Title: [291244] trunk
Revision
291244
Author
obru...@igalia.com
Date
2022-03-14 12:18:11 -0700 (Mon, 14 Mar 2022)

Log Message

[css] Implement 'text-decoration' as a shorthand.
https://bugs.webkit.org/show_bug.cgi?id=237175

Reviewed by Darin Adler.

Source/WebCore:

The 'text-decoration' property was considered to be a longhand, sharing
a computed value with 'text-decoration-line'.

This patch switches 'text-decoration' to be shorthand instead.
According to the CSS Text Decoration spec, the longhands should be
'text-decoration-line', 'text-decoration-thickness',
'text-decoration-style' and 'text-decoration-color'.
I tried that in https://commits.webkit.org/r290756, but it got reverted
because of a performance regression. So as a first step, here I'm making
'text-decoration-line' be the only longhand.

There is a bunch of editing code that was getting/setting/removing
'text-decoration' as a longhand, so I'm switching that to instead
use 'text-decoration-line'.

Tests: fast/css/getComputedStyle/computed-style.html
       fast/css/getComputedStyle/computed-style-without-renderer.html
       fast/css/getComputedStyle/getComputedStyle-text-decoration.html
       fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-shorthand.html
       imported/w3c/web-platform-tests/css/css-cascade/all-prop-initial-xml.html
       imported/w3c/web-platform-tests/css/css-variables/variable-presentation-attribute.html
       imported/w3c/web-platform-tests/css/cssom/getComputedStyle-detached-subtree.html
       svg/css/getComputedStyle-basic.xhtml

* css/CSSProperties.json:
* css/StyleProperties.cpp:
(WebCore::StyleProperties::getPropertyValue const):
(WebCore::StyleProperties::asText const):
* css/parser/CSSPropertyParser.cpp:
(WebCore::CSSPropertyParser::parseSingleValue):
(WebCore::CSSPropertyParser::parseShorthand):
* editing/EditingStyle.cpp:
(WebCore::HTMLTextDecorationEquivalent::HTMLTextDecorationEquivalent):
(WebCore::EditingStyle::init):
(WebCore::EditingStyle::styleWithResolvedTextDecorations const):
(WebCore::EditingStyle::collapseTextDecorationProperties):
(WebCore::textDecorationValueList):
(WebCore::EditingStyle::conflictsWithInlineStyleOfElement const):
(WebCore::EditingStyle::styleIsPresentInComputedStyleOfNode const):
(WebCore::EditingStyle::mergeStyle):
(WebCore::reconcileTextDecorationProperties):
(WebCore::StyleChange::StyleChange):
(WebCore::StyleChange::extractTextStyles):
(WebCore::extractPropertiesNotIn):
* editing/cocoa/HTMLConverter.mm:
(HTMLConverterCaches::propertyValueForNode):
(HTMLConverter::computedAttributesForElement):
* editing/ios/EditorIOS.mm:
(WebCore::Editor::removeUnchangeableStyles):
* editing/markup.cpp:
(WebCore::serializePreservingVisualAppearanceInternal):
* style/PropertyAllowlist.cpp:
(WebCore::Style::isValidCueStyleProperty):

LayoutTests:

Update tests to take into account that 'text-decoration' is a shorthand.

* fast/css/getComputedStyle/computed-style-expected.txt:
* fast/css/getComputedStyle/computed-style-without-renderer-expected.txt:
* fast/css/getComputedStyle/getComputedStyle-text-decoration-expected.txt:
* fast/css/getComputedStyle/getComputedStyle-text-decoration.html:
* fast/css/getComputedStyle/resources/property-names.js:
* fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-shorthand-expected.txt:
* fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-shorthand.html:
* svg/css/getComputedStyle-basic-expected.txt:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (291243 => 291244)


--- trunk/LayoutTests/ChangeLog	2022-03-14 19:11:33 UTC (rev 291243)
+++ trunk/LayoutTests/ChangeLog	2022-03-14 19:18:11 UTC (rev 291244)
@@ -1,3 +1,21 @@
+2022-03-14  Oriol Brufau  <obru...@igalia.com>
+
+        [css] Implement 'text-decoration' as a shorthand.
+        https://bugs.webkit.org/show_bug.cgi?id=237175
+
+        Reviewed by Darin Adler.
+
+        Update tests to take into account that 'text-decoration' is a shorthand.
+
+        * fast/css/getComputedStyle/computed-style-expected.txt:
+        * fast/css/getComputedStyle/computed-style-without-renderer-expected.txt:
+        * fast/css/getComputedStyle/getComputedStyle-text-decoration-expected.txt:
+        * fast/css/getComputedStyle/getComputedStyle-text-decoration.html:
+        * fast/css/getComputedStyle/resources/property-names.js:
+        * fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-shorthand-expected.txt:
+        * fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-shorthand.html:
+        * svg/css/getComputedStyle-basic-expected.txt:
+
 2022-03-14  Antoine Quint  <grao...@webkit.org>
 
         [model] model-element/model-element-camera.html fails due to `promise_rejects` being undefined

Modified: trunk/LayoutTests/fast/css/getComputedStyle/computed-style-expected.txt (291243 => 291244)


--- trunk/LayoutTests/fast/css/getComputedStyle/computed-style-expected.txt	2022-03-14 19:11:33 UTC (rev 291243)
+++ trunk/LayoutTests/fast/css/getComputedStyle/computed-style-expected.txt	2022-03-14 19:18:11 UTC (rev 291244)
@@ -173,7 +173,10 @@
 text-align: start;
 text-anchor: start;
 text-combine-upright: none;
-text-decoration: none;
+text-decoration-color: rgb(0, 0, 0);
+text-decoration-line: none;
+text-decoration-style: solid;
+text-decoration-thickness: auto;
 text-emphasis-color: rgb(0, 0, 0);
 text-emphasis-position: over right;
 text-emphasis-style: none;

Modified: trunk/LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt (291243 => 291244)


--- trunk/LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt	2022-03-14 19:11:33 UTC (rev 291243)
+++ trunk/LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt	2022-03-14 19:18:11 UTC (rev 291244)
@@ -172,7 +172,10 @@
 text-align: start
 text-anchor: start
 text-combine-upright: none
-text-decoration: none
+text-decoration-color: rgb(0, 0, 0)
+text-decoration-line: none
+text-decoration-style: solid
+text-decoration-thickness: auto
 text-emphasis-color: rgb(0, 0, 0)
 text-emphasis-position: over right
 text-emphasis-style: none

Modified: trunk/LayoutTests/fast/css/getComputedStyle/getComputedStyle-text-decoration-expected.txt (291243 => 291244)


--- trunk/LayoutTests/fast/css/getComputedStyle/getComputedStyle-text-decoration-expected.txt	2022-03-14 19:11:33 UTC (rev 291243)
+++ trunk/LayoutTests/fast/css/getComputedStyle/getComputedStyle-text-decoration-expected.txt	2022-03-14 19:18:11 UTC (rev 291244)
@@ -4,94 +4,205 @@
 
 
 Initial value:
+PASS e.style.textDecoration is ''
+PASS e.style.getPropertyValue('text-decoration') is ''
 PASS e.style.getPropertyCSSValue('text-decoration') is null
+PASS e.style.textDecorationLine is ''
+PASS e.style.getPropertyValue('text-decoration-line') is ''
+PASS e.style.getPropertyCSSValue('text-decoration-line') is null
 PASS computedStyle.textDecoration is 'none'
+PASS computedStyle.getPropertyValue('text-decoration') is 'none'
 PASS computedStyle.getPropertyCSSValue('text-decoration').toString() is '[object CSSPrimitiveValue]'
 PASS computedStyle.getPropertyCSSValue('text-decoration').cssText is 'none'
+PASS computedStyle.textDecorationLine is 'none'
+PASS computedStyle.getPropertyValue('text-decoration-line') is 'none'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').toString() is '[object CSSPrimitiveValue]'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').cssText is 'none'
 
 Initial value (explicit):
 PASS e.style.textDecoration is 'initial'
-PASS e.style.getPropertyCSSValue('text-decoration').toString() is '[object CSSValue]'
-PASS e.style.getPropertyCSSValue('text-decoration').cssText is 'initial'
+PASS e.style.getPropertyValue('text-decoration') is 'initial'
+PASS e.style.getPropertyCSSValue('text-decoration') is null
+PASS e.style.textDecorationLine is 'initial'
+PASS e.style.getPropertyValue('text-decoration-line') is 'initial'
+PASS e.style.getPropertyCSSValue('text-decoration-line').toString() is '[object CSSValue]'
+PASS e.style.getPropertyCSSValue('text-decoration-line').cssText is 'initial'
 PASS computedStyle.textDecoration is 'none'
+PASS computedStyle.getPropertyValue('text-decoration') is 'none'
 PASS computedStyle.getPropertyCSSValue('text-decoration').toString() is '[object CSSPrimitiveValue]'
 PASS computedStyle.getPropertyCSSValue('text-decoration').cssText is 'none'
+PASS computedStyle.textDecorationLine is 'none'
+PASS computedStyle.getPropertyValue('text-decoration-line') is 'none'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').toString() is '[object CSSPrimitiveValue]'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').cssText is 'none'
 
 Value 'none':
 PASS e.style.textDecoration is 'none'
-PASS e.style.getPropertyCSSValue('text-decoration').toString() is '[object CSSPrimitiveValue]'
-PASS e.style.getPropertyCSSValue('text-decoration').cssText is 'none'
+PASS e.style.getPropertyValue('text-decoration') is 'none'
+PASS e.style.getPropertyCSSValue('text-decoration') is null
+PASS e.style.textDecorationLine is 'none'
+PASS e.style.getPropertyValue('text-decoration-line') is 'none'
+PASS e.style.getPropertyCSSValue('text-decoration-line').toString() is '[object CSSPrimitiveValue]'
+PASS e.style.getPropertyCSSValue('text-decoration-line').cssText is 'none'
 PASS computedStyle.textDecoration is 'none'
