summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2018-01-20 22:47:18 +0100
committerLiang Qi <liang.qi@qt.io>2018-01-20 22:47:51 +0100
commit71be1de8162f38fc544605743a0169e10a19dc39 (patch)
tree94d8f3504cd36bb69ec314151e456759bea97481 /src
parent53cfa9f6da036418e2842ac22871cdcc09c90ae6 (diff)
parenteef3467cfad9f6ad892344bfcadbd59b5bcb4f53 (diff)
Merge remote-tracking branch 'origin/5.10' into dev
Conflicts: .qmake.conf Change-Id: I1b0ab1fd69048c03f67da20e0c6e079ef07adf8b
Diffstat (limited to 'src')
-rw-r--r--src/webview/qwebview_darwin.mm62
-rw-r--r--src/webview/webview-lib.pri1
-rw-r--r--src/webview/webview.pro2
3 files changed, 58 insertions, 7 deletions
diff --git a/src/webview/qwebview_darwin.mm b/src/webview/qwebview_darwin.mm
index ff9dc4d..90f6551 100644
--- a/src/webview/qwebview_darwin.mm
+++ b/src/webview/qwebview_darwin.mm
@@ -40,6 +40,7 @@
#include "qtwebviewfunctions.h"
#include "qtwebviewfunctions_p.h"
+#include <QtCore/private/qglobal_p.h>
#include <QtCore/qdatetime.h>
#include <QtCore/qmap.h>
#include <QtCore/qvariant.h>
@@ -190,13 +191,57 @@ QT_END_NAMESPACE
if (--qDarwinWebViewPrivate->requestFrameCount == 0) {
[self pageDone];
NSString *errorString = [error localizedDescription];
+ NSURL *failingURL = error.userInfo[@"NSErrorFailingURLKey"];
+ const QUrl url = [failingURL isKindOfClass:[NSURL class]]
+ ? QUrl::fromNSURL(failingURL)
+ : qDarwinWebViewPrivate->url();
Q_EMIT qDarwinWebViewPrivate->loadingChanged(
- QWebViewLoadRequestPrivate(qDarwinWebViewPrivate->url(),
+ QWebViewLoadRequestPrivate(url,
QWebView::LoadFailedStatus,
QString::fromNSString(errorString)));
}
}
+- (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);
@@ -253,14 +298,19 @@ void QDarwinWebViewPrivate::setUrl(const QUrl &url)
{
if (url.isValid()) {
requestFrameCount = 0;
- if (!url.isLocalFile()) {
- [wkWebView loadRequest:[NSURLRequest requestWithURL:url.toNSURL()]];
- } else {
+
+#if QT_MACOS_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(101100, 90000)
+ if (url.isLocalFile()) {
// We need to pass local files via loadFileURL and the read access should cover
// the directory that the file is in, to facilitate loading referenced images etc
- [wkWebView loadFileURL:url.toNSURL()
- allowingReadAccessToURL:QUrl(url.toString(QUrl::RemoveFilename)).toNSURL()];
+ if (__builtin_available(macOS 10.11, iOS 9, *)) {
+ [wkWebView loadFileURL:url.toNSURL()
+ allowingReadAccessToURL:QUrl(url.toString(QUrl::RemoveFilename)).toNSURL()];
+ return;
+ }
}
+#endif
+ [wkWebView loadRequest:[NSURLRequest requestWithURL:url.toNSURL()]];
}
}
diff --git a/src/webview/webview-lib.pri b/src/webview/webview-lib.pri
index 0731f87..6630fd4 100644
--- a/src/webview/webview-lib.pri
+++ b/src/webview/webview-lib.pri
@@ -49,6 +49,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
diff --git a/src/webview/webview.pro b/src/webview/webview.pro
index 452a3cc..af1286e 100644
--- a/src/webview/webview.pro
+++ b/src/webview/webview.pro
@@ -1,7 +1,7 @@
TARGET = QtWebView
QT =
-QT_FOR_PRIVATE = quick-private gui-private
+QT_FOR_PRIVATE = quick-private core-private gui-private
include($$PWD/webview-lib.pri)