如何在Dart google chrome应用中将postMessage发布到webview(securityError)

时间:2014-06-11 11:07:31

标签: webview dart google-chrome-app google-chrome-webview

我正在使用Dart编程语言构建一个带有webview的Google Chrome应用。 该应用程序通过postMessage与webview内容进行通信。如果我从DartEditor运行应用程序(作为Chrome应用程序运行),postMessage工作正常。但是在构建(dart2js)并使用“加载无包装扩展...”加载到浏览器中之后 - 应用程序无法获取webview contentWindow并在其上执行postMessage。

chrome dev控制台出错: 未捕获的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 个答案:

答案 0 :(得分:3)

众所周知,这是当前版本的dart2js编译器的错误,请参阅bug report here

我构建了一个简单的解决方法chromeapp_webview_wrapper.js 如果从JS包装器调用contextWindow.postMessage - 它可以正常工作。 用法示例:

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开发团队的错误修复。因为,与ChromeView打包应用程序中的WebView内容通信是重要功能。