@@ -150,7 +150,7 @@ private void Attach()
150150 null , null ) ;
151151#pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type.
152152
153- _webview . OnDecidePolicy += HandleOnDecidePolicy ;
153+ _webview . OnDecidePolicy += HandleDecidePolicy ;
154154 _webview . OnDestroy += ( o , args ) => Detach ( ) ;
155155
156156 var userContentManager = _webview . GetUserContentManager ( ) ;
@@ -278,44 +278,22 @@ bool hotReloadedResult
278278 return defaultResult || hotReloadedResult ;
279279 }
280280
281- private bool HandleOnDecidePolicy ( WebKit . WebView sender , WebKit . WebView . DecidePolicySignalArgs args )
281+ private bool HandleDecidePolicy ( WebKit . WebView sender , WebKit . WebView . DecidePolicySignalArgs args )
282282 {
283- if ( args . Decision is NavigationPolicyDecision navigationPolicyDecision )
283+ var decision = args . Decision ;
284+ return args . DecisionType switch
284285 {
285- return args . DecisionType switch
286- {
287- PolicyDecisionType . NavigationAction => HandleNavigationAction ( navigationPolicyDecision ) ,
288- PolicyDecisionType . NewWindowAction => HandleNewWindowAction ( navigationPolicyDecision ) ,
289- _ => false
290- } ;
291- }
292- else if ( args . Decision is ResponsePolicyDecision responsePolicyDecision )
293- {
294- if ( responsePolicyDecision . IsMainFrameMainResource ( ) )
295- {
296- var uriString = responsePolicyDecision . GetRequest ( ) . GetUri ( ) ;
297- if ( Uri . TryCreate ( uriString , UriKind . RelativeOrAbsolute , out var uri ) )
298- {
299- if ( ! AppOriginUri . IsBaseOf ( uri ) )
300- {
301- responsePolicyDecision . Ignore ( ) ;
302- return true ;
303- }
304- }
305-
306- }
307- }
308-
309- return false ;
310- }
286+ PolicyDecisionType . NavigationAction => HandleNavigationAction ( ( NavigationPolicyDecision ) decision ) ,
287+ PolicyDecisionType . NewWindowAction => HandleNewWindowAction ( ( NavigationPolicyDecision ) decision ) ,
288+ PolicyDecisionType . Response => HandleResponsePolicy ( ( ResponsePolicyDecision ) decision ) ,
289+ _ => false
290+ } ;
311291
312- private bool HandleNavigationAction ( NavigationPolicyDecision args )
313- {
314- var uriString = args . NavigationAction . GetRequest ( ) . Uri ;
315- if ( Uri . TryCreate ( uriString , UriKind . RelativeOrAbsolute , out var uri ) )
292+ bool HandleNavigationAction ( NavigationPolicyDecision navigationDecision )
316293 {
294+ var uri = new Uri ( navigationDecision . NavigationAction . GetRequest ( ) . GetUri ( ) ) ;
317295 var callbackArgs = UrlLoadingEventArgs . CreateWithDefaultLoadingStrategy ( uri , AppOriginUri ) ;
318- var navigationType = args . NavigationAction . GetNavigationType ( ) ;
296+ var navigationType = navigationDecision . NavigationAction . GetNavigationType ( ) ;
319297
320298 // <iframe> tags should open in webview
321299 if ( navigationType == NavigationType . Other )
@@ -327,30 +305,48 @@ private bool HandleNavigationAction(NavigationPolicyDecision args)
327305
328306 _logger . NavigationEvent ( uri , callbackArgs . UrlLoadingStrategy ) ;
329307
330- if ( callbackArgs . UrlLoadingStrategy == UrlLoadingStrategy . OpenExternally )
308+ var loadingStrategy = callbackArgs . UrlLoadingStrategy ;
309+
310+ if ( loadingStrategy == UrlLoadingStrategy . OpenExternally )
331311 {
332312 LaunchUriInExternalBrowser ( uri ) ;
333313 }
334314
335- return callbackArgs . UrlLoadingStrategy != UrlLoadingStrategy . OpenInWebView ;
336- }
337-
338- return false ;
339- }
315+ if ( loadingStrategy != UrlLoadingStrategy . OpenInWebView )
316+ {
317+ navigationDecision . Ignore ( ) ;
318+ }
340319
341- private bool HandleNewWindowAction ( NavigationPolicyDecision args )
342- {
343- var uriString = args . NavigationAction . GetRequest ( ) . Uri ;
320+ return loadingStrategy != UrlLoadingStrategy . OpenInWebView ;
321+ }
344322
345- // Intercept _blank target <a> tags to always open in device browser.
346- // The ExternalLinkCallback is not invoked.
347- if ( Uri . TryCreate ( uriString , UriKind . RelativeOrAbsolute , out var uri ) )
323+ bool HandleNewWindowAction ( NavigationPolicyDecision navigationDecision )
348324 {
325+ // Intercept _blank target <a> tags to always open in device browser.
326+ // The ExternalLinkCallback is not invoked.
327+ var uri = new Uri ( navigationDecision . NavigationAction . GetRequest ( ) . GetUri ( ) ) ;
349328 LaunchUriInExternalBrowser ( uri ) ;
329+ navigationDecision . Ignore ( ) ;
350330 return true ;
351331 }
352332
353- return false ;
333+ static bool HandleResponsePolicy ( ResponsePolicyDecision responsePolicyDecision )
334+ {
335+ if ( ! responsePolicyDecision . IsMainFrameMainResource ( ) )
336+ {
337+ return false ;
338+ }
339+
340+ var uri = new Uri ( responsePolicyDecision . GetRequest ( ) . GetUri ( ) ) ;
341+
342+ if ( AppOriginUri . IsBaseOf ( uri ) )
343+ {
344+ return false ;
345+ }
346+
347+ responsePolicyDecision . Ignore ( ) ;
348+ return true ;
349+ }
354350 }
355351
356352 bool _detached = false ;
0 commit comments