Fix access to context properties within TextEdit.cursorDelegate
authorAndrew den Exter <andrew.den-exter@nokia.com>
Tue, 14 Feb 2012 02:55:38 +0000 (12:55 +1000)
committerQt by Nokia <qt-info@nokia.com>
Tue, 14 Feb 2012 06:48:38 +0000 (07:48 +0100)
Don't create the cursorDelegate instance before componentComplete as
the context may not be fully populated prior to that.

Task-number: QTBUG-21780

Change-Id: I6ca8a24989bc28e5c5ca06d61a85e32ff630ce7c
Reviewed-by: Martin Jones <martin.jones@nokia.com>
src/quick/items/qquicktextedit.cpp
tests/auto/qtquick2/qquicktextedit/data/Cursor.qml [new file with mode: 0644]
tests/auto/qtquick2/qquicktextedit/data/cursorTestExternal.qml [new file with mode: 0644]
tests/auto/qtquick2/qquicktextedit/data/cursorTestInline.qml [new file with mode: 0644]
tests/auto/qtquick2/qquicktextedit/tst_qquicktextedit.cpp
tests/auto/qtquick2/qquicktextinput/data/Cursor.qml [new file with mode: 0644]
tests/auto/qtquick2/qquicktextinput/data/cursorTestExternal.qml [new file with mode: 0644]
tests/auto/qtquick2/qquicktextinput/data/cursorTestInline.qml [new file with mode: 0644]
tests/auto/qtquick2/qquicktextinput/tst_qquicktextinput.cpp

index 5343715..b9ff18e 100644 (file)
@@ -960,7 +960,7 @@ void QQuickTextEdit::setCursorDelegate(QDeclarativeComponent* c)
 void QQuickTextEdit::loadCursorDelegate()
 {
     Q_D(QQuickTextEdit);
-    if (d->cursorComponent->isLoading())
+    if (d->cursorComponent->isLoading() || !isComponentComplete())
         return;
     QDeclarativeContext *creationContext = d->cursorComponent->creationContext();
     QObject *object = d->cursorComponent->create(creationContext ? creationContext : qmlContext(this));
@@ -1164,7 +1164,8 @@ void QQuickTextEdit::componentComplete()
         updateSize();
         d->dirty = false;
     }
