2010-07-14 75 views
1

我正在做的是在每一頁上的負載專門爲網頁創建我的XPCOM組件的一個實例的擴展。使用eval.call()在Firefox的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組件爲好,但如果我有好幾頁打開了,我不知道怎麼會工作..

+0

我以爲我可以在本地有var window = doc.defaultView。但是doc.defaultView.eval未定義出於某種原因,即使我可以舉例來說做到這一點:doc.defaultView.content.document.defaultView.content.document.location.href。我想的東西=) – Karolis 2010-07-14 15:59:07

回答

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

UPDATE:

試試這個,你應該能夠得到一個參考最近的窗口:

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

}

+0

我不認爲我可以使用代碼的第一個片段,因爲窗口變量在XPCOM世界不確定的,雖然我可能是錯的。 Plus會讓mainWindow幫我執行window.eval.call(window,somecode);因爲我可能有3個標籤同時開放,其中在他們每個人我要像window.eval.call(窗口,somecode)執行不便..我發現evalInSandbox(代碼上下文)昨天,但我還是沒」不知道如何通過上下文.. – Karolis 2010-07-20 10:35:19

+0

我看到...只是添加了一些想法,希望它有幫助。我將很快與XPCOM合作,所以這是一個非常有趣的問題...確保在找到解決方案時在這裏寫一個更新! – flpmor 2010-07-20 14:18:13

+0

對不起,我從未更新過這個解決方案: - \我最終沒有使用eval,因爲這通常是可以避免的;) – Karolis 2011-04-26 12:27:11