Подключите расширение Firefox с приложением C # - PullRequest
5 голосов
/ 17 апреля 2011

Мне нужно, чтобы у меня было событие, при котором каждый раз, когда пользователь загружает новую страницу и закрывает firefox, мне нужно, чтобы он вызывал в моем приложении C # метод, который заботится о поддержке пользовательской модели. Я точно знаю, что мне нужно создать какой-то тип расширения Firefox, где я использую JavaScript для проверки такого события. Однако я понятия не имею, как я собираюсь интегрировать свое приложение C # с расширением Firefox. Может ли кто-нибудь дать мне руководство?

Ответы [ 2 ]

3 голосов
/ 17 апреля 2011

Я помогу вам с частями вопроса, с которыми я знаком (дополнения на основе Javascript), и предложу некоторые предложения для других частей. Здесь ничего не идет!

Дополнения

Дополнения Firefox легко предоставляют инструменты, необходимые для обнаружения загрузки страниц и открытия / закрытия Firefox.

Для обнаружения загрузки страницы вы можете зарегистрировать прослушиватель события DOMContentLoaded в окне.

window.addEventListener("DOMContentLoaded", function(event){
    var url = event.originalTarget.location.href;
    alert("Oh yeah, a document is loading: " + url);
}, false);

Кроме того, вы можете зарегистрировать nsIWebProgressListener для прослушивания изменений местоположения . Это, вероятно, ближе к тому, что вы хотите, так как DOMContentLoaded также запускается для iframes.

var listener = {
    //unimplemented methods (just give functions which do nothing)
    onLocationChange: function(aWebProgress, aRequest, aLocation){
        var url = aLocation.asciiSpec;
        alert("Oh yeah, a the location changed: " + url);
    }
};
gBrowser.addTabsProgressListener(listener);

Для обнаружения открытия / закрытия Firefox сначала необходимо понять, как работают надстройки Firefox в отношении нескольких окон. Когда запускается новое окно Firefox, у вас в основном работают 2 отдельные копии вашего кода. Итак, если вы заботитесь о том, чтобы Firefox Windows открывался и закрывался, вы можете просто сделать:

window.addEventListener("load", function(event){ 
    alert("Looks like you just opened up a new window");
}, false);

window.addEventListener("unload", function(event){
    alert("Awh, you closed a window");
}, false);

Но, скорее всего, вы хотите обнаружить открытие / закрытие Firefox как всего приложения . Это достигается с помощью механизма совместного использования кода, который называется Javascript Modules . Модули Javascript загружаются всего один раз за время существования приложения. Таким образом, они позволяют вам обмениваться информацией между окнами. Для этого достаточно простого подсчета количества открытых и закрытых окон.

var EXPORTED_SYMBOLS = ["windowOpened", "windowClosed"];
var windowsOpened = 0;
function windowOpened(){
    if( windowsOpened === 0) {
        alert("The first window has been opened!");
    }
    windowsOpened++;
}

function windowClosed(){
    windowsOpened++;
    if( windowsOpened === 0) {
        alert("The last window has been closed!");
    }
}

Затем вы можете просто присоединить вышеупомянутые обработчики событий для вызова этих 2 методов из соответствующих им событий load и unload.

Итак, это все замечательно и все , но теперь вам нужно поработать с деталями, чтобы получить базовую настройку дополнения Firefox. К счастью, Mozilla предоставила удобный Addon Builder для облегчения этого. Весь код (кроме модуля Javascript) должен быть помещен в файл ff-overlay.js (при условии, что вы используете связанный компоновщик).

C # связь

Я немного менее осведомлен о межпроцессном взаимодействии с C #. Однако, возможно, я могу указать вам правильное направление и позволить умным людям в SO заполнить остальное.

Я считаю, COM-объекты - это метод связи между процессами в Windows. Таким образом, вы можете встроить бинарный компонент в ваше дополнение для осуществления связи. Однако, насколько я понимаю, настройка бинарных компонентов намного сложнее, чем стандартное дополнение на основе JavaScript. В любом случае, Mozilla предоставляет руководство по настройке в Visual Studio.

Если вы хотите держаться подальше от бинарных компонентов , у вас остались компоненты SDK с поддержкой javascript. Это включает в себя сокетную связь, файлы, каналы, базу данных sqlite и т. Д. Этот SO вопрос точно отвечает на вопрос, который вы задаете. Если бы это был я, я бы выбрал их в таком порядке.

  1. База данных Sqlite
  2. Именованные трубы
  3. Головки

(1) потому что для этого доступно много примеров кода, и их будет легко реализовать с обеих сторон. (2) потому что это был бы способ реализовать IPC, если бы мне предоставили полный контроль над обеими сторонами приложения. (3) последний, потому что я ненавижу это дерьмо (возможно, я предвзято относится к распределенным системам в колледже).

ТЛ; др

Загрузка страницы должна быть довольно простой. Посмотрите Addon Builder , чтобы начать работу с аддоном FF, и здесь , чтобы узнать об обнаружении загрузки страницы.

Связь на C # выполнима и рассматривается в этом SO Вопросе . Я бы сделал это с базой данных sqlite для простоты, если бы это был я.

1 голос
/ 17 апреля 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...