首页 > 解决方案 > 为什么 http 未定义 chrome.runtime 但 https 可以正常工作

问题描述

当我在 devtool 上调试 javaScript 时。

   chrome.runtime

参见“ http://www.qq.com ”,它显示: chrome.runtime 未定义。 请参阅http 预览

但是当我在 https 站点(https://www.qq.com)上调试它时,它工作正常。见https 预览

提示:所有脚本都在顶部框架上运行。

我可以更改“chorme:flags”来启用它吗?

标签: google-chrome-extension

解决方案


我现在知道为什么了。

没有安装扩展时,“chrome.runtime.sendMessage”不存在。---因为 chrome 66+。见:https ://bugs.chromium.org/p/chromium/issues/detail?id=835287

rdevlin 发表的第 29 条评论....@chromium.org,4 月 25 日 对于这些被欺骗的错误中的至少一些案例,我认为这是由修订版 39f8939309fe39bccc17fa1280b6c7f25c411947 引起的。这修改了 cryptotoken 组件扩展(自动内置在 Chrome 中)的 externally_connectable 属性,以仅接受来自 https URL 的传入连接,而之前它是所有 URL。当它设置为所有 URL 时,chrome.runtime.sendMessage 将始终可用,因为任何 URL 都可能向加密令牌组件扩展发送消息。

但是,这是按预期工作的。cryptotoken 扩展只接受来自 https 源的连接(因此任何其他的都将被忽略),并且向任何其他扩展发送消息需要接收扩展在 externally_connectable 选项中列出 URL。此外,这意味着以前任何依赖此行为的扩展都可能无法发送消息,而是异步发送(一旦消息未能找到合适的接收者)而不是同步发送(因为运行时未定义)。如果扩展在 externally_connectable 中列出了 URL,那么 chrome.runtime 应该仍然存在。如果扩展程序未在 externally_connectable 中列出该站点,则 chrome.runtime 不可用是预期行为。

对于非沙盒化 chrome-extension:// 页面或已安装扩展程序在清单的 externally_connectable 字段中指定该网页的 URL 的网页,是否存在未定义 chrome.runtime 的情况?如果是这样,请附上演示此问题的扩展。如果不是,这听起来像是 WAI。

修复:使用:manifest 添加一个扩展。

"externally_connectable": {
    "ids": [
      "*"
    ],
    "matches": [
      "http://test.yoursite.in:9090/*",
      "*://*.chromium.org/*"
    ]
  },

认为所有。


推荐阅读