diff options
-rw-r--r-- | src/quicktemplates2/qquickscrollbar.cpp | 17 | ||||
-rw-r--r-- | tests/auto/quickcontrols2/controls/data/tst_scrollbar.qml | 34 |
2 files changed, 43 insertions, 8 deletions
diff --git a/src/quicktemplates2/qquickscrollbar.cpp b/src/quicktemplates2/qquickscrollbar.cpp index f20805a8f0..14d4e3a86f 100644 --- a/src/quicktemplates2/qquickscrollbar.cpp +++ b/src/quicktemplates2/qquickscrollbar.cpp @@ -165,7 +165,8 @@ static const QQuickItemPrivate::ChangeTypes verticalChangeTypes = changeTypes | QQuickScrollBarPrivate::VisualArea QQuickScrollBarPrivate::visualArea() const { qreal visualPos = position; - if (minimumSize > size) + + if (minimumSize > size && size != 1.0) visualPos = position / (1.0 - size) * (1.0 - minimumSize); qreal visualSize = qBound<qreal>(0, qMax(size, minimumSize) + qMin<qreal>(0, visualPos), @@ -178,7 +179,7 @@ QQuickScrollBarPrivate::VisualArea QQuickScrollBarPrivate::visualArea() const qreal QQuickScrollBarPrivate::logicalPosition(qreal position) const { - if (minimumSize > size) + if (minimumSize > size && minimumSize != 1.0) return position * (1.0 - size) / (1.0 - minimumSize); return position; } @@ -434,11 +435,11 @@ qreal QQuickScrollBar::size() const void QQuickScrollBar::setSize(qreal size) { Q_D(QQuickScrollBar); - if (qFuzzyCompare(d->size, size)) + if (!qt_is_finite(size) || qFuzzyCompare(d->size, size)) return; auto oldVisualArea = d->visualArea(); - d->size = size; + d->size = qBound(0.0, size, 1.0); if (isComponentComplete()) d->resizeContent(); emit sizeChanged(); @@ -466,7 +467,7 @@ qreal QQuickScrollBar::position() const void QQuickScrollBar::setPosition(qreal position) { Q_D(QQuickScrollBar); - if (qFuzzyCompare(d->position, position)) + if (!qt_is_finite(position) || qFuzzyCompare(d->position, position)) return; auto oldVisualArea = d->visualArea(); @@ -493,7 +494,7 @@ qreal QQuickScrollBar::stepSize() const void QQuickScrollBar::setStepSize(qreal step) { Q_D(QQuickScrollBar); - if (qFuzzyCompare(d->stepSize, step)) + if (!qt_is_finite(step) || qFuzzyCompare(d->stepSize, step)) return; d->stepSize = step; @@ -737,11 +738,11 @@ qreal QQuickScrollBar::minimumSize() const void QQuickScrollBar::setMinimumSize(qreal minimumSize) { Q_D(QQuickScrollBar); - if (qFuzzyCompare(d->minimumSize, minimumSize)) + if (!qt_is_finite(minimumSize) || qFuzzyCompare(d->minimumSize, minimumSize)) return; auto oldVisualArea = d->visualArea(); - d->minimumSize = minimumSize; + d->minimumSize = qBound(0.0, minimumSize, 1.0); if (isComponentComplete()) d->resizeContent(); emit minimumSizeChanged(); diff --git a/tests/auto/quickcontrols2/controls/data/tst_scrollbar.qml b/tests/auto/quickcontrols2/controls/data/tst_scrollbar.qml index d49658762c..d453f017e7 100644 --- a/tests/auto/quickcontrols2/controls/data/tst_scrollbar.qml +++ b/tests/auto/quickcontrols2/controls/data/tst_scrollbar.qml @@ -964,4 +964,38 @@ TestCase { compare(vertical.visualPosition, 0.2) compare(vertical.contentItem.y, vertical.topPadding + 0.2 * vertical.availableHeight) } + + function test_setting_invalid_property_values() { + var control = createTemporaryObject(scrollBar, testCase, {size: 2.0, minimumSize: -1.0}) + verify(control) + + // check that the values are within the expected range + compare(control.size, 1.0) + compare(control.minimumSize, 0) + + control.minimumSize = 2.0 + compare(control.minimumSize, 1.0) + + // test if setting NaN is prevented + control.size = NaN + control.minimumSize = NaN + compare(control.size, 1.0) + compare(control.minimumSize, 1.0) + + + // test if setting float infinity is prevented + control.size = Number.POSITIVE_INFINITY + control.minimumSize = Number.POSITIVE_INFINITY + compare(control.size, 1.0) + compare(control.minimumSize, 1.0) + + let oldPosition = control.position; + let oldStepSize = control.stepSize; + + control.position = NaN; + control.stepSize = NaN; + + compare(oldPosition, control.position) + compare(oldStepSize, control.stepSize) + } } |