mozrepl:遍历firefox所有窗口中的所有选项卡

时间:2015-06-24 19:17:41

标签: javascript firefox firefox-addon mozilla mozrepl

我知道当我进入一个mozrepl会话时,我会在一个特定的浏览器窗口的上下文中。 在那个窗口我可以做

var tabContainer = window.getBrowser().tabContainer;
var tabs = tabContainer.childNodes;

将在该窗口中为我提供一系列选项卡。 我需要在所有打开的Firefox窗口中获取所有选项卡的数组,我该怎么做?

1 个答案:

答案 0 :(得分:4)

我不确定它是否适用于mozrepl,但在Firefox附加组件中,您可以执行类似以下代码的操作。此代码将在所有打开的浏览器窗口中循环。为每个窗口调用一个函数,在本例中为doWindow

Components.utils.import("resource://gre/modules/Services.jsm");
function forEachOpenWindow(fn)  {
    // Apply a function to all open browser windows

    var windows = Services.wm.getEnumerator("navigator:browser");
    while (windows.hasMoreElements()) {
        fn(windows.getNext().QueryInterface(Ci.nsIDOMWindow));
    }
}

function doWindow(curWindow) {
    var tabContainer = curWindow.getBrowser().tabContainer;
    var tabs = tabContainer.childNodes;
    //Do what you are wanting to do with the tabs in this window
    //  then move to the next.
}

forEachOpenWindow(doWindow);

您可以创建一个包含所有当前标签的数组,只需让doWindow将从tabContainer.childNodes获取的任何标签添加到整体列表中。我在这里没有这样做,因为你从tabContainer.childNodes获得的是live collection并且你没有说明你是如何使用数组的。您的其他代码可能会或可能不会假设列表是活动的。

如果您确实希望所有标签都在一个数组中,则可以doWindow为以下内容:

var allTabs = [];
function doWindow(curWindow) {
    var tabContainer = curWindow.getBrowser().tabContainer;
    var tabs = tabContainer.childNodes;
    //Explicitly convert the live collection to an array, then add to allTabs
    allTabs = allTabs.concat(Array.prototype.slice.call(tabs));
}

注意:循环访问窗口的代码最初来自Converting an old overlay-based Firefox extension into a restartless addon,作者在MDN上重写了How to convert an overlay extension to restartless的初始部分。