Управление вкладками Firefox
Я работаю над расширением Firefox, до сих пор я работал с браузером XUL, чтобы управлять пользовательской навигацией по веб-сайтам и сохранять посещенные страницы, но браузер ограничен, я пробовал простой поиск в Google, когда я нажимал на некоторые результат не будет отображаться в браузере.
Одна идея состоит в том, чтобы переместить приложение xul в диалоговое окно и управлять фактическими вкладками Firefox. Но я понятия не имею, как это сделать.
1 ответ
(за ваш комментарий....)
Чтобы создать дополнение, которое регистрирует события загрузки "TAB", создайте загрузочное дополнение (без перезапуска):
- 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>youraddonname@yourdomain</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()
, Для гигиены, вы можете (и, вероятно, должны) также реализовать install()
а также uninstall()
функции.
Начните с реализации следующего кода в 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
элементы). Хитрость в том, что когда страница перезагружает все пользовательские свойства в "контенте" DomWindow
потеряны, поэтому мы проверяем, присутствует ли пользовательское свойство. Если нет, то мы регистрируем детали страницы содержания TAB.