использование eval.call () в компоненте Firefox XPCOM - PullRequest
1 голос
/ 14 июля 2010

Я делаю расширение, которое при загрузке каждой страницы создает экземпляр моего компонента 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 () в глобальном контексте этого документа.Если бы вы просто делали это в обычном javascript в html, вы могли бы сделать:

window.eval.call(window, somecode);

Проблема в том, что у меня нет оконной переменной в моем компоненте xpcom (или у меня), у меня есть только ссылкак документу.Я мог бы также передать окно моему компоненту XPCOM при создании, но если у меня открыто несколько страниц, я не вижу, как это будет работать ..

1 Ответ

1 голос
/ 19 июля 2010

Из 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), чтобы перебрать все из них и получить доступ к каждому документу:

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);
  }

}

...