aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquicktextnodeengine.cpp2
-rw-r--r--tests/auto/quick/qquicktextdocument/tst_qquicktextdocument.cpp49
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");