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