如何为从特定站点打开的某些(选择)选项卡动态添加 declarativeNetRequest 规则

问题描述 投票:0回答:1

我有一个产品,可以在附加窗口中使用 window.open 打开第 3 方客户站点。(用于在站点上进行一些 WSIWYG 类型编辑)。我需要删除我们网站打开的选项卡的一些标头(例如 Cross-Origin-Opener-Policy),以便网站能够像我需要的那样打开和工作。(为此,我使用扩展)

在 MV2 中这很容易,因为我们将维护一个 myProductTabs 数组,当我打开一个新选项卡时在 myProductTabs 中附加 tabId。在webRequest.onHeadersReceived中,我将使用details.tabId检查当前请求是否来自myProductTabs中的选项卡之一,然后删除那里的标头。

但在 MV3 中,问题是第一次使用 window.open 打开新选项卡,我现在必须添加一个新的声明性 netrequest 规则,其中 tabs 属性将是 myProductTabs,因为新选项卡已添加到数组中。 (删除旧规则ofc)。 现在这行不通了。可能是因为注册新规则不会立即添加该规则,并且在其有效主文档加载时添加该规则。 如果我刷新选项卡,那么它就会工作,因为规则已经设置了。

现在我可以默认将规则设置为所有选项卡,但这会给用户带来安全风险。那么还有其他办法吗?

注意:我正在使用 updateSessionRules(不要认为使用 updateDynamicRules 会有帮助。如果我错了,请纠正我)。

javascript google-chrome-extension http-headers chrome-extension-manifest-v3 chrome-extension-manifest-v2
1个回答
0
投票

在请求新 URL 之前,会报告该选项卡,因此看起来有足够的时间:

const myProductTabs = {};
chrome.tabs.onCreated.addListener(t => {
  if (!t.url && !t.pendingUrl && t.openerTabId in myProductTabs) {
    chrome.declarativeNetRequest.updateSessionRules({
      removeRuleIds: [1],
      addRules: [{
        id: 1,
        condition: {
          tabIds: [t.id],
        },
        action: {
          type: 'modifyHeaders',
          responseHeaders: [
            {operation: 'remove', header: 'Cross-Origin-Opener-Policy'},
          ],
        },
      }],
    });
  }
});
© www.soinside.com 2019 - 2024. All rights reserved.