如何使用 WebView2 打开内存中的网页?

How to open an in-memory web page with WebView2?

我的 C++ 代码有这些步骤,试图获得 JavaScript 生成的 HTML 代码。

  1. 调用 ICoreWebView2Settings::put_IsScriptEnabled 开启 JavaScript 功能
  2. 调用ICoreWebView2::NavigateToString设置内存网页。
  3. NavigationCompleted发生时,我们收获了整个网页的HTML代码。

不幸的是,显然存在竞争条件。有时,<body>中的JavaScript代码会被忽略,只有<head>中的JavaScript代码有效。有时,我们得到 <html><head></head><body></body></html>.

使用ICoreWebView2::Navigate打开远程网页时,我没有看到这个问题。这似乎是 ICoreWebView2::NavigateToString 中的错误。因此,将ICoreWebView2::NavigateToString替换为ICoreWebView2::Navigate似乎是更好的选择,但我不知道如何使用ICoreWebView2::Navigate打开内存中的HTML文档。我应该使用什么方案? file://memory:// 等?有什么建议吗?谢谢。

我认为你可以在 ICoreWebView2::Navigate 中使用 Data URLs。数据 URL 以 data: 方案开头,您可以使用 data:text/html, 来显示 HTML 内容。您可以参考下面的示例代码:

webviewWindow->Navigate(L"data:text/html,<h1>Hello, World!</h1> <script>alert('hi');</script>");

上面的代码将显示一个带有“Hello, World!”的 HTML 文档。并执行 JavaScript 警报。

我尝试了很多方法来获得 JavaScript-rendered 代码,我得到的最好的方法是:

  1. 调用 ICoreWebView2::AddWebResourceRequestedFilterICoreWebView2::add_WebResourceRequested 启用伪 URI,例如“文件://in-mem/doc”。

  2. 事件回调中WebResourceRequested,

    1. 调用 ICoreWebView2WebResourceRequestedEventArgs::get_ResourceContext 获取请求。

    2. 调用 ICoreWebView2Environment::CreateWebResourceResponse 创建响应。

    3. 在回调的参数上调用 ICoreWebView2WebResourceRequestedEventArgs::put_Response

  3. 在事件NavigationCompleted的回调中,我们收获了JavaScript-renderedHTML代码。