使用新的 WebView2 控件并通过 window.external 调用访问旧服务器...有什么方法可以捕获这些吗?
Using new WebView2 control and hitting older server with window.external calls... is there any way to capture those?
我正在开发一个以前使用 WebBrowser 控件并通过使用 window.external 调用(例如 window.external.myMethod())与 cshtml 网页来回通信的 Office 插件。
我们已改用上个月正式发布的新 WebView2 控件,并更新了当前的 cshtml 页面以使用对该控件的正确调用(例如 chrome.webview.hostObjects.myObject.myMethod())。
我请求帮助的问题是我的插件仍然可以连接到仍在 运行 包含旧 window.external 调用的这些 cshtml 页面的旧服务器。我正在尝试找出一种仍然来回传递值的方法。
我知道有能力注入一些 javascript 每次使用 WebView2 控件加载页面时 运行,例如:
await webBrowser.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync("my javascript");
...我们实际上这样做是为了挂钩几个事件。我们也可以 运行 WebView2 的 ExecuteScriptAsync。
我不确定这两种方法是否可行,或者是否有我没有想到的更好方法。如果我将一些 Javascript 注入 运行,它会是什么样子!
希望大家多提建议...
是的,您最多可以使用通过 AddScriptToExecuteOnDocumentCreatedAsync
注入的脚本连接 WebView2 的主机对象 window.external
。例如,在我们的 sample app 中,我打开了 Scenarios|Host Objects 菜单项,打开了 DevTools window 和 运行 以下代码:
window.external = await window.chrome.webview.hostObjects.sync;
window.external.sample.property; // "Example Property String Value"
然而,有一些潜在的陷阱需要注意:
- 主要的潜在缺陷是 WebView2 主机对象支持与 mshtml 的
window.external
功能不完全兼容。最明显的是,默认情况下 WebView2 对其主机对象使用异步代理。您可以在异步主机对象代理上使用 sync
属性 选择加入同步代理,这 returns 是对同步代理的承诺。但也可能存在其他不兼容性。与其简单地将同步代理分配给 window.external
,一种不同的方法是创建自己的 JavaScript 函数集来环绕 window.chrome.webview.hostObjects
属性 以解决任何问题您找到这些问题并将该包装器分配给 window.external
.
-
window.chrome.webview.hostObjects
属性 延迟其初始化,直到它被实际引用。如果可以,您可能希望延迟引用它,或者仅将其分配给您知道需要它的页面上的 window.external
。
- 目前a bug with AddScriptToExecuteOnDocumentCreatedAsync其中的代码不在子框架中执行跨源。
我正在开发一个以前使用 WebBrowser 控件并通过使用 window.external 调用(例如 window.external.myMethod())与 cshtml 网页来回通信的 Office 插件。
我们已改用上个月正式发布的新 WebView2 控件,并更新了当前的 cshtml 页面以使用对该控件的正确调用(例如 chrome.webview.hostObjects.myObject.myMethod())。
我请求帮助的问题是我的插件仍然可以连接到仍在 运行 包含旧 window.external 调用的这些 cshtml 页面的旧服务器。我正在尝试找出一种仍然来回传递值的方法。
我知道有能力注入一些 javascript 每次使用 WebView2 控件加载页面时 运行,例如:
await webBrowser.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync("my javascript");
...我们实际上这样做是为了挂钩几个事件。我们也可以 运行 WebView2 的 ExecuteScriptAsync。
我不确定这两种方法是否可行,或者是否有我没有想到的更好方法。如果我将一些 Javascript 注入 运行,它会是什么样子!
希望大家多提建议...
是的,您最多可以使用通过 AddScriptToExecuteOnDocumentCreatedAsync
注入的脚本连接 WebView2 的主机对象 window.external
。例如,在我们的 sample app 中,我打开了 Scenarios|Host Objects 菜单项,打开了 DevTools window 和 运行 以下代码:
window.external = await window.chrome.webview.hostObjects.sync;
window.external.sample.property; // "Example Property String Value"
然而,有一些潜在的陷阱需要注意:
- 主要的潜在缺陷是 WebView2 主机对象支持与 mshtml 的
window.external
功能不完全兼容。最明显的是,默认情况下 WebView2 对其主机对象使用异步代理。您可以在异步主机对象代理上使用sync
属性 选择加入同步代理,这 returns 是对同步代理的承诺。但也可能存在其他不兼容性。与其简单地将同步代理分配给window.external
,一种不同的方法是创建自己的 JavaScript 函数集来环绕window.chrome.webview.hostObjects
属性 以解决任何问题您找到这些问题并将该包装器分配给window.external
. -
window.chrome.webview.hostObjects
属性 延迟其初始化,直到它被实际引用。如果可以,您可能希望延迟引用它,或者仅将其分配给您知道需要它的页面上的window.external
。 - 目前a bug with AddScriptToExecuteOnDocumentCreatedAsync其中的代码不在子框架中执行跨源。