From 8ff1f926ea1d18b226060b4ea1bf6924eceba8c6 Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Tue, 11 Oct 2011 13:09:42 +1000 Subject: Don't keep a cache of created QSGDragAttached objects. It's unnecessary and can potentially return stale objects. Change-Id: Ia04b9a58757ef06d3178e6a64e168f68abc1c9d8 Reviewed-by: Martin Jones --- src/declarative/items/qsgdrag.cpp | 12 ---- src/declarative/items/qsgdrag_p.h | 4 -- src/declarative/items/qsgmousearea.cpp | 2 +- tests/auto/declarative/qsgdrag/tst_qsgdrag.cpp | 76 +++++++++++++++++--- .../declarative/qsgdroparea/tst_qsgdroparea.cpp | 82 +++++++++++++++++----- 5 files changed, 134 insertions(+), 42 deletions(-) diff --git a/src/declarative/items/qsgdrag.cpp b/src/declarative/items/qsgdrag.cpp index 7c73db7d38..b95e495477 100644 --- a/src/declarative/items/qsgdrag.cpp +++ b/src/declarative/items/qsgdrag.cpp @@ -113,18 +113,6 @@ public: */ -QSGDragAttached *QSGDragAttached::properties(QObject *obj) -{ - QSGDragAttached *rv = attachedProperties.value(obj); - if (!rv) { - rv = new QSGDragAttached(obj); - attachedProperties.insert(obj, rv); - } - return rv; -} - -QHash QSGDragAttached::attachedProperties; - void QSGDragAttachedPrivate::itemGeometryChanged(QSGItem *, const QRectF &newGeometry, const QRectF &oldGeometry) { Q_Q(QSGDragAttached); diff --git a/src/declarative/items/qsgdrag_p.h b/src/declarative/items/qsgdrag_p.h index a1b6cdca9b..246c6e6beb 100644 --- a/src/declarative/items/qsgdrag_p.h +++ b/src/declarative/items/qsgdrag_p.h @@ -183,8 +183,6 @@ public: Q_INVOKABLE int drop(); - static QSGDragAttached *properties(QObject *obj); - public Q_SLOTS: void start(QDeclarativeV8Function *); void cancel(); @@ -199,8 +197,6 @@ Q_SIGNALS: void proposedActionChanged(); private: - static QHash attachedProperties; - Q_DECLARE_PRIVATE(QSGDragAttached) }; diff --git a/src/declarative/items/qsgmousearea.cpp b/src/declarative/items/qsgmousearea.cpp index 4d14eaa565..a401b52e95 100644 --- a/src/declarative/items/qsgmousearea.cpp +++ b/src/declarative/items/qsgmousearea.cpp @@ -178,7 +178,7 @@ void QSGDrag::setFilterChildren(bool filter) QSGDragAttached *QSGDrag::qmlAttachedProperties(QObject *obj) { - return QSGDragAttached::properties(obj); + return new QSGDragAttached(obj); } QSGMouseAreaPrivate::QSGMouseAreaPrivate() diff --git a/tests/auto/declarative/qsgdrag/tst_qsgdrag.cpp b/tests/auto/declarative/qsgdrag/tst_qsgdrag.cpp index 5d5da9a931..8e2163a3eb 100644 --- a/tests/auto/declarative/qsgdrag/tst_qsgdrag.cpp +++ b/tests/auto/declarative/qsgdrag/tst_qsgdrag.cpp @@ -189,7 +189,8 @@ void tst_QSGDrag::active() "x: 50; y: 50\n" "width: 10; height: 10\n" "}", QUrl()); - QSGItem *item = qobject_cast(component.create()); + QScopedPointer object(component.create()); + QSGItem *item = qobject_cast(object.data()); QVERIFY(item); item->setParentItem(&dropTarget); @@ -322,6 +323,41 @@ void tst_QSGDrag::active() QCOMPARE(evaluate(item, "Drag.target"), static_cast(0)); QCOMPARE(evaluate(item, "dragTarget"), static_cast(0)); QCOMPARE(dropTarget.enterEvents, 0); QCOMPARE(dropTarget.leaveEvents, 1); + + // Events are sent to hidden or disabled items. + dropTarget.accept = true; + dropTarget.setVisible(false); + dropTarget.reset(); + evaluate(item, "Drag.active = true"); + QCOMPARE(evaluate(item, "Drag.active"), true); + QCOMPARE(evaluate(item, "dragActive"), true); + QCOMPARE(evaluate(item, "Drag.target"), static_cast(0)); + QCOMPARE(evaluate(item, "dragTarget"), static_cast(0)); + QCOMPARE(dropTarget.enterEvents, 0); QCOMPARE(dropTarget.leaveEvents, 0); + + evaluate(item, "Drag.active = false"); + dropTarget.setVisible(true); + + dropTarget.setOpacity(0.0); + dropTarget.reset(); + evaluate(item, "Drag.active = true"); + QCOMPARE(evaluate(item, "Drag.active"), true); + QCOMPARE(evaluate(item, "dragActive"), true); + QCOMPARE(evaluate(item, "Drag.target"), static_cast(0)); + QCOMPARE(evaluate(item, "dragTarget"), static_cast(0)); + QCOMPARE(dropTarget.enterEvents, 0); QCOMPARE(dropTarget.leaveEvents, 0); + + evaluate(item, "Drag.active = false"); + dropTarget.setOpacity(1.0); + + dropTarget.setEnabled(false); + dropTarget.reset(); + evaluate(item, "Drag.active = true"); + QCOMPARE(evaluate(item, "Drag.active"), true); + QCOMPARE(evaluate(item, "dragActive"), true); + QCOMPARE(evaluate(item, "Drag.target"), static_cast(0)); + QCOMPARE(evaluate(item, "dragTarget"), static_cast(0)); + QCOMPARE(dropTarget.enterEvents, 0); QCOMPARE(dropTarget.leaveEvents, 0); } void tst_QSGDrag::drop() @@ -342,7 +378,8 @@ void tst_QSGDrag::drop() "x: 50; y: 50\n" "width: 10; height: 10\n" "}", QUrl()); - QSGItem *item = qobject_cast(component.create()); + QScopedPointer object(component.create()); + QSGItem *item = qobject_cast(object.data()); QVERIFY(item); item->setParentItem(&outerTarget); @@ -428,6 +465,18 @@ void tst_QSGDrag::drop() QCOMPARE(evaluate(item, "dragTarget"), static_cast(0)); QCOMPARE(outerTarget.enterEvents, 0); QCOMPARE(outerTarget.leaveEvents, 0); QCOMPARE(outerTarget.dropEvents, 1); QCOMPARE(innerTarget.enterEvents, 0); QCOMPARE(innerTarget.leaveEvents, 0); QCOMPARE(innerTarget.dropEvents, 0); + + // drop doesn't send an event and returns Qt.IgnoreAction if not active. + innerTarget.accept = true; + outerTarget.accept = true; + innerTarget.reset(); outerTarget.reset(); + QCOMPARE(evaluate(item, "Drag.drop() == Qt.IgnoreAction"), true); + QCOMPARE(evaluate(item, "Drag.active"), false); + QCOMPARE(evaluate(item, "dragActive"), false); + QCOMPARE(evaluate(item, "Drag.target"), static_cast(0)); + QCOMPARE(evaluate(item, "dragTarget"), static_cast(0)); + QCOMPARE(outerTarget.enterEvents, 0); QCOMPARE(outerTarget.leaveEvents, 0); QCOMPARE(outerTarget.dropEvents, 0); + QCOMPARE(innerTarget.enterEvents, 0); QCOMPARE(innerTarget.leaveEvents, 0); QCOMPARE(innerTarget.dropEvents, 0); } void tst_QSGDrag::move() @@ -450,7 +499,8 @@ void tst_QSGDrag::move() "x: 50; y: 50\n" "width: 10; height: 10\n" "}", QUrl()); - QSGItem *item = qobject_cast(component.create()); + QScopedPointer object(component.create()); + QSGItem *item = qobject_cast(object.data()); QVERIFY(item); item->setParentItem(&outerTarget); @@ -580,7 +630,8 @@ void tst_QSGDrag::hotSpot() "x: 50; y: 50\n" "width: 10; height: 10\n" "}", QUrl()); - QSGItem *item = qobject_cast(component.create()); + QScopedPointer object(component.create()); + QSGItem *item = qobject_cast(object.data()); QVERIFY(item); item->setParentItem(&dropTarget); @@ -634,7 +685,8 @@ void tst_QSGDrag::supportedActions() "x: 50; y: 50\n" "width: 10; height: 10\n" "}", QUrl()); - QSGItem *item = qobject_cast(component.create()); + QScopedPointer object(component.create()); + QSGItem *item = qobject_cast(object.data()); QVERIFY(item); item->setParentItem(&dropTarget); @@ -681,10 +733,12 @@ void tst_QSGDrag::proposedAction() "x: 50; y: 50\n" "width: 10; height: 10\n" "}", QUrl()); - QSGItem *item = qobject_cast(component.create()); + QScopedPointer object(component.create()); + QSGItem *item = qobject_cast(object.data()); QVERIFY(item); item->setParentItem(&dropTarget); + QCOMPARE(evaluate(item, "Drag.proposedAction == Qt.MoveAction"), true); QCOMPARE(evaluate(item, "proposedAction == Qt.MoveAction"), true); evaluate(item, "{ Drag.start(); Drag.cancel() }"); @@ -724,7 +778,8 @@ void tst_QSGDrag::keys() "x: 50; y: 50\n" "width: 10; height: 10\n" "}", QUrl()); - QSGItem *item = qobject_cast(component.create()); + QScopedPointer object(component.create()); + QSGItem *item = qobject_cast(object.data()); QVERIFY(item); // QCOMPARE(evaluate(item, "Drag.keys"), QStringList()); @@ -749,7 +804,8 @@ void tst_QSGDrag::source() "width: 10; height: 10\n" "Item { id: proxySource; objectName: \"proxySource\" }\n" "}", QUrl()); - QSGItem *item = qobject_cast(component.create()); + QScopedPointer object(component.create()); + QSGItem *item = qobject_cast(object.data()); QVERIFY(item); QCOMPARE(evaluate(item, "Drag.source"), static_cast(item)); @@ -761,6 +817,10 @@ void tst_QSGDrag::source() evaluate(item, "Drag.source = proxySource"); QCOMPARE(evaluate(item, "Drag.source"), static_cast(proxySource)); QCOMPARE(evaluate(item, "source"), static_cast(proxySource)); + + evaluate(item, "Drag.source = undefined"); + QCOMPARE(evaluate(item, "Drag.source"), static_cast(item)); + QCOMPARE(evaluate(item, "source"), static_cast(item)); } QTEST_MAIN(tst_QSGDrag) diff --git a/tests/auto/declarative/qsgdroparea/tst_qsgdroparea.cpp b/tests/auto/declarative/qsgdroparea/tst_qsgdroparea.cpp index 4fa6704611..57cedcc414 100644 --- a/tests/auto/declarative/qsgdroparea/tst_qsgdroparea.cpp +++ b/tests/auto/declarative/qsgdroparea/tst_qsgdroparea.cpp @@ -119,7 +119,8 @@ void tst_QSGDropArea::containsDrag_internal() "width: 10; height: 10\n" "}\n" "}", QUrl()); - QSGItem *dropArea = qobject_cast(component.create()); + QScopedPointer object(component.create()); + QSGItem *dropArea = qobject_cast(object.data()); QVERIFY(dropArea); dropArea->setParentItem(canvas.rootItem()); @@ -182,8 +183,8 @@ void tst_QSGDropArea::containsDrag_external() "onEntered: {++enterEvents}\n" "onExited: {++exitEvents}\n" "}", QUrl()); - QSGItem *dropArea = qobject_cast(component.create()); - QVERIFY(dropArea); + QScopedPointer object(component.create()); + QSGItem *dropArea = qobject_cast(object.data()); dropArea->setParentItem(canvas.rootItem()); QMimeData data; @@ -249,8 +250,8 @@ void tst_QSGDropArea::keys_internal() "Drag.keys: [\"red\", \"blue\"]\n" "}\n" "}", QUrl()); - QSGItem *dropArea = qobject_cast(component.create()); - QVERIFY(dropArea); + QScopedPointer object(component.create()); + QSGItem *dropArea = qobject_cast(object.data()); dropArea->setParentItem(canvas.rootItem()); QSGItem *dragItem = dropArea->findChild("dragItem"); @@ -308,6 +309,32 @@ void tst_QSGDropArea::keys_internal() evaluate(dragItem, "Drag.active = true"); QCOMPARE(evaluate(dropArea, "containsDrag"), false); QCOMPARE(evaluate(dropArea, "enterEvents"), 0); + + evaluate(dragItem, "Drag.active = false"); + evaluate(dropArea, "keys = []"); + QCOMPARE(dropArea->property("keys").toStringList(), QStringList()); + QCOMPARE(dropArea->property("dropKeys").toStringList(), QStringList()); + evaluate(dropArea, "{ enterEvents = 0; dragKeys = undefined }"); + evaluate(dragItem, "Drag.active = true"); + QCOMPARE(evaluate(dropArea, "containsDrag"), true); + QCOMPARE(evaluate(dropArea, "enterEvents"), 1); + QCOMPARE(dropArea->property("dragKeys").toStringList(), QStringList()); + + evaluate(dragItem, "Drag.active = false"); + evaluate(dropArea, "keys = []"); + evaluate(dropArea, "{ enterEvents = 0; dragKeys = undefined }"); + evaluate(dragItem, "Drag.active = true"); + QCOMPARE(evaluate(dropArea, "containsDrag"), true); + QCOMPARE(evaluate(dropArea, "enterEvents"), 1); + QCOMPARE(dropArea->property("dragKeys").toStringList(), QStringList()); + + evaluate(dragItem, "Drag.active = false"); + evaluate(dragItem, "Drag.keys = [\"red\", \"blue\"]"); + evaluate(dropArea, "{ enterEvents = 0; dragKeys = undefined }"); + evaluate(dragItem, "Drag.active = true"); + QCOMPARE(evaluate(dropArea, "containsDrag"), true); + QCOMPARE(evaluate(dropArea, "enterEvents"), 1); + QCOMPARE(dropArea->property("dragKeys").toStringList(), QStringList() << "red" << "blue"); } void tst_QSGDropArea::keys_external() @@ -323,8 +350,8 @@ void tst_QSGDropArea::keys_external() "width: 100; height: 100\n" "onEntered: {++enterEvents; dragKeys = drag.keys }\n" "}", QUrl()); - QSGItem *dropArea = qobject_cast(component.create()); - QVERIFY(dropArea); + QScopedPointer object(component.create()); + QSGItem *dropArea = qobject_cast(object.data()); dropArea->setParentItem(canvas.rootItem()); QMimeData data; @@ -387,6 +414,27 @@ void tst_QSGDropArea::keys_external() QCOMPARE(evaluate(dropArea, "containsDrag"), false); QCOMPARE(evaluate(dropArea, "enterEvents"), 0); + QWindowSystemInterface::handleDrag(&alternateCanvas, &data, QPoint(50, 50)); + evaluate(dropArea, "keys = []"); + QCOMPARE(dropArea->property("keys").toStringList(), QStringList()); + QCOMPARE(dropArea->property("dropKeys").toStringList(), QStringList()); + evaluate(dropArea, "{ enterEvents = 0; dragKeys = undefined }"); + QWindowSystemInterface::handleDrag(&canvas, &data, QPoint(50, 50)); + QCOMPARE(evaluate(dropArea, "containsDrag"), true); + QCOMPARE(evaluate(dropArea, "enterEvents"), 1); + QCOMPARE(dropArea->property("dragKeys").toStringList(), QStringList()); + + QWindowSystemInterface::handleDrag(&alternateCanvas, &data, QPoint(50, 50)); + data.setData("text/x-red", "red"); + data.setData("text/x-blue", "blue"); + QCOMPARE(dropArea->property("keys").toStringList(), QStringList()); + QCOMPARE(dropArea->property("dropKeys").toStringList(), QStringList()); + evaluate(dropArea, "{ enterEvents = 0; dragKeys = undefined }"); + QWindowSystemInterface::handleDrag(&canvas, &data, QPoint(50, 50)); + QCOMPARE(evaluate(dropArea, "containsDrag"), true); + QCOMPARE(evaluate(dropArea, "enterEvents"), 1); + QCOMPARE(dropArea->property("dragKeys").toStringList(), QStringList() << "text/x-red" << "text/x-blue"); + QWindowSystemInterface::handleDrop(&canvas, &data, QPoint(50, 50)); } @@ -408,8 +456,8 @@ void tst_QSGDropArea::source_internal() "}\n" "Item { id: dragSource; objectName: \"dragSource\" }\n" "}", QUrl()); - QSGItem *dropArea = qobject_cast(component.create()); - QVERIFY(dropArea); + QScopedPointer object(component.create()); + QSGItem *dropArea = qobject_cast(object.data()); dropArea->setParentItem(canvas.rootItem()); QSGItem *dragItem = dropArea->findChild("dragItem"); @@ -472,8 +520,8 @@ void tst_QSGDropArea::position_internal() "width: 10; height: 10\n" "}\n" "}", QUrl()); - QSGItem *dropArea = qobject_cast(component.create()); - QVERIFY(dropArea); + QScopedPointer object(component.create()); + QSGItem *dropArea = qobject_cast(object.data()); dropArea->setParentItem(canvas.rootItem()); QSGItem *dragItem = dropArea->findChild("dragItem"); @@ -531,8 +579,8 @@ void tst_QSGDropArea::position_external() "onEntered: {++enterEvents; eventX = drag.x; eventY = drag.y}\n" "onPositionChanged: {++moveEvents; eventX = drag.x; eventY = drag.y}\n" "}", QUrl()); - QSGItem *dropArea = qobject_cast(component.create()); - QVERIFY(dropArea); + QScopedPointer object(component.create()); + QSGItem *dropArea = qobject_cast(object.data()); dropArea->setParentItem(canvas.rootItem()); QMimeData data; @@ -607,8 +655,8 @@ void tst_QSGDropArea::drop_internal() "width: 10; height: 10\n" "}\n" "}", QUrl()); - QSGItem *dropArea = qobject_cast(component.create()); - QVERIFY(dropArea); + QScopedPointer object(component.create()); + QSGItem *dropArea = qobject_cast(object.data()); dropArea->setParentItem(canvas.rootItem()); QSGItem *dragItem = dropArea->findChild("dragItem"); @@ -745,8 +793,8 @@ void tst_QSGDropArea::simultaneousDrags() "}\n" "}", QUrl()); - QSGItem *dropArea1 = qobject_cast(component.create()); - QVERIFY(dropArea1); + QScopedPointer object(component.create()); + QSGItem *dropArea1 = qobject_cast(object.data()); dropArea1->setParentItem(canvas.rootItem()); QSGItem *dropArea2 = dropArea1->findChild("dropArea2"); -- cgit v1.2.3