【问题标题】:XUL/Firefox: create new browser window on addon loadXUL/Firefox:在加载插件时创建新的浏览器窗口
【发布时间】:2013-04-22 23:13:11
【问题描述】:

我正在开发引导式 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 回调永远不会触发。我认为这是因为gBrowserselectedBrowser 只是不加载主页并在about:blank 加载后停止。当我手动重新激活我的扩展程序时(当 Firefox 已经加载时),为什么它会在新窗口中加载主页?

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

那么我如何确定gBrowser 是否会加载主页?为什么它在应用启动和插件重新激活时表现不同?

PS:要使上述代码正常工作,必须执行这些imports 并使用以下后备:

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

【问题讨论】:

  • 如果重要的话,我在 Mac OS 上。
  • 为什么不按照更传统的方式向窗口中介添加监听器?
  • 在我的插件中,我需要自己的(附加)窗口,该窗口由插件本身打开。这个窗口将在后台做一些工作。如果使用窗口中介,我需要手动打开新窗口,我理解你正确吗?
  • 你想要一个隐藏的窗口(但是为什么要回退到一个正常的窗口呢?)还是尽快打开一个窗口?
  • 在我的插件被激活后,我需要一个新的(普通的,非隐藏的)窗口。为此,我使用在已存在窗口的浏览器覆盖中定义的OpenBrowserWindow 函数,但我认为在 MacOS 上,在某些情况下,在激活我的插件期间可能没有真正的窗口。这就是我回退到 hiddenWindow 的原因。

标签: firefox firefox-addon xul add-on


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 2013-11-20
    • 2012-06-19
    • 1970-01-01
    相关资源
    最近更新 更多