diff options
author | Fabian Kosmale <fabian.kosmale@qt.io> | 2021-09-06 17:03:29 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2021-10-06 06:39:34 +0000 |
commit | e82a6bdad3b6c73571e1bcb2bacf8dc931285dd7 (patch) | |
tree | 9d0cac136998dbb9d6fb0633d8faab34842d790d /src/qml/qml/qqmlproperty.cpp | |
parent | 33cab286e96bcd742292aeebc113066e57455b95 (diff) |
QML engine: Resolve URLs on property assignment when given an env var
This is a partial (and manual) revert of
0a1e4cc7ec7548f6273befff9cdddb0bc7a58961. We still do not intercept
during property assignment, but relative URLs get resolved in the
current context if QML_COMPAT_RESOLVE_URLS_ON_ASSIGNMENT is set.
Pick-to: 6.2
Task-number: QTBUG-95587
Change-Id: Ib2955541d2626fd26d3886b33f8ba0c2f940779b
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/qml/qqmlproperty.cpp')
-rw-r--r-- | src/qml/qml/qqmlproperty.cpp | 50 |
1 files changed, 34 insertions, 16 deletions
diff --git a/src/qml/qml/qqmlproperty.cpp b/src/qml/qml/qqmlproperty.cpp index d8e2c58e36..d5f0e6c273 100644 --- a/src/qml/qml/qqmlproperty.cpp +++ b/src/qml/qml/qqmlproperty.cpp @@ -74,6 +74,8 @@ Q_DECLARE_METATYPE(QList<QUrl>) QT_BEGIN_NAMESPACE +DEFINE_BOOL_CONFIG_OPTION(compatResolveUrlsOnAssigment, QML_COMPAT_RESOLVE_URLS_ON_ASSIGNMENT); + /*! \class QQmlProperty \since 5.0 @@ -246,6 +248,11 @@ QQmlProperty QQmlPropertyPrivate::create(QObject *target, const QString &propert return result; } +bool QQmlPropertyPrivate::resolveUrlsOnAssignment() +{ + return ::compatResolveUrlsOnAssigment(); +} + QQmlRefPointer<QQmlContextData> QQmlPropertyPrivate::effectiveContext() const { if (context) @@ -1134,32 +1141,38 @@ QVariant QQmlPropertyPrivate::readValueProperty() } // helper function to allow assignment / binding to QList<QUrl> properties. -QVariant QQmlPropertyPrivate::urlSequence(const QVariant &value) +QList<QUrl> QQmlPropertyPrivate::urlSequence(const QVariant &value) { + if (value.metaType() == QMetaType::fromType<QList<QUrl>>()) + return value.value<QList<QUrl> >(); + QList<QUrl> urls; - if (value.userType() == qMetaTypeId<QUrl>()) { + if (value.metaType() == QMetaType::fromType<QUrl>()) { urls.append(value.toUrl()); - } else if (value.userType() == qMetaTypeId<QString>()) { + } else if (value.metaType() == QMetaType::fromType<QString>()) { urls.append(QUrl(value.toString())); - } else if (value.userType() == qMetaTypeId<QByteArray>()) { + } else if (value.metaType() == QMetaType::fromType<QByteArray>()) { urls.append(QUrl(QString::fromUtf8(value.toByteArray()))); - } else if (value.userType() == qMetaTypeId<QList<QUrl> >()) { - urls = value.value<QList<QUrl> >(); - } else if (value.userType() == qMetaTypeId<QStringList>()) { + } else if (value.metaType() == QMetaType::fromType<QStringList>()) { QStringList urlStrings = value.value<QStringList>(); const int urlStringsSize = urlStrings.size(); urls.reserve(urlStringsSize); for (int i = 0; i < urlStringsSize; ++i) urls.append(QUrl(urlStrings.at(i))); - } else if (value.userType() == qMetaTypeId<QList<QString> >()) { - QList<QString> urlStrings = value.value<QList<QString> >(); - const int urlStringsSize = urlStrings.size(); - urls.reserve(urlStringsSize); - for (int i = 0; i < urlStringsSize; ++i) - urls.append(QUrl(urlStrings.at(i))); } // note: QList<QByteArray> is not currently supported. + return urls; +} - return QVariant::fromValue<QList<QUrl> >(urls); +// ### Qt7: Get rid of this +QList<QUrl> QQmlPropertyPrivate::urlSequence( + const QVariant &value, const QQmlRefPointer<QQmlContextData> &ctxt) +{ + QList<QUrl> urls = urlSequence(value); + + for (auto urlIt = urls.begin(); urlIt != urls.end(); ++urlIt) + *urlIt = ctxt->resolvedUrl(*urlIt); + + return urls; } //writeEnumProperty MIRRORS the relelvant bit of QMetaProperty::write AND MUST BE KEPT IN SYNC! @@ -1356,8 +1369,11 @@ bool QQmlPropertyPrivate::write( return property.writeProperty(object, const_cast<QVariant *>(&value), flags); } else if (isUrl) { QUrl u; - if (variantMetaType == QMetaType::fromType<QUrl>()) + if (variantMetaType == QMetaType::fromType<QUrl>()) { u = value.toUrl(); + if (compatResolveUrlsOnAssigment() && context && u.isRelative() && !u.isEmpty()) + u = context->resolvedUrl(u); + } else if (variantMetaType == QMetaType::fromType<QByteArray>()) u = QUrl(QString::fromUtf8(value.toByteArray())); else if (variantMetaType == QMetaType::fromType<QString>()) @@ -1367,7 +1383,9 @@ bool QQmlPropertyPrivate::write( return property.writeProperty(object, &u, flags); } else if (propertyMetaType == QMetaType::fromType<QList<QUrl>>()) { - QList<QUrl> urlSeq = urlSequence(value).value<QList<QUrl>>(); + QList<QUrl> urlSeq = compatResolveUrlsOnAssigment() + ? urlSequence(value, context) + : urlSequence(value); return property.writeProperty(object, &urlSeq, flags); } else if (property.isQList()) { QQmlMetaObject listType; |