Как установить связь между фреймом и сценарием содержимого Edge Extension?

Я разрабатываю расширение Edge, мне нужно отправить сообщение из документа фрейма (не верхнего документа, верхний документ работает нормально) в скрипт содержимого.
Как показано ниже:

`contentscript.js
window.addEventListener("message", function(event) {
    console.log("window top message...event:");
    console.log(event);
});`

Отправьте сообщение из документа фрейма с помощью:

window.top.postMessage("Hi, I am from frame", "*").

На панели консоли я вижу window top message...event:, а затем браузер перезагружает страницу. Похоже, сообщение было заблокировано.
Расширение можно получить на github.
шаги для воспроизведения:
загрузите расширение, откройте Google, откройте панель консоли, переключитесь на Frame и введите

window.top.postMessage("Hi, I am from frame", "*").

Кто-нибудь может помочь?


person BurningFish    schedule 11.05.2017    source источник
comment
Пожалуйста, включите «сохранять журнал» и опубликуйте фактическое сообщение об ошибке.   -  person Anatoly Sazanov    schedule 12.05.2017
comment
Нет сообщения об ошибке.   -  person BurningFish    schedule 15.05.2017


Ответы (1)


Если у вас есть фоновая страница, и ваш contentscript.js имеет доступ к объекту browser., дешевый и простой способ может состоять в том, чтобы передать сообщение на расширение и обратно, например:

contentscript.js
browser.runtime.sendMessage({name: 'bounce', payload: {name: hello}});

background.js
browser.runtime.onMessage.addListener(function (request, sender) {
  if (request.name === 'bounce') {
    browser.tabs.sendMessage(sender.tab.id, request.payload);
  }
});

и просто слушайте {name: hello} в вашем контент-скрипте. Все кадры, включая верхний, должны получить это сообщение.

person Anatoly Sazanov    schedule 12.05.2017
comment
Спасибо за ваш вклад. Но я не думаю, что browser.extension.sendMessage поддерживается в Edge, вы можете проверить по адресу docs.microsoft.com/en-us/microsoft-edge/extensions/api-support/. - person BurningFish; 15.05.2017
comment
@BurningFish извините, должно быть browser.runtime.sendMessage. См. здесь: developer.mozilla.org/en-US /Дополнения/WebExtensions/API/среда выполнения/ - person Anatoly Sazanov; 15.05.2017
comment
Привет, Анатолий, browser.runtime.sendMessage может помочь при передаче сообщения между фоновой страницей и сценарием содержимого, но не помогает при передаче сообщения между igames веб-страницы и сценарием содержимого. Я надеюсь отправить сообщение с помощью window.top.postMessage в документе ifame, но это не удается. Я отправил сообщение об ошибке команде Edge developer.microsoft.com /en-us/microsoft-edge/platform/issues/. Спасибо за ваш вклад. - person BurningFish; 16.05.2017
comment
@BurningFish является ли этот iframe частью вашего расширения или сайта? Если последнее, вы можете попробовать внедрить идентичные сценарии контента во все фреймы и использовать window.postMessage для общения с ними. Из этих сценариев содержимого, даже если оно находится в iframe, вы сможете отправить сообщение в фоновый режим, а затем вернуться к своему сценарию верхнего содержимого. - person Anatoly Sazanov; 16.05.2017
comment
iframe является частью сайта. Я пытаюсь использовать window.postMessage в iframe, сайт перезагружается при выполнении window.postMessage, я думаю, что это ошибка Edge. - person BurningFish; 18.05.2017