0

FirefoxのADDONSDK(v1.9)を使用して拡張機能を構築しています。この拡張機能は、すべてのHTTPリクエスト/レスポンスを読み取り、読み込みにかかった時間を計算できます。これには、メインフレームだけでなく、その他のロードファイル(サブフレーム、スクリプト、css、画像など)も含まれます。

これまでのところ、「observer-service」モジュールを使用して以下をリッスンすることができます。

  • HTTPリクエストが作成されたときの「http-on-modify-request」。
  • HTTP応答を受信したときの「http-on-examine-response」
  • HTTP応答が完全にキャッシュから受信された場合の「http-on-examine-cached-response」
  • HTTP応答がキャッシュから部分的に受信された場合の「http-on-examine-merged-response」

私のアプリケーションは次のシーケンスに従います。

  1. リクエストは、オブザーバーを介して作成および登録されます。
  2. 現在の時刻を保存し、リクエストロードのstart_timeとしてマークします。
  3. リクエストに対する応答は、オブザーバーの1つを介して受信および登録されます。
  4. 現在の時間を保存し、以前に保存した時間を使用してリクエストの読み込み時間を計算します。

問題: 要求と応答を結び付ける要求ID(または他の一意の値)が見つからないため、ロードの開始時刻と終了時刻をリンクできません。現在、リクエスト/レスポンスのURLを使用してそれらを結び付けていますが、2つ以上の等しいURLが同時に読み込まれると「競合状態」が発生するため、これは正しくありません。Google Chromeは、一意のrequestIdを提供することでこの問題を解決しますが、Firefoxで同様の機能を見つけることができませんでした。

4

2 に答える 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"));

もう1つの解決策は、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 に答える