+PASS computedStyle.getPropertyValue('text-decoration') is 'none'
 PASS computedStyle.getPropertyCSSValue('text-decoration').toString() is '[object CSSPrimitiveValue]'
 PASS computedStyle.getPropertyCSSValue('text-decoration').cssText is 'none'
+PASS computedStyle.textDecorationLine is 'none'
+PASS computedStyle.getPropertyValue('text-decoration-line') is 'none'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').toString() is '[object CSSPrimitiveValue]'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').cssText is 'none'
 
 Value 'underline':
 PASS e.style.textDecoration is 'underline'
-PASS e.style.getPropertyCSSValue('text-decoration').toString() is '[object CSSValueList]'
-PASS e.style.getPropertyCSSValue('text-decoration').cssText is 'underline'
+PASS e.style.getPropertyValue('text-decoration') is 'underline'
+PASS e.style.getPropertyCSSValue('text-decoration') is null
+PASS e.style.textDecorationLine is 'underline'
+PASS e.style.getPropertyValue('text-decoration-line') is 'underline'
+PASS e.style.getPropertyCSSValue('text-decoration-line').toString() is '[object CSSValueList]'
+PASS e.style.getPropertyCSSValue('text-decoration-line').cssText is 'underline'
 PASS computedStyle.textDecoration is 'underline'
+PASS computedStyle.getPropertyValue('text-decoration') is 'underline'
 PASS computedStyle.getPropertyCSSValue('text-decoration').toString() is '[object CSSValueList]'
 PASS computedStyle.getPropertyCSSValue('text-decoration').cssText is 'underline'
+PASS computedStyle.textDecorationLine is 'underline'
+PASS computedStyle.getPropertyValue('text-decoration-line') is 'underline'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').toString() is '[object CSSValueList]'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').cssText is 'underline'
 
 Value 'overline':
 PASS e.style.textDecoration is 'overline'
-PASS e.style.getPropertyCSSValue('text-decoration').toString() is '[object CSSValueList]'
-PASS e.style.getPropertyCSSValue('text-decoration').cssText is 'overline'
+PASS e.style.getPropertyValue('text-decoration') is 'overline'
+PASS e.style.getPropertyCSSValue('text-decoration') is null
+PASS e.style.textDecorationLine is 'overline'
+PASS e.style.getPropertyValue('text-decoration-line') is 'overline'
+PASS e.style.getPropertyCSSValue('text-decoration-line').toString() is '[object CSSValueList]'
+PASS e.style.getPropertyCSSValue('text-decoration-line').cssText is 'overline'
 PASS computedStyle.textDecoration is 'overline'
+PASS computedStyle.getPropertyValue('text-decoration') is 'overline'
 PASS computedStyle.getPropertyCSSValue('text-decoration').toString() is '[object CSSValueList]'
 PASS computedStyle.getPropertyCSSValue('text-decoration').cssText is 'overline'
+PASS computedStyle.textDecorationLine is 'overline'
+PASS computedStyle.getPropertyValue('text-decoration-line') is 'overline'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').toString() is '[object CSSValueList]'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').cssText is 'overline'
 
 Value 'line-through':
 PASS e.style.textDecoration is 'line-through'
-PASS e.style.getPropertyCSSValue('text-decoration').toString() is '[object CSSValueList]'
-PASS e.style.getPropertyCSSValue('text-decoration').cssText is 'line-through'
+PASS e.style.getPropertyValue('text-decoration') is 'line-through'
+PASS e.style.getPropertyCSSValue('text-decoration') is null
+PASS e.style.textDecorationLine is 'line-through'
+PASS e.style.getPropertyValue('text-decoration-line') is 'line-through'
+PASS e.style.getPropertyCSSValue('text-decoration-line').toString() is '[object CSSValueList]'
+PASS e.style.getPropertyCSSValue('text-decoration-line').cssText is 'line-through'
 PASS computedStyle.textDecoration is 'line-through'
+PASS computedStyle.getPropertyValue('text-decoration') is 'line-through'
 PASS computedStyle.getPropertyCSSValue('text-decoration').toString() is '[object CSSValueList]'
 PASS computedStyle.getPropertyCSSValue('text-decoration').cssText is 'line-through'
+PASS computedStyle.textDecorationLine is 'line-through'
+PASS computedStyle.getPropertyValue('text-decoration-line') is 'line-through'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').toString() is '[object CSSValueList]'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').cssText is 'line-through'
 
 Value 'underline overline line-through':
 PASS e.style.textDecoration is 'underline overline line-through'
-PASS e.style.getPropertyCSSValue('text-decoration').toString() is '[object CSSValueList]'
-PASS e.style.getPropertyCSSValue('text-decoration').cssText is 'underline overline line-through'
+PASS e.style.getPropertyValue('text-decoration') is 'underline overline line-through'
+PASS e.style.getPropertyCSSValue('text-decoration') is null
+PASS e.style.textDecorationLine is 'underline overline line-through'
+PASS e.style.getPropertyValue('text-decoration-line') is 'underline overline line-through'
+PASS e.style.getPropertyCSSValue('text-decoration-line').toString() is '[object CSSValueList]'
+PASS e.style.getPropertyCSSValue('text-decoration-line').cssText is 'underline overline line-through'
 PASS computedStyle.textDecoration is 'underline overline line-through'
+PASS computedStyle.getPropertyValue('text-decoration') is 'underline overline line-through'
 PASS computedStyle.getPropertyCSSValue('text-decoration').toString() is '[object CSSValueList]'
 PASS computedStyle.getPropertyCSSValue('text-decoration').cssText is 'underline overline line-through'
+PASS computedStyle.textDecorationLine is 'underline overline line-through'
+PASS computedStyle.getPropertyValue('text-decoration-line') is 'underline overline line-through'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').toString() is '[object CSSValueList]'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').cssText is 'underline overline line-through'
 
 Value 'blink' (valid but ignored):
 PASS e.style.textDecoration is 'blink'
-PASS e.style.getPropertyCSSValue('text-decoration').toString() is '[object CSSValueList]'
-PASS e.style.getPropertyCSSValue('text-decoration').cssText is 'blink'
+PASS e.style.getPropertyValue('text-decoration') is 'blink'
+PASS e.style.getPropertyCSSValue('text-decoration') is null
+PASS e.style.textDecorationLine is 'blink'
+PASS e.style.getPropertyValue('text-decoration-line') is 'blink'
+PASS e.style.getPropertyCSSValue('text-decoration-line').toString() is '[object CSSValueList]'
+PASS e.style.getPropertyCSSValue('text-decoration-line').cssText is 'blink'
 PASS computedStyle.textDecoration is 'none'
+PASS computedStyle.getPropertyValue('text-decoration') is 'none'
 PASS computedStyle.getPropertyCSSValue('text-decoration').toString() is '[object CSSPrimitiveValue]'
 PASS computedStyle.getPropertyCSSValue('text-decoration').cssText is 'none'
+PASS computedStyle.textDecorationLine is 'none'
+PASS computedStyle.getPropertyValue('text-decoration-line') is 'none'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').toString() is '[object CSSPrimitiveValue]'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').cssText is 'none'
 
 Value '':
+PASS e.style.textDecoration is ''
+PASS e.style.getPropertyValue('text-decoration') is ''
 PASS e.style.getPropertyCSSValue('text-decoration') is null
+PASS e.style.textDecorationLine is ''
+PASS e.style.getPropertyValue('text-decoration-line') is ''
+PASS e.style.getPropertyCSSValue('text-decoration-line') is null
 PASS computedStyle.textDecoration is 'none'
+PASS computedStyle.getPropertyValue('text-decoration') is 'none'
 PASS computedStyle.getPropertyCSSValue('text-decoration').toString() is '[object CSSPrimitiveValue]'
 PASS computedStyle.getPropertyCSSValue('text-decoration').cssText is 'none'
+PASS computedStyle.textDecorationLine is 'none'
+PASS computedStyle.getPropertyValue('text-decoration-line') is 'none'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').toString() is '[object CSSPrimitiveValue]'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').cssText is 'none'
 
 Parent gets 'underline' value:
 PASS e.style.textDecoration is 'underline'
-PASS e.style.getPropertyCSSValue('text-decoration').toString() is '[object CSSValueList]'
-PASS e.style.getPropertyCSSValue('text-decoration').cssText is 'underline'
+PASS e.style.getPropertyValue('text-decoration') is 'underline'
+PASS e.style.getPropertyCSSValue('text-decoration') is null
+PASS e.style.textDecorationLine is 'underline'
+PASS e.style.getPropertyValue('text-decoration-line') is 'underline'
+PASS e.style.getPropertyCSSValue('text-decoration-line').toString() is '[object CSSValueList]'
+PASS e.style.getPropertyCSSValue('text-decoration-line').cssText is 'underline'
 PASS computedStyle.textDecoration is 'underline'
+PASS computedStyle.getPropertyValue('text-decoration') is 'underline'
 PASS computedStyle.getPropertyCSSValue('text-decoration').toString() is '[object CSSValueList]'
 PASS computedStyle.getPropertyCSSValue('text-decoration').cssText is 'underline'
+PASS computedStyle.textDecorationLine is 'underline'
+PASS computedStyle.getPropertyValue('text-decoration-line') is 'underline'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').toString() is '[object CSSValueList]'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').cssText is 'underline'
 
 Ancestor should explicitly inherit value from parent when 'inherit' value is used:
 PASS e.style.textDecoration is 'inherit'
