помочь с расширением Firefox в нескольких окнах - PullRequest
1 голос
/ 15 января 2011

Я пишу расширение Firefox, которое создает сервер сокетов, который будет выводить URL-адрес активной вкладки, когда клиент устанавливает соединение с ним.У меня есть следующий код в моем файле JavaScript:

var serverSocket;

function startServer()
{
    var listener =
    {
        onSocketAccepted : function(socket, transport)
        {
            try {
                var outputString = gBrowser.currentURI.spec + "\n";
                var stream = transport.openOutputStream(0,0,0);
                stream.write(outputString,outputString.length);
                stream.close();
            } catch(ex2){ dump("::"+ex2); }
        },

        onStopListening : function(socket, status){}
    };

    try {
        serverSocket = Components.classes["@mozilla.org/network/server-socket;1"]
        .createInstance(Components.interfaces.nsIServerSocket);

        serverSocket.init(7055,true,-1);
        serverSocket.asyncListen(listener);
   } catch(ex){ dump(ex); }

   document.getElementById("status").value = "Started";
}



function stopServer ()
{
    if (serverSocket) 
    serverSocket.close();
}

window.addEventListener("load", function() { startServer(); }, false);
window.addEventListener("unload", function() { stopServer(); }, false);

Как это, он работает для нескольких вкладок в одном окне.Если я открываю несколько окон, он игнорирует дополнительные окна.Я думаю, что это создает сокет сервера для каждого окна, но так как они используют один и тот же порт, дополнительные сокеты не инициализируются.Мне нужно создать сокет сервера, когда браузер запускается и продолжает работать, когда я закрываю окна (Mac OS X).Когда я закрываю окно, но Firefox продолжает работать, сокет закрывается, и мне нужно перезапустить Firefox, чтобы запустить его.Как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 15 января 2011

Расширения Firefox накладываются на оконные объекты. Одним из способов решения этой проблемы является создание компонента XPCOM или поиск компонента, который уже был создан кем-то другим, чтобы позволить вам создавать функциональные возможности без привязки его к объектам окна.

Конечно, раздел № 2 ниже об уведомлениях наблюдателя также может быть полезен.

Возможное решение: # 1

Вместо вызова «startServer ()» каждый раз, когда открывается окно, у вас может быть флаг с именем windowCount, который вы можете увеличивать при каждом открытии нового окна. Если windowCount больше 0, не вызывайте startServer ().

Когда окна закрываются, вы можете уменьшить счетчик. Как только он достигнет 0, остановите сервер.

Вот информация с форумов Mozilla по этой проблеме: http://forums.mozillazine.org/viewtopic.php?f=19&t=2030279

Возможное решение № 2:

С учетом вышесказанного я также нашел документацию для уведомлений наблюдателя, которая может оказаться полезной, поскольку есть раздел, посвященный запуску и завершению работы приложения: https://developer.mozilla.org/en/Observer_Notifications

UPDATE:

Вот некоторые ресурсы по созданию компонентов XPCOM в JavaScript и в C ++:

1 голос
/ 21 января 2011

Вы, вероятно, хотите:

  1. Переместите ваш код в компонент JavaScript
  2. Зарегистрируйте свой компонент как profile-after-change наблюдатель
  3. Всякий раз, когда кто-либо устанавливает соединение с вашим сокетом, найдите активное окно и верните его URL.

Используйте что-то вроде

var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                   .getService(Components.interfaces.nsIWindowMediator);
var win = wm.getMostRecentWindow("navigator:browser");
var spec = win ? win.getBrowser().currentURI.spec : "";
var outputString = spec + "\n";

и т.д.

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