diff options
| -rw-r--r-- | src/quick/items/qquicktextnodeengine.cpp | 2 | ||||
| -rw-r--r-- | tests/auto/quick/qquicktextdocument/tst_qquicktextdocument.cpp | 49 |
2 files changed, 51 insertions, 0 deletions
diff --git a/src/quick/items/qquicktextnodeengine.cpp b/src/quick/items/qquicktextnodeengine.cpp index d6d31b4621..1be5e34e37 100644 --- a/src/quick/items/qquicktextnodeengine.cpp +++ b/src/quick/items/qquicktextnodeengine.cpp @@ -141,6 +141,8 @@ int QQuickTextNodeEngine::addText(const QTextBlock &block, while (textPos < fragmentEnd) { int blockRelativePosition = textPos - block.position(); QTextLine line = block.layout()->lineForTextPosition(blockRelativePosition); + if (!line.isValid()) + break; if (!currentLine().isValid() || line.lineNumber() != currentLine().lineNumber()) { setCurrentLine(line); diff --git a/tests/auto/quick/qquicktextdocument/tst_qquicktextdocument.cpp b/tests/auto/quick/qquicktextdocument/tst_qquicktextdocument.cpp index e8c9f09413..50576f5cf2 100644 --- a/tests/auto/quick/qquicktextdocument/tst_qquicktextdocument.cpp +++ b/tests/auto/quick/qquicktextdocument/tst_qquicktextdocument.cpp @@ -16,6 +16,7 @@ #include <QtQml/QQmlComponent> #include <QtQml/QQmlEngine> #include <QtQml/QQmlFile> +#include <QtQuickTest/QtQuickTest> #include <QtQuickTestUtils/private/qmlutils_p.h> #include <QtQuickTestUtils/private/viewtestutils_p.h> #ifdef Q_OS_UNIX @@ -46,6 +47,8 @@ private slots: void loadErrorPermissionDenied(); void overrideTextFormat_data(); void overrideTextFormat(); + void changeCharFormatInRange_data(); + void changeCharFormatInRange(); void independentDocumentsSameSource_data(); void independentDocumentsSameSource(); }; @@ -574,6 +577,52 @@ void tst_qquicktextdocument::overrideTextFormat() // QTBUG-120772 QVERIFY(textPropValue.startsWith(expectedFinalPrefix)); } +void tst_qquicktextdocument::changeCharFormatInRange_data() +{ + QTest::addColumn<bool>("editBlock"); + + QTest::newRow("begin/end") << true; + QTest::newRow("no edit block") << false; // QTBUG-126886 : don't crash +} + +void tst_qquicktextdocument::changeCharFormatInRange() +{ + QFETCH(bool, editBlock); + QQuickView window; + QVERIFY(QQuickTest::showView(window, testFileUrl("initialText.qml"))); + QQuickTextEdit *textEdit = qobject_cast<QQuickTextEdit *>(window.rootObject()); + QVERIFY(textEdit); + QVERIFY(textEdit->textDocument()); + auto *doc = textEdit->textDocument()->textDocument(); + QVERIFY(doc); + + QSignalSpy contentSpy(doc, &QTextDocument::contentsChanged); + const auto data = QStringLiteral("Format String"); + doc->setPlainText(data); + auto block = doc->findBlockByNumber(0); + + auto formatText = [block, data] { + QTextLayout::FormatRange formatText; + formatText.start = 0; + formatText.length = data.size(); + formatText.format.setForeground(Qt::green); + block.layout()->setFormats({formatText}); + }; + + // change the char format of this block, and verify visual effect + if (editBlock) { + QTextCursor cursor(doc); + cursor.beginEditBlock(); + formatText(); + cursor.endEditBlock(); + } else { + formatText(); + } + + QVERIFY(QQuickTest::qWaitForPolish(textEdit)); + QCOMPARE(contentSpy.size(), editBlock ? 2 : 1); +} + void tst_qquicktextdocument::independentDocumentsSameSource_data() { QTest::addColumn<QUrl>("qmlfile"); |
