mozrepl:循环浏览 Firefox 的所有窗口中的所有选项卡

D P*_*Pao 5 javascript firefox mozilla firefox-addon mozrepl

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

var tabContainer = window.getBrowser().tabContainer;
var tabs = tabContainer.childNodes;
Run Code Online (Sandbox Code Playgroud)

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

Mak*_*yen 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);
Run Code Online (Sandbox Code Playgroud)

您可以创建一个包含所有当前选项卡的数组,只需将doWindow其获取的任何选项卡添加tabContainer.childNodes到整个列表即可。我在这里没有这样做,因为您获得的tabContainer.childNodes实时集合,并且您没有说明如何使用该数组。您的其他代码可能会也可能不会假设该列表是活动的。

如果您确实希望所有选项卡都位于一个数组中,则可以执行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));
}
Run Code Online (Sandbox Code Playgroud)

注意:循环窗口的代码最初取自将旧的基于覆盖的 Firefox 扩展转换为可重新启动的插件,作者将其重新编写为MDN 上的如何将覆盖扩展扩展为可重新启动的初始部分。