예제 #1
0
        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));
        }
예제 #2
0
        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();
					"                    );
            };
        }
예제 #3
0
        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));
        }