-PASS e.style.getPropertyCSSValue('text-decoration').toString() is '[object CSSValue]'
-PASS e.style.getPropertyCSSValue('text-decoration').cssText is 'inherit'
+PASS e.style.getPropertyValue('text-decoration') is 'inherit'
+PASS e.style.getPropertyCSSValue('text-decoration') is null
+PASS e.style.textDecorationLine is 'inherit'
+PASS e.style.getPropertyValue('text-decoration-line') is 'inherit'
+PASS e.style.getPropertyCSSValue('text-decoration-line').toString() is '[object CSSValue]'
+PASS e.style.getPropertyCSSValue('text-decoration-line').cssText is 'inherit'
 PASS computedStyle.textDecoration is 'underline'
+PASS computedStyle.getPropertyValue('text-decoration') is 'underline'
 PASS computedStyle.getPropertyCSSValue('text-decoration').toString() is '[object CSSValueList]'
 PASS computedStyle.getPropertyCSSValue('text-decoration').cssText is 'underline'
+PASS computedStyle.textDecorationLine is 'underline'
+PASS computedStyle.getPropertyValue('text-decoration-line') is 'underline'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').toString() is '[object CSSValueList]'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').cssText is 'underline'
 
 Ancestor should not implicitly inherit value from parent (i.e. when value is void):
+PASS e.style.textDecoration is ''
+PASS e.style.getPropertyValue('text-decoration') is ''
 PASS e.style.getPropertyCSSValue('text-decoration') is null
+PASS e.style.textDecorationLine is ''
+PASS e.style.getPropertyValue('text-decoration-line') is ''
+PASS e.style.getPropertyCSSValue('text-decoration-line') is null
 PASS computedStyle.textDecoration is 'none'
+PASS computedStyle.getPropertyValue('text-decoration') is 'none'
 PASS computedStyle.getPropertyCSSValue('text-decoration').toString() is '[object CSSPrimitiveValue]'
 PASS computedStyle.getPropertyCSSValue('text-decoration').cssText is 'none'
+PASS computedStyle.textDecorationLine is 'none'
+PASS computedStyle.getPropertyValue('text-decoration-line') is 'none'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').toString() is '[object CSSPrimitiveValue]'
+PASS computedStyle.getPropertyCSSValue('text-decoration-line').cssText is 'none'
 
 PASS successfullyParsed is true
 

Modified: trunk/LayoutTests/fast/css/getComputedStyle/getComputedStyle-text-decoration.html (291243 => 291244)


--- trunk/LayoutTests/fast/css/getComputedStyle/getComputedStyle-text-decoration.html	2022-03-14 19:11:33 UTC (rev 291243)
+++ trunk/LayoutTests/fast/css/getComputedStyle/getComputedStyle-text-decoration.html	2022-03-14 19:18:11 UTC (rev 291244)
@@ -5,22 +5,41 @@
 </head>
 <body>
 <script>
-function testElementStyle(propertyJS, propertyCSS, type, value)
+function testElementStyle(type, value)
 {
     if (type != null) {
-        shouldBe("e.style." + propertyJS, "'" + value + "'");
-        shouldBe("e.style.getPropertyCSSValue('" + propertyCSS + "').toString()", "'" + type + "'");
-        shouldBe("e.style.getPropertyCSSValue('" + propertyCSS + "').cssText", "'" + value + "'");
-    } else
-        shouldBeNull("e.style.getPropertyCSSValue('" + propertyCSS + "')");
+        shouldBe("e.style.textDecoration", "'" + value + "'");
+        shouldBe("e.style.getPropertyValue('text-decoration')", "'" + value + "'");
+        shouldBeNull("e.style.getPropertyCSSValue('text-decoration')");
+
+        shouldBe("e.style.textDecorationLine", "'" + value + "'");
+        shouldBe("e.style.getPropertyValue('text-decoration-line')", "'" + value + "'");
+        shouldBe("e.style.getPropertyCSSValue('text-decoration-line').toString()", "'" + type + "'");
+        shouldBe("e.style.getPropertyCSSValue('text-decoration-line').cssText", "'" + value + "'");
+    } else {
+        shouldBe("e.style.textDecoration", "''");
+        shouldBe("e.style.getPropertyValue('text-decoration')", "''");
+        shouldBeNull("e.style.getPropertyCSSValue('text-decoration')");
+
+        shouldBe("e.style.textDecorationLine", "''");
+        shouldBe("e.style.getPropertyValue('text-decoration-line')", "''");
+        shouldBeNull("e.style.getPropertyCSSValue('text-decoration-line')");
+    }
 }
 
-function testComputedStyle(propertyJS, propertyCSS, type, value)
+function testComputedStyle(type, value)
 {
     computedStyle = window.getComputedStyle(e, null);
-    shouldBe("computedStyle." + propertyJS, "'" + value + "'");
-    shouldBe("computedStyle.getPropertyCSSValue('" + propertyCSS + "').toString()", "'" + type + "'");
-    shouldBe("computedStyle.getPropertyCSSValue('" + propertyCSS + "').cssText", "'" + value + "'");
+
+    shouldBe("computedStyle.textDecoration", "'" + value + "'");
+    shouldBe("computedStyle.getPropertyValue('text-decoration')", "'" + value + "'");
+    shouldBe("computedStyle.getPropertyCSSValue('text-decoration').toString()", "'" + type + "'");
+    shouldBe("computedStyle.getPropertyCSSValue('text-decoration').cssText", "'" + value + "'");
+
+    shouldBe("computedStyle.textDecorationLine", "'" + value + "'");
+    shouldBe("computedStyle.getPropertyValue('text-decoration-line')", "'" + value + "'");
+    shouldBe("computedStyle.getPropertyCSSValue('text-decoration-line').toString()", "'" + type + "'");
+    shouldBe("computedStyle.getPropertyCSSValue('text-decoration-line').cssText", "'" + value + "'");
 }
 
 description("Test to make sure text-decoration property returns values properly.")
@@ -32,75 +51,75 @@
 testContainer.innerHTML = '<div id="test">hello world</div>';
 debug("Initial value:");
 e = document.getElementById('test');
-testElementStyle("textDecoration", "text-decoration", null, '');
-testComputedStyle("textDecoration", "text-decoration", "[object CSSPrimitiveValue]", "none");
+testElementStyle(null, '');
+testComputedStyle("[object CSSPrimitiveValue]", "none");
 debug('');
 
 debug("Initial value (explicit):");
 e.style.textDecoration = 'initial';
-testElementStyle("textDecoration", "text-decoration", "[object CSSValue]", "initial");
-testComputedStyle("textDecoration", "text-decoration", "[object CSSPrimitiveValue]", "none");
+testElementStyle("[object CSSValue]", "initial");
+testComputedStyle("[object CSSPrimitiveValue]", "none");
 debug('');
 
 debug("Value 'none':");
 e.style.textDecoration = 'none';
-testElementStyle("textDecoration", "text-decoration", "[object CSSPrimitiveValue]", "none");
-testComputedStyle("textDecoration", "text-decoration", "[object CSSPrimitiveValue]", "none");
+testElementStyle("[object CSSPrimitiveValue]", "none");
+testComputedStyle("[object CSSPrimitiveValue]", "none");
 debug('');
 
 debug("Value 'underline':");
 e.style.textDecoration = 'underline';
-testElementStyle("textDecoration", "text-decoration", "[object CSSValueList]", "underline");
-testComputedStyle("textDecoration", "text-decoration", "[object CSSValueList]", "underline");
+testElementStyle("[object CSSValueList]", "underline");
+testComputedStyle("[object CSSValueList]", "underline");
 debug('');
 
 debug("Value 'overline':");
 e.style.textDecoration = 'overline';
-testElementStyle("textDecoration", "text-decoration", "[object CSSValueList]", "overline");
-testComputedStyle("textDecoration", "text-decoration", "[object CSSValueList]", "overline");
+testElementStyle("[object CSSValueList]", "overline");
+testComputedStyle("[object CSSValueList]", "overline");
 debug('');
 
 debug("Value 'line-through':");
 e.style.textDecoration = 'line-through';
-testElementStyle("textDecoration", "text-decoration", "[object CSSValueList]", "line-through");
-testComputedStyle("textDecoration", "text-decoration", "[object CSSValueList]", "line-through");
+testElementStyle("[object CSSValueList]", "line-through");
+testComputedStyle("[object CSSValueList]", "line-through");
 debug('');
 
 debug("Value 'underline overline line-through':");
 e.style.textDecoration = 'underline overline line-through';
-testElementStyle("textDecoration", "text-decoration", "[object CSSValueList]", "underline overline line-through");
-testComputedStyle("textDecoration", "text-decoration", "[object CSSValueList]", "underline overline line-through");
+testElementStyle("[object CSSValueList]", "underline overline line-through");
+testComputedStyle("[object CSSValueList]", "underline overline line-through");
 debug('');
 
 debug("Value 'blink' (valid but ignored):");
 e.style.textDecoration = 'blink';
-testElementStyle("textDecoration", "text-decoration", "[object CSSValueList]", "blink");
-testComputedStyle("textDecoration", "text-decoration", "[object CSSPrimitiveValue]", "none");
+testElementStyle("[object CSSValueList]", "blink");
+testComputedStyle("[object CSSPrimitiveValue]", "none");
 debug('');
 
 debug("Value '':");
 e.style.textDecoration = '';
-testElementStyle("textDecoration", "text-decoration", null, '');
-testComputedStyle("textDecoration", "text-decoration", "[object CSSPrimitiveValue]", "none");
+testElementStyle(null, '');
+testComputedStyle("[object CSSPrimitiveValue]", "none");
 debug('');
 
 testContainer.innerHTML = '<div id="test-parent" style="text-decoration: underline;">hello <span id="test-ancestor" style="text-decoration: inherit;">world</span></div>';
 debug("Parent gets 'underline' value:");
 e = document.getElementById('test-parent');
