为firefox(目前使用Nightly 52)创建了一个webextension,它使用本机消息传递在Linux上启动java程序(Ubuntu 14,32x)。
webextension加载,读取.json文件并读取指向启动java程序的脚本的路径。当我使用时,JSON和路径是正确的:
var native = browser.runtime.connectNative("passwordmanager");
console.log("native.name" + native.name); //outputs passwordmanager.
native.onDisconnect.addListener(function(m) { console.log("Disconnected"); });
以上代码打印本机端口的名称,并打印“Disconnected”。所以我猜测本机应用程序因某种原因终止。
应用程序现在只是框架,它只是sysout
并且读取sysin
并且如果直接通过shell脚本启动它,则可以正常工作。
在调试webextension时,我无法进入对connectNative的调用,因为它只是逐步调用该调用而不是执行步骤。所以选择出错了。
如果有人能够根据FF webextension创建本机消息传递应用程序以及我可能做错的任何指示,请告诉我。
由于
答案 0 :(得分:4)
此解决方案向您展示了如何检测onConnect和onFail。它应该可以帮助你找出真正的问题。
所以我不认为你可以单独从JS方面使用connectNative
进行适当的错误处理。如果你涉及exe方面,你可以做一些错误处理,但你不能得到一个字符串"错误原因"发生错误时该错误仅记录到控制台。
首先确保设置deeloper prefs,以便在浏览器控制台中显示消息。您可以使用此插件 - https://addons.mozilla.org/en-US/firefox/addon/devprefs/ - 或者读取该插件说明,它会为您提供带有要设置的首选项的MDN页面。
然后这就是你可以做某种错误处理的方法(没有错误原因)(伪代码 - 我可能需要在callbcks中使用.bind
):
function connectNative(aAppName, onConnect, onFail) {
var listener = function(payload) {
if (!connected) {
connected = true;
port.onDisconnect.removeListener(failedConnect);
onConnect();
} else {
// process messages
}
}
var failedConnect = function() {
onFail('failed for unattainable reason - however see browser console as it got logged there');
}
var connected = false;
var port = chrome.runtime.connectNative(aAppName);
port.onMessage.addListener(listener);
port.onDisconnect.addListener(failedConnect);
return port;
}
现在在你的exe中,一旦它启动,就让它写入stdout的东西。这将触发onConnect
。