diff options
author | David Faure <david.faure@kdab.com> | 2017-04-10 11:05:51 +0200 |
---|---|---|
committer | David Faure <david.faure@kdab.com> | 2017-04-10 09:44:01 +0000 |
commit | c0ecfc08e3bfb8d93136a859808bf713c56b68e3 (patch) | |
tree | 466a478a6b23524a60136e9eb04196ab9a618172 | |
parent | 45862976b7566d416aff887b74eb60cb039a3dd6 (diff) |
QTextDocument: improve import of DIV tags
<div>1<br/></div>2 was inserting two newlines between 1 and 2, while all
tested web browsers only insert one newline - as long as there is nothing
between the <br/> and the </div>.
This was the cause for extra newlines being inserted in KMail when
replying to HTML emails, such as those generated by gmail.
Change-Id: I5145d977701e68913264357bba22780e7cdd3f7d
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
-rw-r--r-- | src/gui/text/qtextdocumentfragment.cpp | 10 | ||||
-rw-r--r-- | tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp | 22 |
2 files changed, 27 insertions, 5 deletions
diff --git a/src/gui/text/qtextdocumentfragment.cpp b/src/gui/text/qtextdocumentfragment.cpp index 3a78296c57..ea37695f4e 100644 --- a/src/gui/text/qtextdocumentfragment.cpp +++ b/src/gui/text/qtextdocumentfragment.cpp @@ -825,9 +825,13 @@ bool QTextHtmlImporter::closeTag() break; case Html_div: - if (closedNode->children.isEmpty()) - break; - Q_FALLTHROUGH(); + if (cursor.position() > 0) { + const QChar curChar = cursor.document()->characterAt(cursor.position() - 1); + if (!closedNode->children.isEmpty() && curChar != QChar::LineSeparator) { + blockTagClosed = true; + } + } + break; default: if (closedNode->isBlock()) blockTagClosed = true; diff --git a/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp b/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp index ef1ad76161..764b99646b 100644 --- a/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp +++ b/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp @@ -134,6 +134,7 @@ private slots: void clearResources(); void setPlainText(); + void toPlainText_data(); void toPlainText(); void toRawText(); @@ -2391,10 +2392,27 @@ void tst_QTextDocument::setPlainText() QCOMPARE(doc->toPlainText(), s); } +void tst_QTextDocument::toPlainText_data() +{ + QTest::addColumn<QString>("html"); + QTest::addColumn<QString>("expectedPlainText"); + + QTest::newRow("nbsp") << "Hello World" << "Hello World"; + QTest::newRow("empty_div") << "<div></div>hello" << "hello"; + QTest::newRow("br_and_p") << "<p>first<br></p><p>second<br></p>" << "first\n\nsecond\n"; + QTest::newRow("div") << "first<div>second<br>third</div>fourth" << "first\nsecond\nthird\nfourth"; // <div> and </div> become newlines... + QTest::newRow("br_text_end_of_div") << "<div><div>first<br>moretext</div>second<br></div>" << "first\nmoretext\nsecond\n"; // ... when there is text before <div> + QTest::newRow("br_end_of_div_like_gmail") << "<div><div><div>first<br></div>second<br></div>third<br></div>" << "first\nsecond\nthird\n"; // ... and when there is text before </div> + QTest::newRow("p_and_div") << "<div><div>first<p>second</p></div>third</div>" << "first\nsecond\nthird"; +} + void tst_QTextDocument::toPlainText() { - doc->setHtml("Hello World"); - QCOMPARE(doc->toPlainText(), QLatin1String("Hello World")); + QFETCH(QString, html); + QFETCH(QString, expectedPlainText); + + doc->setHtml(html); + QCOMPARE(doc->toPlainText(), expectedPlainText); } void tst_QTextDocument::toRawText() |