【问题标题】:Firefox native messaging through webextension通过 web 扩展的 Firefox 原生消息传递
【发布时间】:2018-08-30 14:59:10
【问题描述】:

为 firefox(目前使用 Nightly 52)创建了一个 webextension,它使用本地消息在 Linux(Ubuntu 14、32x)上启动一个 java 程序。

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"); });

上面的代码打印了本机端口的名称,也打印了“断开连接”。所以我猜测本机应用程序由于某种原因而终止。

该应用程序现在只是骨架,它只是执行sysout 并读取sysin 并且如果直接通过shell 脚本启动它则可以正常工作。

在调试 webextension 时,我无法介入对 connectNative 的调用,因为它只是跳过该调用而不是介入。如此多的选择出了什么问题。

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

谢谢

【问题讨论】:

  • 有很多事情可能会出错,一个好的起点是查看浏览器控制台。 MDN 上的此页面详细介绍了如何处理您可能会在此处看到的一些消息:developer.mozilla.org/en-US/Add-ons/WebExtensions/…
  • 你看到这个例子了吗?它帮助了我 - github.com/mdn/webextensions-examples/blob/master/… - 将您的 connectNative(...) 行包装在 try-catch 中,以查看错误是这样的:try { chrome.runtime.connectNative(...) } catch (ex) { console.error('ex:', ex) }。如果您使用的是 Promise 版本,请坚持使用 .catch(function(ex) { console.error('ex:', ex) }
  • 谢谢,BrowserConsole 没有任何错误。我也试过try/catch,没有例外。请注意,在 connectNative 之后,我有一个 port.name 并打印了本机应用程序的名称。现在我想知道应用程序是否正在以某种方式启动和退出...
  • @Noitidart,是的,这个例子对我有用。我的扩展仍然无法工作,我现在对如何调试它一无所知:(
  • 射击我不知道我在想什么。实际上,我在使用 connectNative 处理错误/成功时也遇到了问题。我能得到的最接近的是:var port = chrome.runtime.connectNative('..'); port.onDisconnect.addListener(blah);,断开回调触发,但没有给出原因。原因已记录到控制台。 @AndrewSwan - 你能提供任何帮助吗?

标签: firefox-addon firefox-addon-webextensions


【解决方案1】:

此处的此解决方案向您展示了如何检测 onConnect 和 onFail。它应该可以帮助您找出真正的问题。

所以我认为您不能仅从 JS 方面使用 connectNative 进行正确的错误处理。如果涉及到 exe 端,您可以进行一些错误处理,但是当发生错误时,您无法获得“错误原因”的字符串。该错误仅记录到控制台。

首先确保设置您的 deeloper 首选项,以便消息显示在您的浏览器控制台中。您可以使用此插件 - 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2011-03-01
    • 1970-01-01
    相关资源
    最近更新 更多