Междоменная связь Iframe и домен Chromeless

У меня есть приложение без chrome с некоторым привилегированным кодом JavaScript, взаимодействующим с системой. Теперь я хочу смешать привилегированный JavaScript (jsctypes) с приложением, размещенным на сервере. Удаленное приложение будет загружено в Iframe, а взаимодействие между приложением без хрома и удаленным приложением произойдет через html5 postMessage.

Родитель отправляет сообщение в содержащийся Iframe и успешно получен Iframe с e.origin как «resource:\app», тогда как если я попытаюсь отправить сообщение из Iframe в window.parent с доменом в качестве ресурса:\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:                                     |
|                                                 |
+-------------------------------------------------+

postMessage внутри Iframe

  [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, я пытался реализовать междоменную связь с помощью пользовательских событий, но не смог,

В Priviliged index.html [примеры Chromeless\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), тогда родительское окно получает уведомление, но не через иерархию. Я пропустил что-то основное??


person Yeshvanthni    schedule 08.09.2011    source источник
comment
если я установлю домен на «*» и postMessage из iframe, сообщение будет получено самим iframe, а не родительским окном.   -  person Yeshvanthni    schedule 08.09.2011
comment
Тот же образец html-страницы (с доменом, установленным на «*», отправляет сообщение в родительское окно при открытии его в Firefox или выполнении пакета Chromeless и открытии html-файла в браузере. В этом случае это так же, как файл и привилегированный javascript не выполняется и не ведет себя как XULaplication   -  person Yeshvanthni    schedule 08.09.2011
comment
Это из-за [link]stackoverflow.com/questions/5463429/ . Поведение, которое делает окно Iframe верхним.??   -  person Yeshvanthni    schedule 08.09.2011


Ответы (1)


Учитывая, что вы ссылаетесь на Предотвратите захват target=_top Пользовательский интерфейс в Mozilla Chromeless Я предполагаю, что фрейм, в который вы загрузили удаленное приложение, является фреймом содержимого (каким он определенно должен быть). Это означает, что между вашим привилегированным кодом и содержимым устанавливается граница безопасности, и в частности для фрейма она выглядит так, как будто она находится на верхнем уровне — он не может получить доступ к привилегированному документу (легко проверить, добавьте alert(window == window.parent) к коду фрейма) . Все это имеет смысл с точки зрения безопасности, но это также означает, что использование postMessage() для связи будет невозможно.

Существует несколько более неудобный метод связи, описанный на https://developer.mozilla.org/en/Code_snippets/Interaction_between_privived_and_non-privived_pages. Его преимущество в том, что он может безопасно пересечь границу безопасности.

person Wladimir Palant    schedule 08.09.2011
comment
Большое спасибо. Хотя window!=window.parent. Я попробовал window.location,window.parent.location,window.parent.parent.location, и все они, похоже, указывают на местоположение Iframe. Я надеюсь, что пользовательские события работают для меня. Отпишусь после попытки. - person Yeshvanthni; 08.09.2011