aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquicktextnodeengine.cpp
diff options
context:
space:
mode:
authorShawn Rutledge <shawn.rutledge@qt.io>2024-07-10 16:59:26 -0700
committerSanthosh Kumar <santhosh.kumar.selvaraj@qt.io>2024-07-23 18:38:20 +0200
commitf6810b64401ead3a9ace972acea7797c998e91b5 (patch)
treef61a750f2a621a6a302d3a37e1ee8185d28bd1b5 /src/quick/items/qquicktextnodeengine.cpp
parent51de3b6806032232a5d7f805b9d1e539b7522426 (diff)
QQuickTextNodeEngine::addText(): don't crash if QTextLine is invalid
When a QTextBlock has been pulled out of a QTextDocument, lineNumberForTextPosition() returns -1, so lineForTextPosition() returns a default-constructed QTextLine whose `eng` pointer is null. QTextLine::textStart() needs to access `eng`, so we can't call it. The new autotest is similar to what a syntax highlighter does. However QTextLayout::setFormats() doesn't trigger QTextEdit::update() by itself. QTextCursor::endEditBlock() results in QTD::contentsChanged() being emitted, which is connected to QQuickTextEdit::q_textChanged(); so we test it both ways to ensure that it doesn't crash in either case, but one can see the text turn green only in the case that update() is called somehow. Done-with: Santhosh Kumar <santhosh.kumar.selvaraj@qt.io> Fixes: QTBUG-126886 Pick-to: 6.8 6.7 6.5 6.2 Change-Id: I9c1093af7002432add3b4ab856a41ce2f9af4619 Reviewed-by: Santhosh Kumar <santhosh.kumar.selvaraj@qt.io>
Diffstat (limited to 'src/quick/items/qquicktextnodeengine.cpp')
-rw-r--r--src/quick/items/qquicktextnodeengine.cpp2
1 files changed, 2 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);