我最近开始开发我的第一款Chrome扩展程序,主要是为了了解我是否可以做到这一点,并且我想知道消息传递的具体方式。这可能是关于windows.postMessage API的更普遍的问题,但我想知道是否有人能够解释控制消息接收和传播的幕后过程。Chrome扩展消息架构
这是我目前的消息WRT Chrome扩展的理解:
- 有四类的Javascript:
(1)
JS绑在弹出,(2)
JS在后台或作为事件运行,(3)
JS内容脚本,以及注入到页面的JS的(4)
。 (2) -> (1)
和(3) -> (1)
由runtime.sendMessage()
发送。只有在弹出窗口打开时才会收到它们。(1) -> (2)
和(3) -> (2)
分别由runtime.sendMessage()
或tabs.sendMessage()
从(3)
和(1)
发送。它们被尽快接收,因为背景/事件JS是持久的(我不太确定这是否合适,因为事件JS必须绑定到eventListeners中)。由tabs.sendMessage()
发送。它们被尽快接收,因为只要网页是内容脚本(因为它存在于并行沙箱中),内容脚本就处于活动状态。(*) -> (4)
和(4) -> (*)
不能被chrome.*
的安全问题处理,但是(3) -> (4)
和(4) -> (3)
可以通过window.postMessage()
,进行处理,因为它们都在网页的上下文中存在。
有几件事情我有关于具体问题 - 当然,如果我已经正确地描述了一些事情,第一个问题。其余的是这些:
- 究竟是
runtime.sendMessage()
和tabs.sendMessage()
是规定了哪些JS实际上可以使用它们之间的区别? - 消息如何传递?当调用
*.sendMessage()
或window.postMessage()
时,后台会发生什么情况?