2011-03-22 130 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和后台页面之间进行通信的唯一途径。