(на ваш комментарий ....)
Чтобы создать аддон, который регистрирует TAB события 'загрузка', создать бутстрапируемый (Restartless) аддон:
- bootstrap.js (Файл JavaScript содержащий ваш «привилегированный» код)
- install.rdf (файл XML, описывающий ваш аддон Firefrox)
чтобы построить аддон, просто поместите оба файла внутри верхнего уровня (не раз ер!) ZIP-файла с расширением файла .xpi
. Чтобы установить аддон, перейдите в about:addons
, затем в меню инструментов нажмите Install from file
, найдите свой XPI, откройте его, затем после короткой задержки выберите Install
.
В install.rdf
поставить что-то вроде этого:
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<em:id>[email protected]</em:id>
<em:type>2</em:type>
<em:name>Name of your addon</em:name>
<em:version>1.0</em:version>
<em:bootstrap>true</em:bootstrap>
<em:description>Describe your addon.</em:description>
<em:creator>Your name</em:creator>
<!-- Firefox Desktop -->
<em:targetApplication>
<Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
<em:minVersion>4.0.*</em:minVersion>
<em:maxVersion>29.0.*</em:maxVersion>
</Description>
</em:targetApplication>
</Description>
</RDF>
Необходимо реализовать два обязательных функций JavaScript в bootstrap.js
:
startup()
- вызывается при установке аддона , и когда ваш браузер запустится.
shutdown()
- вызывается при удалении аддона и при выключенном браузере.
Вы должны называть все «привилегированные» коды от startup()
. Для гигиены вы можете (и, вероятно, должны) также реализовать функциии uninstall()
.
Start, реализовав следующий код в bootstrap.js
:
const Cc = Components.classes;
const Ci = Components.interfaces;
let consoleService = Cc["@mozilla.org/consoleservice;1"]
.getService(Ci.nsIConsoleService);
let wm = Cc["@mozilla.org/appshell/window-mediator;1"]
.getService(Ci.nsIWindowMediator);
function LOG(msg) {
consoleService.logStringMessage("EXTENSION: "+msg);
}
function startup() {
try {
LOG("starting up...");
let windows = wm.getEnumerator("navigator:browser");
while (windows.hasMoreElements()) {
let chromeWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow);
WindowListener.setupBrowserUI(chromeWindow);
}
wm.addListener(WindowListener);
LOG("done startup.");
} catch (e) {
LOG("error starting up: "+e);
}
}
function shutdown() {
try {
LOG("shutting down...");
let windows = wm.getEnumerator("navigator:browser");
while (windows.hasMoreElements()) {
let chromeWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow);
WindowListener.tearDownBrowserUI(chromeWindow);
}
wm.addListener(WindowListener);
LOG("done shutdown.");
} catch (e) {
LOG("error shutting down: "+e);
}
}
В принципе, это вызывает WindowListener.setupBrowserUI()
для каждого текущего & будущего окна вашего веб-браузера. WindowListener
определяется следующим образом:
var WindowListener = {
setupBrowserUI: function(chromeWindow) {
chromeWindow.gBrowser.addEventListener('load', my_load_handler, true);
},
tearDownBrowserUI: function(chromeWindow) {
chromeWindow.gBrowser.removeEventListener('load', my_load_handler, true);
},
onOpenWindow: function(xulWindow) {
let chromeWindow = xulWindow.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindow);
chromeWindow.addEventListener("load", function listener() {
chromeWindow.removeEventListener("load", listener, false);
var domDocument = chromeWindow.document.documentElement;
var windowType = domDocument.getAttribute("windowtype");
if (windowType == "navigator:browser")
WindowListener.setupBrowserUI(chromeWindow);
}, false);
},
onCloseWindow: function(chromeWindow) { },
onWindowTitleChange: function(chromeWindow, newTitle) { }
};
Это настраивает слушателя событий для OpenWindow
события, и в свою очередь, устанавливает слушателя событий для load
событий в TabBrowser
каждого ChromeWindow. Обработчик load
события определяется как:
var my_load_handler = function (evt) {
try {
var browserEnumerator = wm.getEnumerator("navigator:browser");
while (browserEnumerator.hasMoreElements()) {
var browserWin = browserEnumerator.getNext();
var tabbrowser = browserWin.gBrowser;
var numTabs = tabbrowser.browsers.length;
for (var index = 0; index < numTabs; index++) {
var currentBrowser = tabbrowser.getBrowserAtIndex(index);
var domWindow = currentBrowser.contentWindow.wrappedJSObject;
if (!domWindow.hasOwnProperty('__logged_this_window__')) {
LOG("TAB loaded:");
LOG(" URL: "+domWindow.location.href);
LOG(" TITLE: "+domWindow.title)
domWindow.__logged_this_window__ = 1;
}
}
}
} catch (e) {
LOG(e);
}
}
Так в основном, если есть load
события на любом из TabBrowser
элементов в Firefox, эта функция будет работать.Он перечислит все окна Firefox и все вкладки этих окон (Browser
элементов). Фокус в том, что когда страница перезагружает все пользовательские свойства «content» DomWindow
, они теряются, поэтому мы проверяем, присутствует ли пользовательское свойство. Если нет, тогда мы регистрируем детали страницы содержания TAB.
Вы пытаетесь «управлять вкладками firefox» в собственном 'TabBrowser' Firefox, или создаете дополнительное окно и используете элемент« Browser »для рендеринга удаленного контента? Если последнее, почему? –
Я пытаюсь использовать первый вариант, я хочу регистрировать веб-сайты, посещаемые в firefox Tabs. – elaich
Хорошо, составив пример ... –