-testElementStyle("textDecoration", "text-decoration", "[object CSSValueList]", "underline");
-testComputedStyle("textDecoration", "text-decoration", "[object CSSValueList]", "underline");
+testElementStyle("[object CSSValueList]", "underline");
+testComputedStyle("[object CSSValueList]", "underline");
 debug('');
 
 debug("Ancestor should explicitly inherit value from parent when 'inherit' value is used:");
 e = document.getElementById('test-ancestor');
-testElementStyle("textDecoration", "text-decoration", "[object CSSValue]", "inherit");
-testComputedStyle("textDecoration", "text-decoration", "[object CSSValueList]", "underline");
+testElementStyle("[object CSSValue]", "inherit");
+testComputedStyle("[object CSSValueList]", "underline");
 debug('');
 
 debug("Ancestor should not implicitly inherit value from parent (i.e. when value is void):");
 e.style.textDecoration = '';
-testElementStyle("textDecoration", "text-decoration", null, '');
-testComputedStyle("textDecoration", "text-decoration", "[object CSSPrimitiveValue]", "none");
+testElementStyle(null, '');
+testComputedStyle("[object CSSPrimitiveValue]", "none");
 debug('');
 
 document.body.removeChild(testContainer);

Modified: trunk/LayoutTests/fast/css/getComputedStyle/resources/property-names.js (291243 => 291244)


--- trunk/LayoutTests/fast/css/getComputedStyle/resources/property-names.js	2022-03-14 19:11:33 UTC (rev 291243)
+++ trunk/LayoutTests/fast/css/getComputedStyle/resources/property-names.js	2022-03-14 19:18:11 UTC (rev 291244)
@@ -257,7 +257,10 @@
     "table-layout": true,
     "text-align": true,
     "text-anchor": true,
-    "text-decoration": true,
+    "text-decoration-color": true,
+    "text-decoration-line": true,
+    "text-decoration-style": true,
+    "text-decoration-thickness": true,
     "text-indent": true,
     "text-overflow": true,
     "text-rendering": true,

Modified: trunk/LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-shorthand-expected.txt (291243 => 291244)


--- trunk/LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-shorthand-expected.txt	2022-03-14 19:11:33 UTC (rev 291243)
+++ trunk/LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-shorthand-expected.txt	2022-03-14 19:18:11 UTC (rev 291244)
@@ -5,29 +5,81 @@
 
 Initial values:
 PASS e.style.getPropertyCSSValue('-webkit-text-decoration') is null
-PASS computedStyle.getPropertyCSSValue('-webkit-text-decoration').cssText is 'none solid rgb(0, 0, 0)'
-PASS checkComputedStyleValue() is true
+PASS computedStyle.getPropertyValue('-webkit-text-decoration') is 'none solid rgb(0, 0, 0)'
+PASS checkComputedStyleValue('webkitTextDecoration', '-webkit-text-decoration') is true
 
 CSS2.1 backwards compatibility ("-webkit-text-decoration: underline overline line-through blink;"):
-PASS e.style.getPropertyCSSValue('-webkit-text-decoration-line').cssText is 'underline overline line-through blink'
-PASS computedStyle.getPropertyCSSValue('-webkit-text-decoration-line').cssText is 'underline overline line-through'
-PASS computedStyle.getPropertyCSSValue('-webkit-text-decoration').cssText is 'underline overline line-through solid rgb(0, 0, 0)'
-PASS checkComputedStyleValue() is true
+PASS e.style.getPropertyValue('-webkit-text-decoration-line') is 'underline overline line-through blink'
+PASS computedStyle.getPropertyValue('-webkit-text-decoration-line') is 'underline overline line-through'
+PASS computedStyle.getPropertyValue('-webkit-text-decoration') is 'underline overline line-through solid rgb(0, 0, 0)'
+PASS checkComputedStyleValue('webkitTextDecoration', '-webkit-text-decoration') is true
 
 CSS3 Shorthand ("-webkit-text-decoration: underline overline line-through blink dashed red;"):
-PASS computedStyle.getPropertyCSSValue('-webkit-text-decoration').cssText is 'underline overline line-through dashed rgb(255, 0, 0)'
-PASS computedStyle.getPropertyCSSValue('-webkit-text-decoration-line').cssText is 'underline overline line-through'
-PASS computedStyle.getPropertyCSSValue('-webkit-text-decoration-style').cssText is 'dashed'
-PASS computedStyle.getPropertyCSSValue('-webkit-text-decoration-color').cssText is 'rgb(255, 0, 0)'
-PASS checkComputedStyleValue() is true
+PASS computedStyle.getPropertyValue('-webkit-text-decoration') is 'underline overline line-through dashed rgb(255, 0, 0)'
+PASS computedStyle.getPropertyValue('-webkit-text-decoration-line') is 'underline overline line-through'
+PASS computedStyle.getPropertyValue('-webkit-text-decoration-style') is 'dashed'
+PASS computedStyle.getPropertyValue('-webkit-text-decoration-color') is 'rgb(255, 0, 0)'
+PASS checkComputedStyleValue('webkitTextDecoration', '-webkit-text-decoration') is true
 
 Omitting text decoration line resets to its initial value "none" ("-webkit-text-decoration: navy dotted;"):
-PASS computedStyle.getPropertyCSSValue('-webkit-text-decoration').cssText is 'none dotted rgb(0, 0, 128)'
-PASS computedStyle.getPropertyCSSValue('-webkit-text-decoration-line').cssText is 'none'
-PASS computedStyle.getPropertyCSSValue('-webkit-text-decoration-style').cssText is 'dotted'
-PASS computedStyle.getPropertyCSSValue('-webkit-text-decoration-color').cssText is 'rgb(0, 0, 128)'
-PASS checkComputedStyleValue() is true
+PASS computedStyle.getPropertyValue('-webkit-text-decoration') is 'none dotted rgb(0, 0, 128)'
+PASS computedStyle.getPropertyValue('-webkit-text-decoration-line') is 'none'
+PASS computedStyle.getPropertyValue('-webkit-text-decoration-style') is 'dotted'
+PASS computedStyle.getPropertyValue('-webkit-text-decoration-color') is 'rgb(0, 0, 128)'
+PASS checkComputedStyleValue('webkitTextDecoration', '-webkit-text-decoration') is true
 
+CSS2.1 backwards compatibility of non-prefixed shorthand ("text-decoration: underline overline line-through blink;"):
+PASS e.style.getPropertyValue('text-decoration') is 'underline overline line-through blink'
+PASS e.style.getPropertyValue('text-decoration-line') is 'underline overline line-through blink'
+PASS e.style.getPropertyValue('text-decoration-thickness') is ''
+PASS e.style.getPropertyValue('text-decoration-style') is ''
+PASS e.style.getPropertyValue('text-decoration-color') is ''
+PASS computedStyle.getPropertyValue('text-decoration') is 'underline overline line-through'
+PASS computedStyle.getPropertyValue('text-decoration-line') is 'underline overline line-through'
+PASS computedStyle.getPropertyValue('text-decoration-thickness') is 'auto'
+PASS computedStyle.getPropertyValue('text-decoration-style') is 'solid'
+PASS computedStyle.getPropertyValue('text-decoration-color') is 'rgb(0, 0, 0)'
+PASS checkComputedStyleValue('textDecoration', 'text-decoration') is true
+
+Setting CSS3 longhands to initial values ("text-decoration-line: none; text-decoration-thickness: auto; text-decoration-style: solid; text-decoration-color: currentcolor;"):
+PASS e.style.getPropertyValue('text-decoration') is 'none'
+PASS e.style.getPropertyValue('text-decoration-line') is 'none'
+PASS e.style.getPropertyValue('text-decoration-thickness') is 'auto'
+PASS e.style.getPropertyValue('text-decoration-style') is 'solid'
+PASS e.style.getPropertyValue('text-decoration-color') is 'currentcolor'
+PASS computedStyle.getPropertyValue('text-decoration') is 'none'
+PASS computedStyle.getPropertyValue('text-decoration-line') is 'none'
+PASS computedStyle.getPropertyValue('text-decoration-thickness') is 'auto'
+PASS computedStyle.getPropertyValue('text-decoration-style') is 'solid'
+PASS computedStyle.getPropertyValue('text-decoration-color') is 'rgb(0, 0, 0)'
+PASS checkComputedStyleValue('textDecoration', 'text-decoration') is true
+
+Setting CSS3 longhands to values backwards compatibile with CSS2.1 ("text-decoration-line: underline overline line-through blink; text-decoration-thickness: auto; text-decoration-style: solid; text-decoration-color: currentcolor;"):
+PASS e.style.getPropertyValue('text-decoration') is 'underline overline line-through blink'
+PASS e.style.getPropertyValue('text-decoration-line') is 'underline overline line-through blink'
+PASS e.style.getPropertyValue('text-decoration-thickness') is 'auto'
+PASS e.style.getPropertyValue('text-decoration-style') is 'solid'
+PASS e.style.getPropertyValue('text-decoration-color') is 'currentcolor'
+PASS computedStyle.getPropertyValue('text-decoration') is 'underline overline line-through'
+PASS computedStyle.getPropertyValue('text-decoration-line') is 'underline overline line-through'
+PASS computedStyle.getPropertyValue('text-decoration-thickness') is 'auto'
+PASS computedStyle.getPropertyValue('text-decoration-style') is 'solid'
+PASS computedStyle.getPropertyValue('text-decoration-color') is 'rgb(0, 0, 0)'
+PASS checkComputedStyleValue('textDecoration', 'text-decoration') is true
+
+Setting CSS3 longhands to values not backwards compatibile with CSS2.1 ("text-decoration-line: underline overline line-through blink; text-decoration-thickness: 16px; text-decoration-style: dotted; text-decoration-color: blue;"):
+PASS e.style.getPropertyValue('text-decoration') is 'underline overline line-through blink'
+PASS e.style.getPropertyValue('text-decoration-line') is 'underline overline line-through blink'
+PASS e.style.getPropertyValue('text-decoration-thickness') is '16px'
+PASS e.style.getPropertyValue('text-decoration-style') is 'dotted'
+PASS e.style.getPropertyValue('text-decoration-color') is 'blue'
+PASS computedStyle.getPropertyValue('text-decoration') is 'underline overline line-through'
+PASS computedStyle.getPropertyValue('text-decoration-line') is 'underline overline line-through'
+PASS computedStyle.getPropertyValue('text-decoration-thickness') is '16px'
+PASS computedStyle.getPropertyValue('text-decoration-style') is 'dotted'
+PASS computedStyle.getPropertyValue('text-decoration-color') is 'rgb(0, 0, 255)'
+PASS checkComputedStyleValue('textDecoration', 'text-decoration') is true
+
 PASS successfullyParsed is true
 
 TEST COMPLETE

