2013-04-18 68 views
0

我正在開發引導式Firefox插件。在我startup功能我構建對象的新實例,與下面的代碼創建新的Firefox窗口:對前20,如果火狐 :XUL/Firefox:在插件加載時創建新的瀏覽器窗口

function createWindow (cb) { 
    const appHiddenWindow = Services.appShell.applicationProvidedHiddenWindow 
     , hidden = Services.appShell.hiddenDOMWindow; 

    // For definition of OpenBrowserWindow() see 
    // http://mxr.mozilla.org/mozilla-central/source/browser/base/content/browser.js 
    // Prior to Firefox 20 "private" option is silently ignored 
    let parent = appHiddenWindow ? hidden : RecentWindow.getMostRecentBrowserWindow() 
     , window = parent.OpenBrowserWindow({ private: true }); 
    window.addEventListener("load", onWindowLoad); 
    return window; 

    function onWindowLoad (e) { 
     window.removeEventListener("load", onWindowLoad); 
     window.gBrowser.addEventListener("pageshow", onPageShow); 
    } 

    function onPageShow (e) { 
     dump("onPageShow\n"); 
     try { 
      cb(window); 
     } catch (e) {} 
    } 
} 

對於一些未知的我原因,該代碼在不同情況下表現不同它在應用程序啓動時執行,onPageShow回調從不觸發。我認爲這是因爲gBrowserselectedBrowser只是不加載主頁,並在about:blank加載後停止。爲什麼當我手動重新激活我的擴展(當Firefox已經加載時)時,它會在新窗口中加載主頁?

當它尚未將主頁加載到selectedBrowser(在較新的Fx版本中)時出現問題:在這種情況下,它不會開始加載我指定的URL,而是繼續加載我的主頁。

那麼如何確定gBrowser是否會加載主頁?爲什麼它在App啓動和附加重新激活時的行爲不同?

PS:對於上面的代碼工作必須做這些import S和使用以下備用:

Cu.import("resource://gre/modules/Services.jsm"); 
try { 
    Cu.import("resource:///modules/RecentWindow.jsm"); 
} catch (e) { // Firefox prior to v20 
    var RecentWindow = { 
     getMostRecentBrowserWindow: function() 
      Services.wm.getMostRecentWindow("navigator:browser") 
    }; 
} 
+0

我在Mac OS上,如果它很重要。 – nilfalse

+0

爲什麼不按照傳統的將偵聽器添加到窗口介體的路徑? – paa

+0

在我的插件中,我需要我自己的(附加)窗口,它是由插件本身打開的。這個窗口會在後臺做一些工作。 在使用窗口介體的情況下,我將需要手動打開新窗口,我理解你是正確的嗎? – nilfalse

回答

0

看來我錯在我的一些假設。我不必等到pageshow事件發生。經過長時間的研究,我發現這個bug。根據它,有一個觀察員通知browser-delayed-startup-finished足以開始做我必須做的事與window