@@ -20,6 +20,7 @@ namespace Microsoft.AspNetCore.Components.WebView.Maui
2020 /// </summary>
2121 internal class WinUIWebViewManager : WebView2WebViewManager
2222 {
23+ private readonly BlazorWebViewHandler _handler ;
2324 private readonly WebView2Control _webview ;
2425 private readonly string _hostPageRelativePath ;
2526 private readonly string _contentRootRelativeToAppRoot ;
@@ -62,6 +63,7 @@ public WinUIWebViewManager(
6263 ILogger logger )
6364 : base ( webview , services , dispatcher , fileProvider , jsComponents , contentRootRelativeToAppRoot , hostPagePathWithinFileProvider , webViewHandler , logger )
6465 {
66+ _handler = webViewHandler ;
6567 _logger = logger ;
6668 _webview = webview ;
6769 _hostPageRelativePath = hostPagePathWithinFileProvider ;
@@ -71,52 +73,71 @@ public WinUIWebViewManager(
7173 /// <inheritdoc />
7274 protected override async Task HandleWebResourceRequest ( CoreWebView2WebResourceRequestedEventArgs eventArgs )
7375 {
74- // Unlike server-side code, we get told exactly why the browser is making the request,
75- // so we can be smarter about fallback. We can ensure that 'fetch' requests never result
76- // in fallback, for example.
77- var allowFallbackOnHostPage =
78- eventArgs . ResourceContext == CoreWebView2WebResourceContext . Document ||
79- eventArgs . ResourceContext == CoreWebView2WebResourceContext . Other ; // e.g., dev tools requesting page source
76+ var url = eventArgs . Request . Uri ;
8077
81- // Get a deferral object so that WebView2 knows there's some async stuff going on. We call Complete() at the end of this method.
82- using var deferral = eventArgs . GetDeferral ( ) ;
78+ _logger . LogDebug ( "Intercepting request for {Url}." , url ) ;
8379
84- var requestUri = QueryStringHelper . RemovePossibleQueryString ( eventArgs . Request . Uri ) ;
85-
86- _logger . HandlingWebRequest ( requestUri ) ;
87-
88- var uri = new Uri ( requestUri ) ;
89- var relativePath = AppOriginUri . IsBaseOf ( uri ) ? AppOriginUri . MakeRelativeUri ( uri ) . ToString ( ) : null ;
90-
91- // Check if the uri is _framework/blazor.modules.json is a special case as the built-in file provider
92- // brings in a default implementation.
93- if ( relativePath != null &&
94- string . Equals ( relativePath , "_framework/blazor.modules.json" , StringComparison . Ordinal ) &&
95- await TryServeFromFolderAsync ( eventArgs , allowFallbackOnHostPage : false , requestUri , relativePath ) )
96- {
97- _logger . ResponseContentBeingSent ( requestUri , 200 ) ;
98- }
99- else if ( TryGetResponseContent ( requestUri , allowFallbackOnHostPage , out var statusCode , out var statusMessage , out var content , out var headers )
100- && statusCode != 404 )
80+ // 1. First check if the app wants to modify or override the request.
81+ if ( WebRequestInterceptingWebView . TryInterceptResponseStream ( _handler , _webview . CoreWebView2 , eventArgs , url , _logger ) )
10182 {
102- // First, call into WebViewManager to see if it has a framework file for this request. It will
103- // fall back to an IFileProvider, but on WinUI it's always a NullFileProvider, so that will never
104- // return a file.
105- var headerString = GetHeaderString ( headers ) ;
106- _logger . ResponseContentBeingSent ( requestUri , statusCode ) ;
107- eventArgs . Response = _coreWebView2Environment ! . CreateWebResourceResponse ( content . AsRandomAccessStream ( ) , statusCode , statusMessage , headerString ) ;
83+ return ;
10884 }
109- else if ( relativePath != null )
85+
86+ // 2. If this is an app request, then assume the request is for a Blazor resource.
87+ var requestUri = QueryStringHelper . RemovePossibleQueryString ( url ) ;
88+ if ( new Uri ( requestUri ) is Uri uri )
11089 {
111- await TryServeFromFolderAsync (
112- eventArgs ,
113- allowFallbackOnHostPage ,
114- requestUri ,
115- relativePath ) ;
90+ // Unlike server-side code, we get told exactly why the browser is making the request,
91+ // so we can be smarter about fallback. We can ensure that 'fetch' requests never result
92+ // in fallback, for example.
93+ var allowFallbackOnHostPage =
94+ eventArgs . ResourceContext == CoreWebView2WebResourceContext . Document ||
95+ eventArgs . ResourceContext == CoreWebView2WebResourceContext . Other ; // e.g., dev tools requesting page source
96+
97+ // Get a deferral object so that WebView2 knows there's some async stuff going on. We call Complete() at the end of this method.
98+ using var deferral = eventArgs . GetDeferral ( ) ;
99+
100+ _logger . HandlingWebRequest ( requestUri ) ;
101+
102+ var relativePath = AppOriginUri . IsBaseOf ( uri ) ? AppOriginUri . MakeRelativeUri ( uri ) . ToString ( ) : null ;
103+
104+ // Check if the uri is _framework/blazor.modules.json is a special case as the built-in file provider
105+ // brings in a default implementation.
106+ if ( relativePath != null &&
107+ string . Equals ( relativePath , "_framework/blazor.modules.json" , StringComparison . Ordinal ) &&
108+ await TryServeFromFolderAsync ( eventArgs , allowFallbackOnHostPage : false , requestUri , relativePath ) )
109+ {
110+ _logger . ResponseContentBeingSent ( requestUri , 200 ) ;
111+ }
112+ else if ( TryGetResponseContent ( requestUri , allowFallbackOnHostPage , out var statusCode , out var statusMessage , out var content , out var headers )
113+ && statusCode != 404 )
114+ {
115+ // First, call into WebViewManager to see if it has a framework file for this request. It will
116+ // fall back to an IFileProvider, but on WinUI it's always a NullFileProvider, so that will never
117+ // return a file.
118+ var headerString = GetHeaderString ( headers ) ;
119+ _logger . ResponseContentBeingSent ( requestUri , statusCode ) ;
120+ eventArgs . Response = _coreWebView2Environment ! . CreateWebResourceResponse ( content . AsRandomAccessStream ( ) , statusCode , statusMessage , headerString ) ;
121+ }
122+ else if ( relativePath != null )
123+ {
124+ await TryServeFromFolderAsync (
125+ eventArgs ,
126+ allowFallbackOnHostPage ,
127+ requestUri ,
128+ relativePath ) ;
129+ }
130+
131+ // Notify WebView2 that the deferred (async) operation is complete and we set a response.
132+ deferral . Complete ( ) ;
133+ return ;
116134 }
117135
118- // Notify WebView2 that the deferred (async) operation is complete and we set a response.
119- deferral . Complete ( ) ;
136+ // 3. If the request is not handled by the app nor is it a local source, then we let the WebView2
137+ // handle the request as it would normally do. This means that it will try to load the resource
138+ // from the internet or from the local cache.
139+
140+ _logger . LogDebug ( "Request for {Url} was not handled." , url ) ;
120141 }
121142
122143 private async Task < bool > TryServeFromFolderAsync (
0 commit comments