1

我正在编写一个无需重启的 Firefox 扩展,我必须在其中枚举所有打开的选项卡并使用它们。

这是引发错误的代码部分:

getInfoString : function ()
    {
        infos = "";
        HELPER.alerting("url", "URL-Function");
        var winMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator);
        HELPER.alerting("url", "Mediator initialized");
        var mrw = winMediator.getEnumerator(null);
        while(mrw.hasMoreElements())
        {
            var win = mrw.getNext();
            var t = win.gBrowser.browsers.length;
            HELPER.alerting("url", "browsers: " + t);
            for (var i = 0; i < t; i++)
            {
                var b = win.gBrowser.getBrowserAtIndex(i);
                if(b.currentURI.spec.substr(0,3) != "http")
                {
                    continue;
                }
                HELPER.alerting(b.title,b.currentURI.spec);
                var doc = b.contentDocument;
                var src = doc.documentElement.innerHTML;
                infos = infos + src
                HELPER.alerting("doc", src);
            }
        }

        return infos;
    }

我在测试这个时运行了一个 JavascriptDebugger-Addon,Firefox 执行一切正常

HELPER.alerting("url", "browsers: " + t);

但是在这一行之后,调试器插件会抛出一个错误,说:

win.gBrowser 未定义

...指向线:

var t = win.gBrowser.browsers.length;

但在它引发错误之前,我得到了我的警报消息,它给了我正确数量的选项卡。因此,在执行该行之后会引发错误,而不是在执行该行时直接引发错误。有谁知道如何解决这个问题,因为在引发错误后扩展程序停止工作。

格雷茨

PS:如果有人对此有更好的标题,请随时编辑。

4

2 回答 2

1

使用winMediator.getEnumerator(null)会给你所有类型的窗口,可能是也可能不是浏览器窗口。您应该尝试更改以下行

var mrw = winMediator.getEnumerator(null);

var mrw = winMediator.getEnumerator('navigator:browser');
于 2013-11-05T14:05:35.647 回答
-1

我终于发现这种行为有时会发生。我只是稍微重新排列了代码,删除了 for 循环中的一些警报,它又可以正常工作了。因此,如果有人也有此错误,只需重新排列您的代码,它就会再次像魅力一样工作。

于 2013-11-05T14:22:38.160 回答