-
+    if (d->cursorComponent && d->cursorComponent->isReady())
+        loadCursorDelegate();
 }
 /*!
     \qmlproperty bool QtQuick2::TextEdit::selectByMouse
diff --git a/tests/auto/qtquick2/qquicktextedit/data/Cursor.qml b/tests/auto/qtquick2/qquicktextedit/data/Cursor.qml
new file mode 100644 (file)
index 0000000..e5c1853
--- /dev/null
@@ -0,0 +1,5 @@
+import QtQuick 2.0
+
+Rectangle {
+    property string localProperty
+}
diff --git a/tests/auto/qtquick2/qquicktextedit/data/cursorTestExternal.qml b/tests/auto/qtquick2/qquicktextedit/data/cursorTestExternal.qml
new file mode 100644 (file)
index 0000000..7e916ec
--- /dev/null
@@ -0,0 +1,15 @@
+import QtQuick 2.0
+
+Rectangle { width: 300; height: 300; color: "white"
+    property string contextualProperty: "Hello"
+    TextEdit {
+        text: "Hello world!"
+        id: textEditObject;
+        objectName: "textEditObject"
+        cursorDelegate: Cursor {
+            id:cursorInstance;
+            objectName: "cursorInstance";
+            localProperty: contextualProperty;
+        }
+    }
+}
diff --git a/tests/auto/qtquick2/qquicktextedit/data/cursorTestInline.qml b/tests/auto/qtquick2/qquicktextedit/data/cursorTestInline.qml
new file mode 100644 (file)
index 0000000..786f391
--- /dev/null
@@ -0,0 +1,15 @@
+import QtQuick 2.0
+
+Rectangle { width: 300; height: 300; color: "white"
+    property string contextualProperty: "Hello"
+    TextEdit {
+        text: "Hello world!"
+        id: textEditObject
+        objectName: "textEditObject"
+        cursorDelegate: Item {
+            id:cursorInstance
+            objectName: "cursorInstance"
+            property string localProperty: contextualProperty
+        }
+    }
+}
index 77d17d9..eb8e711 100644 (file)
@@ -134,6 +134,7 @@ private slots:
 
     void linkActivated();
 
+    void cursorDelegate_data();
     void cursorDelegate();
     void cursorVisible();
     void delegateLoading_data();
@@ -1813,9 +1814,18 @@ void tst_qquicktextedit::linkActivated()
     QCOMPARE(spy.count(), 2);
 }
 
+void tst_qquicktextedit::cursorDelegate_data()
+{
+    QTest::addColumn<QUrl>("source");
+    QTest::newRow("out of line") << testFileUrl("cursorTest.qml");
+    QTest::newRow("in line") << testFileUrl("cursorTestInline.qml");
+    QTest::newRow("external") << testFileUrl("cursorTestExternal.qml");
+}
+
 void tst_qquicktextedit::cursorDelegate()
 {
-    QQuickView view(testFileUrl("cursorTest.qml"));
+    QFETCH(QUrl, source);
+    QQuickView view(source);
     view.show();
     view.requestActivateWindow();
     QQuickTextEdit *textEditObject = view.rootObject()->findChild<QQuickTextEdit*>("textEditObject");
diff --git a/tests/auto/qtquick2/qquicktextinput/data/Cursor.qml b/tests/auto/qtquick2/qquicktextinput/data/Cursor.qml
new file mode 100644 (file)
index 0000000..e5c1853
--- /dev/null
@@ -0,0 +1,5 @@
+import QtQuick 2.0
+
+Rectangle {
+    property string localProperty
+}
diff --git a/tests/auto/qtquick2/qquicktextinput/data/cursorTestExternal.qml b/tests/auto/qtquick2/qquicktextinput/data/cursorTestExternal.qml
new file mode 100644 (file)
index 0000000..9277dcc
--- /dev/null
@@ -0,0 +1,15 @@
+import QtQuick 2.0
+
+Rectangle { width: 300; height: 300; color: "white"
+    property string contextualProperty: "Hello"
+    TextInput {
+        text: "Hello world!"
+        id: textInputObject;
+        objectName: "textInputObject"
+        cursorDelegate: Cursor {
+            id:cursorInstance;
+            objectName: "cursorInstance";
+            localProperty: contextualProperty;
+        }
+    }
+}
diff --git a/tests/auto/qtquick2/qquicktextinput/data/cursorTestInline.qml b/tests/auto/qtquick2/qquicktextinput/data/cursorTestInline.qml
new file mode 100644 (file)
index 0000000..efc4b19
--- /dev/null
@@ -0,0 +1,15 @@
+import QtQuick 2.0
+
+Rectangle { width: 300; height: 300; color: "white"
+    property string contextualProperty: "Hello"
+    TextInput {
+        text: "Hello world!"
+        id: textInputObject
+        objectName: "textInputObject"
+        cursorDelegate: Item {
+            id:cursorInstance
+            objectName: "cursorInstance"
+            property string localProperty: contextualProperty
+        }
+    }
+}
index dd86d03..1657737 100644 (file)
@@ -136,6 +136,7 @@ private slots:
     void inputMethods();
 
     void passwordCharacter();
+    void cursorDelegate_data();
     void cursorDelegate();
     void cursorVisible();
     void cursorRectangle();
@@ -2306,9 +2307,18 @@ void tst_qquicktextinput::passwordCharacter()
     delete textInput;
 }
 
+void tst_qquicktextinput::cursorDelegate_data()
+{
+    QTest::addColumn<QUrl>("source");
+    QTest::newRow("out of line") << testFileUrl("cursorTest.qml");
+    QTest::newRow("in line") << testFileUrl("cursorTestInline.qml");
+    QTest::newRow("external") << testFileUrl("cursorTestExternal.qml");
+}
+
 void tst_qquicktextinput::cursorDelegate()
 {
-    QQuickView view(testFileUrl("cursorTest.qml"));
+    QFETCH(QUrl, source);
+    QQuickView view(source);
     view.show();
     view.requestActivateWindow();
     QQuickTextInput *textInputObject = view.rootObject()->findChild<QQuickTextInput*>("textInputObject");