我正在开发引导式 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
'sselectedBrowser
只是不加载主页并在about:blank
加载后停止。当我手动重新激活我的扩展程序时(当 Firefox 已经加载时),为什么它会在新窗口中加载主页?
将主页加载到selectedBrowser
(在较新的 Fx 版本中)时出现问题:在这种情况下,它不会开始加载由我指定的 URL,而是继续加载我的主页。
那么如何确定是否gBrowser
要加载主页?为什么它在应用程序启动和插件重新激活时表现不同?
PS:要使上述代码正常工作,必须执行这些操作import
并使用以下后备:
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")
};
}