From 0879758f8ece9f3b2a799eb87de25813934ba02f Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Wed, 1 Feb 2023 16:47:46 +0100 Subject: [PATCH] tst_FlickableInterop: use QScopedPointer for touchscreen device Avoid leaking. Pick-to: 6.5 6.4 6.2 Change-Id: I791dc01b9be28464f55911a0e74cb7096fa4f316 Reviewed-by: Doris Verria --- .../flickableinterop/tst_flickableinterop.cpp | 59 +++++++++---------- 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/tests/auto/quick/pointerhandlers/flickableinterop/tst_flickableinterop.cpp b/tests/auto/quick/pointerhandlers/flickableinterop/tst_flickableinterop.cpp index d2066d119f..0343c77ddc 100644 --- a/tests/auto/quick/pointerhandlers/flickableinterop/tst_flickableinterop.cpp +++ b/tests/auto/quick/pointerhandlers/flickableinterop/tst_flickableinterop.cpp @@ -31,7 +31,6 @@ class tst_FlickableInterop : public QQmlDataTest public: tst_FlickableInterop() : QQmlDataTest(QT_QMLTEST_DATADIR) - , touchDevice(QTest::createTouchDevice()) {} private slots: @@ -59,7 +58,7 @@ private slots: private: void createView(QScopedPointer &window, const char *fileName); - QPointingDevice *touchDevice; + QScopedPointer touchDevice = QScopedPointer(QTest::createTouchDevice()); }; void tst_FlickableInterop::createView(QScopedPointer &window, const char *fileName) @@ -98,24 +97,24 @@ void tst_FlickableInterop::touchTapButton() // Button changes pressed state and emits tapped on release QPoint p1 = button->mapToScene(QPointF(20, 20)).toPoint(); - QTest::touchEvent(window, touchDevice).press(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).press(1, p1, window); QQuickTouchUtils::flush(window); QTRY_VERIFY(button->property("pressed").toBool()); - QTest::touchEvent(window, touchDevice).release(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).release(1, p1, window); QQuickTouchUtils::flush(window); QTRY_VERIFY(!button->property("pressed").toBool()); QCOMPARE(tappedSpy.size(), 1); // We can drag <= dragThreshold and the button still acts normal, Flickable doesn't grab p1 = button->mapToScene(QPointF(20, 20)).toPoint(); - QTest::touchEvent(window, touchDevice).press(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).press(1, p1, window); QQuickTouchUtils::flush(window); QTRY_VERIFY(button->property("pressed").toBool()); p1 += QPoint(dragThreshold, 0); - QTest::touchEvent(window, touchDevice).move(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).move(1, p1, window); QQuickTouchUtils::flush(window); QVERIFY(button->property("pressed").toBool()); - QTest::touchEvent(window, touchDevice).release(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).release(1, p1, window); QQuickTouchUtils::flush(window); QTRY_VERIFY(!button->property("pressed").toBool()); QCOMPARE(tappedSpy.size(), 2); @@ -146,11 +145,11 @@ void tst_FlickableInterop::touchDragFlickableBehindButton() tappedSpy.clear(); QPoint p1 = button->mapToScene(QPointF(20, 20)).toPoint(); - QTest::touchEvent(window, touchDevice).press(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).press(1, p1, window); QQuickTouchUtils::flush(window); QTRY_VERIFY(button->property("pressed").toBool()); p1 += QPoint(dragThreshold, 0); - QTest::touchEvent(window, touchDevice).move(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).move(1, p1, window); QQuickTouchUtils::flush(window); QVERIFY(button->property("pressed").toBool()); int i = 0; @@ -158,14 +157,14 @@ void tst_FlickableInterop::touchDragFlickableBehindButton() // Button is no longer pressed because Flickable steals the grab for (; i < 100 && !flickable->isMoving(); ++i) { p1 += QPoint(1, 0); - QTest::touchEvent(window, touchDevice).move(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).move(1, p1, window); QQuickTouchUtils::flush(window); } qCDebug(lcPointerTests) << "flickable started moving after" << i << "moves, when we got to" << p1; QVERIFY(flickable->isMoving()); QCOMPARE(i, 2); QVERIFY(!button->property("pressed").toBool()); - QTest::touchEvent(window, touchDevice).release(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).release(1, p1, window); QQuickTouchUtils::flush(window); QVERIFY(!button->property("pressed").toBool()); QCOMPARE(tappedSpy.size(), 0); @@ -242,7 +241,7 @@ void tst_FlickableInterop::mouseDragFlickableBehindButton() QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, p1); QTRY_VERIFY(button->property("pressed").toBool()); p1 += QPoint(dragThreshold, 0); - QTest::touchEvent(window, touchDevice).move(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).move(1, p1, window); QVERIFY(button->property("pressed").toBool()); int i = 0; for (; i < 100 && !flickable->isMoving(); ++i) { @@ -279,19 +278,19 @@ void tst_FlickableInterop::touchDragSlider() // Drag the slider in the allowed (vertical) direction tappedSpy.clear(); QPoint p1 = knob->mapToScene(knob->clipRect().center()).toPoint() - QPoint(0, 8); - QTest::touchEvent(window, touchDevice).press(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).press(1, p1, window); QQuickTouchUtils::flush(window); QTRY_VERIFY(slider->property("pressed").toBool()); p1 += QPoint(0, dragThreshold); - QTest::touchEvent(window, touchDevice).move(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).move(1, p1, window); QQuickTouchUtils::flush(window); QVERIFY(slider->property("pressed").toBool()); QCOMPARE(slider->property("value").toInt(), 49); p1 += QPoint(0, 1); - QTest::touchEvent(window, touchDevice).move(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).move(1, p1, window); QQuickTouchUtils::flush(window); p1 += QPoint(0, 10); - QTest::touchEvent(window, touchDevice).move(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).move(1, p1, window); QQuickTouchUtils::flush(window); QVERIFY(slider->property("value").toInt() < 49); QVERIFY(!flickable->isMoving()); @@ -300,12 +299,12 @@ void tst_FlickableInterop::touchDragSlider() // Now that the DragHandler is active, the Flickable will not steal the grab // even if we move a large distance horizontally p1 += QPoint(dragThreshold * 2, 0); - QTest::touchEvent(window, touchDevice).move(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).move(1, p1, window); QQuickTouchUtils::flush(window); QVERIFY(!flickable->isMoving()); // Release, and do not expect the tapped signal - QTest::touchEvent(window, touchDevice).release(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).release(1, p1, window); QQuickTouchUtils::flush(window); QCOMPARE(tappedSpy.size(), 0); QCOMPARE(translationChangedSpy.size(), 1); @@ -418,24 +417,24 @@ void tst_FlickableInterop::touchDragFlickableBehindSlider() // because Flickable steals the grab tappedSpy.clear(); QPoint p1 = knob->mapToScene(knob->clipRect().center()).toPoint(); - QTest::touchEvent(window, touchDevice).press(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).press(1, p1, window); QQuickTouchUtils::flush(window); QTRY_VERIFY(slider->property("pressed").toBool()); p1 += QPoint(dragThreshold, 0); - QTest::touchEvent(window, touchDevice).move(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).move(1, p1, window); QQuickTouchUtils::flush(window); QVERIFY(slider->property("pressed").toBool()); int i = 0; for (; i < 100 && !flickable->isMoving(); ++i) { p1 += QPoint(1, 0); - QTest::touchEvent(window, touchDevice).move(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).move(1, p1, window); QQuickTouchUtils::flush(window); } qCDebug(lcPointerTests) << "flickable started moving after" << i << "moves, when we got to" << p1; QVERIFY(flickable->isMoving()); QCOMPARE(i, 2); QVERIFY(!slider->property("pressed").toBool()); - QTest::touchEvent(window, touchDevice).release(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).release(1, p1, window); QQuickTouchUtils::flush(window); QVERIFY(!slider->property("pressed").toBool()); QCOMPARE(tappedSpy.size(), 0); @@ -509,19 +508,19 @@ void tst_FlickableInterop::touchDragFlickableBehindItemWithHandlers() QPoint p1 = rect->mapToScene(rect->clipRect().center()).toPoint(); QPoint originP1 = p1; - QTest::touchEvent(window, touchDevice).press(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).press(1, p1, window); QQuickTouchUtils::flush(window); for (int i = 0; i < dragThreshold * 3; ++i) { p1 = originP1; p1.rx() += i; - QTest::touchEvent(window, touchDevice).move(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).move(1, p1, window); QQuickTouchUtils::flush(window); } QCOMPARE(flickable->isMoving(), expectedFlickableMoving); if (!expectedFlickableMoving) { QVERIFY(rect->mapToScene(rect->clipRect().center()).toPoint().x() > originP1.x()); } - QTest::touchEvent(window, touchDevice).release(1, p1, window); + QTest::touchEvent(window, touchDevice.get()).release(1, p1, window); QQuickTouchUtils::flush(window); } @@ -586,7 +585,7 @@ void tst_FlickableInterop::touchDragSliderAndFlickable() QVERIFY(knob); QQuickFlickable *flickable = window->rootObject()->findChild(); QVERIFY(flickable); - QTest::QTouchEventSequence touchSeq = QTest::touchEvent(window, touchDevice, false); + QTest::QTouchEventSequence touchSeq = QTest::touchEvent(window, touchDevice.get(), false); // The knob is initially centered over the slider's "groove" qreal initialXOffset = qAbs(knob->mapToScene(knob->clipRect().center()).x() - slider->mapToScene @@ -716,7 +715,7 @@ void tst_FlickableInterop::touchAndDragHandlerOnFlickable() } // Drag one finger on the Flickable (between delegates) and make sure it flicks - QTest::QTouchEventSequence touchSeq = QTest::touchEvent(window, touchDevice, false); + QTest::QTouchEventSequence touchSeq = QTest::touchEvent(window, touchDevice.get(), false); QPoint p1(780, 460); if (delegate) p1 = delegate->mapToScene(delegate->clipRect().bottomRight()).toPoint() + QPoint(-1, 1); @@ -796,10 +795,10 @@ void tst_FlickableInterop::pinchHandlerOnFlickable() QVERIFY(pinchable); QSignalSpy flickMoveSpy(flickable, &QQuickFlickable::movementStarted); - QSignalSpy grabChangedSpy(touchDevice, &QPointingDevice::grabChanged); + QSignalSpy grabChangedSpy(touchDevice.get(), &QPointingDevice::grabChanged); QObject *grabber = nullptr; - connect(touchDevice, &QPointingDevice::grabChanged, + connect(touchDevice.get(), &QPointingDevice::grabChanged, [&grabber](QObject *g, QPointingDevice::GrabTransition transition, const QPointerEvent *, const QEventPoint &) { if (transition == QPointingDevice::GrabTransition::GrabExclusive) grabber = g; @@ -807,7 +806,7 @@ void tst_FlickableInterop::pinchHandlerOnFlickable() QPoint p0 = pinchable->mapToScene({50, 100}).toPoint(); QPoint p1 = pinchable->mapToScene({150, 100}).toPoint(); - QTest::QTouchEventSequence touch = QTest::touchEvent(&window, touchDevice); + QTest::QTouchEventSequence touch = QTest::touchEvent(&window, touchDevice.get()); touch.press(0, p0, &window).press(1, p1, &window).commit(); QQuickTouchUtils::flush(&window);