Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Safari extension Safari扩展无法将消息发送到选项卡中的iFrame_Safari Extension - Fatal编程技术网

Safari extension Safari扩展无法将消息发送到选项卡中的iFrame

Safari extension Safari扩展无法将消息发送到选项卡中的iFrame,safari-extension,Safari Extension,我希望能够将消息从全局页面发送到在其中一个选项卡的IFRAME中运行的内容脚本。我发现Safari扩展API可能有一个设计缺陷,不允许这样做。(与Chrome扩展API不同,后者对扩展的各个组件之间的消息传递提供了更全面的支持) 基本上,我有一个injected.js,它被注入到所有帧及其iframe中。在injected.js中,我有以下功能用于从全局页面捕获消息: safari.self.addEventListener("message", function(msg) { /*

我希望能够将消息从全局页面发送到在其中一个选项卡的IFRAME中运行的内容脚本。我发现Safari扩展API可能有一个设计缺陷,不允许这样做。(与Chrome扩展API不同,后者对扩展的各个组件之间的消息传递提供了更全面的支持)

基本上,我有一个injected.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);
      }
    }
  };
var广播=功能(消息名称){
var ws=safari.application.browserWindows;
对于(变量i=0;i
我发现,这些消息只到达注入选项卡顶部框架的injected.js。消息永远不会到达子iFrame中注入的消息

SafariWebPageProxy类似乎只将消息发送到选项卡的顶部框架,尽管已将injected.js脚本注入子iFrame中,并且它们都在safari.self上注册了“message”事件

您知道如何将消息发送到子IFRAME中的注入脚本,以及IFRAME与顶部框架来自不同的域吗

API中的疏忽似乎是以下缺陷的组合:

(1) 通信基本上是基于广播用户的。没有像Chrome的Chrome.extension.sendRequestAPI那样的基于点对点回调的通信通道

(2) 如果广播覆盖所有的儿童iFrame,这就没问题了。然而,情况并非如此。SafariWebPageProxy.dispatchMessage()只将消息发送到顶部框架中的injected.js


有什么建议吗?

我谈到了同样的问题。后台只能在响应IFRAME消息时向IFRAME发送消息


为了绕过这个限制,我使用了轮询:每个IFRAME都会定期向后台页面发送消息,以便为其提供发送消息的选项。

我知道这很旧,但最近我不得不做同样的事情,Safari的情况没有改善

虽然不理想,但对于safari,您需要依赖window.postMessage()

顶层注入脚本充当页面上任何和所有iframe之间的中继代理,接收消息并根据需要将其传递到后台。虽然听起来很复杂,但它很可能是使跨源iframe和背景页面之间的通信成为可能的唯一方法