diff options
author | Fabian Kosmale <fabian.kosmale@qt.io> | 2020-10-08 15:50:26 +0200 |
---|---|---|
committer | Fabian Kosmale <fabian.kosmale@qt.io> | 2020-10-09 09:03:13 +0200 |
commit | 951c2bcc057be7097dfdcedf8f45c3b858455e0f (patch) | |
tree | d013d534d44508ff6d7df2198cda9d736f65a632 /src/qml | |
parent | e94c57d109d474d9450f39098d51737e8c2f466c (diff) |
QQmlPropertyValidator: only use string converter for strings
A recent change in fromIsoTimeString exposed the fact that we are using
QML's string converters to check whether a binding expression is valid
for a given property. However, while we begrudgingly accept that string
representations shall be converted to value types via the string
converters, the same shouldn't hold true for things that aren't actually
strings - for instance, numbers.
Fixes: QTBUG-87299
Change-Id: Iefd390efae7c193dc32d37e63943b39e09c9295a
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'src/qml')
-rw-r--r-- | src/qml/qml/qqmlpropertyvalidator.cpp | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/src/qml/qml/qqmlpropertyvalidator.cpp b/src/qml/qml/qqmlpropertyvalidator.cpp index 9ad5d3d42f..3cc7cc843a 100644 --- a/src/qml/qml/qqmlpropertyvalidator.cpp +++ b/src/qml/qml/qqmlpropertyvalidator.cpp @@ -406,6 +406,12 @@ QQmlError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache *prope return qQmlCompileError(binding->valueLocation, error); }; + const auto isStringBinding = [&]() -> bool { + // validateLiteralBinding is not supposed to be used on scripts + Q_ASSERT(binding->type != QV4::CompiledData::Binding::Type_Script); + return binding->type == QV4::CompiledData::Binding::Type_String; + }; + switch (property->propType()) { case QMetaType::QVariant: break; @@ -465,7 +471,8 @@ QQmlError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache *prope break; case QMetaType::QColor: { bool ok = false; - QQmlStringConverters::rgbaFromString(compilationUnit->bindingValueAsString(binding), &ok); + if (isStringBinding()) + QQmlStringConverters::rgbaFromString(compilationUnit->bindingValueAsString(binding), &ok); if (!ok) { return warnOrError(tr("Invalid property assignment: color expected")); } @@ -474,7 +481,8 @@ QQmlError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache *prope #if QT_CONFIG(datestring) case QMetaType::QDate: { bool ok = false; - QQmlStringConverters::dateFromString(compilationUnit->bindingValueAsString(binding), &ok); + if (isStringBinding()) + QQmlStringConverters::dateFromString(compilationUnit->bindingValueAsString(binding), &ok); if (!ok) { return warnOrError(tr("Invalid property assignment: date expected")); } @@ -482,7 +490,8 @@ QQmlError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache *prope break; case QMetaType::QTime: { bool ok = false; - QQmlStringConverters::timeFromString(compilationUnit->bindingValueAsString(binding), &ok); + if (isStringBinding()) + QQmlStringConverters::timeFromString(compilationUnit->bindingValueAsString(binding), &ok); if (!ok) { return warnOrError(tr("Invalid property assignment: time expected")); } @@ -490,7 +499,8 @@ QQmlError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache *prope break; case QMetaType::QDateTime: { bool ok = false; - QQmlStringConverters::dateTimeFromString(compilationUnit->bindingValueAsString(binding), &ok); + if (isStringBinding()) + QQmlStringConverters::dateTimeFromString(compilationUnit->bindingValueAsString(binding), &ok); if (!ok) { return warnOrError(tr("Invalid property assignment: datetime expected")); } @@ -499,7 +509,8 @@ QQmlError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache *prope #endif // datestring case QMetaType::QPoint: { bool ok = false; - QQmlStringConverters::pointFFromString(compilationUnit->bindingValueAsString(binding), &ok); + if (isStringBinding()) + QQmlStringConverters::pointFFromString(compilationUnit->bindingValueAsString(binding), &ok); if (!ok) { return warnOrError(tr("Invalid property assignment: point expected")); } @@ -507,7 +518,8 @@ QQmlError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache *prope break; case QMetaType::QPointF: { bool ok = false; - QQmlStringConverters::pointFFromString(compilationUnit->bindingValueAsString(binding), &ok); + if (isStringBinding()) + QQmlStringConverters::pointFFromString(compilationUnit->bindingValueAsString(binding), &ok); if (!ok) { return warnOrError(tr("Invalid property assignment: point expected")); } @@ -515,7 +527,8 @@ QQmlError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache *prope break; case QMetaType::QSize: { bool ok = false; - QQmlStringConverters::sizeFFromString(compilationUnit->bindingValueAsString(binding), &ok); + if (isStringBinding()) + QQmlStringConverters::sizeFFromString(compilationUnit->bindingValueAsString(binding), &ok); if (!ok) { return warnOrError(tr("Invalid property assignment: size expected")); } @@ -523,7 +536,8 @@ QQmlError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache *prope break; case QMetaType::QSizeF: { bool ok = false; - QQmlStringConverters::sizeFFromString(compilationUnit->bindingValueAsString(binding), &ok); + if (isStringBinding()) + QQmlStringConverters::sizeFFromString(compilationUnit->bindingValueAsString(binding), &ok); if (!ok) { return warnOrError(tr("Invalid property assignment: size expected")); } @@ -531,7 +545,8 @@ QQmlError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache *prope break; case QMetaType::QRect: { bool ok = false; - QQmlStringConverters::rectFFromString(compilationUnit->bindingValueAsString(binding), &ok); + if (isStringBinding()) + QQmlStringConverters::rectFFromString(compilationUnit->bindingValueAsString(binding), &ok); if (!ok) { return warnOrError(tr("Invalid property assignment: rect expected")); } @@ -539,7 +554,8 @@ QQmlError QQmlPropertyValidator::validateLiteralBinding(QQmlPropertyCache *prope break; case QMetaType::QRectF: { bool ok = false; - QQmlStringConverters::rectFFromString(compilationUnit->bindingValueAsString(binding), &ok); + if (isStringBinding()) + QQmlStringConverters::rectFFromString(compilationUnit->bindingValueAsString(binding), &ok); if (!ok) { return warnOrError(tr("Invalid property assignment: point expected")); } |