目录
Unchecked runtime.lastError: The message port closed before a response wa received.
使用 eval
Content script 注入 iframe
Extenstion 内的 html
站外连接
1. Unchecked runtime.lastError: The message port closed before a response wa received.
此错误一般发生在 background JS 和 content JS 通讯的时候, 问题描述得也非常清楚, 解决方法非常简单, 即在收到消息后, 在同步时间里 send respnose 就可以了.
注意: send response 如果在异步方法里, 并不能解决这个问题.
- // Example:
- // background JS 或 content JS
- Chrome.extension.onMessage.addListener(function(request, _, sendResponse) {
- sendResponse('');
- });
2. 使用 eval
Chrome Extension 默认是禁止使用 eval 方法的, 使用之前, 需要先在 manifest.JSON 里开启, 如下:
"content_security_policy": "script-src'self''unsafe-eval'; object-src 'self'"
3. 使用 iframe
注入 iframe 同样受 content_security_policy 限制, 而且会受到目标站点的 content_security_policy 限制. 关于 content_security_policy 内容比较多, 这里分成两种情况
3.1 Extension 内的 HTML
注入的 iframe 加载 Extension 内的 HTML 稍微没有这么麻烦, 只需要在 manifest.JSON 里指定要加载的 HTML 就好了
"web_accessible_resources": ["example.html"]
注入 iframe 的 src, 可以使用 Chrome.runtime.getUrl() 来获取地址
let src = Chrome.runtime.getURL('example.html')
注: 要注入网站的 content_security_policy 对这样的 iframe 注入会不会有影响, 目前还没有测试到.
此方法在 Fika (reader-mode) 扩展里有使用
3.2 站外连接
如上所说, 注入 iframe 是受目标网站的 content_security_policy 限制的, 所以, 如果目标网站不允许, 你的注入将会失败, 如 medium.com 的 content_security_policy 关于 frame-src 的部分:
- default-src 'self';
- ...
- frame-src chromenull: https: webviewprogressproxy: medium: 'self';
- ...
它允许了 https 的地址, 所以, 注入的 iframe 加载 https 地址是没有问题的, 而 http 的地址将被拒绝. 因为注入已经离开了 Chrome Extenstion 的范围, 所以, 不管你怎么对 Chrome Extension 的 content_security_policy 进行设置并不会有用.
关于 content_security_policy, 可以看
来源: http://www.bubuko.com/infodetail-2969542.html