中將消息發送到IFRAME我希望能夠從全局頁面向其中一個選項卡中的IFRAME內部的腳本運行內容腳本。我發現Safari擴展API可能有一個不允許的設計疏忽。 (與Chrome擴展API相反,Chrome擴展API對擴展的各個組件之間的消息傳遞有更全面的支持)。Safari擴展無法在選項卡
基本上,我有一個inject.js注入到所有幀和它們的IFRAME。在injected.js,我已在從全球頁面醒目消息如下:
safari.self.addEventListener("message", function(msg) {
/* do something according to the msg */
} , false);
在我的全球網頁,我有以下代碼廣播消息給注入腳本:
var broadcast = function(message_name) {
var ws = safari.application.browserWindows;
for (var i = 0; i < ws.length; i++) {
var ts = ws[i].tabs;
for (var j = 0; j < ts.length; j++) {
ts[j].page.dispatchMessage(message_name);
}
}
};
我發現的是,這些消息只能到達注入標籤的頂框的inject.js。這些消息永遠達不到在子IFRAME中注入的消息。
看起來,SafariWebPageProxy類只會將消息分發到選項卡中的頂部框架,儘管inject.js腳本已注入到子IFRAME中,並且它們都註冊了「消息」事件在safari.self。
你知道我怎樣才能將消息傳遞給子IFRAME中的注入腳本,並且IFRAME來自不同的域與頂幀?
似乎是API中的監督是如下面的缺陷的組合:
(1)的通信基本上是廣播訂戶基礎的。沒有像Chrome的chrome.extension.sendRequest API這樣的基於點對點回調的通信渠道;
(2)如果廣播發送給所有子IFRAME,這將會很好。但是,情況並非如此。 SafariWebPageProxy.dispatchMessage()僅將消息發送到頂部框架中的inject.js。
有什麼建議嗎?