Отлов открытия вкладки
Как поймать момент открытия новой вкладки (в том числе и первой) в браузере?
Получилось вот такое:
const windowDataSource = Components.classes['@mozilla.org/rdf/datasource;1?name=window-mediator'].getService(Components.interfaces.nsIWindowDataSource); function check(aEvent) { var document = aEvent.target.wrappedJSObject; var index = 0; while (true) { var window = windowDataSource.getWindowForResource("window-" + index); if (window && ("getBrowser" in window)) { var tabs = window.getBrowser().browsers; for (var i = tabs.length; --i > -1;) if (tabs[i].contentDocument && document == tabs[i].contentDocument && !("_checked" in tabs[i])) { // Поймали открытие очередной вкладки. Помечаем её и делаем своё дело. tabs[i]._checked = true; return; } } index++; } } function init() { var browser = getBrowser(); var tabs = browser.browsers; if (tabs.length == 1 && tabs[0].contentWindow.location == "about:blank") { // Поймали открытие первой вкладки. Помечаем её и делаем своё дело. tabs[0]._checked = true; } browser.addEventListener("DOMContentLoaded", check, false); } window.addEventListener("load", init, false);
Пока вроде работает верно, но такое ощущение, что через одно место.
Может лучше заменить метод addTab у tabbrowser'а? Что-то в таком роде:
var oldAddTabMethod = getBrowser().addTab; getBrowser().addTab = function(url) { alert("Opening new tab: " + url); return oldAddTabMethod.apply(this, arguments); }
Можно еще отлавливать создание нового browser-элемента с помощью события DOMNodeInserted.