javascript - Chrome 扩展如何向网页公开自定义 API?
问题描述
我的 Web 应用程序需要访问 UDP 套接字,这是 Web 不支持的,可能是出于安全原因。我决定创建一个 chrome 扩展,用户需要安装它才能使用我的 Web 应用程序,当然这样做需要他们自担风险。
这个想法是让我的扩展通过添加全局变量(例如myExtension.udpSockets
网页)来公开自定义 UDP 套接字 API。window.myExtension
在尝试访问我的 UDP 套接字 API 之前,该网页可以先检查是否存在(安装了扩展程序)。
当网页访问我的 UDP 套接字 API 时,我将创建一个弹出窗口以确保用户愿意让该网页访问 UDP 套接字并说明安全隐患。
我目前在内容脚本中有我的代码,例如
function createUDPSocket() {
// use chrome API
console.log("Creating a UDP socket!");
}
我知道我可以通过修改 DOM 将 JavaScript 注入网页。
document.createElement("script");
// etc.
但是我怎样才能将我的 API 暴露给这个网页呢?它们位于不同的 JS 上下文中,因此这是行不通的。他们之间有什么交流方式吗?
Edt:看来我正在寻找类似于exportFunction
Firefox 扩展的东西。
解决方案
Chrome 中没有 exportFunction/cloneInto,因此您必须使用 DOM 脚本元素和消息传递。
如果您只向一个或多个 URL 公开 API,则可以通过直接向后台脚本使用安全扩展 API 消息传递externally_connectable
(它无法连接到内容脚本)。否则,对于 DOM 消息传递,我建议使用CustomEvent
唯一甚至更好的随机事件 id,绝对不是 postMessage,这样就没有其他代码可以窃听您的频道(假设您使用可以传递给脚本元素的随机事件 id)使用 textContent 创建,参见方法 2)。
在任何消息传递方法中,您的数据都必须与 JSON 兼容(数字、字符串、布尔值、null 和由这些类型组成的对象/数组)。尝试发送不兼容的对象(例如函数或 DOM 元素或Map
类型数组)可能会导致您的整个消息为空。
推荐阅读
- hibernate - 如何在本机查询中访问子类实体字段?
- flask - 为什么我的服务器抱怨“错误的授权标头”?
- git - 是否可以将更改拉/推到在另一台 PC 上克隆的 Git 存储库?
- android - 从 Android 手机设置中的 24 小时格式更改后,gson 无法反序列化日期时间
- django - 如何使用来自 Django 的序列化数据访问 Angular 中的 ForeignKey 模型属性
- sql - FROM 关键字不是预期的
- c# - Asp.net mvc 5 code first class的字段名不存储在数据库中
- java - 如何在android中摇晃手机3次后检测摇晃和敬酒消息
- angular - 选项的默认值仅在 IE 中不以角度形式出现
- node.js - 在 Nodejs 中使用数千个不同的代理 IP 转发 TCP 连接?