diff options
| author | Shawn Rutledge <shawn.rutledge@qt.io> | 2024-07-10 16:59:26 -0700 |
|---|---|---|
| committer | Santhosh Kumar <santhosh.kumar.selvaraj@qt.io> | 2024-07-23 18:38:20 +0200 |
| commit | f6810b64401ead3a9ace972acea7797c998e91b5 (patch) | |
| tree | f61a750f2a621a6a302d3a37e1ee8185d28bd1b5 /src/quick/items/qquicktextnodeengine.cpp | |
| parent | 51de3b6806032232a5d7f805b9d1e539b7522426 (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.cpp | 2 |
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); |
