Управление вкладками 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.

Другие вопросы по тегам