Don't assert if focus is already clear.
authorAlan Alpert <alan.alpert@nokia.com>
Mon, 12 Mar 2012 08:48:05 +0000 (18:48 +1000)
committerQt by Nokia <qt-info@nokia.com>
Thu, 15 Mar 2012 09:14:37 +0000 (10:14 +0100)
Already cleared focus should exit the function without terminating the
runtime.

Task-number: QTBUG-24714
Change-Id: Ia8c6be0d88e43d1f71112acc7bac3eb674f22de8
Reviewed-by: Martin Jones <martin.jones@nokia.com>

src/quick/items/qquickcanvas.cpp
tests/auto/quick/qquickitem/data/multipleFocusClears.qml [new file with mode: 0644]
tests/auto/quick/qquickitem/tst_qquickitem.cpp

index 2636022..a6c2a90 100644 (file)
@@ -607,7 +607,6 @@ void QQuickCanvasPrivate::clearFocusInScope(QQuickItem *scope, QQuickItem *item,
 {
     Q_Q(QQuickCanvas);
 
-    Q_UNUSED(item);
     Q_ASSERT(item);
     Q_ASSERT(scope || item == rootItem);
 
@@ -618,7 +617,12 @@ void QQuickCanvasPrivate::clearFocusInScope(QQuickItem *scope, QQuickItem *item,
     qWarning() << "    activeFocusItem:" << (QObject *)activeFocusItem;
 #endif
 
-    QQuickItemPrivate *scopePrivate = scope ? QQuickItemPrivate::get(scope) : 0;
+    QQuickItemPrivate *scopePrivate = 0;
+    if (scope) {
+        scopePrivate = QQuickItemPrivate::get(scope);
+        if ( !scopePrivate->subFocusItem )
+            return;//No focus, nothing to do.
+    }
 
     QQuickItem *oldActiveFocusItem = 0;
     QQuickItem *newActiveFocusItem = 0;
diff --git a/tests/auto/quick/qquickitem/data/multipleFocusClears.qml b/tests/auto/quick/qquickitem/data/multipleFocusClears.qml
new file mode 100644 (file)
index 0000000..f68a890
--- /dev/null
@@ -0,0 +1,18 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 200
+    height: 200
+
+    FocusScope {
+        id: focusScope
+        anchors.fill: parent
+
+        TextInput {
+            anchors.centerIn: parent
+            text: "Some text"
+            onActiveFocusChanged: if (!activeFocus) focusScope.focus = false
+            Component.onCompleted: forceActiveFocus()
+        }
+    }
+}
index 7a589a4..9fdfa78 100644 (file)
@@ -138,6 +138,7 @@ private slots:
     void scopedFocus();
     void addedToCanvas();
     void changeParent();
+    void multipleFocusClears();
 
     void constructor();
     void setParentItem();
@@ -675,6 +676,16 @@ void tst_qquickitem::changeParent()
 
 }
 
+void tst_qquickitem::multipleFocusClears()
+{
+    //Multiple clears of focus inside a focus scope shouldn't crash. QTBUG-24714
+    QQuickView *view = new QQuickView;
+    view->setSource(testFileUrl("multipleFocusClears.qml"));
+    view->show();
+    ensureFocus(view);
+    QTRY_VERIFY(QGuiApplication::focusWindow() == view);
+}
+
 void tst_qquickitem::constructor()
 {
     QQuickItem *root = new QQuickItem;