Как создать расширение Firefox для отправки URL активной вкладки на свой собственный, аналогично встроенному обмену сообщениями в Chrome, и установить его через msi

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

Я хочу добиться того же с 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, должно отображаться предупреждение вверх из самого браузера (не из собственного в данный момент), отображая URL-адрес активной вкладки. Я даже не понимаю, как файлы js будут вызываться или выполняться, как эта строка myWorker.addEventListener('message', handleMessageFromWorker); будет работать или мне нужно добавить другого слушателя. Вообще ничего не происходит. Как отлаживать или действовать дальше? Пожалуйста помоги.


person Tutun    schedule 27.11.2014    source источник
comment
Чтобы установить из msi, ознакомьтесь с этой темой: stackoverflow .com / questions / 3888316 /   -  person Noitidart    schedule 27.11.2014
comment
Я большой поклонник js-ctypes, поэтому дайте мне знать, когда начнете :) Вы можете увидеть, как много моих js-ctypes работают на gist.github.com/search?q=ctpyes также есть тег stackoverflow jsctypes, в котором много полезного :)   -  person Noitidart    schedule 27.11.2014
comment
Большое спасибо за эту ценную информацию. Я слежу за ними сейчас и обязательно сообщу вам о результатах.   -  person Tutun    schedule 28.11.2014
comment
Вы можете найти это полезным: mar10.noblogs.org/post/2014/10/02/   -  person Noitidart    schedule 01.12.2014


Ответы (1)


Чтобы получить текущий 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;
                }
            }

Если вы не проверяете gBrowser, aDOMWindow.location, скорее всего, будет хромированным путем.

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

Мы бы сделали это из 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
    });
}

Затем в worker сделаем что-то вроде этого:

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';
    }
}

Затем снова в bootstrap.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 выдает предупреждение об уровне ОС, а затем ctypes отправляет обратно то, что пользователь щелкнул, затем bootstrap.js находит то же окно и эту вкладку и с помощью предупреждения javascript сообщает, какое возвращаемое значение msgbox уровня jsctypes было .

person Noitidart    schedule 27.11.2014
comment
Большое спасибо Noitidart, в значительной степени от вас помощь. Прежде всего, я следил за вашим ответом в части расширения браузера. Сделаю родной, как только смогу закончить эту бывшую часть. Я отредактировал свой вопрос, чтобы обновить свою последнюю ситуацию. @Noitidart, пожалуйста, посмотрите правку. - person Tutun; 03.12.2014