1

システムと対話するいくつかの特権 JavaScript コードを含むクロムレス アプリケーションがあります。サーバーでホストされているアプリケーションを使用して、特権 JavaScript (jsctypes) をマッシュアップしたいと考えています。リモート アプリケーションは Iframe に読み込まれ、クロムレス アプリケーションとリモート アプリケーション間のやり取りは html5 postMessage を通じて行われます。

親は含まれている Iframe にメッセージを投稿し、e.origin を「resource:\app」として Iframe によって正常に受信されますが、ドメインを resource:\app として Iframe から window.parent に postMessage を試みた場合、onmessage リスナーは親は呼び出されません

レイアウト、

実行すると、 >chromeless examples\testapp\index.html chromeless build フォルダに xul アプリケーションが生成され、以下のように表示されます。

+------------------------------------クロムレス----+
| | | |
| | --- MessageToIframeButton |
| | | |
| | +--------------------------Iframe--+ |
| | |メッセージ受信元: resource://app | | |
| | |(これは保護者からのメッセージです) | | |
| | | | | | | |
| | | | _TxtBox_sendMessage | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | +------------------------------------------------+ |
| | メッセージ受信: |
| | | |
+---------------------------------------------------------------- +

Iframe 内の postMessage

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

  [/Code]

親の onMessage 、

           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さん、カスタムイベントを使ってクロスドメイン通信を実装しようとしましたがうまくいきませんでした。

特権 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) で生成された場合、親ウィンドウは受信します。通知ですが、階層全体ではありません。基本的なものが欠けていますか??

4

1 に答える 1

2

Prevent target="_top" from Mozilla Chromeless での UIへのリンクを考えると、リモート アプリケーションをロードしたフレームはコンテンツ フレームであると推測されます (これは間違いなくそうあるべきです)。これは、特権コードとコンテンツの間にセキュリティ境界が確立されていることを意味します。特に、最上位にあるように見えるフレームについては、特権ドキュメントにアクセスできません (簡単にチェックalert(window == window.parent)して、フレーム コードに追加します)。これはすべてセキュリティ的には理にかなってpostMessage()いますが、通信に使用できないことも意味します.

https://developer.mozilla.org/en/Code_snippets/Interaction_between_privileged_and_non-privileged_pa​​gesで説明されている、やや厄介な通信方法があります。セキュリティの境界を安全に越えることができるという利点があります。

于 2011-09-08T06:32:47.847 に答える