Fix assert when calculating the implicit width of truncated lines.
authorAndrew den Exter <andrew.den.exter@jollamobile.com>
Fri, 31 May 2013 02:13:40 +0000 (12:13 +1000)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Fri, 31 May 2013 07:56:42 +0000 (09:56 +0200)
Guard against reading past the end of the final line.

Task-number: QTBUG-31471

Change-Id: I489f742936ee16f12ad9762b7c0891bfa9377e21
Reviewed-by: Martin Jones <martin.jones@jollamobile.com>
src/quick/items/qquicktext.cpp
tests/auto/quick/qquicktext/data/elideBeforeMaximumLineCount.qml [new file with mode: 0644]
tests/auto/quick/qquicktext/tst_qquicktext.cpp

index cf9cb42..fbf46f5 100644 (file)
@@ -954,7 +954,10 @@ QRectF QQuickTextPrivate::setupTextLayout(qreal *const baseline)
 
                 // Create the remainder of the unwrapped lines up to maxLineCount to get the
                 // implicit width.
-                if (line.isValid() && layoutText.at(line.textStart() + line.textLength()) != QChar::LineSeparator)
+                const int eol = line.isValid()
+                        ? line.textStart() + line.textLength()
+                        : layoutText.length();
+                if (eol < layoutText.length() && layoutText.at(eol) != QChar::LineSeparator)
                     line = layout.createLine();
                 for (; line.isValid() && unwrappedLineCount <= maxLineCount; ++unwrappedLineCount)
                     line = layout.createLine();
diff --git a/tests/auto/quick/qquicktext/data/elideBeforeMaximumLineCount.qml b/tests/auto/quick/qquicktext/data/elideBeforeMaximumLineCount.qml
new file mode 100644 (file)
index 0000000..7f1ce70
--- /dev/null
@@ -0,0 +1,10 @@
+import QtQuick 2.0
+
+Text {
+    width: implicitWidth / 2
+    height: implicitHeight / 2
+    elide: Text.ElideRight
+    maximumLineCount: 4
+
+    text: "Line one\nLine two\nLine three\nLine four"
+}
index b95a646..fb3b62b 100644 (file)
@@ -149,6 +149,8 @@ private slots:
     void htmlLists();
     void htmlLists_data();
 
+    void elideBeforeMaximumLineCount();
+
 private:
     QStringList standard;
     QStringList richText;
@@ -3638,6 +3640,18 @@ void tst_qquicktext::htmlLists_data()
     QTest::newRow("unordered list bad") << "<ul type=\"bad\"><li>one</li><li>two</li></ul>" << 2;
 }
 
+void tst_qquicktext::elideBeforeMaximumLineCount()
+{   // QTBUG-31471
+    QQmlComponent component(&engine, testFile("elideBeforeMaximumLineCount.qml"));
+
+    QScopedPointer<QObject> object(component.create());
+
+    QQuickText *item = qobject_cast<QQuickText *>(object.data());
+    QVERIFY(item);
+
+    QCOMPARE(item->lineCount(), 2);
+}
+
 QTEST_MAIN(tst_qquicktext)
 
 #include "tst_qquicktext.moc"