Chrome 本机消息传递:页面无法与扩展程序通信

如何解决Chrome 本机消息传递:页面无法与扩展程序通信

我正在编写一个简单的 Chrome 扩展程序,它使用本机消息传递与本机主机进行通信。 我已经密切关注 native messaging(扩展 本机主机)和 host-page communication 的 Chrome 文档,但我不得不说他们留下了许多重要的细节。

我可以毫无问题地启动本机主机,并且扩展程序和主机之间的通信可以正常工作。 但是,所有“前端”(页面内容脚本和后台脚本)都不能相互通信。

层级如下:

页面

window.postMessage({ type: "TO_THE_EXTENSION",text: "Hello from the webpage!" },"*");
// this never reaches the content script

contentscript.js(脚本似乎在页面上正确加载)

var port = chrome.runtime.connect(); // this throws an error

window.addEventListener("message",(event) => {
  // We only accept messages from ourselves
  if (event.source != window)
    return;

  if (event.data.type && (event.data.type === "TO_THE_EXTENSION")) {
    console.log("Content script received: " + event.data.text);
    port.postMessage(event.data.text);
  }
},false);

内容脚本的第一行立即抛出

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

background.js(这在从扩展工具栏重新加载扩展时有效)

var port = chrome.runtime.connectNative('my.example.app.com');

port.onMessage.addListener(function(msg) {
  console.log("Received" + msg);
});
port.ondisconnect.addListener(function() {
  console.log("disconnected");
});
port.postMessage( {'text': 'Hello'} );

manifest.json

{
  "name": "Simple extension","description": "Simple extension using native messaging","version": "1.0","manifest_version": 3,"content_scripts": [
   {
      "matches": ["http://*/*","https://*/*"],"js": ["contentscript.js"]      
   }
  ],"background": {
      "service_worker": "background.js"
  },"permissions": ["nativeMessaging"]
}

感谢任何帮助,并提供指向文档的指针,这些文档解释了整个 page -> content script -> background script -> native host应该如何实际工作。我不敢相信 Chrome 文档中没有使用本机消息传递的扩展程序的最小、完整且可验证的示例。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?