diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2020-01-15 12:18:57 +0100 |
---|---|---|
committer | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2020-01-15 12:18:57 +0100 |
commit | 499c6ed78d9657fbab344d5688c3c86b606c05b1 (patch) | |
tree | 215b21e0912bb586ee361ac540fb0792a02a2e62 /src/qml | |
parent | f215d00f601f66c15e0d4b2951223bc6f7e3ea5e (diff) | |
parent | c5a8dc153b3d3218360184837b098ba09018d982 (diff) |
Merge remote-tracking branch 'origin/5.15' into dev
Change-Id: I3058a6b9347d7ca2a0c04a58cb030ae5c47de415
Diffstat (limited to 'src/qml')
-rw-r--r-- | src/qml/jsruntime/qv4sequenceobject.cpp | 4 | ||||
-rw-r--r-- | src/qml/qml/qqmlengine.cpp | 4 | ||||
-rw-r--r-- | src/qml/qml/qqmltypemodule.cpp | 8 | ||||
-rw-r--r-- | src/qml/qml/qqmlxmlhttprequest.cpp | 36 |
4 files changed, 46 insertions, 6 deletions
diff --git a/src/qml/jsruntime/qv4sequenceobject.cpp b/src/qml/jsruntime/qv4sequenceobject.cpp index 82436bcd5d..ee42342bf2 100644 --- a/src/qml/jsruntime/qv4sequenceobject.cpp +++ b/src/qml/jsruntime/qv4sequenceobject.cpp @@ -304,8 +304,10 @@ public: return false; } - if (d()->isReadOnly) + if (d()->isReadOnly) { + engine()->throwTypeError(QLatin1String("Cannot insert into a readonly container")); return false; + } if (d()->isReference) { if (!d()->object) diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp index 84f56eb051..6cdb012e26 100644 --- a/src/qml/qml/qqmlengine.cpp +++ b/src/qml/qml/qqmlengine.cpp @@ -985,8 +985,6 @@ QQmlEngine::~QQmlEngine() Q_D(QQmlEngine); QJSEnginePrivate::removeFromDebugServer(this); - d->typeLoader.invalidate(); - // Emit onDestruction signals for the root context before // we destroy the contexts, engine, Singleton Types etc. that // may be required to handle the destruction signal. @@ -1002,6 +1000,8 @@ QQmlEngine::~QQmlEngine() delete d->rootContext; d->rootContext = nullptr; + + d->typeLoader.invalidate(); } /*! \fn void QQmlEngine::quit() diff --git a/src/qml/qml/qqmltypemodule.cpp b/src/qml/qml/qqmltypemodule.cpp index 9c9bf3e48f..9d6f269030 100644 --- a/src/qml/qml/qqmltypemodule.cpp +++ b/src/qml/qml/qqmltypemodule.cpp @@ -97,10 +97,14 @@ void QQmlTypeModule::add(QQmlTypePrivate *type) QList<QQmlTypePrivate *> &list = d->typeHash[type->elementName]; for (int ii = 0; ii < list.count(); ++ii) { - Q_ASSERT(list.at(ii)); - if (list.at(ii)->version_min < type->version_min) { + QQmlTypePrivate *in_list = list.at(ii); + Q_ASSERT(in_list); + if (in_list->version_min < type->version_min) { list.insert(ii, type); return; + } else if (in_list->version_min == type->version_min) { + list[ii] = type; + return; } } list.append(type); diff --git a/src/qml/qml/qqmlxmlhttprequest.cpp b/src/qml/qml/qqmlxmlhttprequest.cpp index c2e7be73e7..2afbdb616b 100644 --- a/src/qml/qml/qqmlxmlhttprequest.cpp +++ b/src/qml/qml/qqmlxmlhttprequest.cpp @@ -54,6 +54,7 @@ #include <QtCore/qobject.h> #include <QtQml/qjsvalue.h> #include <QtQml/qjsengine.h> +#include <QtQml/qqmlfile.h> #include <QtNetwork/qnetworkreply.h> #include <QtCore/qtextcodec.h> #include <QtCore/qxmlstream.h> @@ -77,6 +78,8 @@ using namespace QV4; QT_BEGIN_NAMESPACE DEFINE_BOOL_CONFIG_OPTION(xhrDump, QML_XHR_DUMP); +DEFINE_BOOL_CONFIG_OPTION(xhrFileWrite, QML_XHR_ALLOW_FILE_WRITE); +DEFINE_BOOL_CONFIG_OPTION(xhrFileRead, QML_XHR_ALLOW_FILE_READ); struct QQmlXMLHttpRequestData { QQmlXMLHttpRequestData(); @@ -1195,6 +1198,37 @@ void QQmlXMLHttpRequest::fillHeadersList() void QQmlXMLHttpRequest::requestFromUrl(const QUrl &url) { QNetworkRequest request = m_request; + + if (QQmlFile::isLocalFile(url)) { + if (m_method == QLatin1String("PUT")) + { + if (!xhrFileWrite()) { + if (qEnvironmentVariableIsSet("QML_XHR_ALLOW_FILE_WRITE")) { + qWarning("XMLHttpRequest: Tried to use PUT on a local file despite being disabled."); + return; + } else { + qWarning("XMLHttpRequest: Using PUT on a local file is dangerous " + "and will be disabled by default in a future Qt version." + "Set QML_XHR_ALLOW_FILE_WRITE to 1 if you wish to continue using this feature."); + } + } + } else if (m_method == QLatin1String("GET")) { + if (!xhrFileRead()) { + if (qEnvironmentVariableIsSet("QML_XHR_ALLOW_FILE_READ")) { + qWarning("XMLHttpRequest: Tried to use GET on a local file despite being disabled."); + return; + } else { + qWarning("XMLHttpRequest: Using GET on a local file is dangerous " + "and will be disabled by default in a future Qt version." + "Set QML_XHR_ALLOW_FILE_READ to 1 if you wish to continue using this feature."); + } + } + } else { + qWarning("XMLHttpRequest: Unsupported method used on a local file"); + return; + } + } + request.setUrl(url); if(m_method == QLatin1String("POST") || m_method == QLatin1String("PUT")) { @@ -1389,7 +1423,7 @@ void QQmlXMLHttpRequest::finished() QVariant redirect = m_network->attribute(QNetworkRequest::RedirectionTargetAttribute); if (redirect.isValid()) { QUrl url = m_network->url().resolved(redirect.toUrl()); - if (url.scheme() != QLatin1String("file")) { + if (!QQmlFile::isLocalFile(url)) { // See http://www.ietf.org/rfc/rfc2616.txt, section 10.3.4 "303 See Other": // Result of 303 redirection should be a new "GET" request. const QVariant code = m_network->attribute(QNetworkRequest::HttpStatusCodeAttribute); |