window.postMessage
与window.chrome.webview.postMessage
有何不同?
我在WebView2
的上下文中使用它(在.NET/WPF应用程序中)。我们正在WebView 2中加载第三方网页。该网页触发window.postMessage
,其中包含我们需要捕获的某些数据。根据documentation,当加载的页面触发window.chrome.webview.postMessage
时,WebView 2将引发WebMessageReceived
事件,这是正确的。另一方面,它似乎不遵守window.postMessage
(没有触发WebMessageReceived
)。
这是两个不同的API吗?哪一个是标准的(如HTML5)?我如何在我的.NET应用程序中捕获window.postMessage
事件,因为我不能要求第三方网站更改他们的代码以使用window.chrome.webview.postMessage
。
1条答案
按热度按时间xvw2m8pv1#
chrome.webview.postMessage
方法是一个WebView2特定的JavaScript函数,允许web内容通过CoreWebView2.WebMessageReceived
事件向主机应用发送消息。它的模式遵循HTML标准window.postMessage
DOM API,但除了chrome.webview.postMessage将消息发布到主机应用和窗口之外,还有一些不同之处:差异
消息参数
它们都将
message
对象作为第一个参数,通过值传递给目标。消息由window.postMessage使用Structured Clone Algorithm (SCA)序列化,而window.chrome.webview.postMessage使用JSON。两者之间最大的区别是SCA可以处理消息对象中的引用循环,而JSON将抛出。原点参数
window.postMessage方法用于将消息发送到其他窗口,并且存在窗口可能不在正确的源上并且不允许接收消息数据的风险。源参数允许调用者指定允许接收数据的源。
在WebView2的情况下,没有这样的参数,因为消息被发送到本质上受信任的主机应用程序(它是受信任的,因为它承载Web内容,并且能够检查用户数据文件夹、注入脚本等)。
传输参数
window.postMessage的可选传输参数允许将特定类型的JavaScript对象移动到目标窗口。这包括消息端口和大型数据数组。
WebView2当前不支持此方案,chrome.webview.postMessage也不支持此参数。
正在转发到chrome.webview.postMessage
如果希望将window.postMessage消息发送到宿主应用程序,最简单的方法是订阅目标窗口的window.onmessage事件
如果您无法订阅该事件,也可以填充window.postMessage方法:
填充这样的方法比较棘手,因为此填充代码中的任何错误都可能破坏任何尝试使用postMessage的操作,而不像事件处理程序那样,失败的范围仅限于该事件处理程序。
在这两种情况下,您可能希望过滤转发到WebView2的消息,以确保不会从其他库或源发送不相关的消息,您不希望发送数据以限制攻击面。
此外,仅当您要转发到WebView2的邮件不依赖于
transfer
时,此方法才有效。