我最近開始開發我的第一款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()
時,後臺會發生什麼情況?