在多个窗口中帮助Firefox扩展

时间:2011-01-15 19:52:06

标签: javascript sockets firefox firefox-addon

我正在编写一个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 个答案:

答案 0 :(得分:2)

Firefox扩展程序覆盖绑定到窗口对象。解决此问题的一种方法是创建一个XPCOM组件或找到其他人已经创建的组件,以允许您构建功能而不将其绑定到窗口对象。

当然,下面关于观察员通知的第2节也可能有所帮助。

可能的解决方法:#1

而不是调用" startServer()"每次打开一个窗口时,你都可以有一个名为windowCount的标志,每次打开一个新窗口时都可以增加该标志。如果windowCount大于0,则不要调用startServer()。

当窗口关闭时,您可以减少计数。一旦达到0,停止服务器。

以下是来自Mozilla论坛的有关此问题的信息: http://forums.mozillazine.org/viewtopic.php?f=19&t=2030279

可能的解决方法#2:

话虽如此,我还发现了Observer Notifications的文档,这可能会有所帮助,因为有一个关于应用程序启动和关闭的部分: https://developer.mozilla.org/en/Observer_Notifications

<强>更新

以下是有关在JavaScript和C ++中创建XPCOM组件的一些资源:

答案 1 :(得分:1)

你可能想:

  1. 将您的代码移至JavaScript组件
  2. 将您的组件注册为profile-after-change observer
  3. 每当有人与您的套接字建立连接时,请找到活动窗口并返回其URL。
  4. 使用类似

    的内容
    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";