gpt4 book ai didi

javascript - 帮助在多个窗口中使用 Firefox 扩展

转载 作者:行者123 更新时间:2023-11-30 13:36:18 26 4
gpt4 key购买 nike

我正在编写一个 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 才能使其运行。我该怎么做?

最佳答案

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

当然,下面关于观察者通知的第 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 组件的资源:

关于javascript - 帮助在多个窗口中使用 Firefox 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4701804/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com