aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quicktemplates2/qquickscrollbar.cpp17
-rw-r--r--tests/auto/quickcontrols2/controls/data/tst_scrollbar.qml34
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)
+ }
}