在Firefox扩展的窗口加载上添加选项卡

时间:2014-07-08 19:39:29

标签: javascript firefox firefox-addon

每当为我的bootstrap扩展加载新的Firefox窗口时,我想添加一个标签。我使用此代码清单:

var WindowListener = {
    setupBrowserUI: function(window) {
        window.gBrowser.selectedTab=window.gBrowser.addTab("http://google.com");
    },
    tearDownBrowserUI: function(window) {
    },
    // nsIWindowMediatorListener functions
    onOpenWindow: function(xulWindow) {
        var domWindow = xulWindow.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                                 .getInterface(Components.interfaces.nsIDOMWindow);
        // Wait for it to finish loading
        domWindow.addEventListener("load", function listener() {
            domWindow.removeEventListener("load", listener, false);
            // If this is a browser window then setup its UI      
            if (domWindow.document.documentElement.getAttribute("windowtype")=="navigator:browser") domWindow.gBrowser.selectedTab=domWindow.gBrowser.addTab("http://google.com");
        }, false);
    },
    onCloseWindow: function(xulWindow) {
    },
    onWindowTitleChange: function(xulWindow, newTitle) {
    }
};

let wm = Components.classes["@mozilla.org/appshell/window-mediator;1"].
       getService(Components.interfaces.nsIWindowMediator);
// Wait for any new browser windows to open
wm.addListener(WindowListener);

您可以在Scratchpad中尝试。

onOpenWindow方法具有在新窗口中打开选项卡的代码,但它在窗口完全加载之前执行,因此在此状态下添加选项卡似乎不起作用,尽管MDN代码显示“等待它完成加载”。

通过setTimeout函数设置超时可以完成工作,但看起来很难看。

domWindow.setTimeout(function(){domWindow.gBrowser.selectedTab=domWindow.gBrowser.addTab("http://google.com");},1000);

是否可以在没有setTimeouts的情况下加载窗口后为新的Firefox窗口添加选项卡?

2 个答案:

答案 0 :(得分:0)

我选择了setTimeout(..., 0)黑客。这应该是最可靠的选项,并在整个Firefox代码中使用:p

if (domWindow.gBrowser) {
  setTimeout(function() {
    domWindow.gBrowser.selectedTab =
      domWindow.gBrowser.addTab("http://google.com");
  }, 0);
}

答案 1 :(得分:0)

真的很奇怪。我无法解释。但从行:

if(domWindow.document.documentElement.getAttribute(" windowtype")==" navigator:browser")domWindow.gBrowser.selectedTab = domWindow.gBrowser.addTab(&#34 ; http://google.com&#34);

删除domWindow.gBrowser.selectedTab =,然后将其更改为:

if (domWindow.document.documentElement.getAttribute("windowtype")=="navigator:browser")  { 
     domWindow.gBrowser.addTab("http://google.com");
}

这成功加载了网址,但它没有选择标签我试过,绝对新的想法为什么这个东西失败了:

if (domWindow.document.documentElement.getAttribute("windowtype")=="navigator:browser")  { 
     var tab = domWindow.gBrowser.addTab("http://google.com");
}

一旦我将var tab =放在前面就失败了。如果它没有失败,我打算下一行:domWindow.gBrowser.selectedTab = tab

然后这也失败了: loadOneTabinBackground参数,如果设置为false,则会关注标签:

if (domWindow.document.documentElement.getAttribute("windowtype")=="navigator:browser")  { 
     domWindow.gBrowser.loadOneTab("http://google.com", {inBackground:false});
}

绝对不知道,但是这无法加载网址,但它会关注标签。如果您将inBackground设置为true,则会加载网址,当然它不会关注标签。绝对奇怪......

发布以便其他人可以找出问题所在,也许我们需要报告bugzilla的内容。