2014-02-04 3 views
1

Я работаю над расширением firefox, до сих пор работал с XUL browser, чтобы управлять навигацией пользователя по веб-сайтам и сохранять посещенные страницы, но браузер ограничен, я пробовал простой поиск в Google , когда я нажимаю на какой-то результат, он не будет отображаться в браузере.Управление вкладками firefox

Одна из идей - переместить приложение xul в Dialog и управлять действительными вкладками firefox. Но я не знаю, как это сделать.

+0

Вы пытаетесь «управлять вкладками firefox» в собственном 'TabBrowser' Firefox, или создаете дополнительное окно и используете элемент« Browser »для рендеринга удаленного контента? Если последнее, почему? –

+0

Я пытаюсь использовать первый вариант, я хочу регистрировать веб-сайты, посещаемые в firefox Tabs. – elaich

+0

Хорошо, составив пример ... –

ответ

1

(на ваш комментарий ....)

Чтобы создать аддон, который регистрирует 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.

+1

Есть больше «прямых» способов, чем перечисление всех окон и таблиц. (например, используя интерфейс nsIProgressListener), но этот способ очень легко понять. –

Смежные вопросы