Как отправить сообщение на веб-просмотр в приложении Google Chrome Dart (securityError)
Я создаю приложение Google Chrome с веб-браузером, используя язык программирования Dart. Приложение взаимодействует с контентом в сети через postMessage. Если я запускаю приложение из DartEditor (запускается как приложение Chrome), postMessage работает нормально. Но после сборки (dart2js) и загрузки в браузер с помощью "Загрузить неупакованное расширение..." - приложение не может получить webview contentWindow и выполнить для него postMessage.
Ошибка консоли chrome dev: Uncaught SecurityError: заблокирован фрейм с источником "chrome-extension://bpddihniogcgmnlaghkacfagkecgnljo" из-за доступа к фрейму с источником "swappedout://". Кадр, запрашивающий доступ, имеет протокол "chrome-extension", а кадр, к которому осуществляется доступ, имеет протокол "swappedout". Протоколы должны совпадать.
Google Chrome версии 36.0.1951.5 dev Dart версия SDK 1.4.2, версия 1.5.0-dev.4.2 - выдает ту же ошибку.
Это минимальный рабочий пример для демонстрации проблемы - https://github.com/Dumbris/dart_chrome_app_webview_security_error
1 ответ
Стало известно, что это ошибка текущей версии компилятора dart2js, см. Отчет об ошибке здесь.
Я построил простой обходной путь chromeapp_webview_wrapper.js Если contextWindow.postMessage вызывается из оболочки JS - все работает нормально. Пример использования:
js.JsObject _webview = new js.JsObject.fromBrowserObject(querySelector('webview'));
js.JsObject _webview_wrapper = new js.JsObject(js.context['WebviewWrapper'], [_webview]);
_webview_wrapper.callMethod('postMessage', ['initial message', '*']);
Тем не менее, я жду исправления ошибки от команды разработчиков Dart. Потому что связь с контентом WebView является важной функцией в Chrome Packaged App.