我正在编写一个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以使其运行。我该怎么做?
答案 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)
你可能想:
profile-after-change
observer 使用类似
的内容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";
等