window.postMessage VS window.chrome.webview.postMessage

网络

如何window.postMessage不同window.chrome.webview.postMessage

我在 a 的上下文中使用它WebView2(在 .NET/WPF 应用程序中)。我们正在 WebView2 中加载第三方网页。网页会触发window.postMessage我们需要捕获的某些数据。根据文档,WebView2WebMessageReceived在加载的页面触发时引发事件window.chrome.webview.postMessage,这是正确的。另一方面,它似乎并不尊重window.postMessage(没有WebMessageReceived被解雇)。

这是两个不同的 API 吗?哪一个是标准的(如在 HTML5 中)?我如何window.postMessage在我的 .NET 应用程序中捕获事件,因为我不能要求第三方网站更改他们的代码以使用window.chrome.webview.postMessage.

大卫·里斯尼

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

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

差异

消息参数

它们都将一个message对象作为第一个参数,通过值传递给目标。消息由 window.postMessage 使用结构化克隆算法 (SCA) 进行序列化,而 window.chrome.webview.postMessage 使用 JSON。两者之间最大的区别是 SCA 可以处理消息对象中的引用循环,而 JSON 会抛出。

原点参数

window.postMessage 方法用于将消息发布到其他窗口,并且存在窗口可能不在正确的来源并且不允许接收消息数据的风险。origin 参数允许调用者指定允许接收数据的来源。

在 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.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

setTimeout(0)vs window.postMessage vs MessagePort.postMessage

是否可以在Chrome扩展程序中使用window.postMessage()?

window.postMessage()如何“安全”?

Angular 2 window.postmessage

离子打字稿中的window.postMessage

postMessage目标原点-window.parent.origin与“ *”

window.postMessage与Ajax的优缺点

TypeError:IOS上带有window.postMessage的参数不足

从web_accessible_resource到内容脚本的window.postMessage

您如何跨域使用window.postMessage?

哪些浏览器现在支持window.postMessage调用?

为什么JavaScript“ window.postMessage”创建重复的消息?

如何使用window.postmessage与父窗口进行通信

如何限制由`window.postMessage()`事件调用的函数

如何使用window.postMessage来动态嵌入iframe?

节点模块库中 Window.postMessage 的安全风险

Chrome ServiceWorker postMessage

未捕获的SyntaxError:无法在“ Window”上执行“ postMessage”:在对“ postMessage”的调用中无效的目标源“ my_page”

React Native WebView postMessage不起作用

在页面和内容脚本之间发送消息的window.postMessage替代方法是什么?

从iframe到被调用方的window.postMessage,iframe和被调用方都在同一域中

一堆重定向后 window.parent.postMessage() 不起作用

未捕获的DOMException:无法在“ Window”上执行“ postMessage”:无法克隆对象

iframe及其使用Angular的父级之间的window.postMessage:有人在工作吗?

没有React中的setTimeOut,window.postMessage在componentDidMount中不起作用

Internet Explorer 11 上的 window.postMessage 是否有最大长度限制?

window.parent.postMessage父级检查iframe发送了什么消息

Javascript window.opener.postMessage 具有多个子域的跨域

Javascript postMessage