Я помогу вам с частями вопроса, с которыми я знаком (дополнения на основе 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 вопрос точно отвечает на вопрос, который вы задаете. Если бы это был я, я бы выбрал их в таком порядке.
- База данных Sqlite
- Именованные трубы
- Головки
(1) потому что для этого доступно много примеров кода, и их будет легко реализовать с обеих сторон. (2) потому что это был бы способ реализовать IPC, если бы мне предоставили полный контроль над обеими сторонами приложения. (3) последний, потому что я ненавижу это дерьмо (возможно, я предвзято относится к распределенным системам в колледже).
ТЛ; др
Загрузка страницы должна быть довольно простой. Посмотрите Addon Builder , чтобы начать работу с аддоном FF, и здесь , чтобы узнать об обнаружении загрузки страницы.
Связь на C # выполнима и рассматривается в этом SO Вопросе . Я бы сделал это с базой данных sqlite для простоты, если бы это был я.