Modified: trunk/LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-shorthand.html (291243 => 291244)


--- trunk/LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-shorthand.html	2022-03-14 19:11:33 UTC (rev 291243)
+++ trunk/LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-shorthand.html	2022-03-14 19:18:11 UTC (rev 291244)
@@ -7,20 +7,20 @@
         <script>
             function testElementStyle(propertyJS, propertyCSS, value)
             {
-                shouldBe("e.style.getPropertyCSSValue('" + propertyCSS + "').cssText", "'" + value + "'");
+                shouldBe("e.style.getPropertyValue('" + propertyCSS + "')", "'" + value + "'");
             }
 
             function testComputedStyle(propertyJS, propertyCSS, value)
             {
                 computedStyle = window.getComputedStyle(e, null);
-                shouldBe("computedStyle.getPropertyCSSValue('" + propertyCSS + "').cssText", "'" + value + "'");
+                shouldBe("computedStyle.getPropertyValue('" + propertyCSS + "')", "'" + value + "'");
             }
 
-            function checkComputedStyleValue() {
-                var before = window.getComputedStyle(e, null).getPropertyValue('-webkit-text-decoration');
-                e.style.webkitTextDecoration = 'none';
-                e.style.webkitTextDecoration = before;
-                return (window.getComputedStyle(e, null).getPropertyValue('-webkit-text-decoration') == before);
+            function checkComputedStyleValue(propertyJS, propertyCSS) {
+                var before = window.getComputedStyle(e, null).getPropertyValue(propertyCSS);
+                e.style[propertyJS] = 'none';
+                e.style[propertyJS] = before;
+                return (window.getComputedStyle(e, null).getPropertyValue(propertyCSS) == before);
             }
 
             description("Test to make sure -webkit-text-decoration property is backwards compatible with CSS 2.1 and CSS 3 shorthand.")
@@ -36,7 +36,7 @@
             debug('Initial values:');
             shouldBeNull("e.style.getPropertyCSSValue('-webkit-text-decoration')");
             testComputedStyle("webkitTextDecoration", "-webkit-text-decoration", "none solid rgb(0, 0, 0)");
-            shouldBe("checkComputedStyleValue()", "true");
+            shouldBe("checkComputedStyleValue('webkitTextDecoration', '-webkit-text-decoration')", "true");
             debug('');
 
             debug('CSS2.1 backwards compatibility ("-webkit-text-decoration: underline overline line-through blink;"):');
@@ -44,7 +44,7 @@
             testElementStyle("webkitTextDecorationLine", "-webkit-text-decoration-line", "underline overline line-through blink");
             testComputedStyle("webkitTextDecorationLine", "-webkit-text-decoration-line", "underline overline line-through");
             testComputedStyle("webkitTextDecoration", "-webkit-text-decoration", "underline overline line-through solid rgb(0, 0, 0)");
-            shouldBe("checkComputedStyleValue()", "true");
+            shouldBe("checkComputedStyleValue('webkitTextDecoration', '-webkit-text-decoration')", "true");
             debug('');
 
             debug('CSS3 Shorthand ("-webkit-text-decoration: underline overline line-through blink dashed red;"):');
@@ -53,7 +53,7 @@
             testComputedStyle("webkitTextDecorationLine", "-webkit-text-decoration-line", "underline overline line-through");
             testComputedStyle("webkitTextDecorationStyle", "-webkit-text-decoration-style", "dashed");
             testComputedStyle("webkitTextDecorationColor", "-webkit-text-decoration-color", "rgb(255, 0, 0)");
-            shouldBe("checkComputedStyleValue()", "true");
+            shouldBe("checkComputedStyleValue('webkitTextDecoration', '-webkit-text-decoration')", "true");
             debug('');
 
             debug('Omitting text decoration line resets to its initial value "none" ("-webkit-text-decoration: navy dotted;"):');
@@ -62,9 +62,69 @@
             testComputedStyle("webkitTextDecorationLine", "-webkit-text-decoration-line", "none");
             testComputedStyle("webkitTextDecorationStyle", "-webkit-text-decoration-style", "dotted");
             testComputedStyle("webkitTextDecorationColor", "-webkit-text-decoration-color", "rgb(0, 0, 128)");
-            shouldBe("checkComputedStyleValue()", "true");
+            shouldBe("checkComputedStyleValue('webkitTextDecoration', '-webkit-text-decoration')", "true");
             debug('');
 
+            debug('CSS2.1 backwards compatibility of non-prefixed shorthand ("text-decoration: underline overline line-through blink;"):');
+            e.style.cssText = "text-decoration: underline overline line-through blink";
+            testElementStyle("textDecoration", "text-decoration", "underline overline line-through blink");
+            testElementStyle("textDecorationLine", "text-decoration-line", "underline overline line-through blink");
+            testElementStyle("textDecorationThickness", "text-decoration-thickness", "");
+            testElementStyle("textDecorationStyle", "text-decoration-style", "");
+            testElementStyle("textDecorationColor", "text-decoration-color", "");
+            testComputedStyle("textDecoration", "text-decoration", "underline overline line-through");
+            testComputedStyle("textDecorationLine", "text-decoration-line", "underline overline line-through");
+            testComputedStyle("textDecorationThickness", "text-decoration-thickness", "auto");
+            testComputedStyle("textDecorationStyle", "text-decoration-style", "solid");
+            testComputedStyle("textDecorationColor", "text-decoration-color", "rgb(0, 0, 0)");
+            shouldBe("checkComputedStyleValue('textDecoration', 'text-decoration')", "true");
+            debug('');
+
+            debug('Setting CSS3 longhands to initial values ("text-decoration-line: none; text-decoration-thickness: auto; text-decoration-style: solid; text-decoration-color: currentcolor;"):');
+            e.style.cssText = "text-decoration-line: none; text-decoration-thickness: auto; text-decoration-style: solid; text-decoration-color: currentcolor;";
+            testElementStyle("textDecoration", "text-decoration", "none");
+            testElementStyle("textDecorationLine", "text-decoration-line", "none");
+            testElementStyle("textDecorationThickness", "text-decoration-thickness", "auto");
+            testElementStyle("textDecorationStyle", "text-decoration-style", "solid");
+            testElementStyle("textDecorationColor", "text-decoration-color", "currentcolor");
+            testComputedStyle("textDecoration", "text-decoration", "none");
+            testComputedStyle("textDecorationLine", "text-decoration-line", "none");
+            testComputedStyle("textDecorationThickness", "text-decoration-thickness", "auto");
+            testComputedStyle("textDecorationStyle", "text-decoration-style", "solid");
+            testComputedStyle("textDecorationColor", "text-decoration-color", "rgb(0, 0, 0)");
+            shouldBe("checkComputedStyleValue('textDecoration', 'text-decoration')", "true");
+            debug('');
+
+            debug('Setting CSS3 longhands to values backwards compatibile with CSS2.1 ("text-decoration-line: underline overline line-through blink; text-decoration-thickness: auto; text-decoration-style: solid; text-decoration-color: currentcolor;"):');
+            e.style.cssText = "text-decoration-line: underline overline line-through blink; text-decoration-thickness: auto; text-decoration-style: solid; text-decoration-color: currentcolor;";
+            testElementStyle("textDecoration", "text-decoration", "underline overline line-through blink");
+            testElementStyle("textDecorationLine", "text-decoration-line", "underline overline line-through blink");
+            testElementStyle("textDecorationThickness", "text-decoration-thickness", "auto");
+            testElementStyle("textDecorationStyle", "text-decoration-style", "solid");
+            testElementStyle("textDecorationColor", "text-decoration-color", "currentcolor");
+            testComputedStyle("textDecoration", "text-decoration", "underline overline line-through");
+            testComputedStyle("textDecorationLine", "text-decoration-line", "underline overline line-through");
+            testComputedStyle("textDecorationThickness", "text-decoration-thickness", "auto");
+            testComputedStyle("textDecorationStyle", "text-decoration-style", "solid");
+            testComputedStyle("textDecorationColor", "text-decoration-color", "rgb(0, 0, 0)");
+            shouldBe("checkComputedStyleValue('textDecoration', 'text-decoration')", "true");
+            debug('');
+
+            debug('Setting CSS3 longhands to values not backwards compatibile with CSS2.1 ("text-decoration-line: underline overline line-through blink; text-decoration-thickness: 16px; text-decoration-style: dotted; text-decoration-color: blue;"):');
+            e.style.cssText = "text-decoration-line: underline overline line-through blink; text-decoration-thickness: 16px; text-decoration-style: dotted; text-decoration-color: blue;";
+            testElementStyle("textDecoration", "text-decoration", "underline overline line-through blink");
+            testElementStyle("textDecorationLine", "text-decoration-line", "underline overline line-through blink");
+            testElementStyle("textDecorationThickness", "text-decoration-thickness", "16px");
+            testElementStyle("textDecorationStyle", "text-decoration-style", "dotted");
+            testElementStyle("textDecorationColor", "text-decoration-color", "blue");
+            testComputedStyle("textDecoration", "text-decoration", "underline overline line-through");
+            testComputedStyle("textDecorationLine", "text-decoration-line", "underline overline line-through");
+            testComputedStyle("textDecorationThickness", "text-decoration-thickness", "16px");
+            testComputedStyle("textDecorationStyle", "text-decoration-style", "dotted");
+            testComputedStyle("textDecorationColor", "text-decoration-color", "rgb(0, 0, 255)");
+            shouldBe("checkComputedStyleValue('textDecoration', 'text-decoration')", "true");
+            debug('');
+
             document.body.removeChild(testContainer);
         </script>
         <script src=""

Modified: trunk/LayoutTests/svg/css/getComputedStyle-basic-expected.txt (291243 => 291244)


--- trunk/LayoutTests/svg/css/getComputedStyle-basic-expected.txt	2022-03-14 19:11:33 UTC (rev 291243)
+++ trunk/LayoutTests/svg/css/getComputedStyle-basic-expected.txt	2022-03-14 19:18:11 UTC (rev 291244)
@@ -344,8 +344,14 @@
 rect: style.getPropertyCSSValue(text-anchor) : [object CSSPrimitiveValue]
 rect: style.getPropertyValue(text-combine-upright) : none
 rect: style.getPropertyCSSValue(text-combine-upright) : [object CSSPrimitiveValue]
-rect: style.getPropertyValue(text-decoration) : none
-rect: style.getPropertyCSSValue(text-decoration) : [object CSSPrimitiveValue]
+rect: style.getPropertyValue(text-decoration-color) : rgb(0, 0, 0)
+rect: style.getPropertyCSSValue(text-decoration-color) : [object CSSPrimitiveValue]
+rect: style.getPropertyValue(text-decoration-line) : none
+rect: style.getPropertyCSSValue(text-decoration-line) : [object CSSPrimitiveValue]
+rect: style.getPropertyValue(text-decoration-style) : solid
+rect: style.getPropertyCSSValue(text-decoration-style) : [object CSSPrimitiveValue]
+rect: style.getPropertyValue(text-decoration-thickness) : auto
+rect: style.getPropertyCSSValue(text-decoration-thickness) : [object CSSPrimitiveValue]
 rect: style.getPropertyValue(text-emphasis-color) : rgb(0, 0, 0)
 rect: style.getPropertyCSSValue(text-emphasis-color) : [object CSSPrimitiveValue]
 rect: style.getPropertyValue(text-emphasis-position) : over right
@@ -854,8 +860,14 @@
 g: style.getPropertyCSSValue(text-anchor) : [object CSSPrimitiveValue]
 g: style.getPropertyValue(text-combine-upright) : none
 g: style.getPropertyCSSValue(text-combine-upright) : [object CSSPrimitiveValue]
-g: style.getPropertyValue(text-decoration) : none
-g: style.getPropertyCSSValue(text-decoration) : [object CSSPrimitiveValue]
+g: style.getPropertyValue(text-decoration-color) : rgb(0, 0, 0)
+g: style.getPropertyCSSValue(text-decoration-color) : [object CSSPrimitiveValue]
+g: style.getPropertyValue(text-decoration-line) : none
+g: style.getPropertyCSSValue(text-decoration-line) : [object CSSPrimitiveValue]
+g: style.getPropertyValue(text-decoration-style) : solid
+g: style.getPropertyCSSValue(text-decoration-style) : [object CSSPrimitiveValue]
+g: style.getPropertyValue(text-decoration-thickness) : auto
+g: style.getPropertyCSSValue(text-decoration-thickness) : [object CSSPrimitiveValue]
 g: style.getPropertyValue(text-emphasis-color) : rgb(0, 0, 0)
 g: style.getPropertyCSSValue(text-emphasis-color) : [object CSSPrimitiveValue]
 g: style.getPropertyValue(text-emphasis-position) : over right

Modified: trunk/Source/WebCore/ChangeLog (291243 => 291244)


--- trunk/Source/WebCore/ChangeLog	2022-03-14 19:11:33 UTC (rev 291243)
+++ trunk/Source/WebCore/ChangeLog	2022-03-14 19:18:11 UTC (rev 291244)
@@ -1,3 +1,64 @@
+2022-03-14  Oriol Brufau  <obru...@igalia.com>
+
+        [css] Implement 'text-decoration' as a shorthand.
+        https://bugs.webkit.org/show_bug.cgi?id=237175
+
+        Reviewed by Darin Adler.
+
+        The 'text-decoration' property was considered to be a longhand, sharing
+        a computed value with 'text-decoration-line'.
+
+        This patch switches 'text-decoration' to be shorthand instead.
+        According to the CSS Text Decoration spec, the longhands should be
+        'text-decoration-line', 'text-decoration-thickness',
+        'text-decoration-style' and 'text-decoration-color'.
+        I tried that in https://commits.webkit.org/r290756, but it got reverted
+        because of a performance regression. So as a first step, here I'm making
+        'text-decoration-line' be the only longhand.
+
+        There is a bunch of editing code that was getting/setting/removing
+        'text-decoration' as a longhand, so I'm switching that to instead
+        use 'text-decoration-line'.
+
+        Tests: fast/css/getComputedStyle/computed-style.html
+               fast/css/getComputedStyle/computed-style-without-renderer.html
+               fast/css/getComputedStyle/getComputedStyle-text-decoration.html
+               fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-shorthand.html
+               imported/w3c/web-platform-tests/css/css-cascade/all-prop-initial-xml.html
+               imported/w3c/web-platform-tests/css/css-variables/variable-presentation-attribute.html
+               imported/w3c/web-platform-tests/css/cssom/getComputedStyle-detached-subtree.html
+               svg/css/getComputedStyle-basic.xhtml
+
+        * css/CSSProperties.json:
+        * css/StyleProperties.cpp:
+        (WebCore::StyleProperties::getPropertyValue const):
+        (WebCore::StyleProperties::asText const):
+        * css/parser/CSSPropertyParser.cpp:
+        (WebCore::CSSPropertyParser::parseSingleValue):
+        (WebCore::CSSPropertyParser::parseShorthand):
+        * editing/EditingStyle.cpp:
+        (WebCore::HTMLTextDecorationEquivalent::HTMLTextDecorationEquivalent):
+        (WebCore::EditingStyle::init):
+        (WebCore::EditingStyle::styleWithResolvedTextDecorations const):
+        (WebCore::EditingStyle::collapseTextDecorationProperties):
+        (WebCore::textDecorationValueList):
+        (WebCore::EditingStyle::conflictsWithInlineStyleOfElement const):
+        (WebCore::EditingStyle::styleIsPresentInComputedStyleOfNode const):
+        (WebCore::EditingStyle::mergeStyle):
+        (WebCore::reconcileTextDecorationProperties):
+        (WebCore::StyleChange::StyleChange):
+        (WebCore::StyleChange::extractTextStyles):
+        (WebCore::extractPropertiesNotIn):
+        * editing/cocoa/HTMLConverter.mm:
+        (HTMLConverterCaches::propertyValueForNode):
+        (HTMLConverter::computedAttributesForElement):
+        * editing/ios/EditorIOS.mm:
+        (WebCore::Editor::removeUnchangeableStyles):
+        * editing/markup.cpp:
+        (WebCore::serializePreservingVisualAppearanceInternal):
+        * style/PropertyAllowlist.cpp:
+        (WebCore::Style::isValidCueStyleProperty):
+
 2022-03-14  Tim Nguyen  <n...@apple.com>
 
         REGRESSION(r289850): Bundle size has increased

Modified: trunk/Source/WebCore/css/CSSProperties.json (291243 => 291244)


--- trunk/Source/WebCore/css/CSSProperties.json	2022-03-14 19:11:33 UTC (rev 291243)
+++ trunk/Source/WebCore/css/CSSProperties.json	2022-03-14 19:18:11 UTC (rev 291244)
@@ -4615,17 +4615,10 @@
             }
         },
         "text-decoration": {
-            "values": [
-                "underline",
-                "overline",
-                "line-through",
-                {
-                    "value": "blink",
-                    "status": "not considering"
-                }
-            ],
             "codegen-properties": {
-                "converter": "TextDecoration"
+                "longhands": [
+                    "text-decoration-line"
+                ]
             },
             "specification": {
                 "category": "css-22",
@@ -6854,6 +6847,15 @@
                     "-webkit-text-decoration-line"
                 ]
             },
