2011-06-22 20 views
0

私は現在Firefoxの拡張機能を開発しており、開いているタブを区別することができるようにする必要があります。Firefoxのタブを区別するにはどうすればよいですか?

送信HTTPリクエストを送信元タブに関連付けることができます。それぞれの 'on-modify-request'イベントでは、たとえば、タブ2またはタブ3からのイベントであることがわかります。

これは、同じウェブサイトの複数のインスタンスを区別するのに十分なはずです。 3つの 'www.google.com'タブが開いている場合は、開いているタブをすべて列挙できません。

私が知る限り、Mozillaのtabbrowserオブジェクトには一意の識別子やプロパティはありません。

アイデア?

答えて

3

http-on-modify-requestは、実際のリクエストオブジェクトを提供します。そこから、関連付けられたウィンドウを取得する必要があります。行く方法はnsILoadContextです。私はこのコードを使用します:

function getRequestWindow(request) 
{ 
    try 
    { 
    if (request.notificationCallbacks) 
     return request.notificationCallbacks 
        .getInterface(Components.interfaces.nsILoadContext) 
        .associatedWindow; 
    } catch(e) {} 

    try 
    { 
    if (request.loadGroup && request.loadGroup.notificationCallbacks) 
     return request.loadGroup.notificationCallbacks 
           .getInterface(Components.interfaces.nsILoadContext) 
           .associatedWindow; 
    } catch(e) {} 

    return null; 
} 

これはコンテンツウィンドウ(おそらくはフレーム)です。したがって、対応するタブを見つけなければなりません。gBrowser.getBrowserForDocument()を使用してください。このように: - もしあれば

var wnd = getRequestWindow(request); 
var browser = (wnd ? gBrowser.getBrowserForDocument(wnd.top.document) : null); 

今、あなたは、要求が属する<browser>要素を持っています。リクエストはFirefoxのUIまたは別のブラウザウィンドウからも発生する可能性があるためです。その要素に独自のexpandoプロパティを設定して、タブ識別子を取得できます(他の拡張との競合を避けるために一意の名前を選択してください)。このような何か:

if (!("_myExtensionTabId" in browser)) 
    browser._myExtensionTabId = ++maxTabId; 
var tabId = browser._myExtensionTabId; 

ここmaxTabIdは、最初はゼロだグローバル変数になります。また、「myExtension」は、拡張機能固有のもの(名前など)に置き換えられるのが理想的です。

+0

これは、各リクエストに関連付けられたオブジェクトを取得しますが、開いている他の要素から要素を一意に識別する方法はありますか?私はこの関係をデータベースに保存しようとしています(つまりxyzリクエストはの要素Xから来ています)。これにより、一意の識別子を使用できないと問題が発生します。または、あなたのコードスニペットを誤解していますか? – Kotsu

+0

あなたはコードスニペットを正しく理解していますが、達成しようとしていることを理解していない可能性があります。オブジェクトには、残念ながらハッシュテーブルで使用できる一意の識別子はありません。つまり、通常はexpandoプロパティです。実際には、必要なすべてのデータを 'browser._myExtensionRequests'に格納します(他の拡張との競合を避けるために一意のプロパティ名を使用します)。したがって、特定のタブのデータが必要な場合は、そのタブを見つける場所を知っています。存在しなくなったタブのデータは保持しません。それは役に立ちますか? –

+0

はい - 私の使用のために、これは可能ではないようです。私は基本的にHTTP要求をデータベースの元の要素でグループ化する方法を望んでいました。これらの要求を行ったURLをグループ化すれば簡単ですが、同一のURLを持つ要素のインスタンスを区別することで、この手間がかかります... – Kotsu

関連する問題