diff options
author | Andrew den Exter <[email protected]> | 2011-10-11 13:09:42 +1000 |
---|---|---|
committer | Qt by Nokia <[email protected]> | 2011-10-18 01:47:23 +0200 |
commit | 8ff1f926ea1d18b226060b4ea1bf6924eceba8c6 (patch) | |
tree | 702dfbdbd41a94469d778411ad263f73d4f18612 | |
parent | bca5c6d21711d5844c435bd41a71f8fe356a1038 (diff) |
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 <[email protected]>
-rw-r--r-- | src/declarative/items/qsgdrag.cpp | 12 | ||||
-rw-r--r-- | src/declarative/items/qsgdrag_p.h | 4 | ||||
-rw-r--r-- | src/declarative/items/qsgmousearea.cpp | 2 | ||||
-rw-r--r-- | tests/auto/declarative/qsgdrag/tst_qsgdrag.cpp | 76 | ||||
-rw-r--r-- | tests/auto/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<QObject*, QSGDragAttached *> 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<QObject*, QSGDragAttached *> 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<QSGItem *>(component.create()); + QScopedPointer<QObject> object(component.create()); + QSGItem *item = qobject_cast<QSGItem *>(object.data()); QVERIFY(item); item->setParentItem(&dropTarget); @@ -322,6 +323,41 @@ void tst_QSGDrag::active() QCOMPARE(evaluate<QObject *>(item, "Drag.target"), static_cast<QObject *>(0)); QCOMPARE(evaluate<QObject *>(item, "dragTarget"), static_cast<QObject *>(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<void>(item, "Drag.active = true"); + QCOMPARE(evaluate<bool>(item, "Drag.active"), true); + QCOMPARE(evaluate<bool>(item, "dragActive"), true); + QCOMPARE(evaluate<QObject *>(item, "Drag.target"), static_cast<QObject *>(0)); + QCOMPARE(evaluate<QObject *>(item, "dragTarget"), static_cast<QObject *>(0)); + QCOMPARE(dropTarget.enterEvents, 0); QCOMPARE(dropTarget.leaveEvents, 0); + + evaluate<void>(item, "Drag.active = false"); + dropTarget.setVisible(true); + + dropTarget.setOpacity(0.0); + dropTarget.reset(); + evaluate<void>(item, "Drag.active = true"); + QCOMPARE(evaluate<bool>(item, "Drag.active"), true); + QCOMPARE(evaluate<bool>(item, "dragActive"), true); + QCOMPARE(evaluate<QObject *>(item, "Drag.target"), static_cast<QObject *>(0)); + QCOMPARE(evaluate<QObject *>(item, "dragTarget"), static_cast<QObject *>(0)); + QCOMPARE(dropTarget.enterEvents, 0); QCOMPARE(dropTarget.leaveEvents, 0); + + evaluate<void>(item, "Drag.active = false"); + dropTarget.setOpacity(1.0); + + dropTarget.setEnabled(false); + dropTarget.reset(); + evaluate<void>(item, "Drag.active = true"); + QCOMPARE(evaluate<bool>(item, "Drag.active"), true); + QCOMPARE(evaluate<bool>(item, "dragActive"), true); + QCOMPARE(evaluate<QObject *>(item, "Drag.target"), static_cast<QObject *>(0)); + QCOMPARE(evaluate<QObject *>(item, "dragTarget"), static_cast<QObject *>(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<QSGItem *>(component.create()); + QScopedPointer<QObject> object(component.create()); + QSGItem *item = qobject_cast<QSGItem *>(object.data()); QVERIFY(item); item->setParentItem(&outerTarget); @@ -428,6 +465,18 @@ void tst_QSGDrag::drop() QCOMPARE(evaluate<QObject *>(item, "dragTarget"), static_cast<QObject *>(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<bool>(item, "Drag.drop() == Qt.IgnoreAction"), true); + QCOMPARE(evaluate<bool>(item, "Drag.active"), false); + QCOMPARE(evaluate<bool>(item, "dragActive"), false); + QCOMPARE(evaluate<QObject *>(item, "Drag.target"), static_cast<QObject *>(0)); + QCOMPARE(evaluate<QObject *>(item, "dragTarget"), static_cast<QObject *>(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<QSGItem *>(component.create()); + QScopedPointer<QObject> object(component.create()); + QSGItem *item = qobject_cast<QSGItem *>(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<QSGItem *>(component.create()); + QScopedPointer<QObject> object(component.create()); + QSGItem *item = qobject_cast<QSGItem *>(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<QSGItem *>(component.create()); + QScopedPointer<QObject> object(component.create()); + QSGItem *item = qobject_cast<QSGItem *>(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<QSGItem *>(component.create()); + QScopedPointer<QObject> object(component.create()); + QSGItem *item = qobject_cast<QSGItem *>(object.data()); QVERIFY(item); item->setParentItem(&dropTarget); + QCOMPARE(evaluate<bool>(item, "Drag.proposedAction == Qt.MoveAction"), true); QCOMPARE(evaluate<bool>(item, "proposedAction == Qt.MoveAction"), true); evaluate<void>(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<QSGItem *>(component.create()); + QScopedPointer<QObject> object(component.create()); + QSGItem *item = qobject_cast<QSGItem *>(object.data()); QVERIFY(item); // QCOMPARE(evaluate<QStringList>(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<QSGItem *>(component.create()); + QScopedPointer<QObject> object(component.create()); + QSGItem *item = qobject_cast<QSGItem *>(object.data()); QVERIFY(item); QCOMPARE(evaluate<QObject *>(item, "Drag.source"), static_cast<QObject *>(item)); @@ -761,6 +817,10 @@ void tst_QSGDrag::source() evaluate<void>(item, "Drag.source = proxySource"); QCOMPARE(evaluate<QObject *>(item, "Drag.source"), static_cast<QObject *>(proxySource)); QCOMPARE(evaluate<QObject *>(item, "source"), static_cast<QObject *>(proxySource)); + + evaluate<void>(item, "Drag.source = undefined"); + QCOMPARE(evaluate<QObject *>(item, "Drag.source"), static_cast<QObject *>(item)); + QCOMPARE(evaluate<QObject *>(item, "source"), static_cast<QObject *>(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<QSGItem *>(component.create()); + QScopedPointer<QObject> object(component.create()); + QSGItem *dropArea = qobject_cast<QSGItem *>(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<QSGItem *>(component.create()); - QVERIFY(dropArea); + QScopedPointer<QObject> object(component.create()); + QSGItem *dropArea = qobject_cast<QSGItem *>(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<QSGItem *>(component.create()); - QVERIFY(dropArea); + QScopedPointer<QObject> object(component.create()); + QSGItem *dropArea = qobject_cast<QSGItem *>(object.data()); dropArea->setParentItem(canvas.rootItem()); QSGItem *dragItem = dropArea->findChild<QSGItem *>("dragItem"); @@ -308,6 +309,32 @@ void tst_QSGDropArea::keys_internal() evaluate<void>(dragItem, "Drag.active = true"); QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), false); QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 0); + + evaluate<void>(dragItem, "Drag.active = false"); + evaluate<void>(dropArea, "keys = []"); + QCOMPARE(dropArea->property("keys").toStringList(), QStringList()); + QCOMPARE(dropArea->property("dropKeys").toStringList(), QStringList()); + evaluate<void>(dropArea, "{ enterEvents = 0; dragKeys = undefined }"); + evaluate<void>(dragItem, "Drag.active = true"); + QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), true); + QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 1); + QCOMPARE(dropArea->property("dragKeys").toStringList(), QStringList()); + + evaluate<void>(dragItem, "Drag.active = false"); + evaluate<void>(dropArea, "keys = []"); + evaluate<void>(dropArea, "{ enterEvents = 0; dragKeys = undefined }"); + evaluate<void>(dragItem, "Drag.active = true"); + QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), true); + QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 1); + QCOMPARE(dropArea->property("dragKeys").toStringList(), QStringList()); + + evaluate<void>(dragItem, "Drag.active = false"); + evaluate<void>(dragItem, "Drag.keys = [\"red\", \"blue\"]"); + evaluate<void>(dropArea, "{ enterEvents = 0; dragKeys = undefined }"); + evaluate<void>(dragItem, "Drag.active = true"); + QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), true); + QCOMPARE(evaluate<int>(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<QSGItem *>(component.create()); - QVERIFY(dropArea); + QScopedPointer<QObject> object(component.create()); + QSGItem *dropArea = qobject_cast<QSGItem *>(object.data()); dropArea->setParentItem(canvas.rootItem()); QMimeData data; @@ -387,6 +414,27 @@ void tst_QSGDropArea::keys_external() QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), false); QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 0); + QWindowSystemInterface::handleDrag(&alternateCanvas, &data, QPoint(50, 50)); + evaluate<void>(dropArea, "keys = []"); + QCOMPARE(dropArea->property("keys").toStringList(), QStringList()); + QCOMPARE(dropArea->property("dropKeys").toStringList(), QStringList()); + evaluate<void>(dropArea, "{ enterEvents = 0; dragKeys = undefined }"); + QWindowSystemInterface::handleDrag(&canvas, &data, QPoint(50, 50)); + QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), true); + QCOMPARE(evaluate<int>(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<void>(dropArea, "{ enterEvents = 0; dragKeys = undefined }"); + QWindowSystemInterface::handleDrag(&canvas, &data, QPoint(50, 50)); + QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), true); + QCOMPARE(evaluate<int>(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<QSGItem *>(component.create()); - QVERIFY(dropArea); + QScopedPointer<QObject> object(component.create()); + QSGItem *dropArea = qobject_cast<QSGItem *>(object.data()); dropArea->setParentItem(canvas.rootItem()); QSGItem *dragItem = dropArea->findChild<QSGItem *>("dragItem"); @@ -472,8 +520,8 @@ void tst_QSGDropArea::position_internal() "width: 10; height: 10\n" "}\n" "}", QUrl()); - QSGItem *dropArea = qobject_cast<QSGItem *>(component.create()); - QVERIFY(dropArea); + QScopedPointer<QObject> object(component.create()); + QSGItem *dropArea = qobject_cast<QSGItem *>(object.data()); dropArea->setParentItem(canvas.rootItem()); QSGItem *dragItem = dropArea->findChild<QSGItem *>("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<QSGItem *>(component.create()); - QVERIFY(dropArea); + QScopedPointer<QObject> object(component.create()); + QSGItem *dropArea = qobject_cast<QSGItem *>(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<QSGItem *>(component.create()); - QVERIFY(dropArea); + QScopedPointer<QObject> object(component.create()); + QSGItem *dropArea = qobject_cast<QSGItem *>(object.data()); dropArea->setParentItem(canvas.rootItem()); QSGItem *dragItem = dropArea->findChild<QSGItem *>("dragItem"); @@ -745,8 +793,8 @@ void tst_QSGDropArea::simultaneousDrags() "}\n" "}", QUrl()); - QSGItem *dropArea1 = qobject_cast<QSGItem *>(component.create()); - QVERIFY(dropArea1); + QScopedPointer<QObject> object(component.create()); + QSGItem *dropArea1 = qobject_cast<QSGItem *>(object.data()); dropArea1->setParentItem(canvas.rootItem()); QSGItem *dropArea2 = dropArea1->findChild<QSGItem *>("dropArea2"); |