【问题标题】:Can message passing be used to detect if another extension is enabled?可以使用消息传递来检测是否启用了另一个扩展程序吗?
【发布时间】:2020-02-03 03:01:36
【问题描述】:

我想检查是否启用了另一个扩展程序。我了解管理 API 可用于检查是否启用了另一个扩展 (Detect if another Chrome Extension is installed)。但是,我尝试请求最低权限,因此我想问一下我是否可以使用消息传递。

扩展 A

let extPort = chrome.runtime.connect(ExtB);
extPort.postMessage({from: "ExtA", fn: "greeting"});
extPort.onMessage.addListener(function(message, sender) {
    if ((message.from == "ExtB") && (message.fn == "greeting")) {
        console.log("Ext B is enabled");
    }
});

扩展 B

chrome.runtime.onConnectExternal.addListener(function(port) {
    port.onMessage.addListener(function(message, sender) {
        if ((message.from == "ExtA") && (message.fn == "greeting")) {
                port.postMessage({from: "ExtB", fn: "greeting"});
        }
    });
});

如果启用了扩展 B,此方法可以正常工作,但如果未启用扩展 B,则会显示错误消息。有什么方法可以处理这个错误信息?

Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.

【问题讨论】:

  • 错误消息包含一个明显的提示如何解决它:只需在您的onMessage 侦听器中检查runtime.lastError(将其添加到您的if 语句中就足够了)
  • 对不起。你能给我更多的提示吗? let extPort = chrome.runtime.connect(ExtB); 出现错误消息,chrome.runtime.connect 没有回调函数
  • 我写的是:onMessage 监听器,而不是connect 的。上面的代码真的是你自己写的吗?
  • 首先感谢您的帮助 =) 我是 Chrome 扩展程序的新手。在您鼓励我检查 chrome API 规范后,这个问题得到了解决。正如我所提到的,let extPort = chrome.runtime.connect(ExtB); 会发生此错误,并且因为没有 runtime.onConnect 事件侦听器(未启用 ext B)。在 onMessage 侦听器中添加检查并不能解决问题,因为端口/连接设置不正确。应在 onDisconnect 侦听器中添加检查。

标签: javascript google-chrome-extension message-passing


【解决方案1】:

检查 chrome.runtime.lastError 应该添加到 onDisconnect 监听器中。

extPort.onDisconnect.addListener(function(object) {
    if (chrome.runtime.lastError) {
        extPort.disconnect();
    }
}); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 2016-04-13
    • 2011-12-15
    • 2021-09-20
    相关资源
    最近更新 更多