diff options
| author | Hatem ElKharashy <[email protected]> | 2024-06-18 17:58:03 +0300 | 
|---|---|---|
| committer | Hatem ElKharashy <[email protected]> | 2024-06-20 20:36:54 +0000 | 
| commit | a37ca7c85933979351d99f1bb22191763a78de46 (patch) | |
| tree | bff8b4df200497c713268553b567401403f8147e | |
| parent | 83ff34d1c626759224a95f39bca8337a8390ed52 (diff) | |
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.8 6.7 6.5 6.2
Change-Id: Ic6f3d722ffe0d72dcb5faa9916a23c804211ce49
Reviewed-by: Santhosh Kumar <[email protected]>
| -rw-r--r-- | src/gui/text/qtexthtmlparser.cpp | 8 | ||||
| -rw-r--r-- | tests/auto/gui/text/qcssparser/tst_qcssparser.cpp | 53 | 
2 files changed, 60 insertions, 1 deletions
diff --git a/src/gui/text/qtexthtmlparser.cpp b/src/gui/text/qtexthtmlparser.cpp index 54c291b82ea..95f882be22b 100644 --- a/src/gui/text/qtexthtmlparser.cpp +++ b/src/gui/text/qtexthtmlparser.cpp @@ -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); diff --git a/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp b/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp index 203fe003a08..2d577198840 100644 --- a/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp +++ b/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp @@ -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"  | 
