Междоменная связь в iframe и домен без хрома - PullRequest
1 голос
/ 08 сентября 2011

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

Родитель отправляет сообщение в содержащийся Iframe и успешно принимается Iframe с e.origin как «resource: \ app» тогда как, если я пытаюсь отправить сообщение из Iframe в window.parent с доменом в качестве ресурса: \ app, прослушиватель onmessage в родительском объекте не вызывается

Макет,

При выполнении> chromeless examples \ testapp \ index.html Приложение xul генерируется в папке сборки chromeless и отображается следующее.

+-----------------------------------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 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 [Примеры без Chrome \ 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);

Инициированное событие не отправляется в привилегированный родительский домен. Если в сам Iframe добавляется eventListener, отправляется Событие, и аналогично, если пользовательское событие генерируется в привилегированном контексте (index.html), то родительский окно получает уведомление, но не по всей иерархии. Я что-то упускаю из виду?

1 Ответ

2 голосов
/ 08 сентября 2011

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

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

...