summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJüri Valdmann <juri.valdmann@qt.io>2019-02-05 15:00:52 +0100
committerJüri Valdmann <juri.valdmann@qt.io>2019-02-11 10:18:07 +0000
commit998a5a28f4ce348ba985bec4aacbd39aa82b5261 (patch)
tree93128bc3ddf8d039524808581b819e55d8e470a9 /src
parentb3872ab2bb94b70e3f43cdf4217d959b95815d26 (diff)
Better error reporting for QWebEngineUrlScheme
Add warnings for late registration and invalid configuration. Fixes: QTBUG-72842 Change-Id: I2c103c3b3581112cc885c3a1b4f42c011c3510ab Reviewed-by: Michal Klocek <michal.klocek@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/core/api/qwebengineurlscheme.cpp33
-rw-r--r--src/core/api/qwebengineurlscheme.h4
-rw-r--r--src/core/web_engine_context.cpp15
3 files changed, 46 insertions, 6 deletions
diff --git a/src/core/api/qwebengineurlscheme.cpp b/src/core/api/qwebengineurlscheme.cpp
index d63599163..9f7288f2d 100644
--- a/src/core/api/qwebengineurlscheme.cpp
+++ b/src/core/api/qwebengineurlscheme.cpp
@@ -39,7 +39,9 @@
#include "qwebengineurlscheme.h"
-#include <url/url_util_qt.h>
+#include "url/url_util_qt.h"
+
+#include <QtDebug>
QT_BEGIN_NAMESPACE
@@ -59,6 +61,8 @@ ASSERT_ENUMS_MATCH(QWebEngineUrlScheme::ServiceWorkersAllowed, url::CustomScheme
ASSERT_ENUMS_MATCH(QWebEngineUrlScheme::ViewSourceAllowed, url::CustomScheme::ViewSourceAllowed)
ASSERT_ENUMS_MATCH(QWebEngineUrlScheme::ContentSecurityPolicyIgnored, url::CustomScheme::ContentSecurityPolicyIgnored)
+static bool g_schemesLocked = false;
+
class QWebEngineUrlSchemePrivate : public QSharedData
, public url::CustomScheme
{
@@ -357,6 +361,28 @@ void QWebEngineUrlScheme::setFlags(Flags newValue)
*/
void QWebEngineUrlScheme::registerScheme(const QWebEngineUrlScheme &scheme)
{
+ if (scheme.d->name.empty()) {
+ qWarning() << "QWebEngineUrlScheme::registerScheme: Scheme name cannot be empty";
+ return;
+ }
+
+ bool needsPort = scheme.d->has_port_component();
+ bool hasPort = scheme.d->default_port != url::PORT_UNSPECIFIED;
+ if (needsPort && !hasPort) {
+ qWarning() << "QWebEngineUrlScheme::registerScheme: Scheme" << scheme.name() << "needs a default port";
+ return;
+ }
+
+ if (url::CustomScheme::FindScheme(scheme.d->name)) {
+ qWarning() << "QWebEngineUrlScheme::registerScheme: Scheme" << scheme.name() << "already registered";
+ return;
+ }
+
+ if (g_schemesLocked) {
+ qWarning() << "QWebEngineUrlScheme::registerScheme: Too late to register scheme" << scheme.name();
+ return;
+ }
+
url::CustomScheme::AddScheme(*scheme.d);
}
@@ -374,4 +400,9 @@ QWebEngineUrlScheme QWebEngineUrlScheme::schemeByName(const QByteArray &name)
return QWebEngineUrlScheme();
}
+void QWebEngineUrlScheme::lockSchemes()
+{
+ g_schemesLocked = true;
+}
+
QT_END_NAMESPACE
diff --git a/src/core/api/qwebengineurlscheme.h b/src/core/api/qwebengineurlscheme.h
index 88a8f5065..da3010335 100644
--- a/src/core/api/qwebengineurlscheme.h
+++ b/src/core/api/qwebengineurlscheme.h
@@ -46,6 +46,8 @@
#include <QtCore/qobjectdefs.h>
#include <QtCore/qshareddata.h>
+namespace QtWebEngineCore { class WebEngineContext; }
+
QT_BEGIN_NAMESPACE
class QWebEngineUrlSchemePrivate;
@@ -106,6 +108,8 @@ public:
static QWebEngineUrlScheme schemeByName(const QByteArray &name);
private:
+ friend QtWebEngineCore::WebEngineContext;
+ static void lockSchemes();
QWebEngineUrlScheme(QWebEngineUrlSchemePrivate *d);
QSharedDataPointer<QWebEngineUrlSchemePrivate> d;
};
diff --git a/src/core/web_engine_context.cpp b/src/core/web_engine_context.cpp
index ca52a5e67..edae5c47d 100644
--- a/src/core/web_engine_context.cpp
+++ b/src/core/web_engine_context.cpp
@@ -353,11 +353,16 @@ WebEngineContext::WebEngineContext()
qputenv("force_s3tc_enable", "true");
#endif
- QWebEngineUrlScheme qrcScheme(QByteArrayLiteral("qrc"));
- qrcScheme.setFlags(QWebEngineUrlScheme::SecureScheme
- | QWebEngineUrlScheme::LocalAccessAllowed
- | QWebEngineUrlScheme::ViewSourceAllowed);
- QWebEngineUrlScheme::registerScheme(qrcScheme);
+ if (QWebEngineUrlScheme::schemeByName(QByteArrayLiteral("qrc")) == QWebEngineUrlScheme()) {
+ // User might have registered "qrc" already with different options.
+ QWebEngineUrlScheme qrcScheme(QByteArrayLiteral("qrc"));
+ qrcScheme.setFlags(QWebEngineUrlScheme::SecureScheme
+ | QWebEngineUrlScheme::LocalAccessAllowed
+ | QWebEngineUrlScheme::ViewSourceAllowed);
+ QWebEngineUrlScheme::registerScheme(qrcScheme);
+ }
+
+ QWebEngineUrlScheme::lockSchemes();
// Allow us to inject javascript like any webview toolkit.
content::RenderFrameHost::AllowInjectingJavaScriptForAndroidWebView();