提问人:yigal 提问时间:11/11/2023 最后编辑:VLAZyigal 更新时间:11/11/2023 访问量:45
在 chome 扩展 mv3 中,如何在不下载链接文档的情况下进行跨域获取?
In chome extension mv3, how do a cross origin fetch without downloading linked documents?
问:
我正在编写一个执行跨域获取的 chrome 扩展程序
这是我的代码。要运行它,请将其加载为解压缩的 chrome 扩展程序。https://github.com/yigalirani/cross_origin_fetch
manifest.json
{
"name": "cross origin fetch",
"version": "1.1",
"manifest_version": 3,
"background": {
"service_worker": "service-worker.js"
},
"side_panel": {
"default_path": "sidepanel.html"
},
"host_permissions": ["*://*/*"],
"permissions": [
"sidePanel",
"declarativeNetRequest",
"declarativeNetRequestFeedback"
]
}
侧边板:.html
<body>
<button id="clicker">fetch</button>
</body>
<script src="click_to_fetch.js"></script>
click_to_fetch.js
function call_fetch(){
console.log('now calling fetch')
fetch('https://symbolclick.com/demo/').then(res=>res.text()).then(console.log)
}
document.getElementById('clicker').onclick=call_fetch
服务工作者 .js
chrome.runtime.onInstalled.addListener(() => {
const RULE = {
id: 1,
condition:{urlFilter: "*://*/*",resourceTypes: ['main_frame'] },
action: {
type: 'modifyHeaders',
responseHeaders: [
{header: 'Link', operation: 'remove'},
],
},
};
chrome.declarativeNetRequest.updateDynamicRules({
removeRuleIds: [1],
addRules: [RULE],
});
});
self.addEventListener('fetch', async (event) => {
console.log('service worker: fetch',event.request.url)
return fetch(event.request.url)
})
console.log('service worker: hello')
该代码在镀铬侧板上添加了一个面板,标题为一个按钮。单击它调用 fetch 并打印结果。cross origin fetch
这通常会被 cors 规则阻止,但由于代码作为 chrome 扩展程序运行,因此有效。host_permissions
问题是,每次调用 fetch 时,都会有一些警告打印到扩展的控制台:
拒绝加载脚本“https://symbolclick.com/demo/print_world.js”,因为它违反了以下内容安全策略指令:“script-src 'self'”。请注意,未显式设置“script-src-elem”,因此使用“script-src”作为回退。
我做了一些调查,发现错误提到的文件是通过 fetch 自动下载的,因为该文件在获取的 url 的 http 标头中提到:print_world.js
HTTP/1.1 200 OK
Link: <print_world.js>; rel=preload; as=script
Content-Type: text/html; charset=UTF-8
我的问题是
如何防止 fetch 自动加载链接的文件?
上面尝试使用 删除链接标头,但这确实有任何影响。service-worker.js
declarativeNetRequestupdateDynamicRules
适用于 mv2 但不适用于 mv3 的相关问题 使用 fetch 时如何选择退出 HTTP/2 服务器推送?
答: 暂无答案
评论
removeRuleIds: [1],
urlFilter
main_frame
xmlhttprequest
initiatorDomains:[chrome.runtime.id]