+            "values": [
+                "underline",
+                "overline",
+                "line-through",
+                {
+                    "value": "blink",
+                    "status": "not considering"
+                }
+            ],
             "specification": {
                 "category": "css-text-decor",
                 "url": "https://www.w3.org/TR/css-text-decor-3/#text-decoration-line"

Modified: trunk/Source/WebCore/css/StyleProperties.cpp (291243 => 291244)


--- trunk/Source/WebCore/css/StyleProperties.cpp	2022-03-14 19:11:33 UTC (rev 291243)
+++ trunk/Source/WebCore/css/StyleProperties.cpp	2022-03-14 19:18:11 UTC (rev 291244)
@@ -275,6 +275,12 @@
         return fontValue();
     case CSSPropertyFontVariant:
         return fontVariantValue();
+    case CSSPropertyTextDecoration:
+        if (auto line = getPropertyCSSValue(CSSPropertyTextDecorationLine))
+            return line->cssText();
+        return String();
+    case CSSPropertyWebkitTextDecoration:
+        return getShorthandValue(webkitTextDecorationShorthand());
     case CSSPropertyTextDecorationSkip:
         return textDecorationSkipValue();
     case CSSPropertyInset:
@@ -1433,6 +1439,9 @@
             case CSSPropertyScrollPaddingInlineEnd:
                 shorthandPropertyID = CSSPropertyScrollPaddingInline;
                 break;
+            case CSSPropertyTextDecorationLine:
+                shorthandPropertyID = CSSPropertyTextDecoration;
+                break;
             case CSSPropertyTransitionProperty:
             case CSSPropertyTransitionDuration:
             case CSSPropertyTransitionTimingFunction:

Modified: trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp (291243 => 291244)


--- trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp	2022-03-14 19:11:33 UTC (rev 291243)
+++ trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp	2022-03-14 19:18:11 UTC (rev 291244)
@@ -4473,7 +4473,6 @@
         if (!m_context.colorFilterEnabled)
             return nullptr;
         return consumeFilter(m_range, m_context, AllowedFilterFunctions::ColorFilters);
-    case CSSPropertyTextDecoration:
     case CSSPropertyWebkitTextDecorationsInEffect:
     case CSSPropertyTextDecorationLine:
         return consumeTextDecorationLine(m_range);
@@ -6285,7 +6284,13 @@
         return consumeAnimationShorthand(animationShorthandForParsing(), important);
     case CSSPropertyTransition:
         return consumeAnimationShorthand(transitionShorthandForParsing(), important);
-    case CSSPropertyTextDecoration:
+    case CSSPropertyTextDecoration: {
+        auto line = consumeTextDecorationLine(m_range);
+        if (!line || !m_range.atEnd())
+            return false;
+        addProperty(CSSPropertyTextDecorationLine, property, line.releaseNonNull(), important);
+        return true;
+    }
     case CSSPropertyWebkitTextDecoration:
         // FIXME-NEWPARSER: We need to unprefix -line/-style/-color ASAP and get rid
         // of -webkit-text-decoration completely.

Modified: trunk/Source/WebCore/editing/EditingStyle.cpp (291243 => 291244)


--- trunk/Source/WebCore/editing/EditingStyle.cpp	2022-03-14 19:11:33 UTC (rev 291243)
+++ trunk/Source/WebCore/editing/EditingStyle.cpp	2022-03-14 19:18:11 UTC (rev 291244)
@@ -94,7 +94,7 @@
 
     // Non-inheritable properties
     CSSPropertyBackgroundColor,
-    CSSPropertyTextDecoration,
+    CSSPropertyTextDecorationLine,
 };
 
 const unsigned numAllEditingProperties = WTF_ARRAY_LENGTH(editingProperties);
