Don't keep a cache of created QSGDragAttached objects.
authorAndrew den Exter <andrew.den-exter@nokia.com>
Tue, 11 Oct 2011 03:09:42 +0000 (13:09 +1000)
committerQt by Nokia <qt-info@nokia.com>
Mon, 17 Oct 2011 23:47:23 +0000 (01:47 +0200)
It's unnecessary and can potentially return stale objects.

Change-Id: Ia04b9a58757ef06d3178e6a64e168f68abc1c9d8
Reviewed-by: Martin Jones <martin.jones@nokia.com>
src/declarative/items/qsgdrag.cpp
src/declarative/items/qsgdrag_p.h
src/declarative/items/qsgmousearea.cpp
tests/auto/declarative/qsgdrag/tst_qsgdrag.cpp
tests/auto/declarative/qsgdroparea/tst_qsgdroparea.cpp

index 7c73db7..b95e495 100644 (file)
@@ -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);
index a1b6cdc..246c6e6 100644 (file)
@@ -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)
 };
 
index 4d14eaa..a401b52 100644 (file)
@@ -178,7 +178,7 @@ void QSGDrag::setFilterChildren(bool filter)
 
 QSGDragAttached *QSGDrag::qmlAttachedProperties(QObject *obj)
 {
-    return QSGDragAttached::properties(obj);
+    return new QSGDragAttached(obj);
 }
 
 QSGMouseAreaPrivate::QSGMouseAreaPrivate()
index 5d5da9a..8e2163a 100644 (file)
@@ -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)
index 4fa6704..57cedcc 100644 (file)
@@ -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");