5

mozrepl セッションに入ると、ある特定のブラウザー ウィンドウのコンテキストにいることを知っています。そのウィンドウで私ができること

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

これにより、そのウィンドウに一連のタブが表示されます。開いているすべての Firefox ウィンドウのすべてのタブの配列を取得する必要があります。どうすればよいですか?

4

1 に答える 1

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のはライブコレクションであり、配列をどのように使用しているかを述べていないため、ここではそれを行いませんでした. 他のコードは、リストがライブであると想定している場合と想定していない場合があります。

すべてのタブを確実に 1 つの配列にしたい場合は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));
}

注: ウィンドウをループするコードは、元々 、MDNでオーバーレイ拡張機能を再起動なしに変換する方法の最初の部分として作成者が書き直した 古いオーバーレイベースの Firefox 拡張機能を再起動なしのアドオンに変換する から取得したものです。

于 2015-06-24T21:14:44.890 に答える