0

我正在使用 Firefox 的 ADD ON SDK (v1.9) 构建一个扩展,它将能够读取所有 HTTP 请求/响应并计算它们加载的时间。这不仅包括主框架,还包括任何其他加载文件(子框架、脚本、css、图像等)。

到目前为止,我可以使用“observer-service”模块来监听:

  • 创建 HTTP 请求时的“http-on-modify-request”。
  • 收到 HTTP 响应时的“http-on-examine-response”
  • “http-on-examine-cached-response”当 HTTP 响应完全从缓存中接收时
  • “http-on-examine-merged-response”当从缓存部分接收到 HTTP 响应时

我的申请遵循以下顺序:

  1. 通过观察者创建和注册请求。
  2. 我保存当前时间并将其标记为请求加载的 start_time。
  3. 通过其中一个观察者接收和注册请求的响应。
  4. 我保存当前时间并使用之前保存的时间来计算请求的加载时间。

问题: 我无法链接加载的开始时间和结束时间,因为我找不到将请求与响应联系起来的请求 ID(或其他唯一值)。我目前正在使用请求/响应的 URL 将它们绑定在一起,但这是不正确的,因为如果同时加载两个或多个相等的 url,它将引发“竞争条件”。谷歌浏览器通过提供唯一的 requestId 解决了这个问题,但我在 Firefox 上找不到类似的功能。

4

2 回答 2

2

我知道有两种方法可以识别您在此观察者中收到的频道。“旧”解决方案是使用nsIWritablePropertyBag接口将数据附加到通道:

var {Ci} = require("chrome");
var channelId = 0;

...

// Attach channel ID to a channel
if (channel instanceof Ci.nsIWritablePropertyBag)
  channel.setProperty("myExtension-channelId", ++channelId);

...

// Read out channel ID for a channel
if (channel instanceof Ci.nsIPropertyBag)
  console.log(channel.getProperty("myExtension-channelId"));

另一种解决方案是使用WeakMapAPI(仅从 Firefox 13 开始正常工作):

var channelMap = new WeakMap();
var channelId = 0;

...

// Attach channel ID to a channel
channelMap.set(channel, ++channelId);

...

// Read out channel ID for a channel
console.log(channelMap.get(channel));

我不确定WeakMap在附加 SDK 模块的上下文中是否可用,您可能必须从常规 JavaScript 模块中“窃取”它:

var {Cu} = require("chrome");
var {WeakMap} = Cu.import("resource://gre/modules/FileUtils.jsm", null);

显然,在这两种情况下,您都可以将比简单数字更多的数据附加到通道。

于 2012-08-21T15:02:17.760 回答
0

Firebug 通过为这些事件实现一个中央观察者来完成您的想法:

https://github.com/firebug/firebug/blob/master/extension/modules/firebug-http-observer.js

这可能是一个很好的起点,尽管Firefox最终会默认提供一个更完整的网络监视器/调试器。我想我在某处读到它将基于 Firebug 的。

于 2012-08-21T03:58:15.637 回答