iframe跨域通信和无边框域

时间:2011-09-08 03:33:33

标签: firefox-addon mozilla xulrunner chromeless

我有chromeless应用程序,其中一些特权JavaScript代码与系统交互。现在我想将特权JavaScript(jsctypes)与服务器中托管的应用程序混搭。远程应用程序将加载到Iframe中,并且chromeless应用程序和远程应用程序之间的交互通过html5 postMessage进行。

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

布局,

执行时,> chromeless examples \ testapp \ index.html 在chromeless构建文件夹中生成xul应用程序,并显示以下内容。

+-----------------------------------Chromeless----+
|                                                 |
|   --- MessageToIframeButton                     |
|                                                 |
|  +--------------------------Iframe--+           |
|  |Msg Recvd from: resource://app    |           |
|  |(this is the message from parent) |           |
|  |                                  |           |
|  |   _TxtBox_sendMessage            |           |
|  |                                  |           |
|  |                                  |           |
|  |                                  |           |
|  +----------------------------------+           |
|  Msg Recvd:                                     |
|                                                 |
+-------------------------------------------------+

iframe内的postMessage

  [Code]
 var sendMessage = function(){
      var iframe = window.parent;
      iframe.postMessage("test","resouce://app");  
   };

  [/Code]

onMessage of Parent,

           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 [Chromeless examples \ 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)中生成自定义事件,那么父事件窗口确实会收到通知,但不会跨层次结构。我错过了一些基本的东西吗?

1 个答案:

答案 0 :(得分:2)

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

https://developer.mozilla.org/en/Code_snippets/Interaction_between_privileged_and_non-privileged_pages上描述了一种更尴尬的沟通方法。它的优点是可以安全地跨越安全边界。