在 chome 扩展 mv3 中,如何在不下载链接文档的情况下进行跨域获取?

In chome extension mv3, how do a cross origin fetch without downloading linked documents?

提问人:yigal 提问时间:11/11/2023 最后编辑:VLAZyigal 更新时间:11/11/2023 访问量:45

问:

我正在编写一个执行跨域获取的 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.jsdeclarativeNetRequestupdateDynamicRules

适用于 mv2 但不适用于 mv3 的相关问题 使用 fetch 时如何选择退出 HTTP/2 服务器推送?

javascript http google-chrome-extension fetch-api service-worker

评论

0赞 Jaromanda X 11/11/2023
不会删除您刚刚添加的规则,因为它的 ID 为 1?- 不知道添加/删除的顺序是什么removeRuleIds: [1],
1赞 wOxxOm 11/11/2023
1) Your 无效,因为 DNR 使用不同的语法。只需删除 urlFilter,规则就会开始工作。2)是错误的类型。用。3) 请注意,您的规则会从所有请求中删除标头,而不仅仅是您的请求,因此这很糟糕。加。P.S. removeRuleIds 删除了旧规则,因此它是正确的。urlFiltermain_framexmlhttprequestinitiatorDomains:[chrome.runtime.id]
0赞 yigal 11/12/2023
非常感谢@wOxxOm,这完美地解决了我的问题

答: 暂无答案