Firefox addon Iframe跨域通信与无铬域

Firefox addon Iframe跨域通信与无铬域,firefox-addon,mozilla,xulrunner,chromeless,Firefox Addon,Mozilla,Xulrunner,Chromeless,我有一个无铬应用程序,其中包含一些与系统交互的特权JavaScript代码。远程应用程序将加载到Iframe中,无铬应用程序和远程应用程序之间的交互将通过html5 postMessage进行 父级确实将消息发布到包含的Iframe,并由Iframe成功接收,e.origin为“resource:\app” 然而,如果我尝试将消息从Iframe发送到window.parent,域为resource:\app,则不会调用父级中的onmessage侦听器 布局, 执行时,>chromeless ex

我有一个无铬应用程序,其中包含一些与系统交互的特权JavaScript代码。远程应用程序将加载到Iframe中,无铬应用程序和远程应用程序之间的交互将通过html5 postMessage进行

父级确实将消息发布到包含的Iframe,并由Iframe成功接收,e.origin为“resource:\app” 然而,如果我尝试将消息从Iframe发送到window.parent,域为resource:\app,则不会调用父级中的onmessage侦听器

布局,

执行时,>chromeless examples\testapp\index.html xul应用程序在chromeless build文件夹中生成,如下所示

+-----------------------------------Chromeless----+ | | | --- MessageToIframeButton | | | | +--------------------------Iframe--+ | | |Msg Recvd from: resource://app | | | |(this is the message from parent) | | | | | | | | _TxtBox_sendMessage | | | | | | | | | | | | | | | +----------------------------------+ | | Msg Recvd: | | | +-------------------------------------------------+ 在父母的消息中

           var onmessage = function(e) {
               alert("message");
             }
           if(typeof window.addEventListener != 'undefined') {
               window.addEventListener('message', onmessage, false);
             }
          else if(typeof window.attachEvent != 'undefined') {
               window.attachEvent('onmessage', onmessage);
              } 
感谢您的帮助

Palant,我尝试使用自定义事件实现跨域通信,但未能成功

在Priviliged index.html[无铬示例\testapp\index.html]中:

     var myExtension = {
            myListener: function(evt) {
            alert("Received from web page: " +
            evt.target.getAttribute("attribute1"));
        }
        }
document.addEventListener("MyExtensionEvent", function(e) {myExtension.myListener(e); }, false, true); // The last value is a Mozilla-specific value to indicate untrusted content is allowed to trigger the event.
    //content.addEventListener("MyExtensionEvent", function(e) {myExtension.myListener(e); }, false, true); //Also tried with content.
在远程应用程序Iframe remote.html中: 点击一个按钮

    var element = document.createElement("MyExtensionDataElement");
element.setAttribute("attribute1", "foobar");
document.documentElement.appendChild(element);

var evt = document.createEvent("Events");
evt.initEvent("MyExtensionEvent", true, false);
element.dispatchEvent(evt);
触发的事件不会冒泡到特权父域。如果将eventListener添加到Iframe本身,则会接收调度的事件,类似地,如果在特权上下文(index.html)中生成自定义事件,则父窗口会接收通知,但不会跨层次结构。我是否遗漏了一些基本内容???

如果您链接到,我猜您加载远程应用程序的框架是一个内容框架(它肯定应该是)。这意味着在您的特权代码和内容之间建立了一个安全边界,特别是对于框架,它看起来像是在顶层-它无法访问特权文档(易于检查,在框架代码中添加
alert(window==window.parent)
)。所有这些在安全方面都是有意义的,但也意味着不可能使用
postMessage()
进行通信


上描述了一种更为笨拙的通信方法。它的优点是可以安全地跨越安全边界。

如果我将域设置为“*”并从iframe发送postMessage,则消息由iframe本身接收,而不是由父窗口接收。相同的示例html页面(当域设置为“*”时,在firefox中打开父窗口或执行无铬批处理并在浏览器上打开html文件时,会将消息发布到父窗口。在这种情况下,它就像一个文件,私有javascript不会被执行,也不会像Xulapplications那样运行,这是因为[link]。使Iframe成为顶部窗口的行为。?非常感谢。虽然Window!=Window.parent。我尝试了Window.location、Window.parent.location、Window.parent.parent.location和所有这些似乎都指向Iframe位置。我希望自定义事件对我有效。尝试后将发回。
    var element = document.createElement("MyExtensionDataElement");
element.setAttribute("attribute1", "foobar");
document.documentElement.appendChild(element);

var evt = document.createEvent("Events");
evt.initEvent("MyExtensionEvent", true, false);
element.dispatchEvent(evt);