我正在使用Firefox的ADD ON SDK(v1.9)构建扩展,该扩展将能够读取所有HTTP请求/响应并计算加载时间。这不仅包括主框架,还包括任何其他加载文件(子框架,脚本,CSS,图像等)。
到目前为止,我可以使用“observer-service”模块来监听:
我的申请遵循以下顺序:
问题: 我无法链接负载的开始和结束时间,因为我找不到将请求与响应绑定的请求ID(或其他唯一值)。 我目前正在使用请求/响应的URL将它们绑定在一起,但这不正确,因为如果同时加载两个或更多相等的URL,它将引发“竞争条件”。谷歌Chrome通过提供独特的requestIds解决了这个问题,但我无法在Firefox上找到类似的功能。
答案 0 :(得分:2)
我知道有两种方法可以识别您在此观察者中收到的频道。 “旧”解决方案是使用nsIWritablePropertyBag
interface将数据附加到频道:
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"));
另一个解决方案是使用WeakMap
API(只能从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));
我不确定附加SDK模块的上下文中是否有WeakMap
,您可能需要从常规JavaScript模块中“窃取”它:
var {Cu} = require("chrome");
var {WeakMap} = Cu.import("resource://gre/modules/FileUtils.jsm", null);
显然,在这两种情况下,您可以将更多数据附加到频道而不是简单数字。
答案 1 :(得分:0)
Firebug通过为这些事件实施中央观察员来实现您的想法:
https://github.com/firebug/firebug/blob/master/extension/modules/firebug-http-observer.js
这可能是一个很好的起点,虽然最终 Firefox默认会发布更完整的网络监视器/调试器。我想我会在某处读到它将基于Firebug的。