1

すべてのページの読み込み時に、そのページ専用の xpcom コンポーネントのインスタンスを作成する拡張機能を作成しています。

私はこのようにします:

var appcontent = document.getElementById("appcontent");   // browser
if(appcontent) {
   appcontent.addEventListener("load", onPageLoad, true);
}
var onPageLoad = function(aEvent) {
   var doc = aEvent.originalTarget; //this is the reference to the opened page
   pages.push(createInstanceOfMyXPCOM(doc));
}

私の質問は、XPCOM コンポーネント内で、そのドキュメントのグローバル コンテキスト内で eval() をどのように使用できるかということです。htmlの通常のjavascriptでこれを行うだけの場合は、次のことができます。

window.eval.call(window, somecode);

問題は、xpcom コンポーネントにウィンドウ変数がない (またはある) ことです。ドキュメントへの参照しかありません。作成時にウィンドウを XPCOM コンポーネントに渡すこともできますが、複数のページを開いている場合、それがどのように機能するかわかりません..

4

1 に答える 1

1

XPCOM から、以下を使用してメイン ウィンドウへの参照を取得できるはずです。

var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                       .getInterface(Components.interfaces.nsIWebNavigation)
                       .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
                       .rootTreeItem
                       .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                       .getInterface(Components.interfaces.nsIDOMWindow);

次に、現在選択されているタブ ドキュメントを次のように取得できます。

document = mainWindow.gBrowser.contentDocument;

詳細については、次を参照してください。

https://developer.mozilla.org/en/Code_snippets/Tabbed_browser

https://developer.mozilla.org/en/Working_with_windows_in_chrome_code

アップデート:

これを試してみてください。最新のウィンドウへの参照を取得できるはずです。

var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                   .getService(Components.interfaces.nsIWindowMediator);
var recentWindow = wm.getMostRecentWindow("navigator:browser");

複数のタブがある場合は、次のようなもの (Mozilla Dev Site のコード) を使用して、それらすべてを繰り返し処理し、各ドキュメントにアクセスします。

var num = gBrowser.browsers.length;
for (var i = 0; i < num; i++) {
  var b = gBrowser.getBrowserAtIndex(i);
  try {
    dump(b.currentURI.spec); // dump URLs of all open tabs to console
  } catch(e) {
    Components.utils.reportError(e);
  }

}

于 2010-07-19T13:38:17.133 に答える