我有一个扩展,它使用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',
])
但是有了新的declarativeNetRequest
API,我找不到一个好的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本身的请求,而不是它自己的请求"。
您是否看到任何可以用declarativeNetRequest
API模拟parentFrameId !== -1
的条件?
我发现了一个解决方案:使用非阻塞webRequest
API和declarativeNetRequest
API的组合。
我不会添加一个片段,但这是一个想法:
- 使用
webRequest
查看生成iframe的请求 - 当我们看到这样的请求时,添加一个
declarativeNetRequest
规则来匹配请求与iframe 的URL匹配的启动器。
这样,我可以实现足够接近parentFrameId
的行为。