Firefox addon 通过webextension的Firefox本机消息传递

Firefox addon 通过webextension的Firefox本机消息传递,firefox-addon,firefox-addon-webextensions,Firefox Addon,Firefox Addon Webextensions,为firefox创建了一个webextension(目前使用的是Nightly 52),它使用本机消息在Linux(Ubuntu1432x)上启动java程序 webextension加载、读取.json文件并读取指向启动java程序的脚本的路径。JSON和路径与我使用时一样正确: var native=browser.runtime.connectNative(“密码管理器”); console.log(“native.name”+native.name)//输出passwordmanager

为firefox创建了一个webextension(目前使用的是Nightly 52),它使用本机消息在Linux(Ubuntu1432x)上启动java程序

webextension加载、读取.json文件并读取指向启动java程序的脚本的路径。JSON和路径与我使用时一样正确:

var native=browser.runtime.connectNative(“密码管理器”);
console.log(“native.name”+native.name)//输出passwordmanager。
native.onDisconnect.addListener(函数(m){console.log(“Disconnected”);});
上面的代码打印本机端口的名称,还打印“Disconnected”。因此,我猜本机应用程序由于某种原因正在终止

该应用程序目前只是一个框架,它只执行
sysout
和读取
sysin
,如果直接通过shell脚本启动它,则可以正常工作

调试webextension时,我无法单步执行对connectNative的调用,因为它只是单步执行该调用,而不是单步执行。所以有点选择不出来,出了什么问题

请让我知道是否有人能够创建基于FF webextension的本机消息传递应用程序,以及任何关于我可能做错了什么的指针


谢谢

此解决方案向您展示了如何检测onConnect和onFail。这会帮助你找出真正的问题

因此,我认为单从JS端使用
connectNative
无法正确处理错误。如果涉及到exe端,则可以执行一些错误处理,但在发生错误时,无法获取“错误原因”字符串。该错误仅记录到控制台

首先确保设置deeloper prefs,以便消息显示在浏览器控制台中。您可以使用此加载项,也可以阅读它为您提供的MDN页面上的加载项描述,其中包含要设置的prefs

然后,这就是如何进行某种错误处理(无错误原因)(伪代码-我可能需要callbck中的
.bind
):

函数connectNative(aAppName、onConnect、onFail){
var listener=函数(有效负载){
如果(!已连接){
连接=真;
端口onDisconnect.removeListener(连接失败);
onConnect();
}否则{
//处理消息
}
}
var failedConnect=函数(){
onFail('由于无法达到的原因而失败-但是,请查看浏览器控制台,因为它被记录在那里');
}
var=false;
var port=chrome.runtime.connectNative(aAppName);
port.onMessage.addListener(监听器);
端口.onDisconnect.addListener(失败连接);
返回端口;
}

现在在你的exe中,一旦它启动,让它写一些东西给标准输出。这将触发onConnect

此解决方案向您展示如何检测onConnect和onFail。这会帮助你找出真正的问题

因此,我认为单从JS端使用
connectNative
无法正确处理错误。如果涉及到exe端,则可以执行一些错误处理,但在发生错误时,无法获取“错误原因”字符串。该错误仅记录到控制台

首先确保设置deeloper prefs,以便消息显示在浏览器控制台中。您可以使用此加载项,也可以阅读它为您提供的MDN页面上的加载项描述,其中包含要设置的prefs

然后,这就是如何进行某种错误处理(无错误原因)(伪代码-我可能需要callbck中的
.bind
):

函数connectNative(aAppName、onConnect、onFail){
var listener=函数(有效负载){
如果(!已连接){
连接=真;
端口onDisconnect.removeListener(连接失败);
onConnect();
}否则{
//处理消息
}
}
var failedConnect=函数(){
onFail('由于无法达到的原因而失败-但是,请查看浏览器控制台,因为它被记录在那里');
}
var=false;
var port=chrome.runtime.connectNative(aAppName);
port.onMessage.addListener(监听器);
端口.onDisconnect.addListener(失败连接);
返回端口;
}

现在在你的exe中,一旦它启动,让它写一些东西给标准输出。这将触发
onConnect

有很多可能出错的地方,最好从浏览器控制台开始。关于MDN的这一页详细介绍了如何处理您可能在那里看到的一些消息:您看到这个示例了吗?它帮助我--将您的
connectNative(…)
行包装在
try-catch
中,以查看错误是什么样的:
尝试{chrome.runtime.connectNative(…)}catch(ex){console.error('ex:',ex)}
。如果您使用的是promise版本,那么请坚持使用
.catch(函数(ex){console.error('ex:',ex)}
谢谢,BrowserConsole没有任何错误。我也尝试了try/catch,没有异常。请注意,在connectNative之后,我有一个port.name,它打印了本机应用程序的名称。现在我想知道应用程序是否正在启动和退出…@Noitidart,是的,该示例对我有效。我的扩展仍然不起作用我现在对如何调试这个有点不知所措:(我不知道我在想什么。实际上,我在处理connectNative的错误/成功方面也遇到了问题。我能得到的最接近的结果是:
var port=chrome.runtime.connectNative('..');port.onDisconnect.addListener(blah)
,断开连接回调会触发,但没有给出原因。但原因会记录到控制台。@AndrewSwan-您能为此提供帮助吗?可能会出现很多问题,一个好的开始是查看浏览器控制台。关于MDN的这一页详细介绍了如何处理可能在控制台中看到的一些消息:您看到了吗看到这个例子了吗?它帮助我--包装您的
connectNative