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

时间:2014-03-21 20:01:21

标签: javascript google-chrome iframe google-chrome-extension httprequest

我正在撰写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)

== Experiment ==

作为实验,我:

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

以下是捕获的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

1 个答案:

答案 0 :(得分:2)

事态

嗨 - 在类似的问题上挣扎,这就是我发现的:

  

tabIdparentFrameId值看起来很可疑。

查看the documentation以获取返回给WebRequest回调处理程序的详细信息对象:

    当没有标签时,
  • tabId设置为-1。(如在后台页面中)。
  • 由于扩展名在他们自己的进程中,0表示父级是您的顶级框架

使用chrome.tabscan actually get a tabId for a background page但遗憾的是,正如您所发现的那样,WebRequest总是为tabId

提供-1

通常,似乎WebRequest将被弃用,而不是DeclarativeWebRequest,而是development of the latter is currently on pause

潜在的真正解决方案:

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

Hacky解决方案:

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