Расширение Safari не может отправить сообщение в IFRAME на вкладке - PullRequest
1 голос
/ 22 марта 2011

Я хочу иметь возможность отправлять сообщение с глобальной страницы в скрипт содержимого, запущенный внутри IFRAME на одной из вкладок.Я обнаружил, что API расширения Safari может иметь недосмотр проекта, который не позволяет этого.(В отличие от API расширения Chrome, который имеет более полную поддержку обмена сообщениями между различными компонентами расширения).

По сути, у меня есть файл injected.js, который внедряется во все кадры и их IFRAME.В injected.js у меня есть следующее для перехвата сообщений с глобальной страницы:

 safari.self.addEventListener("message", function(msg) {
    /* do something according to the msg */
  } , false);

На моей глобальной странице у меня есть следующий код, который передает сообщения на внедренные скрипты:

  var broadcast = function(message_name) {
    var ws = safari.application.browserWindows;
    for (var i = 0; i < ws.length; i++) {
      var ts = ws[i].tabs;
      for (var j = 0; j < ts.length; j++) {
        ts[j].page.dispatchMessage(message_name);
      }
    }
  };

Я обнаружил, что сообщения достигают только файла injected.js, введенного в верхние фреймы вкладок.Сообщения никогда не достигают тех, которые вставлены в дочерние IFRAME.

Похоже, что класс SafariWebPageProxy отправляет сообщения только в верхний фрейм на вкладке, несмотря на то, что сценарий injected.js внедряется вдочерние IFRAME, и что все они регистрируются для события «message» на safari.self.

Знаете ли вы, как я могу получить сообщения для внедренного сценария в дочернем IFRAME, и что IFRAME происходит отдругой домен по сравнению с верхним фреймом?

Похоже, что упущение в API является комбинацией следующих недостатков:

(1) коммуникации в основном основаны на вещателе и подписчике.Не существует канала связи на основе обратного вызова типа «точка-точка», такого как Chrome chrome.extension.sendRequest API;

(2) это было бы хорошо, если бы широковещательная рассылка шла на все дочерние IFRAME.Однако это не так.SafariWebPageProxy.dispatchMessage () отправляет только сообщение injected.js в верхнем фрейме.

Любое предложение?

Ответы [ 2 ]

0 голосов
/ 09 января 2014

Я знаю, что это действительно старая версия, но недавно мне пришлось сделать то же самое, и ситуация с Safari не улучшилась.

Хотя это и не идеально, для сафари вам нужно полагаться на window.postMessage ().

Внедренный сценарий верхнего уровня действует как агент ретрансляции между любым и всеми iFrames на странице, принимая сообщения и передавая их в фоновом режиме по мере необходимости.Как бы сложно это ни звучало, но вполне возможно, что это единственный способ сделать возможным обмен данными между iframe из разных источников и фоновой страницей.

0 голосов
/ 07 января 2012

Я столкнулся с той же проблемой.Фон может отправлять сообщение на IFRAME только в ответ на сообщение IFRAME.

Чтобы обойти ограничение, я использовал опрос: каждый IFRAME регулярно отправляет сообщения на фоновую страницу, чтобы дать ему возможностьотправить сообщение.

...