@@ -220,7 +220,7 @@
 class HTMLTextDecorationEquivalent : public HTMLElementEquivalent {
 public:
     HTMLTextDecorationEquivalent(CSSValueID primitiveValue, const QualifiedName& tagName)
-        : HTMLElementEquivalent(CSSPropertyTextDecoration, primitiveValue, tagName)
+        : HTMLElementEquivalent(CSSPropertyTextDecorationLine, primitiveValue, tagName)
         , m_isUnderline(primitiveValue == CSSValueUnderline)
     {
     }
@@ -235,7 +235,7 @@
 
         auto& mutableStyle = *style.m_mutableStyle;
         return mutableStyle.getPropertyCSSValue(CSSPropertyWebkitTextDecorationsInEffect)
-            || mutableStyle.getPropertyCSSValue(CSSPropertyTextDecoration);
+            || mutableStyle.getPropertyCSSValue(CSSPropertyTextDecorationLine);
     }
 
     bool valueIsPresentInStyle(Element& element, const EditingStyle& style) const override
@@ -247,7 +247,7 @@
             return change == TextDecorationChange::Add;
         RefPtr<CSSValue> styleValue = style.m_mutableStyle->getPropertyCSSValue(CSSPropertyWebkitTextDecorationsInEffect);
         if (!styleValue)
-            styleValue = style.m_mutableStyle->getPropertyCSSValue(CSSPropertyTextDecoration);
+            styleValue = style.m_mutableStyle->getPropertyCSSValue(CSSPropertyTextDecorationLine);
         return is<CSSValueList>(styleValue) && downcast<CSSValueList>(*styleValue).hasValue(m_primitiveValue.get());
     }
 
@@ -510,7 +510,7 @@
         if (RefPtr<CSSValue> value = backgroundColorInEffect(node))
             m_mutableStyle->setProperty(CSSPropertyBackgroundColor, value->cssText());
         if (RefPtr<CSSValue> value = computedStyleAtPosition.propertyValue(CSSPropertyWebkitTextDecorationsInEffect)) {
-            m_mutableStyle->setProperty(CSSPropertyTextDecoration, value->cssText());
+            m_mutableStyle->setProperty(CSSPropertyTextDecorationLine, value->cssText());
             m_mutableStyle->removeProperty(CSSPropertyWebkitTextDecorationsInEffect);
         }
     }
@@ -595,9 +595,9 @@
         valueList->append(CSSValuePool::singleton().createIdentifierValue(CSSValueLineThrough));
 
     if (valueList->length())
-        style->setProperty(CSSPropertyTextDecoration, valueList.ptr());
+        style->setProperty(CSSPropertyTextDecorationLine, valueList.ptr());
     else
-        style->setProperty(CSSPropertyTextDecoration, CSSValuePool::singleton().createIdentifierValue(CSSValueNone));
+        style->setProperty(CSSPropertyTextDecorationLine, CSSValuePool::singleton().createIdentifierValue(CSSValueNone));
 
     return style;
 }
@@ -779,15 +779,15 @@
         return;
 
     if (textDecorationsInEffect->isValueList())
-        m_mutableStyle->setProperty(CSSPropertyTextDecoration, textDecorationsInEffect->cssText(), m_mutableStyle->propertyIsImportant(CSSPropertyTextDecoration));
+        m_mutableStyle->setProperty(CSSPropertyTextDecorationLine, textDecorationsInEffect->cssText(), m_mutableStyle->propertyIsImportant(CSSPropertyTextDecorationLine));
     else
