1

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

回答

2
  • 有四類的Javascript:(1) JS綁在彈出,(2) JS在後臺或作爲事件運行,在內容腳本(3) JS和JS (4)注入頁面。

(1)(2)實際上是相同的( 「彈出」 下的 「擴展碼」 也屬於 - 見)。

  • (2) -> (1)(3) -> (1)runtime.sendMessage()發送。只有在彈出窗口打開時纔會收到它們。
  • (1) -> (2)(3) -> (2)分別由runtime.sendMessage()tabs.sendMessage()(3)(1)發送。它們被儘快接收,因爲背景/事件JS是持久的(我不太確定這是否合適,因爲事件JS必須綁定到eventListeners中)。

runtime.sendMessage的確可以通過(1)(2)(3)發送。在接收者的角色中,(1)(2)之間沒有特別的區別。這裏是my classification of scripts進來的地方:由chrome.runtime.sendMessage發送的消息被擴展代碼接收,除了發送者的幀。例如,如果您將放在後臺頁面中,並且從背景頁面調用chrome.runtime.sendMessage,則將在該幀中觸發chrome.runtime.onMessage

event pages正在使用中時,只有在等待事件頁面加載之後纔會調度消息事件。

  • (1) -> (3)(2) -> (3)tabs.sendMessage()發送。它們被儘快接收,因爲只要網頁是內容腳本(因爲它存在於並行沙箱中),內容腳本就處於活動狀態。

chrome.tabs.sendMessage是有道理的,只要你有一個有效的標籤ID。由於背景頁面沒有標籤ID,因此無法使用tabs.sendMessage將消息發送到背景頁面。內容腳本,選項卡中的擴展頁面,選項卡中的擴展框架都可以接收由chrome.tabs.sendMessage發送的郵件,因爲它們是該選項卡的一部分。

  • (*) -> (4)(4) -> (*)不能被chrome.*的安全問題處理,但是(3) -> (4)(4) -> (3)可以通過window.postMessage(),進行處理,因爲它們都在網頁的上下文中存在。

(4) -> (1,2)(網頁擴展碼)經由externally_connectable是可能的。

(4) -> (4)也可能與window.postMessage,但不直接與*.sendMessage(因爲這不包括髮件人)。

  • 究竟是runtime.sendMessage()tabs.sendMessage()是規定了哪些JS實際上可以使用它們之間的區別?

tabs.sendMessage當將該翼片API可只能用,將消息發送到接片,而runtime.sendMessage還可以通過內容腳本中使用。

可以使用tabs.sendMessage發送消息到一個標籤,使用runtime.sendMessage發送消息到您的擴展的另一部分。

  • 消息如何傳遞?當調用*.sendMessage()window.postMessage()時,後臺會發生什麼情況?