2011-03-22 105 views
1

中將消息發送到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。

有什麼建議嗎?

回答

0

我跑到相同的問題。背景只能響應IFRAME消息而將消息發送給IFRAME。

爲了解決這個限制,我使用了輪詢:每個IFRAME定期向後臺頁面發送消息,爲它提供發送消息的選項。

0

我知道這真的很舊,但我最近不得不做同樣的事情,Safari的情況並沒有改善。

雖然不理想,但對於safari,您需要依賴window.postMessage()。

頂層注入腳本充當頁面上任何和所有iFrames之間的中繼代理,接收消息並根據需要將它們傳遞到背景。儘管它聽起來很複雜,但它很可能是在交叉源iframe和後臺頁面之間進行通信的唯一途徑。