QTextHtmlParser: parse border color correctly

Use QCss::Declaration::brushValues to parse the values into a list. This
will not only lead to correctly parsing the values, but also prevent an
an assertion from firing when ValueExtractor::extractBorder is called.

Fixes: QTBUG-126381
Pick-to: 6.7 6.5 6.2
Change-Id: Ic6f3d722ffe0d72dcb5faa9916a23c804211ce49
Reviewed-by: Santhosh Kumar <santhosh.kumar.selvaraj@qt.io>
(cherry picked from commit a37ca7c85933979351d99f1bb22191763a78de46)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Hatem ElKharashy 2024-06-18 17:58:03 +03:00 committed by Qt Cherry-pick Bot
parent f0f9cc602f
commit 28b9a653ea
2 changed files with 60 additions and 1 deletions

View File

@ -1213,7 +1213,13 @@ void QTextHtmlParserNode::applyCssDeclarations(const QList<QCss::Declaration> &d
identifier = static_cast<QCss::KnownValue>(decl.d->values.constFirst().variant.toInt());
switch (decl.d->propertyId) {
case QCss::BorderColor: borderBrush = QBrush(decl.colorValue()); break;
case QCss::BorderColor: {
QBrush bordersBrush[4];
decl.brushValues(bordersBrush);
if (bordersBrush[0].color().isValid())
borderBrush = bordersBrush[0];
break;
}
case QCss::BorderStyles:
if (decl.styleValue() != QCss::BorderStyle_Unknown && decl.styleValue() != QCss::BorderStyle_Native)
borderStyle = static_cast<QTextFrameFormat::BorderStyle>(decl.styleValue() - 1);

View File

@ -60,6 +60,8 @@ private slots:
void strokeLineCapValues();
void strokeLineJoinValues_data();
void strokeLineJoinValues();
void borderColor_data();
void borderColor();
};
void tst_QCssParser::scanner_data()
@ -1814,6 +1816,57 @@ void tst_QCssParser::strokeLineJoinValues()
QCOMPARE(rule.declarations.at(0).d->values.first().toString(), value);
}
void tst_QCssParser::borderColor_data()
{
QTest::addColumn<QString>("css");
QTest::addColumn<QColor>("expectedTopColor");
QTest::addColumn<QColor>("expectedRightColor");
QTest::addColumn<QColor>("expectedBottomColor");
QTest::addColumn<QColor>("expectedLeftColor");
QTest::newRow("four values") << "border-color: red green blue white" << QColor("red") << QColor("green") << QColor("blue") << QColor("white");
QTest::newRow("three values") << "border-color: red green blue" << QColor("red") << QColor("green") << QColor("blue") << QColor("green");
QTest::newRow("two values") << "border-color: red green" << QColor("red") << QColor("green") << QColor("red") << QColor("green");
QTest::newRow("one value") << "border-color: red" << QColor("red") << QColor("red") << QColor("red") << QColor("red");
}
void tst_QCssParser::borderColor()
{
QFETCH(QString, css);
QFETCH(QColor, expectedTopColor);
QFETCH(QColor, expectedRightColor);
QFETCH(QColor, expectedBottomColor);
QFETCH(QColor, expectedLeftColor);
css.prepend("dummy {");
css.append(QLatin1Char('}'));
QCss::Parser parser(css);
QCss::StyleSheet sheet;
QVERIFY(parser.parse(&sheet));
QCOMPARE(sheet.styleRules.size() + sheet.nameIndex.size(), 1);
QCss::StyleRule rule = (!sheet.styleRules.isEmpty()) ?
sheet.styleRules.at(0) : *sheet.nameIndex.begin();
const QList<QCss::Declaration> decls = rule.declarations;
QVERIFY(decls.size() == 1);
QVERIFY(decls[0].d->propertyId == QCss::BorderColor);
QBrush colors[4];
decls[0].brushValues(colors);
QCOMPARE(colors[QCss::TopEdge].color(), expectedTopColor);
QCOMPARE(colors[QCss::RightEdge].color(), expectedRightColor);
QCOMPARE(colors[QCss::BottomEdge].color(), expectedBottomColor);
QCOMPARE(colors[QCss::LeftEdge].color(), expectedLeftColor);
//QTBUG-126381 : a second evaluation should give the same results
QCOMPARE(colors[QCss::TopEdge].color(), expectedTopColor);
QCOMPARE(colors[QCss::RightEdge].color(), expectedRightColor);
QCOMPARE(colors[QCss::BottomEdge].color(), expectedBottomColor);
QCOMPARE(colors[QCss::LeftEdge].color(), expectedLeftColor);
}
QTEST_MAIN(tst_QCssParser)
#include "tst_qcssparser.moc"