2014-11-27 1 views
1

Я уже разработал приложение для создания форм C# и расширение chrome с помощью встроенного сообщения (другое приложение консоли C#), для получения активного URL вкладки пользователя. Я также разработал установку msi в WiX для записи в реестре (HKLM/SOFTWARE/Wow6432Node/Google/Chrome/Extensions и HKLM \ SOFTWARE \ Wow6432Node \ Google \ Chrome \ NativeMessagingHosts) программно и протестировал установку расширения chrome на запуск установки на разных машинах Windows 7. Я публикую это расширение на веб-магазине Chrome, а затем устанавливаю расширение на нескольких клиентских компьютерах.Как создать расширение Firefox для отправки активного URL-адреса вкладки в его родной, аналогично хром-нативной передаче сообщений и установить его через msi

Я хочу сделать то же самое с Mozilla Firefox. Я новичок в этой области и прохожу через некоторые руководства разработчиков Firefox (XPCOM, js-ctypes и т. Д.) И немного запутался с несколькими ссылками.

Было бы очень полезно, если бы кто-нибудь мог направлять меня к точному решению. Обратите внимание: 1) я должен установить расширение программным путем через тот же самый msi-пакет, который уже содержит мое собственное приложение C# и расширение chrome с собственным приложением, и 2) клиентские компьютеры будут только Windows, но любая версия (XP (необязательно) , 7, 8, сервер ничего).

EDIT:
Согласно ответу Noitidart, я бы сделал ffext.xpi из 4 файлов (bootstrap.js, myWorker.js, chrome.manifest, install.rdf) и загружен и установлен на firefox, без ошибок, но ничего не происходит. Во-первых, я сосредоточен на части расширения браузера, а не нативной, и сейчас Я просто хочу иметь слушателя внутри js-файлов, так что всякий раз, когда я переключаюсь на другую вкладку firefox или окно Firefox, появляется предупреждение сам браузер (а не родной в данный момент), отображающий URL активной вкладки. Я даже не понимаю, как будут вызываться или исполняться файлы js, как эта строка myWorker.addEventListener('message', handleMessageFromWorker); будет работать, или если мне нужно добавить другого слушателя. Ничего не происходит вообще. Как отлаживать или исходить отсюда? Пожалуйста помоги.

+0

Для установки из msi ознакомьтесь с этой темой: http://stackoverflow.com/questions/3888316/install-firefox-extension-using-windows-registry – Noitidart

+0

Я большой вентилятор js-ctypes, поэтому дайте мне знать, когда вы начинаете :) вы можете видеть, что многие мои js-ctypes работают на https://gist.github.com/search?q=ctpyes, также есть тег stackoverflow [tag: jsctypes], который имеет много полезного материала :) – Noitidart

+0

Большое спасибо за эти ценные данные. Я слежу за ними сейчас и обязательно сообщит вам о результатах. – Tutun

ответ

0

Чтобы получить текущий URL окна сделать это:

aDOMWindow.gBrowser.currentURI.spec 

Чтобы получить доступ все окна сделать это:

  Cu.import('resource://gre/modules/Services.jsm'); 
      let DOMWindows = Services.wm.getEnumerator(null); 
      while (DOMWindows.hasMoreElements()) { 
       let aDOMWindow = DOMWindows.getNext(); 
       if (aDOMWindow.gBrowser) { 
        var currentURL = aDOMWindow.gBrowser.currentURI; 
       } 
      } 

Если вы не проверить gBrowseraDOMWindow.location будет хром путь, очень вероятно.

Так вот, этот купель с ChromeWorker (ChromeWorker будет иметь доступ к шаблону js-ctypes) здесь: https://github.com/Noitidart/ChromeWorker (этот шаблон является минимальным, необходимым для связи между ChromeWorker и вашим js-файлом, в данном случае bootstrap.js) (bootstrap.js - это файл js, который требуется и запускается, в bootstrap.js требуются 4 функции запуска, выключения, установки и удаления.

От bootstrap.js мы бы это сделали, теперь давайте сделаем это при запуске :

function startup() { 
    loadAndSetupWorker(); //must do after startup 
    myWorker.postMessage({ 
     aTopic: 'currentURL', 
     aURL: Services.wm.getMostRecentWindow('navigator:browser').gBrowser.currentURI.spec // recent window of type navigator:browser always has gBrowser 
     aLinkedPanel: Services.wm.getMostRecentWindow('navigator:browser').gBrowser.selectedTab.getAttribute('linkedpanel') //we use this to make sure to get the right tab/window on message back 
    }); 
} 

Тогда в рабочий мы будем делать что-то вроде этого:

self.onmessage = function(msg) { 
    switch (msg.data.aTopic) { 
     case 'currentURL': 
      var ret = msgBox(0, "alert from ctypes on windows, the url is:" + msg.data.aURL, "ctypes alert windows", MB_OK); 
      self.postMessage({ 
       aTopic: 'currentURL-reply', 
       theLinkedPanel: msg.data.aLinkedPanel, 
       aResponde: aRet 
      }); 
      break; 
     default: 
      throw 'no aTopic on incoming message to ChromeWorker'; 
    } 
} 

Затем назад в бутстрап.JS мы получим это сообщение, и сделать что-то с ним:

function handleMessageFromWorker(msg) { 
    console.log('incoming message from worker, msg:', msg); 
    switch (msg.data.aTopic) { 
     case 'currentURL-reply': 
      let DOMWindows = Services.wm.getEnumerator('navigator:browser'); 
      while (DOMWindows.hasMoreElements()) { 
       let aDOMWindow = DOMWindows.getNext(); 
       if (aDOMWindow.gBrowser && aDOMWindow.gBrowser.selectedTab.getAttribute('linkedpanel') == msg.data.theLinkedPanel) { 
        //this is our window, as the currently selected tab linkedpanel is same as one the worker dealt with 
        var currentURL = aDOMWindow.gBrowser.currentURI; 
        aDOMWindow.gBrowser.selectedTab.contentWindow.alert('the user was prompted with js-ctypes and the user clicked on:' + aRet); 
        break; 
       } 
      } 
      break; 
     default: 
      console.error('no handle for msg from worker of aTopic:', msg.data.aTopic); 
    } 
} 

так, что этот пример делает, на установке/запуске аддона он получает самые последние окна браузера URL. он отправляет его в ctypes, ctypes выдает предупреждение уровня os, а затем ctypes отправляет обратно то, что щелкнул пользователь, а затем bootstrap.js находит это же окно и эту вкладку и с предупреждением javascript сообщает, что возвращаемое значение jsctypes os level msgbox ,

+0

Большое спасибо Noitidart, в значительной степени поможет вам. Прежде всего, я выполнил ваш ответ для части расширения браузера. Я сделаю уроженца, как только смогу закончить эту прежнюю часть. Я обновил свой вопрос, чтобы обновить свою последнюю ситуацию. @Noitidart, см. Редактирование. – Tutun