中将消息发送到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。
有什么建议吗?