在firefox XPCOM组件中使用eval.call()

时间:2010-07-14 15:29:42

标签: javascript firefox xpcom

我正在制作一个扩展程序,在每个页面的加载时创建一个专门针对该页面的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组件中,如何在该doc的全局上下文中使用eval()。如果您只是在html中的常规javascript中执行此操作,则可以执行以下操作:

window.eval.call(window, somecode);

问题是我的xpcom组件中没有窗口变量(或者我),我只有文档的引用。我也可以在创建时将窗口传递给我的XPCOM组件,但是如果我打开了几个页面,我看不出它会如何工作..

1 个答案:

答案 0 :(得分: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);
  }

}