wpf 窗口.postMessage与窗口.chrome.webview.postMessage的比较

kb5ga3dv  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(416)

window.postMessagewindow.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

xvw2m8pv

xvw2m8pv1#

chrome.webview.postMessage方法是一个WebView2特定的JavaScript函数,允许web内容通过CoreWebView2.WebMessageReceived事件向主机应用发送消息。它的模式遵循HTML标准window.postMessage DOM API,但除了chrome.webview.postMessage将消息发布到主机应用和窗口之外,还有一些不同之处:

window.postMessage(message, targetOrigin, [transfer]);
window.chrome.webview.postMessage(message);

差异

消息参数

它们都将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.addEventListener("message", e => {
    if (shouldForwardToWebView2(e)) {
        window.chrome.webview.postMessage(e.data);
    }
});

如果您无法订阅该事件,也可以填充window.postMessage方法:

const originalPostMessage = window.postMessage.bind(window);
window.postMessage = function (message, origin, transfer) {
    if (shouldForwardToWebView2(message)) {
        window.chrome.webview.postMessage(message);
    }
    originalPostMessage(message, origin, transfer);
};

填充这样的方法比较棘手,因为此填充代码中的任何错误都可能破坏任何尝试使用postMessage的操作,而不像事件处理程序那样,失败的范围仅限于该事件处理程序。
在这两种情况下,您可能希望过滤转发到WebView2的消息,以确保不会从其他库或源发送不相关的消息,您不希望发送数据以限制攻击面。
此外,仅当您要转发到WebView2的邮件不依赖于transfer时,此方法才有效。

相关问题