-        m_mutableStyle->removeProperty(CSSPropertyTextDecoration);
+        m_mutableStyle->removeProperty(CSSPropertyTextDecorationLine);
     m_mutableStyle->removeProperty(CSSPropertyWebkitTextDecorationsInEffect);
 }
 
 // CSS properties that create a visual difference only when applied to text.
 static const CSSPropertyID textOnlyProperties[] = {
-    CSSPropertyTextDecoration,
+    CSSPropertyTextDecorationLine,
     CSSPropertyWebkitTextDecorationsInEffect,
     CSSPropertyFontStyle,
     CSSPropertyFontWeight,
@@ -852,7 +852,7 @@
 
 static RefPtr<CSSValueList> textDecorationValueList(const StyleProperties& properties)
 {
-    RefPtr<CSSValue> value = properties.getPropertyCSSValue(CSSPropertyTextDecoration);
+    RefPtr<CSSValue> value = properties.getPropertyCSSValue(CSSPropertyTextDecorationLine);
     if (!is<CSSValueList>(value))
         return nullptr;
     return downcast<CSSValueList>(value.get());
@@ -896,13 +896,13 @@
             if (extractedValueList->length()) {
                 conflicts = true;
                 if (newValueList->length())
-                    newInlineStyle->setProperty(CSSPropertyTextDecoration, WTFMove(newValueList));
+                    newInlineStyle->setProperty(CSSPropertyTextDecorationLine, WTFMove(newValueList));
                 else
-                    newInlineStyle->removeProperty(CSSPropertyTextDecoration);
+                    newInlineStyle->removeProperty(CSSPropertyTextDecorationLine);
 
                 if (extractedStyle) {
-                    bool isImportant = inlineStyle->propertyIsImportant(CSSPropertyTextDecoration);
-                    extractedStyle->setProperty(CSSPropertyTextDecoration, extractedValueList->cssText(), isImportant);
+                    bool isImportant = inlineStyle->propertyIsImportant(CSSPropertyTextDecorationLine);
+                    extractedStyle->setProperty(CSSPropertyTextDecorationLine, extractedValueList->cssText(), isImportant);
                 }
             }
         }
@@ -916,13 +916,13 @@
         if (propertyID == CSSPropertyWhiteSpace && isTabSpanNode(&element))
             continue;
 
-        if (propertyID == CSSPropertyWebkitTextDecorationsInEffect && inlineStyle->getPropertyCSSValue(CSSPropertyTextDecoration)) {
+        if (propertyID == CSSPropertyWebkitTextDecorationsInEffect && inlineStyle->getPropertyCSSValue(CSSPropertyTextDecorationLine)) {
             if (!newInlineStyle)
                 return true;
             conflicts = true;
-            newInlineStyle->removeProperty(CSSPropertyTextDecoration);
+            newInlineStyle->removeProperty(CSSPropertyTextDecorationLine);
             if (extractedStyle)
-                extractedStyle->setProperty(CSSPropertyTextDecoration, inlineStyle->getPropertyValue(CSSPropertyTextDecoration), inlineStyle->propertyIsImportant(CSSPropertyTextDecoration));
+                extractedStyle->setProperty(CSSPropertyTextDecorationLine, inlineStyle->getPropertyValue(CSSPropertyTextDecorationLine), inlineStyle->propertyIsImportant(CSSPropertyTextDecorationLine));
         }
 
         if (!inlineStyle->getPropertyCSSValue(propertyID))
@@ -1049,7 +1049,7 @@
     if (shouldAddUnderline || shouldAddLineThrough) {
         bool hasUnderline = false;
         bool hasLineThrough = false;
-        if (RefPtr<CSSValue> value = computedStyle.propertyValue(CSSPropertyTextDecoration)) {
+        if (RefPtr<CSSValue> value = computedStyle.propertyValue(CSSPropertyTextDecorationLine)) {
             if (value->isValueList()) {
                 auto& cssValuePool = CSSValuePool::singleton();
                 const CSSValueList& valueList = downcast<CSSValueList>(*value);
@@ -1283,7 +1283,7 @@
         RefPtr<CSSValue> value = m_mutableStyle->getPropertyCSSValue(property.id());
 
         // text decorations never override values.
-        if ((property.id() == CSSPropertyTextDecoration || property.id() == CSSPropertyWebkitTextDecorationsInEffect)
+        if ((property.id() == CSSPropertyTextDecorationLine || property.id() == CSSPropertyWebkitTextDecorationsInEffect)
             && is<CSSValueList>(*property.value()) && value) {
             if (is<CSSValueList>(*value)) {
                 auto newValue = downcast<CSSValueList>(*value).copy();
@@ -1688,11 +1688,11 @@
 static void reconcileTextDecorationProperties(MutableStyleProperties* style)
 {    
     RefPtr<CSSValue> textDecorationsInEffect = style->getPropertyCSSValue(CSSPropertyWebkitTextDecorationsInEffect);
-    RefPtr<CSSValue> textDecoration = style->getPropertyCSSValue(CSSPropertyTextDecoration);
+    RefPtr<CSSValue> textDecoration = style->getPropertyCSSValue(CSSPropertyTextDecorationLine);
     // We shouldn't have both text-decoration and -webkit-text-decorations-in-effect because that wouldn't make sense.
     ASSERT(!textDecorationsInEffect || !textDecoration);
     if (textDecorationsInEffect) {
-        style->setProperty(CSSPropertyTextDecoration, textDecorationsInEffect->cssText());
+        style->setProperty(CSSPropertyTextDecorationLine, textDecorationsInEffect->cssText());
         style->removeProperty(CSSPropertyWebkitTextDecorationsInEffect);
         textDecoration = textDecorationsInEffect;
     }
@@ -1699,7 +1699,7 @@
 
     // If text-decoration is set to "none", remove the property because we don't want to add redundant "text-decoration: none".
     if (textDecoration && !textDecoration->isValueList())
-        style->removeProperty(CSSPropertyTextDecoration);
+        style->removeProperty(CSSPropertyTextDecorationLine);
 }
 
 StyleChange::StyleChange(EditingStyle* style, const Position& position)
@@ -1734,7 +1734,7 @@
     if (shouldAddUnderline || shouldAddStrikeThrough) {
         RefPtr<CSSValue> value = computedStyle.propertyValue(CSSPropertyWebkitTextDecorationsInEffect);
         if (!is<CSSValueList>(value))
-            value = computedStyle.propertyValue(CSSPropertyTextDecoration);
+            value = computedStyle.propertyValue(CSSPropertyTextDecorationLine);
 
         RefPtr<CSSValueList> valueList;
         if (is<CSSValueList>(value))
@@ -1753,7 +1753,7 @@
                 valueList->append(WTFMove(underline));
             if (shouldAddStrikeThrough && !hasLineThrough)
                 valueList->append(WTFMove(lineThrough));
-            mutableStyle->setProperty(CSSPropertyTextDecoration, valueList.get());
+            mutableStyle->setProperty(CSSPropertyTextDecorationLine, valueList.get());
         } else {
             m_applyUnderline = shouldAddUnderline && !hasUnderline;
             m_applyLineThrough = shouldAddStrikeThrough && !hasLineThrough;
@@ -1815,7 +1815,7 @@
 
     // Assuming reconcileTextDecorationProperties has been called, there should not be -webkit-text-decorations-in-effect
     // Furthermore, text-decoration: none has been trimmed so that text-decoration property is always a CSSValueList.
-    RefPtr<CSSValue> textDecoration = style.getPropertyCSSValue(CSSPropertyTextDecoration);
+    RefPtr<CSSValue> textDecoration = style.getPropertyCSSValue(CSSPropertyTextDecorationLine);
     if (is<CSSValueList>(textDecoration)) {
         auto& cssValuePool = CSSValuePool::singleton();
         RefPtr<CSSPrimitiveValue> underline = cssValuePool.createIdentifierValue(CSSValueUnderline);
@@ -1828,7 +1828,7 @@
             m_applyLineThrough = true;
 
         // If trimTextDecorations, delete underline and line-through
-        setTextDecorationProperty(style, newTextDecoration.get(), CSSPropertyTextDecoration);
+        setTextDecorationProperty(style, newTextDecoration.get(), CSSPropertyTextDecorationLine);
     }
 
     int verticalAlign = identifierForStyleProperty(style, CSSPropertyVerticalAlign);
@@ -1897,7 +1897,7 @@
     Ref<MutableStyleProperties> mutableStyle = *result->style();
 
     RefPtr<CSSValue> baseTextDecorationsInEffect = extractPropertyValue(baseStyle, CSSPropertyWebkitTextDecorationsInEffect);
-    diffTextDecorations(mutableStyle, CSSPropertyTextDecoration, baseTextDecorationsInEffect.get());
+    diffTextDecorations(mutableStyle, CSSPropertyTextDecorationLine, baseTextDecorationsInEffect.get());
     diffTextDecorations(mutableStyle, CSSPropertyWebkitTextDecorationsInEffect, baseTextDecorationsInEffect.get());
 
     if (extractPropertyValue(baseStyle, CSSPropertyFontWeight) && fontWeightIsBold(mutableStyle) == fontWeightIsBold(baseStyle))

Modified: trunk/Source/WebCore/editing/cocoa/HTMLConverter.mm (291243 => 291244)


--- trunk/Source/WebCore/editing/cocoa/HTMLConverter.mm	2022-03-14 19:11:33 UTC (rev 291243)
+++ trunk/Source/WebCore/editing/cocoa/HTMLConverter.mm	2022-03-14 19:18:11 UTC (rev 291244)
@@ -641,7 +641,7 @@
             return "bolder";
         inherit = true;
         break;
-    case CSSPropertyTextDecoration:
+    case CSSPropertyTextDecorationLine:
         if (element.hasTagName(uTag) || element.hasTagName(insTag))
             return "underline";
         else if (element.hasTagName(sTag) || element.hasTagName(strikeTag) || element.hasTagName(delTag))
@@ -1037,7 +1037,7 @@
             [attrs setObject:@0 forKey:NSLigatureAttributeName];  // explicitly disabled
     }
 
-    String textDecoration = _caches->propertyValueForNode(element, CSSPropertyTextDecoration);
+    String textDecoration = _caches->propertyValueForNode(element, CSSPropertyTextDecorationLine);
     if (textDecoration.length()) {
         if (textDecoration.contains("underline"))
             [attrs setObject:[NSNumber numberWithInteger:NSUnderlineStyleSingle] forKey:NSUnderlineStyleAttributeName];

Modified: trunk/Source/WebCore/editing/ios/EditorIOS.mm (291243 => 291244)


--- trunk/Source/WebCore/editing/ios/EditorIOS.mm	2022-03-14 19:11:33 UTC (rev 291243)
+++ trunk/Source/WebCore/editing/ios/EditorIOS.mm	2022-03-14 19:18:11 UTC (rev 291244)
@@ -159,7 +159,7 @@
     defaultStyle->removeProperty(CSSPropertyFontStyle);
     defaultStyle->removeProperty(CSSPropertyFontVariantCaps);
     // FIXME: we should handle also pasted quoted text, strikethrough, etc. <rdar://problem/9255115>
-    defaultStyle->removeProperty(CSSPropertyTextDecoration);
+    defaultStyle->removeProperty(CSSPropertyTextDecorationLine);
     defaultStyle->removeProperty(CSSPropertyWebkitTextDecorationsInEffect); // implements underline
 
     // FIXME add EditAction::MatchStlye <rdar://problem/9156507> Undo rich text's paste & match style should say "Undo Match Style"

Modified: trunk/Source/WebCore/editing/markup.cpp (291243 => 291244)


--- trunk/Source/WebCore/editing/markup.cpp	2022-03-14 19:11:33 UTC (rev 291243)
+++ trunk/Source/WebCore/editing/markup.cpp	2022-03-14 19:18:11 UTC (rev 291244)
@@ -935,8 +935,8 @@
                     // Reset the CSS properties to avoid an assertion error in addStyleMarkup().
                     // This assertion is caused at least when we select all text of a <body> element whose
                     // 'text-decoration' property is "inherit", and copy it.
-                    if (!propertyMissingOrEqualToNone(fullySelectedRootStyle->style(), CSSPropertyTextDecoration))
-                        fullySelectedRootStyle->style()->setProperty(CSSPropertyTextDecoration, CSSValueNone);
+                    if (!propertyMissingOrEqualToNone(fullySelectedRootStyle->style(), CSSPropertyTextDecorationLine))
+                        fullySelectedRootStyle->style()->setProperty(CSSPropertyTextDecorationLine, CSSValueNone);
                     if (!propertyMissingOrEqualToNone(fullySelectedRootStyle->style(), CSSPropertyWebkitTextDecorationsInEffect))
                         fullySelectedRootStyle->style()->setProperty(CSSPropertyWebkitTextDecorationsInEffect, CSSValueNone);
                     accumulator.wrapWithStyleNode(fullySelectedRootStyle->style(), document, true);

Modified: trunk/Source/WebCore/style/PropertyAllowlist.cpp (291243 => 291244)


--- trunk/Source/WebCore/style/PropertyAllowlist.cpp	2022-03-14 19:11:33 UTC (rev 291243)
+++ trunk/Source/WebCore/style/PropertyAllowlist.cpp	2022-03-14 19:18:11 UTC (rev 291244)
@@ -133,7 +133,7 @@
     case CSSPropertyOutlineWidth:
     case CSSPropertyVisibility:
     case CSSPropertyWhiteSpace:
-    case CSSPropertyTextDecoration:
+    case CSSPropertyTextDecorationLine:
     case CSSPropertyTextShadow:
     case CSSPropertyBorderStyle:
     case CSSPropertyPaintOrder:
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to