问题描述
如果我运行window.open("url")
,即使它是Edge WebView2,它也会在新的弹出窗口中打开url。它将仅具有默认的Windows标题栏和只读URL栏。我需要通过window.open("url")
在新的弹出窗口中完全从WebView打开url。
有什么办法可以从我的程序访问原始WebView2子窗口的窗口?通过访问,我的意思是注入脚本,并在注入后获得js响应。
或者,至少,也许可以使用一些预先注入的脚本(例如window.open("http://google.com -javascript: alert(5)")
)来打开url?
更新
找到了MSDN article,也许这就是我所需要的。试图理解这一点。
解决方法
是的,ICoreWebView2::add_NewWindowRequested
事件使您可以拦截WebView2打开新窗口。
如果您在事件处理程序中不执行任何操作,或者不订阅事件,则将看到您所描述的新弹出窗口。在脚本中,返回值window.open
连接到新打开的弹出窗口。但是在您的本机代码中,您无权访问或控制新打开的窗口。
或者您可以在NewWindowRequested事件的args上将Handled
property设置为true,并且不会创建新窗口。如果您要防止打开窗口,或者要将新的窗口打开发送到默认浏览器或其他位置,则此功能很有用。在脚本中,window.open
的返回值为空。
或者您可以通过NewWindow
property提供自己的ICoreWebView2。在这种情况下,您负责并选择如何以某种方式托管该ICoreWebView2。您作为NewWindow提供的ICoreWebView2将成为新窗口导航的目标,并通过脚本备份到window.open
调用的返回值。
由于获取新的WebView2可能需要异步方法调用,因此可以在事件args上使用GetDeferral方法来停止完成窗口请求的事件,直到稍后稍后在延迟上异步调用Complete。
您可以在示例应用程序中看到working sample of the add_NewWindowRequested
event。