我正在编写一个 Chrome 扩展程序,它会代表用户定期检查网页。为了不引人注目,该页面被加载到扩展程序隐藏背景页面上的 iframe 中。 是否可以仅识别此 iframe 发出的网络请求?
我最初的实验(见下文)似乎表明这很棘手。获取特定选项卡的所有 Web 请求很容易:您拥有 tabId,并且可以使用该 tabId 过滤 Web 请求(通过 WebRequest API)。但是对于后台页面 iframe,不清楚“tabId 等效”标识符是什么,或者如何使用它来过滤 Web 请求。
有什么想法吗?
我最初的实验细节如下。 frameId 值看起来很有希望,但我不认为它在扩展程序中是唯一的。
此问题已针对 Firefox 提出:Identify requests originating in the hiddenDOMWindow (or one of its iframes)
== 实验 ==
作为实验,我:
- 使用 WebRequest API 监听所有网络请求
- 在扩展程序的后台页面上创建了一个 iframe,并打开了一个 url。
这是一个捕获的 iframe 网络请求:
{
"frameId": 2,
"method": "GET",
"parentFrameId": 0,
"requestId": "11988",
"tabId": -1,
"timeStamp": 1395423892612.272,
"type": "sub_frame",
"url": "http://en.wikipedia.org/wiki/Frog"
}
tabId 和 parentFrameId 值看起来很可疑。
frameId 值看起来很有希望。如果我们知道框架的 frameId,我们可以使用它来过滤请求吗?
有可能,但 frameId 值在浏览器扩展中不是唯一的。 我创建了另一个相同的扩展,并让它的背景 iframe 加载相同的 url。它生成了一个外观相同的请求,具有相同的 frameId(对于它自己的 - 但不同的 - iframe)。 此外,此 Chromium 问题涉及“帧 ID 冲突”:https://code.google.com/p/chromium/issues/detail?id=173325
最佳答案
事态
您好 - 正在努力解决类似的问题,这是我发现的:
The
tabId
andparentFrameId
values look suspect.
查看 the documentation对于返回到 WebRequest 回调处理程序的详细信息对象:
tabId
在没有选项卡时设置为 -1(如在后台页面中)。- 因为扩展在它们自己的进程中 0 表示父级是您的顶级框架
使用 chrome.tabs
你 can actually get a tabId for a background page但不幸的是,正如您所发现的,WebRequest 总是为 tabId
一般来说,似乎 WebRequest
将被弃用,取而代之的是 DeclarativeWebRequest
但是 development of the latter is currently on pause .
潜在的实际解决方案:
我还没有对此进行测试,但有可能只有从您的后台页面发出的请求对您可用,并且 tabId 为 -1。您可能会针对这些进行过滤。
Hacky 解决方案:
- 将一个框架注入(inject)到具有已知目标 URL 的选项卡中的实际页面上。该 URL 甚至可以是您的扩展程序中可通过 Web 访问的 URL,以避免冲突。
- 扩展端跟踪生成该请求的 tabId 和 frameId。
- 在 iframe 中加载您感兴趣的实际页面(通过重定向或将 iframe 的内容作为页面的另一个 iframe)。
- 使用存储的 tabId 和 frameId(可用作请求的 parentId)来决定过滤哪些请求。
关于javascript - Chrome 扩展 : identify web requests of background-page iframe?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22568457/