Chrome扩展程序:识别后台页面iframe的网络请求?

huc*_*lla 6 javascript iframe google-chrome httprequest google-chrome-extension

我正在撰写Chrome扩展程序,代表用户定期检查网页.为了不引人注目,页面将加载到扩展程序隐藏的背景页面上的iframe中.是否可以仅识别此iframe发出的网络请求?

我最初的实验(见下文)似乎表明这很棘手.获取特定选项卡的所有Web请求非常简单:您拥有tabId,并可以使用该tabId过滤Web请求(通过WebRequest API).但对于后台页面iframe,不清楚"tabId等效"标识符是什么,或者如何使用它来过滤Web请求.

有什么想法吗?

我最初的实验细节如下.frameId值看起来很有希望,但我不相信它在扩展中是唯一的.

这个问题已经被要求用于Firefox:识别源自hiddenDOMWindow(或其中一个iframe)的请求

==实验==

作为实验,我:

  • 使用WebRequest API侦听所有Web请求
  • 在扩展程序的后台页面上创建了一个iframe,并打开了一个网址.

这是一个捕获的iframe Web请求:

{
  "frameId": 2,
  "method": "GET",
  "parentFrameId": 0,
  "requestId": "11988",
  "tabId": -1,
  "timeStamp": 1395423892612.272,
  "type": "sub_frame",
  "url": "http://en.wikipedia.org/wiki/Frog"
}
Run Code Online (Sandbox Code Playgroud)

tabId和parentFrameId值看起来很可疑.

frameId值看起来很有希望.如果我们知道帧的frameId,我们可以使用它来过滤请求吗?

可能,但是frameId值在浏览器扩展中并不是唯一的.我创建了另一个相同的扩展,并获得其背景iframe以加载相同的URL.它生成了一个相同的查看请求,具有相同的frameId(对于它自己的 - 但不同的 - iframe).此外,此Chromium问题涉及"框架ID冲突":https://code.google.com/p/chromium/issues/detail? id = 173325

小智 2

事态

你好 - 正在努力解决类似的问题,这就是我发现的:

和值看起来很可疑tabIdparentFrameId

查看返回到 WebRequest 回调处理程序的详细信息对象的文档:

  • tabId当没有选项卡时(例如在后台页面中),设置为 -1。
  • 因为扩展位于它们自己的进程中,0 表示父级是您的顶级框架

使用chrome.tabs实际上可以获得后台页面的 tabId,但不幸的是,正如您所发现的,WebRequest 总是为后台页​​面提供 -1tabId

一般来说,似乎WebRequest将被弃用,DeclarativeWebRequest后者的开发目前已暂停

潜在的实际解决方案:

我还没有对此进行测试,但可能只有从后台页面发出的请求才可用,并且 tabId 为 -1。您可能会过滤这些内容。

黑客解决方案:

  1. 将框架插入到具有已知目标 URL 的选项卡内的实际页面上。该 URL 甚至可以是扩展程序中可通过 Web 访问的 URL,以避免冲突。
  2. 扩展端跟踪生成该请求的 tabId 和frameId。
  3. 在 iframe 中加载您感兴趣的实际页面(通过重定向或让 iframe 的内容成为页面的另一个 iframe)。
  4. 使用存储的 tabId 和frameId(可用作请求的parentId)来决定要过滤哪些请求。