X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=tests%2Fauto%2Fquick%2Fqquicktextedit%2Ftst_qquicktextedit.cpp;h=fe8beb44f689e4ba81be3c9189a799f6614ce70d;hb=feb996e3ab44e68082c97102556ea396f5df3f44;hp=763c1912637fea3034b099e1956adde71da39e93;hpb=3721de405e8556a25b66f7bc4bc946ba35b45292;p=profile%2Fivi%2Fqtdeclarative.git diff --git a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp index 763c191..fe8beb4 100644 --- a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp +++ b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp @@ -62,11 +62,14 @@ #include "../../shared/util.h" #include "../../shared/platforminputcontext.h" #include +#include #ifdef Q_OS_MAC #include #endif +#define SERVER_PORT 42332 +#define SERVER_ADDR "http://localhost:42332" Q_DECLARE_METATYPE(QQuickTextEdit::SelectionMode) Q_DECLARE_METATYPE(Qt::Key) @@ -131,12 +134,14 @@ private slots: void dragMouseSelection(); void inputMethodHints(); + void positionAt_data(); void positionAt(); void linkActivated(); void cursorDelegate_data(); void cursorDelegate(); + void remoteCursorDelegate(); void cursorVisible(); void delegateLoading_data(); void delegateLoading(); @@ -213,6 +218,8 @@ Q_DECLARE_METATYPE(IntList) typedef QList KeyList; Q_DECLARE_METATYPE(KeyList) +Q_DECLARE_METATYPE(QQuickTextEdit::HAlignment) +Q_DECLARE_METATYPE(QQuickTextEdit::VAlignment) Q_DECLARE_METATYPE(QQuickTextEdit::TextFormat) void tst_qquicktextedit::simulateKeys(QWindow *window, const QList &keys) @@ -576,19 +583,17 @@ void tst_qquicktextedit::alignments() QFETCH(int, vAlign); QFETCH(QString, expectfile); - QQuickView canvas(testFileUrl("alignments.qml")); + QQuickView window(testFileUrl("alignments.qml")); - canvas.show(); - canvas.requestActivateWindow(); - QTest::qWaitForWindowShown(&canvas); - QTRY_COMPARE(&canvas, qGuiApp->focusWindow()); + window.show(); + QTest::qWaitForWindowShown(&window); - QObject *ob = canvas.rootObject(); + QObject *ob = window.rootObject(); QVERIFY(ob != 0); ob->setProperty("horizontalAlignment",hAlign); ob->setProperty("verticalAlignment",vAlign); QTRY_COMPARE(ob->property("running").toBool(),false); - QImage actual = canvas.grabFrameBuffer(); + QImage actual = window.grabWindow(); expectfile = createExpectedFileIfNotFound(expectfile, actual); @@ -639,26 +644,26 @@ void tst_qquicktextedit::hAlign_RightToLeft() QInputMethodPrivate *inputMethodPrivate = QInputMethodPrivate::get(qApp->inputMethod()); inputMethodPrivate->testContext = &platformInputContext; - QQuickView canvas(testFileUrl("horizontalAlignment_RightToLeft.qml")); - QQuickTextEdit *textEdit = canvas.rootObject()->findChild("text"); + QQuickView window(testFileUrl("horizontalAlignment_RightToLeft.qml")); + QQuickTextEdit *textEdit = window.rootObject()->findChild("text"); QVERIFY(textEdit != 0); - canvas.show(); + window.show(); const QString rtlText = textEdit->text(); // implicit alignment should follow the reading direction of text QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignRight); - QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2); + QVERIFY(textEdit->positionToRectangle(0).x() > window.width()/2); // explicitly left aligned textEdit->setHAlign(QQuickTextEdit::AlignLeft); QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignLeft); - QVERIFY(textEdit->positionToRectangle(0).x() < canvas.width()/2); + QVERIFY(textEdit->positionToRectangle(0).x() < window.width()/2); // explicitly right aligned textEdit->setHAlign(QQuickTextEdit::AlignRight); QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignRight); - QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2); + QVERIFY(textEdit->positionToRectangle(0).x() > window.width()/2); QString textString = textEdit->text(); textEdit->setText(QString("") + textString + QString("")); @@ -667,31 +672,31 @@ void tst_qquicktextedit::hAlign_RightToLeft() // implicitly aligned rich text should follow the reading direction of RTL text QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignRight); QCOMPARE(textEdit->effectiveHAlign(), textEdit->hAlign()); - QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2); + QVERIFY(textEdit->positionToRectangle(0).x() > window.width()/2); // explicitly left aligned rich text textEdit->setHAlign(QQuickTextEdit::AlignLeft); QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignLeft); QCOMPARE(textEdit->effectiveHAlign(), textEdit->hAlign()); - QVERIFY(textEdit->positionToRectangle(0).x() < canvas.width()/2); + QVERIFY(textEdit->positionToRectangle(0).x() < window.width()/2); // explicitly right aligned rich text textEdit->setHAlign(QQuickTextEdit::AlignRight); QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignRight); QCOMPARE(textEdit->effectiveHAlign(), textEdit->hAlign()); - QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2); + QVERIFY(textEdit->positionToRectangle(0).x() > window.width()/2); textEdit->setText(textString); // explicitly center aligned textEdit->setHAlign(QQuickTextEdit::AlignHCenter); QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignHCenter); - QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2); + QVERIFY(textEdit->positionToRectangle(0).x() > window.width()/2); // reseted alignment should go back to following the text reading direction textEdit->resetHAlign(); QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignRight); - QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2); + QVERIFY(textEdit->positionToRectangle(0).x() > window.width()/2); // mirror the text item QQuickItemPrivate::get(textEdit)->setLayoutMirror(true); @@ -699,19 +704,19 @@ void tst_qquicktextedit::hAlign_RightToLeft() // mirrored implicit alignment should continue to follow the reading direction of the text QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignRight); QCOMPARE(textEdit->effectiveHAlign(), QQuickTextEdit::AlignRight); - QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2); + QVERIFY(textEdit->positionToRectangle(0).x() > window.width()/2); // mirrored explicitly right aligned behaves as left aligned textEdit->setHAlign(QQuickTextEdit::AlignRight); QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignRight); QCOMPARE(textEdit->effectiveHAlign(), QQuickTextEdit::AlignLeft); - QVERIFY(textEdit->positionToRectangle(0).x() < canvas.width()/2); + QVERIFY(textEdit->positionToRectangle(0).x() < window.width()/2); // mirrored explicitly left aligned behaves as right aligned textEdit->setHAlign(QQuickTextEdit::AlignLeft); QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignLeft); QCOMPARE(textEdit->effectiveHAlign(), QQuickTextEdit::AlignRight); - QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2); + QVERIFY(textEdit->positionToRectangle(0).x() > window.width()/2); // disable mirroring QQuickItemPrivate::get(textEdit)->setLayoutMirror(false); @@ -720,21 +725,21 @@ void tst_qquicktextedit::hAlign_RightToLeft() // English text should be implicitly left aligned textEdit->setText("Hello world!"); QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignLeft); - QVERIFY(textEdit->positionToRectangle(0).x() < canvas.width()/2); + QVERIFY(textEdit->positionToRectangle(0).x() < window.width()/2); - canvas.requestActivateWindow(); - QTest::qWaitForWindowShown(&canvas); - QTRY_COMPARE(&canvas, qGuiApp->focusWindow()); + window.requestActivateWindow(); + QTest::qWaitForWindowActive(&window); + QVERIFY(textEdit->hasActiveFocus()); textEdit->setText(QString()); - { QInputMethodEvent ev(rtlText, QList()); QGuiApplication::sendEvent(qGuiApp->focusObject(), &ev); } + { QInputMethodEvent ev(rtlText, QList()); QGuiApplication::sendEvent(textEdit, &ev); } QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignRight); - { QInputMethodEvent ev("Hello world!", QList()); QGuiApplication::sendEvent(qGuiApp->focusObject(), &ev); } + { QInputMethodEvent ev("Hello world!", QList()); QGuiApplication::sendEvent(textEdit, &ev); } QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignLeft); // Clear pre-edit text. TextEdit should maybe do this itself on setText, but that may be // redundant as an actual input method may take care of it. - { QInputMethodEvent ev; QGuiApplication::sendEvent(qGuiApp->focusObject(), &ev); } + { QInputMethodEvent ev; QGuiApplication::sendEvent(textEdit, &ev); } // empty text with implicit alignment follows the system locale-based // keyboard input direction from qApp->inputMethod()->inputDirection @@ -742,7 +747,7 @@ void tst_qquicktextedit::hAlign_RightToLeft() platformInputContext.setInputDirection(Qt::LeftToRight); QVERIFY(qApp->inputMethod()->inputDirection() == Qt::LeftToRight); QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignLeft); - QVERIFY(textEdit->positionToRectangle(0).x() < canvas.width()/2); + QVERIFY(textEdit->positionToRectangle(0).x() < window.width()/2); QSignalSpy cursorRectangleSpy(textEdit, SIGNAL(cursorRectangleChanged())); @@ -750,27 +755,27 @@ void tst_qquicktextedit::hAlign_RightToLeft() QCOMPARE(cursorRectangleSpy.count(), 1); QVERIFY(qApp->inputMethod()->inputDirection() == Qt::RightToLeft); QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignRight); - QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2); + QVERIFY(textEdit->positionToRectangle(0).x() > window.width()/2); // neutral text follows also input method direction textEdit->resetHAlign(); textEdit->setText(" ()((=<>"); platformInputContext.setInputDirection(Qt::LeftToRight); QCOMPARE(textEdit->effectiveHAlign(), QQuickTextEdit::AlignLeft); - QVERIFY(textEdit->cursorRectangle().left() < canvas.width()/2); + QVERIFY(textEdit->cursorRectangle().left() < window.width()/2); platformInputContext.setInputDirection(Qt::RightToLeft); QCOMPARE(textEdit->effectiveHAlign(), QQuickTextEdit::AlignRight); - QVERIFY(textEdit->cursorRectangle().left() > canvas.width()/2); + QVERIFY(textEdit->cursorRectangle().left() > window.width()/2); // set input direction while having content platformInputContext.setInputDirection(Qt::LeftToRight); textEdit->setText("a"); textEdit->setCursorPosition(1); platformInputContext.setInputDirection(Qt::RightToLeft); - QTest::keyClick(&canvas, Qt::Key_Backspace); + QTest::keyClick(&window, Qt::Key_Backspace); QVERIFY(textEdit->text().isEmpty()); QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignRight); - QVERIFY(textEdit->cursorRectangle().left() > canvas.width()/2); + QVERIFY(textEdit->cursorRectangle().left() > window.width()/2); // input direction changed while not having focus platformInputContext.setInputDirection(Qt::LeftToRight); @@ -778,19 +783,19 @@ void tst_qquicktextedit::hAlign_RightToLeft() platformInputContext.setInputDirection(Qt::RightToLeft); textEdit->setFocus(true); QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignRight); - QVERIFY(textEdit->cursorRectangle().left() > canvas.width()/2); + QVERIFY(textEdit->cursorRectangle().left() > window.width()/2); textEdit->setHAlign(QQuickTextEdit::AlignRight); QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignRight); - QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2); + QVERIFY(textEdit->positionToRectangle(0).x() > window.width()/2); // make sure editor doesn't rely on input for updating size - QQuickTextEdit *emptyEdit = canvas.rootObject()->findChild("emptyTextEdit"); + QQuickTextEdit *emptyEdit = window.rootObject()->findChild("emptyTextEdit"); QVERIFY(emptyEdit != 0); platformInputContext.setInputDirection(Qt::RightToLeft); emptyEdit->setFocus(true); QCOMPARE(emptyEdit->hAlign(), QQuickTextEdit::AlignRight); - QVERIFY(emptyEdit->cursorRectangle().left() > canvas.width()/2); + QVERIFY(emptyEdit->cursorRectangle().left() > window.width()/2); } @@ -810,14 +815,13 @@ void tst_qquicktextedit::hAlignVisual() { QQuickView view(testFileUrl("hAlignVisual.qml")); view.show(); - view.requestActivateWindow(); QTest::qWaitForWindowShown(&view); QQuickText *text = view.rootObject()->findChild("textItem"); QVERIFY(text != 0); { // Left Align - QImage image = view.grabFrameBuffer(); + QImage image = view.grabWindow(); int left = numberOfNonWhitePixels(0, image.width() / 3, image); int mid = numberOfNonWhitePixels(image.width() / 3, 2 * image.width() / 3, image); int right = numberOfNonWhitePixels( 2 * image.width() / 3, image.width(), image); @@ -827,7 +831,7 @@ void tst_qquicktextedit::hAlignVisual() { // HCenter Align text->setHAlign(QQuickText::AlignHCenter); - QImage image = view.grabFrameBuffer(); + QImage image = view.grabWindow(); int left = numberOfNonWhitePixels(0, image.width() / 3, image); int mid = numberOfNonWhitePixels(image.width() / 3, 2 * image.width() / 3, image); int right = numberOfNonWhitePixels( 2 * image.width() / 3, image.width(), image); @@ -837,7 +841,7 @@ void tst_qquicktextedit::hAlignVisual() { // Right Align text->setHAlign(QQuickText::AlignRight); - QImage image = view.grabFrameBuffer(); + QImage image = view.grabWindow(); int left = numberOfNonWhitePixels(0, image.width() / 3, image); int mid = numberOfNonWhitePixels(image.width() / 3, 2 * image.width() / 3, image); int right = numberOfNonWhitePixels( 2 * image.width() / 3, image.width(), image); @@ -849,7 +853,7 @@ void tst_qquicktextedit::hAlignVisual() { // Left Align - QImage image = view.grabFrameBuffer(); + QImage image = view.grabWindow(); int x = qCeil(text->implicitWidth()); int left = numberOfNonWhitePixels(0, x, image); int right = numberOfNonWhitePixels(x, image.width() - x, image); @@ -859,7 +863,7 @@ void tst_qquicktextedit::hAlignVisual() { // HCenter Align text->setHAlign(QQuickText::AlignHCenter); - QImage image = view.grabFrameBuffer(); + QImage image = view.grabWindow(); int x1 = qFloor(image.width() - text->implicitWidth()) / 2; int x2 = image.width() - x1; int left = numberOfNonWhitePixels(0, x1, image); @@ -872,7 +876,7 @@ void tst_qquicktextedit::hAlignVisual() { // Right Align text->setHAlign(QQuickText::AlignRight); - QImage image = view.grabFrameBuffer(); + QImage image = view.grabWindow(); int x = image.width() - qCeil(text->implicitWidth()); int left = numberOfNonWhitePixels(0, x, image); int right = numberOfNonWhitePixels(x, image.width() - x, image); @@ -1079,14 +1083,12 @@ void tst_qquicktextedit::textMargin() void tst_qquicktextedit::persistentSelection() { - QQuickView canvas(testFileUrl("persistentSelection.qml")); - canvas.show(); - canvas.requestActivateWindow(); - QTest::qWaitForWindowShown(&canvas); - QTRY_COMPARE(&canvas, qGuiApp->focusWindow()); - canvas.requestActivateWindow(); - - QQuickTextEdit *edit = qobject_cast(canvas.rootObject()); + QQuickView window(testFileUrl("persistentSelection.qml")); + window.show(); + window.requestActivateWindow(); + QTest::qWaitForWindowActive(&window); + + QQuickTextEdit *edit = qobject_cast(window.rootObject()); QVERIFY(edit); QVERIFY(edit->hasActiveFocus()); @@ -1148,27 +1150,26 @@ void tst_qquicktextedit::focusOnPress() QCOMPARE(textEditObject->focusOnPress(), true); QCOMPARE(activeFocusOnPressSpy.count(), 0); - QQuickCanvas canvas; - canvas.resize(100, 50); - textEditObject->setParentItem(canvas.rootItem()); - canvas.show(); - canvas.requestActivateWindow(); - QTest::qWaitForWindowShown(&canvas); - QTRY_COMPARE(QGuiApplication::activeWindow(), &canvas); + QQuickWindow window; + window.resize(100, 50); + textEditObject->setParentItem(window.rootItem()); + window.show(); + window.requestActivateWindow(); + QTest::qWaitForWindowActive(&window); QCOMPARE(textEditObject->hasFocus(), false); QCOMPARE(textEditObject->hasActiveFocus(), false); - QPoint centerPoint(canvas.width()/2, canvas.height()/2); + QPoint centerPoint(window.width()/2, window.height()/2); Qt::KeyboardModifiers noModifiers = 0; - QTest::mousePress(&canvas, Qt::LeftButton, noModifiers, centerPoint); + QTest::mousePress(&window, Qt::LeftButton, noModifiers, centerPoint); QGuiApplication::processEvents(); QCOMPARE(textEditObject->hasFocus(), true); QCOMPARE(textEditObject->hasActiveFocus(), true); QCOMPARE(focusSpy.count(), 1); QCOMPARE(activeFocusSpy.count(), 1); QCOMPARE(textEditObject->selectedText(), QString()); - QTest::mouseRelease(&canvas, Qt::LeftButton, noModifiers, centerPoint); + QTest::mouseRelease(&window, Qt::LeftButton, noModifiers, centerPoint); textEditObject->setFocusOnPress(false); QCOMPARE(textEditObject->focusOnPress(), false); @@ -1182,13 +1183,13 @@ void tst_qquicktextedit::focusOnPress() // Wait for double click timeout to expire before clicking again. QTest::qWait(400); - QTest::mousePress(&canvas, Qt::LeftButton, noModifiers, centerPoint); + QTest::mousePress(&window, Qt::LeftButton, noModifiers, centerPoint); QGuiApplication::processEvents(); QCOMPARE(textEditObject->hasFocus(), false); QCOMPARE(textEditObject->hasActiveFocus(), false); QCOMPARE(focusSpy.count(), 2); QCOMPARE(activeFocusSpy.count(), 2); - QTest::mouseRelease(&canvas, Qt::LeftButton, noModifiers, centerPoint); + QTest::mouseRelease(&window, Qt::LeftButton, noModifiers, centerPoint); textEditObject->setFocusOnPress(true); QCOMPARE(textEditObject->focusOnPress(), true); @@ -1198,14 +1199,14 @@ void tst_qquicktextedit::focusOnPress() textEditObject->setProperty("selectOnFocus", true); QTest::qWait(400); - QTest::mousePress(&canvas, Qt::LeftButton, noModifiers, centerPoint); + QTest::mousePress(&window, Qt::LeftButton, noModifiers, centerPoint); QGuiApplication::processEvents(); QCOMPARE(textEditObject->hasFocus(), true); QCOMPARE(textEditObject->hasActiveFocus(), true); QCOMPARE(focusSpy.count(), 3); QCOMPARE(activeFocusSpy.count(), 3); QCOMPARE(textEditObject->selectedText(), textEditObject->text()); - QTest::mouseRelease(&canvas, Qt::LeftButton, noModifiers, centerPoint); + QTest::mouseRelease(&window, Qt::LeftButton, noModifiers, centerPoint); } void tst_qquicktextedit::selection() @@ -1351,47 +1352,45 @@ void tst_qquicktextedit::isRightToLeft() void tst_qquicktextedit::keySelection() { - QQuickView canvas(testFileUrl("navigation.qml")); - canvas.show(); - canvas.requestActivateWindow(); - QTest::qWaitForWindowShown(&canvas); - QTRY_COMPARE(&canvas, qGuiApp->focusWindow()); - canvas.requestActivateWindow(); + QQuickView window(testFileUrl("navigation.qml")); + window.show(); + window.requestActivateWindow(); + QTest::qWaitForWindowActive(&window); - QVERIFY(canvas.rootObject() != 0); + QVERIFY(window.rootObject() != 0); - QQuickTextEdit *input = qobject_cast(qvariant_cast(canvas.rootObject()->property("myInput"))); + QQuickTextEdit *input = qobject_cast(qvariant_cast(window.rootObject()->property("myInput"))); QVERIFY(input != 0); - QTRY_VERIFY(input->hasActiveFocus() == true); + QVERIFY(input->hasActiveFocus()); - QSignalSpy spy(input, SIGNAL(selectionChanged())); + QSignalSpy spy(input, SIGNAL(selectedTextChanged())); - simulateKey(&canvas, Qt::Key_Right, Qt::ShiftModifier); + simulateKey(&window, Qt::Key_Right, Qt::ShiftModifier); QVERIFY(input->hasActiveFocus() == true); QCOMPARE(input->selectedText(), QString("a")); QCOMPARE(spy.count(), 1); - simulateKey(&canvas, Qt::Key_Right); + simulateKey(&window, Qt::Key_Right); QVERIFY(input->hasActiveFocus() == true); QCOMPARE(input->selectedText(), QString()); QCOMPARE(spy.count(), 2); - simulateKey(&canvas, Qt::Key_Right); + simulateKey(&window, Qt::Key_Right); QVERIFY(input->hasActiveFocus() == false); QCOMPARE(input->selectedText(), QString()); QCOMPARE(spy.count(), 2); - simulateKey(&canvas, Qt::Key_Left); + simulateKey(&window, Qt::Key_Left); QVERIFY(input->hasActiveFocus() == true); QCOMPARE(spy.count(), 2); - simulateKey(&canvas, Qt::Key_Left, Qt::ShiftModifier); + simulateKey(&window, Qt::Key_Left, Qt::ShiftModifier); QVERIFY(input->hasActiveFocus() == true); QCOMPARE(input->selectedText(), QString("a")); QCOMPARE(spy.count(), 3); - simulateKey(&canvas, Qt::Key_Left); + simulateKey(&window, Qt::Key_Left); QVERIFY(input->hasActiveFocus() == true); QCOMPARE(input->selectedText(), QString()); QCOMPARE(spy.count(), 4); - simulateKey(&canvas, Qt::Key_Left); + simulateKey(&window, Qt::Key_Left); QVERIFY(input->hasActiveFocus() == false); QCOMPARE(input->selectedText(), QString()); QCOMPARE(spy.count(), 4); @@ -1741,39 +1740,62 @@ void tst_qquicktextedit::mouseSelection_data() QTest::addColumn("selectedText"); QTest::addColumn("focus"); QTest::addColumn("focusOnPress"); - QTest::addColumn("doubleClick"); + QTest::addColumn("clicks"); // import installed - QTest::newRow("on") << testFile("mouseselection_true.qml") << 4 << 9 << "45678" << true << true << false; - QTest::newRow("off") << testFile("mouseselection_false.qml") << 4 << 9 << QString() << true << true << false; - QTest::newRow("default") << testFile("mouseselection_default.qml") << 4 << 9 << QString() << true << true << false; - QTest::newRow("off word selection") << testFile("mouseselection_false_words.qml") << 4 << 9 << QString() << true << true << false; - QTest::newRow("on word selection (4,9)") << testFile("mouseselection_true_words.qml") << 4 << 9 << "0123456789" << true << true << false; - - QTest::newRow("on unfocused") << testFile("mouseselection_true.qml") << 4 << 9 << "45678" << false << false << false; - QTest::newRow("on word selection (4,9) unfocused") << testFile("mouseselection_true_words.qml") << 4 << 9 << "0123456789" << false << false << false; - - QTest::newRow("on focus on press") << testFile("mouseselection_true.qml") << 4 << 9 << "45678" << false << true << false; - QTest::newRow("on word selection (4,9) focus on press") << testFile("mouseselection_true_words.qml") << 4 << 9 << "0123456789" << false << true << false; - - QTest::newRow("on word selection (2,13)") << testFile("mouseselection_true_words.qml") << 2 << 13 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << false; - QTest::newRow("on word selection (2,30)") << testFile("mouseselection_true_words.qml") << 2 << 30 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << false; - QTest::newRow("on word selection (9,13)") << testFile("mouseselection_true_words.qml") << 9 << 13 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << false; - QTest::newRow("on word selection (9,30)") << testFile("mouseselection_true_words.qml") << 9 << 30 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << false; - QTest::newRow("on word selection (13,2)") << testFile("mouseselection_true_words.qml") << 13 << 2 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << false; - QTest::newRow("on word selection (20,2)") << testFile("mouseselection_true_words.qml") << 20 << 2 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << false; - QTest::newRow("on word selection (12,9)") << testFile("mouseselection_true_words.qml") << 12 << 9 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << false; - QTest::newRow("on word selection (30,9)") << testFile("mouseselection_true_words.qml") << 30 << 9 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << false; - - QTest::newRow("off double click (4,9)") << testFile("mouseselection_true.qml") << 4 << 9 << "0123456789" << true << true << true; - QTest::newRow("off double click (2,13)") << testFile("mouseselection_true.qml") << 2 << 13 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << true; - QTest::newRow("off double click (2,30)") << testFile("mouseselection_true.qml") << 2 << 30 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << true; - QTest::newRow("off double click (9,13)") << testFile("mouseselection_true.qml") << 9 << 13 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << true; - QTest::newRow("off double click (9,30)") << testFile("mouseselection_true.qml") << 9 << 30 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << true; - QTest::newRow("off double click (13,2)") << testFile("mouseselection_true.qml") << 13 << 2 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << true; - QTest::newRow("off double click (20,2)") << testFile("mouseselection_true.qml") << 20 << 2 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << true; - QTest::newRow("off double click (12,9)") << testFile("mouseselection_true.qml") << 12 << 9 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << true; - QTest::newRow("off double click (30,9)") << testFile("mouseselection_true.qml") << 30 << 9 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << true; + QTest::newRow("on") << testFile("mouseselection_true.qml") << 4 << 9 << "45678" << true << true << 1; + QTest::newRow("off") << testFile("mouseselection_false.qml") << 4 << 9 << QString() << true << true << 1; + QTest::newRow("default") << testFile("mouseselection_default.qml") << 4 << 9 << QString() << true << true << 1; + QTest::newRow("off word selection") << testFile("mouseselection_false_words.qml") << 4 << 9 << QString() << true << true << 1; + QTest::newRow("on word selection (4,9)") << testFile("mouseselection_true_words.qml") << 4 << 9 << "0123456789" << true << true << 1; + + QTest::newRow("on unfocused") << testFile("mouseselection_true.qml") << 4 << 9 << "45678" << false << false << 1; + QTest::newRow("on word selection (4,9) unfocused") << testFile("mouseselection_true_words.qml") << 4 << 9 << "0123456789" << false << false << 1; + + QTest::newRow("on focus on press") << testFile("mouseselection_true.qml") << 4 << 9 << "45678" << false << true << 1; + QTest::newRow("on word selection (4,9) focus on press") << testFile("mouseselection_true_words.qml") << 4 << 9 << "0123456789" << false << true << 1; + + QTest::newRow("on word selection (2,13)") << testFile("mouseselection_true_words.qml") << 2 << 13 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << 1; + QTest::newRow("on word selection (2,30)") << testFile("mouseselection_true_words.qml") << 2 << 30 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << 1; + QTest::newRow("on word selection (9,13)") << testFile("mouseselection_true_words.qml") << 9 << 13 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << 1; + QTest::newRow("on word selection (9,30)") << testFile("mouseselection_true_words.qml") << 9 << 30 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << 1; + QTest::newRow("on word selection (13,2)") << testFile("mouseselection_true_words.qml") << 13 << 2 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << 1; + QTest::newRow("on word selection (20,2)") << testFile("mouseselection_true_words.qml") << 20 << 2 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << 1; + QTest::newRow("on word selection (12,9)") << testFile("mouseselection_true_words.qml") << 12 << 9 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << 1; + QTest::newRow("on word selection (30,9)") << testFile("mouseselection_true_words.qml") << 30 << 9 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << 1; + + QTest::newRow("on double click (4,9)") << testFile("mouseselection_true.qml") << 4 << 9 << "0123456789" << true << true << 2; + QTest::newRow("on double click (2,13)") << testFile("mouseselection_true.qml") << 2 << 13 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << 2; + QTest::newRow("on double click (2,30)") << testFile("mouseselection_true.qml") << 2 << 30 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << 2; + QTest::newRow("on double click (9,13)") << testFile("mouseselection_true.qml") << 9 << 13 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << 2; + QTest::newRow("on double click (9,30)") << testFile("mouseselection_true.qml") << 9 << 30 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << 2; + QTest::newRow("on double click (13,2)") << testFile("mouseselection_true.qml") << 13 << 2 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << 2; + QTest::newRow("on double click (20,2)") << testFile("mouseselection_true.qml") << 20 << 2 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << 2; + QTest::newRow("on double click (12,9)") << testFile("mouseselection_true.qml") << 12 << 9 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << 2; + QTest::newRow("on double click (30,9)") << testFile("mouseselection_true.qml") << 30 << 9 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" << true << true << 2; + + QTest::newRow("on triple click (4,9)") << testFile("mouseselection_true.qml") << 4 << 9 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" << true << true << 3; + QTest::newRow("on triple click (2,13)") << testFile("mouseselection_true.qml") << 2 << 13 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" << true << true << 3; + QTest::newRow("on triple click (2,30)") << testFile("mouseselection_true.qml") << 2 << 30 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" << true << true << 3; + QTest::newRow("on triple click (9,13)") << testFile("mouseselection_true.qml") << 9 << 13 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" << true << true << 3; + QTest::newRow("on triple click (9,30)") << testFile("mouseselection_true.qml") << 9 << 30 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" << true << true << 3; + QTest::newRow("on triple click (13,2)") << testFile("mouseselection_true.qml") << 13 << 2 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" << true << true << 3; + QTest::newRow("on triple click (20,2)") << testFile("mouseselection_true.qml") << 20 << 2 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" << true << true << 3; + QTest::newRow("on triple click (12,9)") << testFile("mouseselection_true.qml") << 12 << 9 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" << true << true << 3; + QTest::newRow("on triple click (30,9)") << testFile("mouseselection_true.qml") << 30 << 9 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" << true << true << 3; + + QTest::newRow("on triple click (2,40)") << testFile("mouseselection_true.qml") << 2 << 40 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ\n9876543210\n" << true << true << 3; + QTest::newRow("on triple click (2,50)") << testFile("mouseselection_true.qml") << 2 << 50 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ\n9876543210\n\nZXYWVUTSRQPON MLKJIHGFEDCBA" << true << true << 3; + QTest::newRow("on triple click (25,40)") << testFile("mouseselection_true.qml") << 25 << 40 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ\n9876543210\n" << true << true << 3; + QTest::newRow("on triple click (25,50)") << testFile("mouseselection_true.qml") << 25 << 50 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ\n9876543210\n\nZXYWVUTSRQPON MLKJIHGFEDCBA" << true << true << 3; + QTest::newRow("on triple click (40,25)") << testFile("mouseselection_true.qml") << 40 << 25 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ\n9876543210\n" << true << true << 3; + QTest::newRow("on triple click (40,50)") << testFile("mouseselection_true.qml") << 40 << 50 << "9876543210\n\nZXYWVUTSRQPON MLKJIHGFEDCBA" << true << true << 3; + QTest::newRow("on triple click (50,25)") << testFile("mouseselection_true.qml") << 50 << 25 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ\n9876543210\n\nZXYWVUTSRQPON MLKJIHGFEDCBA" << true << true << 3; + QTest::newRow("on triple click (50,40)") << testFile("mouseselection_true.qml") << 50 << 40 << "9876543210\n\nZXYWVUTSRQPON MLKJIHGFEDCBA" << true << true << 3; + + QTest::newRow("on tr align") << testFile("mouseselection_align_tr.qml") << 4 << 9 << "45678" << true << true << 1; + QTest::newRow("on center align") << testFile("mouseselection_align_center.qml") << 4 << 9 << "45678" << true << true << 1; + QTest::newRow("on bl align") << testFile("mouseselection_align_bl.qml") << 4 << 9 << "45678" << true << true << 1; } void tst_qquicktextedit::mouseSelection() @@ -1784,17 +1806,16 @@ void tst_qquicktextedit::mouseSelection() QFETCH(QString, selectedText); QFETCH(bool, focus); QFETCH(bool, focusOnPress); - QFETCH(bool, doubleClick); + QFETCH(int, clicks); - QQuickView canvas(QUrl::fromLocalFile(qmlfile)); + QQuickView window(QUrl::fromLocalFile(qmlfile)); - canvas.show(); - canvas.requestActivateWindow(); - QTest::qWaitForWindowShown(&canvas); - QTRY_COMPARE(&canvas, qGuiApp->focusWindow()); + window.show(); + window.requestActivateWindow(); + QTest::qWaitForWindowActive(&window); - QVERIFY(canvas.rootObject() != 0); - QQuickTextEdit *textEditObject = qobject_cast(canvas.rootObject()); + QVERIFY(window.rootObject() != 0); + QQuickTextEdit *textEditObject = qobject_cast(window.rootObject()); QVERIFY(textEditObject != 0); textEditObject->setFocus(focus); @@ -1803,47 +1824,49 @@ void tst_qquicktextedit::mouseSelection() // press-and-drag-and-release from x1 to x2 QPoint p1 = textEditObject->positionToRectangle(from).center().toPoint(); QPoint p2 = textEditObject->positionToRectangle(to).center().toPoint(); - if (doubleClick) - QTest::mouseClick(&canvas, Qt::LeftButton, 0, p1); - QTest::mousePress(&canvas, Qt::LeftButton, 0, p1); - QTest::mouseMove(&canvas, p2); - QTest::mouseRelease(&canvas, Qt::LeftButton, 0, p2); - QTest::qWait(50); + if (clicks == 2) + QTest::mouseClick(&window, Qt::LeftButton, Qt::NoModifier, p1); + else if (clicks == 3) + QTest::mouseDClick(&window, Qt::LeftButton, Qt::NoModifier, p1); + QTest::mousePress(&window, Qt::LeftButton, Qt::NoModifier, p1); + QTest::mouseMove(&window, p2); + QTest::mouseRelease(&window, Qt::LeftButton, Qt::NoModifier, p2); QTRY_COMPARE(textEditObject->selectedText(), selectedText); // Clicking and shift to clicking between the same points should select the same text. textEditObject->setCursorPosition(0); - if (doubleClick) - QTest::mouseDClick(&canvas, Qt::LeftButton, 0, p1); - else - QTest::mouseClick(&canvas, Qt::LeftButton, Qt::NoModifier, p1); - QTest::mouseClick(&canvas, Qt::LeftButton, Qt::ShiftModifier, p2); - QTest::qWait(50); + if (clicks > 1) + QTest::mouseDClick(&window, Qt::LeftButton, Qt::NoModifier, p1); + if (clicks != 2) + QTest::mouseClick(&window, Qt::LeftButton, Qt::NoModifier, p1); + QTest::mouseClick(&window, Qt::LeftButton, Qt::ShiftModifier, p2); QTRY_COMPARE(textEditObject->selectedText(), selectedText); + + // ### This is to prevent double click detection from carrying over to the next test. + QTest::qWait(QGuiApplication::styleHints()->mouseDoubleClickInterval() + 10); } void tst_qquicktextedit::dragMouseSelection() { QString qmlfile = testFile("mouseselection_true.qml"); - QQuickView canvas(QUrl::fromLocalFile(qmlfile)); + QQuickView window(QUrl::fromLocalFile(qmlfile)); - canvas.show(); - canvas.requestActivateWindow(); - QTest::qWaitForWindowShown(&canvas); - QTRY_COMPARE(&canvas, qGuiApp->focusWindow()); + window.show(); + window.requestActivateWindow(); + QTest::qWaitForWindowActive(&window); - QVERIFY(canvas.rootObject() != 0); - QQuickTextEdit *textEditObject = qobject_cast(canvas.rootObject()); + QVERIFY(window.rootObject() != 0); + QQuickTextEdit *textEditObject = qobject_cast(window.rootObject()); QVERIFY(textEditObject != 0); // press-and-drag-and-release from x1 to x2 int x1 = 10; int x2 = 70; - int y = textEditObject->height()/2; - QTest::mousePress(&canvas, Qt::LeftButton, 0, QPoint(x1,y)); - QTest::mouseMove(&canvas, QPoint(x2, y)); - QTest::mouseRelease(&canvas, Qt::LeftButton, 0, QPoint(x2,y)); + int y = QFontMetrics(textEditObject->font()).height() / 2; + QTest::mousePress(&window, Qt::LeftButton, 0, QPoint(x1,y)); + QTest::mouseMove(&window, QPoint(x2, y)); + QTest::mouseRelease(&window, Qt::LeftButton, 0, QPoint(x2,y)); QTest::qWait(300); QString str1; QTRY_VERIFY((str1 = textEditObject->selectedText()).length() > 3); @@ -1851,14 +1874,15 @@ void tst_qquicktextedit::dragMouseSelection() // press and drag the current selection. x1 = 40; x2 = 100; - QTest::mousePress(&canvas, Qt::LeftButton, 0, QPoint(x1,y)); - QTest::mouseMove(&canvas, QPoint(x2, y)); - QTest::mouseRelease(&canvas, Qt::LeftButton, 0, QPoint(x2,y)); + QTest::mousePress(&window, Qt::LeftButton, 0, QPoint(x1,y)); + QTest::mouseMove(&window, QPoint(x2, y)); + QTest::mouseRelease(&window, Qt::LeftButton, 0, QPoint(x2,y)); QTest::qWait(300); QString str2; QTRY_VERIFY((str2 = textEditObject->selectedText()).length() > 3); QVERIFY(str1 != str2); // Verify the second press and drag is a new selection and not the first moved. + } void tst_qquicktextedit::mouseSelectionMode_data() @@ -1879,27 +1903,23 @@ void tst_qquicktextedit::mouseSelectionMode() QString text = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - QQuickView canvas(QUrl::fromLocalFile(qmlfile)); + QQuickView window(QUrl::fromLocalFile(qmlfile)); - canvas.show(); - canvas.requestActivateWindow(); - QTest::qWaitForWindowShown(&canvas); - QTRY_COMPARE(&canvas, qGuiApp->focusWindow()); + window.show(); + window.requestActivateWindow(); + QTest::qWaitForWindowActive(&window); - QVERIFY(canvas.rootObject() != 0); - QQuickTextEdit *textEditObject = qobject_cast(canvas.rootObject()); + QVERIFY(window.rootObject() != 0); + QQuickTextEdit *textEditObject = qobject_cast(window.rootObject()); QVERIFY(textEditObject != 0); // press-and-drag-and-release from x1 to x2 int x1 = 10; int x2 = 70; int y = textEditObject->height()/2; - QTest::mousePress(&canvas, Qt::LeftButton, 0, QPoint(x1,y)); - QTest::mouseMove(&canvas, QPoint(x2, y)); - //QTest::mouseMove(canvas, QPoint(x2,y)); // doesn't work -// QMouseEvent mv(QEvent::MouseMove, QPoint(x2,y), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); -// QGuiApplication::sendEvent(&canvas, &mv); - QTest::mouseRelease(&canvas, Qt::LeftButton, 0, QPoint(x2,y)); + QTest::mousePress(&window, Qt::LeftButton, 0, QPoint(x1,y)); + QTest::mouseMove(&window, QPoint(x2, y)); + QTest::mouseRelease(&window, Qt::LeftButton, 0, QPoint(x2,y)); QString str = textEditObject->selectedText(); if (selectWords) { QTRY_COMPARE(textEditObject->selectedText(), text); @@ -1911,12 +1931,12 @@ void tst_qquicktextedit::mouseSelectionMode() void tst_qquicktextedit::inputMethodHints() { - QQuickView canvas(testFileUrl("inputmethodhints.qml")); - canvas.show(); - canvas.requestActivateWindow(); + QQuickView window(testFileUrl("inputmethodhints.qml")); + window.show(); + window.requestActivateWindow(); - QVERIFY(canvas.rootObject() != 0); - QQuickTextEdit *textEditObject = qobject_cast(canvas.rootObject()); + QVERIFY(window.rootObject() != 0); + QQuickTextEdit *textEditObject = qobject_cast(window.rootObject()); QVERIFY(textEditObject != 0); QVERIFY(textEditObject->inputMethodHints() & Qt::ImhNoPredictiveText); QSignalSpy inputMethodHintSpy(textEditObject, SIGNAL(inputMethodHintsChanged())); @@ -1930,19 +1950,38 @@ void tst_qquicktextedit::inputMethodHints() QCOMPARE(plainTextEdit.inputMethodHints(), Qt::ImhNone); } +void tst_qquicktextedit::positionAt_data() +{ + QTest::addColumn("horizontalAlignment"); + QTest::addColumn("verticalAlignment"); + + QTest::newRow("top-left") << QQuickTextEdit::AlignLeft << QQuickTextEdit::AlignTop; + QTest::newRow("bottom-left") << QQuickTextEdit::AlignLeft << QQuickTextEdit::AlignBottom; + QTest::newRow("center-left") << QQuickTextEdit::AlignLeft << QQuickTextEdit::AlignVCenter; + + QTest::newRow("top-right") << QQuickTextEdit::AlignRight << QQuickTextEdit::AlignTop; + QTest::newRow("top-center") << QQuickTextEdit::AlignHCenter << QQuickTextEdit::AlignTop; + + QTest::newRow("center") << QQuickTextEdit::AlignHCenter << QQuickTextEdit::AlignVCenter; +} + void tst_qquicktextedit::positionAt() { - QQuickView canvas(testFileUrl("positionAt.qml")); - QVERIFY(canvas.rootObject() != 0); - canvas.show(); - canvas.requestActivateWindow(); - canvas.requestActivateWindow(); - QTest::qWaitForWindowShown(&canvas); - - QQuickTextEdit *texteditObject = qobject_cast(canvas.rootObject()); + QFETCH(QQuickTextEdit::HAlignment, horizontalAlignment); + QFETCH(QQuickTextEdit::VAlignment, verticalAlignment); + + QQuickView window(testFileUrl("positionAt.qml")); + QVERIFY(window.rootObject() != 0); + window.show(); + window.requestActivateWindow(); + QTest::qWaitForWindowActive(&window); + + QQuickTextEdit *texteditObject = qobject_cast(window.rootObject()); QVERIFY(texteditObject != 0); + texteditObject->setHAlign(horizontalAlignment); + texteditObject->setVAlign(verticalAlignment); - QTextLayout layout(texteditObject->text()); + QTextLayout layout(texteditObject->text().replace(QLatin1Char('\n'), QChar::LineSeparator)); layout.setFont(texteditObject->font()); if (!qmlDisableDistanceField()) { @@ -1953,15 +1992,45 @@ void tst_qquicktextedit::positionAt() layout.beginLayout(); QTextLine line = layout.createLine(); + line.setLineWidth(texteditObject->width()); + QTextLine secondLine = layout.createLine(); + secondLine.setLineWidth(texteditObject->width()); layout.endLayout(); - const int y0 = line.height() / 2; - const int y1 = line.height() * 3 / 2; + qreal y0; + qreal y1; + + switch (verticalAlignment) { + case QQuickTextEdit::AlignTop: + y0 = line.height() / 2; + y1 = line.height() * 3 / 2; + break; + case QQuickTextEdit::AlignVCenter: + y0 = (texteditObject->height() - line.height()) / 2; + y1 = (texteditObject->height() + line.height()) / 2; + break; + case QQuickTextEdit::AlignBottom: + y0 = texteditObject->height() - line.height() * 3 / 2; + y1 = texteditObject->height() - line.height() / 2; + break; + } + qreal xoff; + switch (horizontalAlignment) { + case QQuickTextEdit::AlignLeft: + xoff = 0; + break; + case QQuickTextEdit::AlignHCenter: + xoff = (texteditObject->width() - secondLine.naturalTextWidth()) / 2; + break; + case QQuickTextEdit::AlignRight: + xoff = texteditObject->width() - secondLine.naturalTextWidth(); + break; + } int pos = texteditObject->positionAt(texteditObject->width()/2, y0); - int widthBegin = floor(line.cursorToX(pos - 1)); - int widthEnd = ceil(line.cursorToX(pos + 1)); + int widthBegin = floor(xoff + line.cursorToX(pos - 1)); + int widthEnd = ceil(xoff + line.cursorToX(pos + 1)); QVERIFY(widthBegin <= texteditObject->width() / 2); QVERIFY(widthEnd >= texteditObject->width() / 2); @@ -1974,7 +2043,7 @@ void tst_qquicktextedit::positionAt() texteditObject->setCursorPosition(0); QInputMethodEvent inputEvent(preeditText, QList()); - QGuiApplication::sendEvent(qGuiApp->focusObject(), &inputEvent); + QGuiApplication::sendEvent(texteditObject, &inputEvent); // Check all points within the preedit text return the same position. QCOMPARE(texteditObject->positionAt(0, y0), 0); @@ -1990,13 +2059,13 @@ void tst_qquicktextedit::positionAt() void tst_qquicktextedit::linkActivated() { - QQuickView canvas(testFileUrl("linkActivated.qml")); - QVERIFY(canvas.rootObject() != 0); - canvas.show(); - canvas.requestActivateWindow(); - QTest::qWaitForWindowShown(&canvas); + QQuickView window(testFileUrl("linkActivated.qml")); + QVERIFY(window.rootObject() != 0); + window.show(); + window.requestActivateWindow(); + QTest::qWaitForWindowActive(&window); - QQuickTextEdit *texteditObject = qobject_cast(canvas.rootObject()); + QQuickTextEdit *texteditObject = qobject_cast(window.rootObject()); QVERIFY(texteditObject != 0); QSignalSpy spy(texteditObject, SIGNAL(linkActivated(QString))); @@ -2006,21 +2075,21 @@ void tst_qquicktextedit::linkActivated() const QPointF linkPos = texteditObject->positionToRectangle(7).center(); const QPointF textPos = texteditObject->positionToRectangle(2).center(); - QTest::mouseClick(&canvas, Qt::LeftButton, 0, linkPos.toPoint()); + QTest::mouseClick(&window, Qt::LeftButton, 0, linkPos.toPoint()); QTRY_COMPARE(spy.count(), 1); QCOMPARE(spy.last()[0].toString(), link); - QTest::mouseClick(&canvas, Qt::LeftButton, 0, textPos.toPoint()); + QTest::mouseClick(&window, Qt::LeftButton, 0, textPos.toPoint()); QTest::qWait(50); QCOMPARE(spy.count(), 1); texteditObject->setReadOnly(true); - QTest::mouseClick(&canvas, Qt::LeftButton, 0, linkPos.toPoint()); + QTest::mouseClick(&window, Qt::LeftButton, 0, linkPos.toPoint()); QTRY_COMPARE(spy.count(), 2); QCOMPARE(spy.last()[0].toString(), link); - QTest::mouseClick(&canvas, Qt::LeftButton, 0, textPos.toPoint()); + QTest::mouseClick(&window, Qt::LeftButton, 0, textPos.toPoint()); QTest::qWait(50); QCOMPARE(spy.count(), 2); } @@ -2141,6 +2210,38 @@ void tst_qquicktextedit::cursorDelegate() QVERIFY(!textEditObject->findChild("cursorInstance")); } +void tst_qquicktextedit::remoteCursorDelegate() +{ + TestHTTPServer server(SERVER_PORT); + server.serveDirectory(dataDirectory()); + + QQuickView view; + + QQmlComponent component(view.engine(), QUrl(SERVER_ADDR "/RemoteCursor.qml")); + + view.rootContext()->setContextProperty("contextDelegate", &component); + view.setSource(testFileUrl("cursorTestRemote.qml")); + view.show(); + view.requestActivateWindow(); + QQuickTextEdit *textEditObject = view.rootObject()->findChild("textEditObject"); + QVERIFY(textEditObject != 0); + + // Delegate is created on demand, and so won't be available immediately. Focus in or + // setCursorVisible(true) will trigger creation. + QTRY_VERIFY(!textEditObject->findChild("cursorInstance")); + QVERIFY(!textEditObject->isCursorVisible()); + + textEditObject->setFocus(true); + QVERIFY(textEditObject->isCursorVisible()); + + QCOMPARE(component.status(), QQmlComponent::Loading); + QVERIFY(!textEditObject->findChild("cursorInstance")); + + // Wait for component to load. + QTRY_COMPARE(component.status(), QQmlComponent::Ready); + QVERIFY(textEditObject->findChild("cursorInstance")); +} + void tst_qquicktextedit::cursorVisible() { QQuickTextEdit edit; @@ -2150,8 +2251,8 @@ void tst_qquicktextedit::cursorVisible() QQuickView view(testFileUrl("cursorVisible.qml")); view.show(); view.requestActivateWindow(); - QTest::qWaitForWindowShown(&view); - QTRY_COMPARE(&view, qGuiApp->focusWindow()); + QTest::qWaitForWindowActive(&view); + QCOMPARE(&view, qGuiApp->focusWindow()); QCOMPARE(edit.isCursorVisible(), false); @@ -2182,13 +2283,13 @@ void tst_qquicktextedit::cursorVisible() QWindow alternateView; alternateView.show(); alternateView.requestActivateWindow(); - QTest::qWaitForWindowShown(&alternateView); + QTest::qWaitForWindowActive(&alternateView); QCOMPARE(edit.isCursorVisible(), false); QCOMPARE(spy.count(), 6); view.requestActivateWindow(); - QTest::qWaitForWindowShown(&view); + QTest::qWaitForWindowActive(&view); QCOMPARE(edit.isCursorVisible(), true); QCOMPARE(spy.count(), 7); @@ -2250,12 +2351,12 @@ void tst_qquicktextedit::delegateLoading() QFETCH(QString, qmlfile); QFETCH(QString, error); - TestHTTPServer server(42332); + TestHTTPServer server(SERVER_PORT); server.serveDirectory(testFile("httpfail"), TestHTTPServer::Disconnect); server.serveDirectory(testFile("httpslow"), TestHTTPServer::Delay); server.serveDirectory(testFile("http")); - QQuickView view(QUrl(QLatin1String("http://localhost:42332/") + qmlfile)); + QQuickView view(QUrl(QLatin1String(SERVER_ADDR "/") + qmlfile)); view.show(); view.requestActivateWindow(); @@ -2292,35 +2393,35 @@ the extent of the text, then they should ignore the keys. */ void tst_qquicktextedit::navigation() { - QQuickView canvas(testFileUrl("navigation.qml")); - canvas.show(); - canvas.requestActivateWindow(); + QQuickView window(testFileUrl("navigation.qml")); + window.show(); + window.requestActivateWindow(); - QVERIFY(canvas.rootObject() != 0); + QVERIFY(window.rootObject() != 0); - QQuickTextEdit *input = qobject_cast(qvariant_cast(canvas.rootObject()->property("myInput"))); + QQuickTextEdit *input = qobject_cast(qvariant_cast(window.rootObject()->property("myInput"))); QVERIFY(input != 0); QTRY_VERIFY(input->hasActiveFocus() == true); - simulateKey(&canvas, Qt::Key_Left); + simulateKey(&window, Qt::Key_Left); QVERIFY(input->hasActiveFocus() == false); - simulateKey(&canvas, Qt::Key_Right); + simulateKey(&window, Qt::Key_Right); QVERIFY(input->hasActiveFocus() == true); - simulateKey(&canvas, Qt::Key_Right); + simulateKey(&window, Qt::Key_Right); QVERIFY(input->hasActiveFocus() == true); - simulateKey(&canvas, Qt::Key_Right); + simulateKey(&window, Qt::Key_Right); QVERIFY(input->hasActiveFocus() == false); - simulateKey(&canvas, Qt::Key_Left); + simulateKey(&window, Qt::Key_Left); QVERIFY(input->hasActiveFocus() == true); // Test left and right navigation works if the TextEdit is empty (QTBUG-25447). input->setText(QString()); QCOMPARE(input->cursorPosition(), 0); - simulateKey(&canvas, Qt::Key_Right); + simulateKey(&window, Qt::Key_Right); QCOMPARE(input->hasActiveFocus(), false); - simulateKey(&canvas, Qt::Key_Left); + simulateKey(&window, Qt::Key_Left); QCOMPARE(input->hasActiveFocus(), true); - simulateKey(&canvas, Qt::Key_Left); + simulateKey(&window, Qt::Key_Left); QCOMPARE(input->hasActiveFocus(), false); } @@ -2396,7 +2497,8 @@ void tst_qquicktextedit::canPaste() { QVERIFY(textEdit != 0); // check initial value - QTBUG-17765 - QQuickTextControl tc(0); + QTextDocument document; + QQuickTextControl tc(&document); QCOMPARE(textEdit->canPaste(), tc.canPaste()); #endif @@ -2414,7 +2516,8 @@ void tst_qquicktextedit::canPasteEmpty() { QVERIFY(textEdit != 0); // check initial value - QTBUG-17765 - QQuickTextControl tc(0); + QTextDocument document; + QQuickTextControl tc(&document); QCOMPARE(textEdit->canPaste(), tc.canPaste()); #endif @@ -2422,23 +2525,23 @@ void tst_qquicktextedit::canPasteEmpty() { void tst_qquicktextedit::readOnly() { - QQuickView canvas(testFileUrl("readOnly.qml")); - canvas.show(); - canvas.requestActivateWindow(); + QQuickView window(testFileUrl("readOnly.qml")); + window.show(); + window.requestActivateWindow(); - QVERIFY(canvas.rootObject() != 0); + QVERIFY(window.rootObject() != 0); - QQuickTextEdit *edit = qobject_cast(qvariant_cast(canvas.rootObject()->property("myInput"))); + QQuickTextEdit *edit = qobject_cast(qvariant_cast(window.rootObject()->property("myInput"))); QVERIFY(edit != 0); QTRY_VERIFY(edit->hasActiveFocus() == true); QVERIFY(edit->isReadOnly() == true); QString initial = edit->text(); for (int k=Qt::Key_0; k<=Qt::Key_Z; k++) - simulateKey(&canvas, k); - simulateKey(&canvas, Qt::Key_Return); - simulateKey(&canvas, Qt::Key_Space); - simulateKey(&canvas, Qt::Key_Escape); + simulateKey(&window, k); + simulateKey(&window, Qt::Key_Return); + simulateKey(&window, Qt::Key_Space); + simulateKey(&window, Qt::Key_Escape); QCOMPARE(edit->text(), initial); edit->setCursorPosition(3); @@ -2461,8 +2564,7 @@ void tst_qquicktextedit::textInput() QQuickView view(testFileUrl("inputMethodEvent.qml")); view.show(); view.requestActivateWindow(); - QTest::qWaitForWindowShown(&view); - QTRY_COMPARE(&view, qGuiApp->focusWindow()); + QTest::qWaitForWindowActive(&view); QQuickTextEdit *edit = qobject_cast(view.rootObject()); QVERIFY(edit); QVERIFY(edit->hasActiveFocus() == true); @@ -2471,7 +2573,7 @@ void tst_qquicktextedit::textInput() QSignalSpy spy(edit, SIGNAL(textChanged())); QInputMethodEvent event; event.setCommitString( "Hello world!", 0, 0); - QGuiApplication::sendEvent(qGuiApp->focusObject(), &event); + QGuiApplication::sendEvent(edit, &event); QCOMPARE(edit->text(), QString("Hello world!")); QCOMPARE(spy.count(), 1); @@ -2481,7 +2583,7 @@ void tst_qquicktextedit::textInput() QCOMPARE(editPrivate->text, QString("Hello world!")); QInputMethodQueryEvent queryEvent(Qt::ImEnabled); - QGuiApplication::sendEvent(qGuiApp->focusObject(), &queryEvent); + QGuiApplication::sendEvent(edit, &queryEvent); QCOMPARE(queryEvent.value(Qt::ImEnabled).toBool(), true); edit->setReadOnly(true); @@ -2498,8 +2600,7 @@ void tst_qquicktextedit::inputMethodUpdate() QQuickView view(testFileUrl("inputMethodEvent.qml")); view.show(); view.requestActivateWindow(); - QTest::qWaitForWindowShown(&view); - QTRY_COMPARE(&view, qGuiApp->focusWindow()); + QTest::qWaitForWindowActive(&view); QQuickTextEdit *edit = qobject_cast(view.rootObject()); QVERIFY(edit); QVERIFY(edit->hasActiveFocus() == true); @@ -2589,8 +2690,7 @@ void tst_qquicktextedit::openInputPanel() QQuickView view(testFileUrl("openInputPanel.qml")); view.show(); view.requestActivateWindow(); - QTest::qWaitForWindowShown(&view); - QTRY_COMPARE(&view, qGuiApp->focusWindow()); + QTest::qWaitForWindowActive(&view); QQuickTextEdit *edit = qobject_cast(view.rootObject()); QVERIFY(edit); @@ -2598,7 +2698,6 @@ void tst_qquicktextedit::openInputPanel() // check default values QVERIFY(edit->focusOnPress()); QVERIFY(!edit->hasActiveFocus()); - qDebug() << &edit << qApp->focusObject(); QVERIFY(qApp->focusObject() != edit); QCOMPARE(qApp->inputMethod()->isVisible(), false); @@ -2930,9 +3029,8 @@ void tst_qquicktextedit::preeditCursorRectangle() QQuickView view(testFileUrl("inputMethodEvent.qml")); view.show(); view.requestActivateWindow(); - QTest::qWaitForWindowShown(&view); + QTest::qWaitForWindowActive(&view); - QTRY_COMPARE(&view, qGuiApp->focusWindow()); QQuickTextEdit *edit = qobject_cast(view.rootObject()); QVERIFY(edit); @@ -2944,16 +3042,17 @@ void tst_qquicktextedit::preeditCursorRectangle() QRectF currentRect; + QCOMPARE(QGuiApplication::focusObject(), static_cast(edit)); QInputMethodQueryEvent query(Qt::ImCursorRectangle); - QCoreApplication::sendEvent(qGuiApp->focusObject(), &query); + QCoreApplication::sendEvent(edit, &query); QRectF previousRect = query.value(Qt::ImCursorRectangle).toRectF(); // Verify that the micro focus rect is positioned the same for position 0 as // it would be if there was no preedit text. QInputMethodEvent imEvent(preeditText, QList() << QInputMethodEvent::Attribute(QInputMethodEvent::Cursor, 0, preeditText.length(), QVariant())); - QCoreApplication::sendEvent(qGuiApp->focusObject(), &imEvent); - QCoreApplication::sendEvent(qGuiApp->focusObject(), &query); + QCoreApplication::sendEvent(edit, &imEvent); + QCoreApplication::sendEvent(edit, &query); currentRect = query.value(Qt::ImCursorRectangle).toRectF(); QCOMPARE(edit->cursorRectangle(), currentRect); QCOMPARE(cursor->pos(), currentRect.topLeft()); @@ -2966,8 +3065,8 @@ void tst_qquicktextedit::preeditCursorRectangle() for (int i = 1; i <= 5; ++i) { QInputMethodEvent imEvent(preeditText, QList() << QInputMethodEvent::Attribute(QInputMethodEvent::Cursor, i, preeditText.length(), QVariant())); - QCoreApplication::sendEvent(qGuiApp->focusObject(), &imEvent); - QCoreApplication::sendEvent(qGuiApp->focusObject(), &query); + QCoreApplication::sendEvent(edit, &imEvent); + QCoreApplication::sendEvent(edit, &query); currentRect = query.value(Qt::ImCursorRectangle).toRectF(); QCOMPARE(edit->cursorRectangle(), currentRect); QCOMPARE(cursor->pos(), currentRect.topLeft()); @@ -2983,8 +3082,8 @@ void tst_qquicktextedit::preeditCursorRectangle() panelSpy.clear(); { QInputMethodEvent imEvent("wwwww", QList() << QInputMethodEvent::Attribute(QInputMethodEvent::Cursor, 5, 1, QVariant())); - QCoreApplication::sendEvent(qGuiApp->focusObject(), &imEvent); } - QCoreApplication::sendEvent(qGuiApp->focusObject(), &query); + QCoreApplication::sendEvent(edit, &imEvent); } + QCoreApplication::sendEvent(edit, &query); currentRect = query.value(Qt::ImCursorRectangle).toRectF(); QCOMPARE(edit->cursorRectangle(), currentRect); QCOMPARE(cursor->pos(), currentRect.topLeft()); @@ -2996,8 +3095,8 @@ void tst_qquicktextedit::preeditCursorRectangle() editSpy.clear(); panelSpy.clear(); { QInputMethodEvent imEvent(preeditText, QList()); - QCoreApplication::sendEvent(qGuiApp->focusObject(), &imEvent); } - QCoreApplication::sendEvent(qGuiApp->focusObject(), &query); + QCoreApplication::sendEvent(edit, &imEvent); } + QCoreApplication::sendEvent(edit, &query); currentRect = query.value(Qt::ImCursorRectangle).toRectF(); QCOMPARE(edit->cursorRectangle(), currentRect); QCOMPARE(cursor->pos(), currentRect.topLeft()); @@ -3013,10 +3112,12 @@ void tst_qquicktextedit::inputMethodComposing() QQuickView view(testFileUrl("inputContext.qml")); view.show(); view.requestActivateWindow(); - QTest::qWaitForWindowShown(&view); - QTRY_COMPARE(&view, qGuiApp->focusWindow()); + QTest::qWaitForWindowActive(&view); + QQuickTextEdit *edit = qobject_cast(view.rootObject()); QVERIFY(edit); + QCOMPARE(QGuiApplication::focusObject(), static_cast(edit)); + QSignalSpy spy(edit, SIGNAL(inputMethodComposingChanged())); edit->setCursorPosition(12); @@ -3114,9 +3215,9 @@ void tst_qquicktextedit::inputMethodComposing() void tst_qquicktextedit::cursorRectangleSize() { - QQuickView *canvas = new QQuickView(testFileUrl("positionAt.qml")); - QVERIFY(canvas->rootObject() != 0); - QQuickTextEdit *textEdit = qobject_cast(canvas->rootObject()); + QQuickView *window = new QQuickView(testFileUrl("positionAt.qml")); + QVERIFY(window->rootObject() != 0); + QQuickTextEdit *textEdit = qobject_cast(window->rootObject()); // make sure cursor rectangle is not at (0,0) textEdit->setX(10); @@ -3124,12 +3225,12 @@ void tst_qquicktextedit::cursorRectangleSize() textEdit->setCursorPosition(3); QVERIFY(textEdit != 0); textEdit->setFocus(true); - canvas->show(); - canvas->requestActivateWindow(); - QTest::qWaitForWindowShown(canvas); + window->show(); + window->requestActivateWindow(); + QTest::qWaitForWindowActive(window); QInputMethodQueryEvent event(Qt::ImCursorRectangle); - qApp->sendEvent(qApp->focusObject(), &event); + qApp->sendEvent(textEdit, &event); QRectF cursorRectFromQuery = event.value(Qt::ImCursorRectangle).toRectF(); QRectF cursorRectFromItem = textEdit->cursorRectangle(); @@ -3141,14 +3242,14 @@ void tst_qquicktextedit::cursorRectangleSize() // item cursor rectangle and positionToRectangle calculations match QCOMPARE(cursorRectFromItem, cursorRectFromPositionToRectangle); - // item-canvas transform and input item transform match - QCOMPARE(QQuickItemPrivate::get(textEdit)->itemToCanvasTransform(), qApp->inputMethod()->inputItemTransform()); + // item-window transform and input item transform match + QCOMPARE(QQuickItemPrivate::get(textEdit)->itemToWindowTransform(), qApp->inputMethod()->inputItemTransform()); // input panel cursorRectangle property and tranformed item cursor rectangle match - QRectF sceneCursorRect = QQuickItemPrivate::get(textEdit)->itemToCanvasTransform().mapRect(cursorRectFromItem); + QRectF sceneCursorRect = QQuickItemPrivate::get(textEdit)->itemToWindowTransform().mapRect(cursorRectFromItem); QCOMPARE(sceneCursorRect, qApp->inputMethod()->cursorRectangle()); - delete canvas; + delete window; } void tst_qquicktextedit::getText_data() @@ -3160,6 +3261,8 @@ void tst_qquicktextedit::getText_data() const QString richBoldText = QStringLiteral("This is some bold text"); const QString plainBoldText = QStringLiteral("This is some bold text"); + const QString richBoldTextLB = QStringLiteral("This is some
bold text"); + const QString plainBoldTextLB = QString(QStringLiteral("This is some\nbold text")).replace(QLatin1Char('\n'), QChar(QChar::LineSeparator)); QTest::newRow("all plain text") << standard.at(0) @@ -3200,6 +3303,47 @@ void tst_qquicktextedit::getText_data() << richBoldText << 14 << 21 << plainBoldText.mid(14, 7); + + // Line break. + QTest::newRow("all plain text (line break)") + << standard.at(1) + << 0 << standard.at(1).length() + << standard.at(1); + + QTest::newRow("plain text sub string (line break)") + << standard.at(1) + << 0 << 12 + << standard.at(1).mid(0, 12); + + QTest::newRow("plain text sub string reversed (line break)") + << standard.at(1) + << 12 << 0 + << standard.at(1).mid(0, 12); + + QTest::newRow("plain text cropped beginning (line break)") + << standard.at(1) + << -3 << 4 + << standard.at(1).mid(0, 4); + + QTest::newRow("plain text cropped end (line break)") + << standard.at(1) + << 23 << standard.at(1).length() + 8 + << standard.at(1).mid(23); + + QTest::newRow("plain text cropped beginning and end (line break)") + << standard.at(1) + << -9 << standard.at(1).length() + 4 + << standard.at(1); + + QTest::newRow("all rich text (line break)") + << richBoldTextLB + << 0 << plainBoldTextLB.length() + << plainBoldTextLB; + + QTest::newRow("rich text sub string (line break)") + << richBoldTextLB + << 14 << 21 + << plainBoldTextLB.mid(14, 7); } void tst_qquicktextedit::getText() @@ -3511,7 +3655,7 @@ void tst_qquicktextedit::insert() textEdit->setTextFormat(textFormat); textEdit->select(selectionStart, selectionEnd); - QSignalSpy selectionSpy(textEdit, SIGNAL(selectionChanged())); + QSignalSpy selectionSpy(textEdit, SIGNAL(selectedTextChanged())); QSignalSpy selectionStartSpy(textEdit, SIGNAL(selectionStartChanged())); QSignalSpy selectionEndSpy(textEdit, SIGNAL(selectionEndChanged())); QSignalSpy textSpy(textEdit, SIGNAL(textChanged())); @@ -3535,8 +3679,8 @@ void tst_qquicktextedit::insert() if (selectionStart > selectionEnd) qSwap(selectionStart, selectionEnd); - QEXPECT_FAIL("into selection", "selectionChanged signal isn't emitted on edits within selection", Continue); - QEXPECT_FAIL("into reversed selection", "selectionChanged signal isn't emitted on edits within selection", Continue); + QEXPECT_FAIL("into selection", "selectedTextChanged signal isn't emitted on edits within selection", Continue); + QEXPECT_FAIL("into reversed selection", "selectedTextChanged signal isn't emitted on edits within selection", Continue); QCOMPARE(selectionSpy.count() > 0, selectionChanged); QCOMPARE(selectionStartSpy.count() > 0, selectionStart != expectedSelectionStart); QEXPECT_FAIL("into reversed selection", "selectionEndChanged signal not emitted", Continue); @@ -3756,7 +3900,7 @@ void tst_qquicktextedit::remove() textEdit->setTextFormat(textFormat); textEdit->select(selectionStart, selectionEnd); - QSignalSpy selectionSpy(textEdit, SIGNAL(selectionChanged())); + QSignalSpy selectionSpy(textEdit, SIGNAL(selectedTextChanged())); QSignalSpy selectionStartSpy(textEdit, SIGNAL(selectionStartChanged())); QSignalSpy selectionEndSpy(textEdit, SIGNAL(selectionEndChanged())); QSignalSpy textSpy(textEdit, SIGNAL(textChanged())); @@ -3779,8 +3923,8 @@ void tst_qquicktextedit::remove() QCOMPARE(textEdit->selectionEnd(), expectedSelectionEnd); QCOMPARE(textEdit->cursorPosition(), expectedCursorPosition); - QEXPECT_FAIL("from selection", "selectionChanged signal isn't emitted on edits within selection", Continue); - QEXPECT_FAIL("from reversed selection", "selectionChanged signal isn't emitted on edits within selection", Continue); + QEXPECT_FAIL("from selection", "selectedTextChanged signal isn't emitted on edits within selection", Continue); + QEXPECT_FAIL("from reversed selection", "selectedTextChanged signal isn't emitted on edits within selection", Continue); QCOMPARE(selectionSpy.count() > 0, selectionChanged); QCOMPARE(selectionStartSpy.count() > 0, selectionStart != expectedSelectionStart); QEXPECT_FAIL("from reversed selection", "selectionEndChanged signal not emitted", Continue); @@ -3937,18 +4081,19 @@ void tst_qquicktextedit::keySequence() QQuickTextEdit *textEdit = qobject_cast(textEditComponent.create()); QVERIFY(textEdit != 0); - QQuickCanvas canvas; - textEdit->setParentItem(canvas.rootItem()); - canvas.show(); - canvas.requestActivateWindow(); - QTest::qWaitForWindowShown(&canvas); - QTRY_COMPARE(QGuiApplication::activeWindow(), &canvas); + QQuickWindow window; + textEdit->setParentItem(window.rootItem()); + window.show(); + window.requestActivateWindow(); + QTest::qWaitForWindowActive(&window); + + QVERIFY(textEdit->hasActiveFocus()); - simulateKey(&canvas, layoutDirection); + simulateKey(&window, layoutDirection); textEdit->select(selectionStart, selectionEnd); - simulateKeys(&canvas, sequence); + simulateKeys(&window, sequence); QCOMPARE(textEdit->cursorPosition(), cursorPosition); QCOMPARE(textEdit->text(), expectedText); @@ -4099,13 +4244,13 @@ void tst_qquicktextedit::undo() QQuickTextEdit *textEdit = qobject_cast(textEditComponent.create()); QVERIFY(textEdit != 0); - QQuickCanvas canvas; - textEdit->setParentItem(canvas.rootItem()); - canvas.show(); - canvas.requestActivateWindow(); - QTest::qWaitForWindowShown(&canvas); - QTRY_COMPARE(QGuiApplication::activeWindow(), &canvas); + QQuickWindow window; + textEdit->setParentItem(window.rootItem()); + window.show(); + window.requestActivateWindow(); + QTest::qWaitForWindowActive(&window); + QVERIFY(textEdit->hasActiveFocus()); QVERIFY(!textEdit->canUndo()); QSignalSpy spy(textEdit, SIGNAL(canUndoChanged())); @@ -4126,7 +4271,7 @@ void tst_qquicktextedit::undo() } for (int j = 0; j < insertString.at(i).length(); j++) - QTest::keyClick(&canvas, insertString.at(i).at(j).toLatin1()); + QTest::keyClick(&window, insertString.at(i).at(j).toLatin1()); } QCOMPARE(spy.count(), 1); @@ -4185,12 +4330,12 @@ void tst_qquicktextedit::redo() QQuickTextEdit *textEdit = qobject_cast(textEditComponent.create()); QVERIFY(textEdit != 0); - QQuickCanvas canvas; - textEdit->setParentItem(canvas.rootItem()); - canvas.show(); - canvas.requestActivateWindow(); - QTest::qWaitForWindowShown(&canvas); - QTRY_COMPARE(QGuiApplication::activeWindow(), &canvas); + QQuickWindow window; + textEdit->setParentItem(window.rootItem()); + window.show(); + window.requestActivateWindow(); + QTest::qWaitForWindowActive(&window); + QVERIFY(textEdit->hasActiveFocus()); QVERIFY(!textEdit->canUndo()); QVERIFY(!textEdit->canRedo()); @@ -4203,7 +4348,7 @@ void tst_qquicktextedit::redo() if (insertIndex[i] > -1) textEdit->setCursorPosition(insertIndex[i]); for (int j = 0; j < insertString.at(i).length(); j++) - QTest::keyClick(&canvas, insertString.at(i).at(j).toLatin1()); + QTest::keyClick(&window, insertString.at(i).at(j).toLatin1()); QVERIFY(textEdit->canUndo()); QVERIFY(!textEdit->canRedo()); } @@ -4378,14 +4523,14 @@ void tst_qquicktextedit::undo_keypressevents() QQuickTextEdit *textEdit = qobject_cast(textEditComponent.create()); QVERIFY(textEdit != 0); - QQuickCanvas canvas; - textEdit->setParentItem(canvas.rootItem()); - canvas.show(); - canvas.requestActivateWindow(); - QTest::qWaitForWindowShown(&canvas); - QTRY_COMPARE(QGuiApplication::activeWindow(), &canvas); + QQuickWindow window; + textEdit->setParentItem(window.rootItem()); + window.show(); + window.requestActivateWindow(); + QTest::qWaitForWindowActive(&window); + QVERIFY(textEdit->hasActiveFocus()); - simulateKeys(&canvas, keys); + simulateKeys(&window, keys); for (int i = 0; i < expectedString.size(); ++i) { QCOMPARE(textEdit->text() , expectedString[i]); @@ -4439,7 +4584,7 @@ void tst_qquicktextedit::embeddedImages() QFETCH(QUrl, qmlfile); QFETCH(QString, error); - TestHTTPServer server(42332); + TestHTTPServer server(SERVER_PORT); server.serveDirectory(testFile("http")); if (!error.isEmpty()) @@ -4466,13 +4611,13 @@ void tst_qquicktextedit::embeddedImages() void tst_qquicktextedit::emptytags_QTBUG_22058() { - QQuickView canvas(testFileUrl("qtbug-22058.qml")); - QVERIFY(canvas.rootObject() != 0); + QQuickView window(testFileUrl("qtbug-22058.qml")); + QVERIFY(window.rootObject() != 0); - canvas.show(); - canvas.requestActivateWindow(); - QTest::qWaitForWindowShown(&canvas); - QQuickTextEdit *input = qobject_cast(qvariant_cast(canvas.rootObject()->property("inputField"))); + window.show(); + window.requestActivateWindow(); + QTest::qWaitForWindowActive(&window); + QQuickTextEdit *input = qobject_cast(qvariant_cast(window.rootObject()->property("inputField"))); QVERIFY(input->hasActiveFocus()); QInputMethodEvent event("", QList());