通过 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.