private async Task InitializeWebView2() { await _webview.CreateEnvironmentAsync().ConfigureAwait(true); await _webview.EnsureCoreWebView2Async(); ApplyDefaultWebViewSettings(); _webview.CoreWebView2.AddWebResourceRequestedFilter($"{AppOrigin}*", CoreWebView2WebResourceContextWrapper.All); var removeResourceCallback = _webview.CoreWebView2.AddWebResourceRequestedHandler(async(s, eventArgs) => { await HandleWebResourceRequest(eventArgs); }); // The code inside blazor.webview.js is meant to be agnostic to specific webview technologies, // so the following is an adaptor from blazor.webview.js conventions to WebView2 APIs await _webview.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(@" window.external = { sendMessage: message => { window.chrome.webview.postMessage(message); }, receiveMessage: callback => { window.chrome.webview.addEventListener('message', e => callback(e.data)); } }; ").ConfigureAwait(true); QueueBlazorStart(); var removeMessageCallback = _webview.CoreWebView2.AddWebMessageReceivedHandler(e => MessageReceived(new Uri(e.Source), e.WebMessageAsString)); }
private async Task InitializeWebView2() { var environment = await CoreWebView2Environment.CreateAsync(); await _webview.EnsureCoreWebView2Async(environment); ApplyDefaultWebViewSettings(); _webview.CoreWebView2.AddWebResourceRequestedFilter($"{AppOrigin}*", CoreWebView2WebResourceContext.All); _webview.CoreWebView2.WebResourceRequested += (sender, eventArgs) => { // Unlike server-side code, we get told exactly why the browser is making the request, // so we can be smarter about fallback. We can ensure that 'fetch' requests never result // in fallback, for example. var allowFallbackOnHostPage = eventArgs.ResourceContext == CoreWebView2WebResourceContext.Document || eventArgs.ResourceContext == CoreWebView2WebResourceContext.Other; // e.g., dev tools requesting page source if (TryGetResponseContent(eventArgs.Request.Uri, allowFallbackOnHostPage, out var statusCode, out var statusMessage, out var content, out var headers)) { // NOTE: This is stream copying is to work around a hanging bug in WinRT with managed streams var memStream = new MemoryStream(); content.CopyTo(memStream); var ms = new InMemoryRandomAccessStream(); ms.WriteAsync(memStream.GetWindowsRuntimeBuffer()).AsTask().Wait(); var headerString = GetHeaderString(headers); eventArgs.Response = environment.CreateWebResourceResponse(ms, statusCode, statusMessage, headerString); } }; // The code inside blazor.webview.js is meant to be agnostic to specific webview technologies, // so the following is an adaptor from blazor.webview.js conventions to WebView2 APIs await _webview.CoreWebView2 !.AddScriptToExecuteOnDocumentCreatedAsync(@" window.external = { sendMessage: message => { window.chrome.webview.postMessage(message); }, receiveMessage: callback => { window.chrome.webview.addEventListener('message', e => callback(e.data)); } }; "); _webview.CoreWebView2.WebMessageReceived += (sender, eventArgs) => MessageReceived(new Uri(eventArgs.Source), eventArgs.TryGetWebMessageAsString()); _webview.CoreWebView2.DOMContentLoaded += async(_, __) => { await _webview.CoreWebView2 !.ExecuteScriptAsync(@" Blazor.start(); " ); }; }
private async Task InitializeWebView2() { await _webview.CreateEnvironmentAsync().ConfigureAwait(true); await _webview.EnsureCoreWebView2Async(); ApplyDefaultWebViewSettings(); _webview.CoreWebView2.AddWebResourceRequestedFilter($"{AppOrigin}*", CoreWebView2WebResourceContextWrapper.All); var removeResourceCallback = _webview.CoreWebView2.AddWebResourceRequestedHandler((s, eventArgs) => { // Unlike server-side code, we get told exactly why the browser is making the request, // so we can be smarter about fallback. We can ensure that 'fetch' requests never result // in fallback, for example. var allowFallbackOnHostPage = eventArgs.ResourceContext == CoreWebView2WebResourceContextWrapper.Document || eventArgs.ResourceContext == CoreWebView2WebResourceContextWrapper.Other; // e.g., dev tools requesting page source var requestUri = QueryStringHelper.RemovePossibleQueryString(eventArgs.Request.Uri); if (TryGetResponseContent(requestUri, allowFallbackOnHostPage, out var statusCode, out var statusMessage, out var content, out var headers)) { var headerString = GetHeaderString(headers); eventArgs.SetResponse(content, statusCode, statusMessage, headerString); } }); // The code inside blazor.webview.js is meant to be agnostic to specific webview technologies, // so the following is an adaptor from blazor.webview.js conventions to WebView2 APIs await _webview.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(@" window.external = { sendMessage: message => { window.chrome.webview.postMessage(message); }, receiveMessage: callback => { window.chrome.webview.addEventListener('message', e => callback(e.data)); } }; ").ConfigureAwait(true); QueueBlazorStart(); var removeMessageCallback = _webview.CoreWebView2.AddWebMessageReceivedHandler(e => MessageReceived(new Uri(e.Source), e.WebMessageAsString)); }