aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/quick/touchmouse
diff options
context:
space:
mode:
authorShawn Rutledge <shawn.rutledge@qt.io>2020-09-30 19:35:26 +0200
committerShawn Rutledge <shawn.rutledge@qt.io>2020-11-11 12:16:15 +0100
commitd7623d79ef4bc9533fced027bf1d173d68b4eba6 (patch)
tree9595924e962c340d8efb9c74c66f053f09c379da /tests/auto/quick/touchmouse
parent25c5ace02747753c524960abbf6fb81de1d11c6d (diff)
Teach flickable to handle and replay touch as it does mouse
QQuickWindowPrivate::cloneMouseEvent() renamed to clonePointerEvent() and generalized to be able to clone any of the kinds of QPointerEvent that we're interested in replaying. Now it is used only in QQuickFlickablePrivate::captureDelayedPress(). Reverts f278bb7c66bb00c9f81b7a3aceeb94cb9b3a1b66 and 012a4528a515af8d7ec7dbc05a38d8fd0d6d4d1b (don't skip tst_TouchMouse::buttonOnDelayedPressFlickable). Some test changes from f128b5dee8a2a03ebc55ed0cd1e749a6599282c3 also get reverted. QEventPoint should always have valid velocity now, so Flickable no longer has to calculate it for itself. Removing that became necessary to fix the movingAndFlicking test. Adds logging categories qt.quick.flickable.filter and .replay. Fixes: QTBUG-85607 Task-number: QTBUG-83437 Task-number: QTBUG-78818 Task-number: QTBUG-61144 Task-number: QTBUG-88038 Task-number: QTBUG-88138 Change-Id: I0ed6802dff5e5d1595adddc389642925f1f2c93d Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'tests/auto/quick/touchmouse')
-rw-r--r--tests/auto/quick/touchmouse/tst_touchmouse.cpp84
1 files changed, 40 insertions, 44 deletions
diff --git a/tests/auto/quick/touchmouse/tst_touchmouse.cpp b/tests/auto/quick/touchmouse/tst_touchmouse.cpp
index ac6b579d03..d06f1337c4 100644
--- a/tests/auto/quick/touchmouse/tst_touchmouse.cpp
+++ b/tests/auto/quick/touchmouse/tst_touchmouse.cpp
@@ -251,11 +251,12 @@ private slots:
protected:
bool eventFilter(QObject *, QEvent *event)
{
- if (event->type() == QEvent::MouseButtonPress ||
- event->type() == QEvent::MouseMove ||
- event->type() == QEvent::MouseButtonRelease) {
- QMouseEvent *me = static_cast<QMouseEvent*>(event);
- filteredEventList.append(Event(me->type(), me->position().toPoint(), me->globalPosition().toPoint()));
+ if (event->isPointerEvent()) {
+ qCDebug(lcTests) << "window filtering" << event;
+ QPointerEvent *pe = static_cast<QPointerEvent*>(event);
+ filteredEventList.append(Event(pe->type(),
+ pe->points().first().position().toPoint(),
+ pe->points().first().globalPosition().toPoint()));
}
return false;
}
@@ -773,10 +774,7 @@ void tst_TouchMouse::buttonOnDelayedPressFlickable()
// - eventItem2 y: 300, height 100
QFETCH(bool, scrollBeforeDelayIsOver);
QFETCH(bool, releaseBeforeDelayIsOver);
-
-#ifdef Q_OS_MACOS
- QSKIP("Deadlocks or crashes due to events changes in qtbase");
-#endif
+ const int threshold = qApp->styleHints()->startDragDistance();
qApp->setAttribute(Qt::AA_SynthesizeMouseForUnhandledTouchEvents, true);
filteredEventList.clear();
@@ -799,6 +797,7 @@ void tst_TouchMouse::buttonOnDelayedPressFlickable()
// should a mouse area button be clickable on top of flickable? yes :)
EventItem *eventItem1 = window->rootObject()->findChild<EventItem*>("eventItem1");
QVERIFY(eventItem1);
+ eventItem1->setAcceptTouchEvents(true); // because it was that way by default in Qt 5
eventItem1->setAcceptedMouseButtons(Qt::LeftButton);
eventItem1->acceptMouse = true;
@@ -815,7 +814,6 @@ void tst_TouchMouse::buttonOnDelayedPressFlickable()
// touch press
QPoint p1 = QPoint(10, 110);
- QPoint pEnd = p1;
QTest::touchEvent(window.data(), device).press(0, p1, window.data());
QQuickTouchUtils::flush(window.data());
@@ -824,68 +822,66 @@ void tst_TouchMouse::buttonOnDelayedPressFlickable()
QCOMPARE(eventItem1->eventList.size(), 0);
} else {
// wait until the button sees the press
- QTRY_COMPARE(eventItem1->eventList.size(), 1);
- QCOMPARE(eventItem1->eventList.at(0).type, QEvent::MouseButtonPress);
- QCOMPARE(filteredEventList.count(), 1);
+ qCDebug(lcTests) << "expected delivered events: press(touch), press(mouse)" << eventItem1->eventList;
+ QTRY_COMPARE(eventItem1->eventList.size(), 2);
+ QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin);
+ QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress);
+ QCOMPARE(filteredEventList.count(), 2); // actual touch begin and replayed touch begin
}
if (!releaseBeforeDelayIsOver) {
// move the touchpoint: try to flick
- p1 += QPoint(0, -10);
- QPoint p2 = p1 + QPoint(0, -10);
- pEnd = p2 + QPoint(0, -10);
- QQuickTouchUtils::flush(window.data());
- QTest::touchEvent(window.data(), device).move(0, p1, window.data());
- QQuickTouchUtils::flush(window.data());
- QTest::touchEvent(window.data(), device).move(0, p2, window.data());
- QQuickTouchUtils::flush(window.data());
- QTest::touchEvent(window.data(), device).move(0, pEnd, window.data());
- QQuickTouchUtils::flush(window.data());
+ for (int i = 0; i < 3; ++i) {
+ p1 += QPoint(0, -threshold);
+ QTest::touchEvent(window.data(), device).move(0, p1, window.data());
+ QQuickTouchUtils::flush(window.data());
+ }
QTRY_VERIFY(flickable->isMovingVertically());
if (scrollBeforeDelayIsOver) {
QCOMPARE(eventItem1->eventList.size(), 0);
- QCOMPARE(filteredEventList.count(), 0);
+ qCDebug(lcTests) << "expected filtered events: 1 TouchBegin and 3 TouchUpdate" << filteredEventList;
+ QCOMPARE(filteredEventList.count(), 4);
} else {
// see at least press, move and ungrab
QTRY_VERIFY(eventItem1->eventList.size() > 2);
- QCOMPARE(eventItem1->eventList.at(0).type, QEvent::MouseButtonPress);
+ QCOMPARE(eventItem1->eventList.at(0).type, QEvent::TouchBegin);
QCOMPARE(eventItem1->eventList.last().type, QEvent::UngrabMouse);
- QCOMPARE(filteredEventList.count(), 1);
+ qCDebug(lcTests) << "expected filtered events: 2 TouchBegin and 3 TouchUpdate" << filteredEventList;
+ QCOMPARE(filteredEventList.count(), 5);
}
- // flickable should have the mouse grab, and have moved the itemForTouchPointId
- // for the touchMouseId to the new grabber.
+ // flickable should have the touchpoint grab: it no longer relies on synth-mouse
QCOMPARE(grabMonitor.exclusiveGrabber, flickable);
- QVERIFY(windowPriv->touchMouseId != -1);
auto devPriv = QPointingDevicePrivate::get(device);
QCOMPARE(devPriv->pointById(0)->exclusiveGrabber, flickable);
}
- QTest::touchEvent(window.data(), device).release(0, pEnd, window.data());
+ QTest::touchEvent(window.data(), device).release(0, p1, window.data());
QQuickTouchUtils::flush(window.data());
if (releaseBeforeDelayIsOver) {
// when the touchpoint was released, the child saw the delayed press and the release in sequence
- qCDebug(lcTests) << "expected delivered events: press, release, ungrab" << eventItem1->eventList;
- qCDebug(lcTests) << "expected filtered events: delayed press, release" << filteredEventList;
- QSKIP("QTBUG-85607");
- QTRY_COMPARE(eventItem1->eventList.size(), 3);
- QCOMPARE(eventItem1->eventList.at(0).type, QEvent::MouseButtonPress);
- QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonRelease);
+ qCDebug(lcTests) << "expected delivered events: press(touch), press(mouse), release(touch), release(mouse), ungrab" << eventItem1->eventList;
+ qCDebug(lcTests) << "expected filtered events: delayed press, release (touch)" << filteredEventList;
+ QTRY_COMPARE(eventItem1->eventList.size(), 5);
+ QCOMPARE(eventItem1->eventList.at(1).type, QEvent::MouseButtonPress);
+ QCOMPARE(eventItem1->eventList.at(3).type, QEvent::MouseButtonRelease);
QCOMPARE(eventItem1->eventList.last().type, QEvent::UngrabMouse);
// QQuickWindow filters the delayed press and release
- QCOMPARE(filteredEventList.count(), 2);
- QCOMPARE(filteredEventList.at(0).type, QEvent::MouseButtonPress);
- QCOMPARE(filteredEventList.at(1).type, QEvent::MouseButtonRelease);
+ QCOMPARE(filteredEventList.count(), 4);
+ QCOMPARE(filteredEventList.at(filteredEventList.count() - 2).type, QEvent::TouchBegin);
+ QCOMPARE(filteredEventList.last().type, QEvent::TouchEnd);
} else {
- // QQuickWindow filters the delayed press if there was one; otherwise nothing
+ // QQuickWindow filters the delayed press if there was one
if (scrollBeforeDelayIsOver) {
- QCOMPARE(filteredEventList.count(), 0);
+ qCDebug(lcTests) << "expected filtered events: 1 TouchBegin, 3 TouchUpdate, 1 TouchEnd" << filteredEventList;
+ QCOMPARE(filteredEventList.count(), 5);
} else {
- qCDebug(lcTests) << "expected filtered event: delayed press" << filteredEventList;
- QCOMPARE(filteredEventList.count(), 1);
- QCOMPARE(filteredEventList.at(0).type, QEvent::MouseButtonPress);
+ qCDebug(lcTests) << "expected filtered events: 2 TouchBegin, 3 TouchUpdate, 1 TouchEnd" << filteredEventList;
+ QCOMPARE(filteredEventList.count(), 6);
+ QCOMPARE(filteredEventList.at(0).type, QEvent::TouchBegin);
+ QCOMPARE(filteredEventList.last().type, QEvent::TouchEnd);
}
}
}