diff options
-rw-r--r-- | src/webview/qwebview_darwin.mm | 40 | ||||
-rw-r--r-- | src/webview/webview-lib.pri | 1 |
2 files changed, 41 insertions, 0 deletions
diff --git a/src/webview/qwebview_darwin.mm b/src/webview/qwebview_darwin.mm index 35fc726..90f6551 100644 --- a/src/webview/qwebview_darwin.mm +++ b/src/webview/qwebview_darwin.mm @@ -202,6 +202,46 @@ QT_END_NAMESPACE } } +- (void)webView:(WKWebView *)webView +decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction + decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler + __attribute__((availability(ios_app_extension,unavailable))) +{ + Q_UNUSED(webView); + NSURL *url = navigationAction.request.URL; + const BOOL handled = (^{ +#if QT_MACOS_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(101300, 110000) + if (__builtin_available(macOS 10.13, iOS 11.0, *)) { + return [WKWebView handlesURLScheme:url.scheme]; + } else +#endif + { + // +[WKWebView handlesURLScheme:] is a stub that calls + // WebCore::SchemeRegistry::isBuiltinScheme(); + // replicate that as closely as possible + return [@[ + @"about", @"applewebdata", @"blob", @"data", + @"file", @"http", @"https", @"javascript", +#ifdef Q_OS_MACOS + @"safari-extension", +#endif + @"webkit-fake-url", @"wss", @"x-apple-content-filter", +#ifdef Q_OS_MACOS + @"x-apple-ql-id" +#endif + ] containsObject:url.scheme]; + } + })(); + if (!handled) { +#ifdef Q_OS_MACOS + [[NSWorkspace sharedWorkspace] openURL:url]; +#elif defined(Q_OS_IOS) + [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil]; +#endif + } + decisionHandler(handled ? WKNavigationActionPolicyAllow : WKNavigationActionPolicyCancel); +} + - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { Q_UNUSED(object); diff --git a/src/webview/webview-lib.pri b/src/webview/webview-lib.pri index f5d6774..1af6dcf 100644 --- a/src/webview/webview-lib.pri +++ b/src/webview/webview-lib.pri @@ -51,6 +51,7 @@ android { $$COMMON_HEADERS \ qwebview_darwin_p.h LIBS_PRIVATE += -framework Foundation -framework WebKit + macos: LIBS_PRIVATE += -framework AppKit ios: LIBS_PRIVATE += -framework UIKit macos: CONFIG += use_webengine_backend |