Javascript Chrome扩展如何向网页公开自定义API?

Javascript Chrome扩展如何向网页公开自定义API?,javascript,google-chrome-extension,Javascript,Google Chrome Extension,我的web应用程序需要访问UDP套接字,这是web不支持的,可能是出于安全原因。我已经决定创建一个chrome扩展,用户需要安装它才能使用我的web应用程序,当然这样做的风险由他们自己承担 我的扩展的想法是通过向网页添加一个全局变量,例如myExtension.udpSockets,来公开自定义UDP套接字API。在尝试访问我的UDP套接字API之前,该网页可以先检查window.myExtension是否存在(扩展已安装) 当一个网页访问我的UDP套接字API时,我将创建一个弹出窗口,以确保用

我的web应用程序需要访问UDP套接字,这是web不支持的,可能是出于安全原因。我已经决定创建一个chrome扩展,用户需要安装它才能使用我的web应用程序,当然这样做的风险由他们自己承担

我的扩展的想法是通过向网页添加一个全局变量,例如
myExtension.udpSockets
,来公开自定义UDP套接字API。在尝试访问我的UDP套接字API之前,该网页可以先检查
window.myExtension
是否存在(扩展已安装)

当一个网页访问我的UDP套接字API时,我将创建一个弹出窗口,以确保用户希望授予该网页访问UDP套接字的权限,并说明安全含义

我目前在内容脚本中有我的代码,例如

function createUDPSocket() {
  // use chrome API
  console.log("Creating a UDP socket!");
}
我知道我可以通过修改DOM将JavaScript注入到网页中

document.createElement("script");
// etc.
但是我怎样才能将我的API公开给这个网页呢?它们在单独的JS上下文中,所以这不起作用。他们之间有什么交流方式吗



Edt:我似乎在寻找类似于Firefox扩展的东西。

Chrome中没有exportFunction/cloneInto,因此您必须使用DOM脚本元素和消息传递

如果只将API公开给一个或多个URL,则可以直接使用安全的后台脚本(它无法连接到内容脚本)。否则,对于DOM消息传递,我建议使用带有唯一或更好的随机事件id的
CustomEvent
,绝对不是postMessage,这样就没有其他代码可以窃听您的频道(假设您使用随机事件id,使用textContent创建时可以传递给脚本元素,请参阅)


在任何消息传递方法中,数据都必须与JSON兼容(数字、字符串、布尔值、null以及由这些类型组成的对象/数组)。尝试发送不兼容的对象,如函数或DOM元素、映射或类型化数组,可能会导致整个消息为空。

我认为您必须插入脚本,然后通过postMessage API与扩展通信。所以,实际上,您将在每一端包装postMessage。@Brad谢谢,我将搜索它,看看它是否有效