通过 webextension 的 Firefox 本机消息传递
Firefox native messaging through webextension
为 firefox 创建了一个网络扩展(目前使用 Nightly 52),它使用本机消息在 Linux(Ubuntu 14、32x)上启动 java 程序。
Web 扩展加载、读取 .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 的本机消息传递应用程序以及关于我可能做错了什么的任何指示,请告诉我。
谢谢
这里的解决方案向您展示了如何检测 onConnect 和 onFail。它应该可以帮助您找出真正的问题。
所以我认为您无法仅从 JS 端使用 connectNative
进行正确的错误处理。如果涉及到 exe 端,您可以做一些错误处理,但是当发生错误时,您无法获得 "error reason" 的字符串。错误仅记录到控制台。
首先确保设置您的开发者首选项,以便消息显示在您的浏览器控制台中。您可以使用此插件 - 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 中,一旦启动,就让它写入标准输出。这将触发 onConnect
.
为 firefox 创建了一个网络扩展(目前使用 Nightly 52),它使用本机消息在 Linux(Ubuntu 14、32x)上启动 java 程序。
Web 扩展加载、读取 .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 的本机消息传递应用程序以及关于我可能做错了什么的任何指示,请告诉我。
谢谢
这里的解决方案向您展示了如何检测 onConnect 和 onFail。它应该可以帮助您找出真正的问题。
所以我认为您无法仅从 JS 端使用 connectNative
进行正确的错误处理。如果涉及到 exe 端,您可以做一些错误处理,但是当发生错误时,您无法获得 "error reason" 的字符串。错误仅记录到控制台。
首先确保设置您的开发者首选项,以便消息显示在您的浏览器控制台中。您可以使用此插件 - 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 中,一旦启动,就让它写入标准输出。这将触发 onConnect
.