2013-04-18 34 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