2015-06-24 2 views
3

Я знаю, что когда я вхожу в сеанс mozrepl, я в контексте одного конкретного окна браузера. В этом окне можно сделатьmozrepl: перебирать все вкладки во всех окнах firefox

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

, который даст мне массив вкладок в этом окне. Мне нужно получить массив всех вкладок во всех открытых окнах Firefox, как это сделать?

ответ

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 которой автора переписана в качестве начальной части How to convert an overlay extension to restartless на MDN.

+1

Я не могу дать вам верх, но спасибо большое! –