会话规则匹配来自iframes的所有请求



我有一个扩展,它使用onHeadersReceived上的parentFrameId属性与webRequestBlocking权限来剥离来自选项卡的iframes的所有请求的特定头。

为达到此目的,条件为:request.tabId === tabId && request.parentFrameId !== -1.

// Tab ID to instrument.
const tabId = 42
chrome.webRequest.onHeadersReceived.addListener((details) => {
if (details.responseHeaders && details.tabId === tabId && details.parentFrameId !== -1) {
return {
responseHeaders: details.responseHeaders.filter( /* filter */ ),
}
}
}, {tabId, urls: ['*://*/*']}, [
'blocking',
'responseHeaders',
'extraHeaders',
])

但是有了新的declarativeNetRequestAPI,我找不到一个好的RuleCondition来模仿这种行为。

我试过了:

// Tab ID to instrument.
const tabId = 42
await chrome.declarativeNetRequest.updateSessionRules({
addRules: [
{
id: 1,
action: {
responseHeaders: [
{
header: 'my-header',
operation: chrome.declarativeNetRequest.HeaderOperation.REMOVE,
},
],
type: chrome.declarativeNetRequest.RuleActionType.MODIFY_HEADERS,
},
condition: {
resourceTypes: [chrome.declarativeNetRequest.ResourceType.SUB_FRAME],
tabIds: [tabId],
},
},
],
})

但是正如在这个StackOverflow问题的评论中所说,"sub_frame表示创建iframe本身的请求,而不是它自己的请求"。

您是否看到任何可以用declarativeNetRequestAPI模拟parentFrameId !== -1的条件?

我发现了一个解决方案:使用非阻塞webRequestAPI和declarativeNetRequestAPI的组合。

我不会添加一个片段,但这是一个想法:

  • 使用webRequest查看生成iframe的请求
  • 当我们看到这样的请求时,添加一个declarativeNetRequest规则来匹配请求与iframe
  • 的URL匹配的启动器。

这样,我可以实现足够接近parentFrameId的行为。

最新更新