XUL / Firefox:在插件加载时创建新的浏览器窗口

时间:2013-04-18 14:41:56

标签: firefox firefox-addon xul add-on

我正在开发自举的Firefox插件。在我的startup函数中,我正在构建对象的新实例,它使用以下代码创建新的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) {}
    }
}

对于某些未知的原因,此代码在不同情况下的行为有所不同: 如果在应用启动时执行,则在20之前的Firefox上,onPageShow回调永远不会触发。我认为这是因为gBrowser的{​​{1}}只是没有加载主页并在selectedBrowser加载后停止。当我手动重新激活扩展时(为什么已经加载Firefox)时,为什么它会在新窗口中加载主页?

在将主页加载到about:blank(在较新的Fx版本中)时出现问题:在这种情况下,它不会开始加载由我指定的网址,而是继续加载我的主页。

那么如何确定selectedBrowser是否要加载主页?为什么它在App启动时和addon重新激活时表现不同?

PS:要使上述代码生效,必须执行以下gBrowser并使用以下后备:

import

1 个答案:

答案 0 :(得分:0)

在我的一些假设中,我似乎错了。我不必等到pageshow事件。经过长时间的研究,我发现了bug。根据它,有一个观察员通知browser-delayed-startup-finished足以开始做我必须对window做的事情。