Skip to content

Commit 586c7ee

Browse files
committed
Fixed the issue of opening the default browser multiple times when clicking on external links
1 parent 4d94f6e commit 586c7ee

1 file changed

Lines changed: 43 additions & 47 deletions

File tree

src/BlazorWebView/src/Gtk/GtkWebViewManager.cs

Lines changed: 43 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)