QQuickCanvas renames
[profile/ivi/qtdeclarative.git] / tests / auto / quick / qquicktextedit / tst_qquicktextedit.cpp
index 763c191..fe8beb4 100644 (file)
 #include "../../shared/util.h"
 #include "../../shared/platforminputcontext.h"
 #include <private/qinputmethod_p.h>
+#include <QtGui/qstylehints.h>
 
 #ifdef Q_OS_MAC
 #include <Carbon/Carbon.h>
 #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<Key> 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<Key> &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<QQuickTextEdit*>("text");
+    QQuickView window(testFileUrl("horizontalAlignment_RightToLeft.qml"));
+    QQuickTextEdit *textEdit = window.rootObject()->findChild<QQuickTextEdit*>("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("<i>") + textString + QString("</i>"));
@@ -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<QInputMethodEvent::Attribute>()); QGuiApplication::sendEvent(qGuiApp->focusObject(), &ev); }
+    { QInputMethodEvent ev(rtlText, QList<QInputMethodEvent::Attribute>()); QGuiApplication::sendEvent(textEdit, &ev); }
     QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignRight);
-    { QInputMethodEvent ev("Hello world!", QList<QInputMethodEvent::Attribute>()); QGuiApplication::sendEvent(qGuiApp->focusObject(), &ev); }
+    { QInputMethodEvent ev("Hello world!", QList<QInputMethodEvent::Attribute>()); 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<QQuickTextEdit*>("emptyTextEdit");
+    QQuickTextEdit *emptyEdit = window.rootObject()->findChild<QQuickTextEdit*>("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<QQuickText*>("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<QQuickTextEdit *>(canvas.rootObject());
+    QQuickView window(testFileUrl("persistentSelection.qml"));
+    window.show();
+    window.requestActivateWindow();
+    QTest::qWaitForWindowActive(&window);
+
+    QQuickTextEdit *edit = qobject_cast<QQuickTextEdit *>(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<QQuickTextEdit *>(qvariant_cast<QObject *>(canvas.rootObject()->property("myInput")));
+    QQuickTextEdit *input = qobject_cast<QQuickTextEdit *>(qvariant_cast<QObject *>(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<QString>("selectedText");
     QTest::addColumn<bool>("focus");
     QTest::addColumn<bool>("focusOnPress");
-    QTest::addColumn<bool>("doubleClick");
+    QTest::addColumn<int>("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<QQuickTextEdit *>(canvas.rootObject());
+    QVERIFY(window.rootObject() != 0);
+    QQuickTextEdit *textEditObject = qobject_cast<QQuickTextEdit *>(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<QQuickTextEdit *>(canvas.rootObject());
+    QVERIFY(window.rootObject() != 0);
+    QQuickTextEdit *textEditObject = qobject_cast<QQuickTextEdit *>(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<QQuickTextEdit *>(canvas.rootObject());
+    QVERIFY(window.rootObject() != 0);
+    QQuickTextEdit *textEditObject = qobject_cast<QQuickTextEdit *>(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<QQuickTextEdit *>(canvas.rootObject());
+    QVERIFY(window.rootObject() != 0);
+    QQuickTextEdit *textEditObject = qobject_cast<QQuickTextEdit *>(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<QQuickTextEdit::HAlignment>("horizontalAlignment");
+    QTest::addColumn<QQuickTextEdit::VAlignment>("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<QQuickTextEdit *>(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<QQuickTextEdit *>(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<QInputMethodEvent::Attribute>());
-    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<QQuickTextEdit *>(canvas.rootObject());
+    QQuickTextEdit *texteditObject = qobject_cast<QQuickTextEdit *>(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<QQuickItem*>("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<QQuickTextEdit*>("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<QQuickItem*>("cursorInstance"));
+    QVERIFY(!textEditObject->isCursorVisible());
+
+    textEditObject->setFocus(true);
+    QVERIFY(textEditObject->isCursorVisible());
+
+    QCOMPARE(component.status(), QQmlComponent::Loading);
+    QVERIFY(!textEditObject->findChild<QQuickItem*>("cursorInstance"));
+
+    // Wait for component to load.
+    QTRY_COMPARE(component.status(), QQmlComponent::Ready);
+    QVERIFY(textEditObject->findChild<QQuickItem*>("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<QQuickTextEdit *>(qvariant_cast<QObject *>(canvas.rootObject()->property("myInput")));
+    QQuickTextEdit *input = qobject_cast<QQuickTextEdit *>(qvariant_cast<QObject *>(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<QQuickTextEdit *>(qvariant_cast<QObject *>(canvas.rootObject()->property("myInput")));
+    QQuickTextEdit *edit = qobject_cast<QQuickTextEdit *>(qvariant_cast<QObject *>(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<QQuickTextEdit *>(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<QQuickTextEdit *>(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<QQuickTextEdit *>(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<QQuickTextEdit *>(view.rootObject());
     QVERIFY(edit);
 
@@ -2944,16 +3042,17 @@ void tst_qquicktextedit::preeditCursorRectangle()
 
     QRectF currentRect;
 
+    QCOMPARE(QGuiApplication::focusObject(), static_cast<QObject *>(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::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::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::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<QInputMethodEvent::Attribute>());
-        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<QQuickTextEdit *>(view.rootObject());
     QVERIFY(edit);
+    QCOMPARE(QGuiApplication::focusObject(), static_cast<QObject *>(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<QQuickTextEdit *>(canvas->rootObject());
+    QQuickView *window = new QQuickView(testFileUrl("positionAt.qml"));
+    QVERIFY(window->rootObject() != 0);
+    QQuickTextEdit *textEdit = qobject_cast<QQuickTextEdit *>(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 <b>bold</b> text");
     const QString plainBoldText = QStringLiteral("This is some bold text");
+    const QString richBoldTextLB = QStringLiteral("This is some<br/><b>bold</b> 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<QQuickTextEdit*>(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<QQuickTextEdit*>(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<QQuickTextEdit*>(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<QQuickTextEdit*>(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<QQuickTextEdit *>(qvariant_cast<QObject *>(canvas.rootObject()->property("inputField")));
+    window.show();
+    window.requestActivateWindow();
+    QTest::qWaitForWindowActive(&window);
+    QQuickTextEdit *input = qobject_cast<QQuickTextEdit *>(qvariant_cast<QObject *>(window.rootObject()->property("inputField")));
     QVERIFY(input->hasActiveFocus());
 
     QInputMethodEvent event("", QList<QInputMethodEvent::Attribute>());