<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[200769] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/200769">200769</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2016-05-12 05:47:21 -0700 (Thu, 12 May 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Correctly handle prefixed and unprefixed variants in CSSStyleDeclaration
https://bugs.webkit.org/show_bug.cgi?id=157569
&lt;rdar://problem/26223115&gt;

Patch by Antoine Quint &lt;graouts@apple.com&gt; on 2016-05-12
Reviewed by Dean Jackson.

Source/WebCore:

Tests: fast/css/prefixed-unprefixed-variant-style-declaration.html
       fast/css/shorthand-omitted-initial-value-overrides-shorthand.html

We essentially revert the code added with https://bugs.webkit.org/show_bug.cgi?id=110011
which duplicated properties that had a prefixed or unprefixed variant. What we do now is
to return the value of the prefixed or unprefixed variant through a CSSStyleDeclaration,
but only return the properties specified by the author when reading from the `cssText` property.

* css/CSSParser.cpp:
(WebCore::CSSParser::parseValue):
(WebCore::CSSParser::parseTransitionShorthand):
(WebCore::CSSParser::addPropertyWithPrefixingVariant): Deleted.
* css/CSSParser.h:
Remove all code adding duplicated properties for the prefixed or unprefixed
variant of properties that exist in both forms.

* css/CSSPropertyNames.in:
Treat transition properties as we do animation properties.

* css/PropertySetCSSStyleDeclaration.cpp:
(WebCore::PropertySetCSSStyleDeclaration::getPropertyCSSValue):
(WebCore::PropertySetCSSStyleDeclaration::getPropertyValue):
Make these two methods call into the matching getXXXInternal() variant instead
of going through the property set directly so that they would correctly pick up
on the prefixed or unprefixed variant should there be one when the specified property
is not specified directly.

(WebCore::PropertySetCSSStyleDeclaration::getPropertyCSSValueInternal):
(WebCore::PropertySetCSSStyleDeclaration::getPropertyValueInternal):
We used to simply return the value for the given property from the property set, which
we still do but now also check if there is prefixed or unprefixed variant for the provided
property in case it was absent.

* css/StyleProperties.cpp:
(WebCore::MutableStyleProperties::removeShorthandProperty):
Remove all code adding duplicated properties for the prefixed or unprefixed
variant of properties that exist in both forms.

(WebCore::StyleProperties::asText):
Drive-by fix to also handle the animation-play-state and -webkit-animation-play-state properties
when serializing to the shorthand.

(WebCore::MutableStyleProperties::removeProperty): Deleted.
(WebCore::MutableStyleProperties::removePrefixedOrUnprefixedProperty): Deleted.
(WebCore::MutableStyleProperties::setProperty): Deleted.
(WebCore::getIndexInShorthandVectorForPrefixingVariant): Deleted.
(WebCore::MutableStyleProperties::appendPrefixingVariantProperty): Deleted.
(WebCore::MutableStyleProperties::setPrefixingVariantProperty): Deleted.
* css/StyleProperties.h:
Remove all code adding duplicated properties for the prefixed or unprefixed
variant of properties that exist in both forms.

LayoutTests:

* animations/fill-mode-forwards-zero-duration.html:
* animations/play-state-start-paused.html:
These two tests incorrectly expected a shorthand property not to reset
longhand properties that it covers to their initial values even if left
out of the shorthand.

* animations/unprefixed-properties-expected.txt:
* animations/unprefixed-properties.html:
This test incorrectly expected that setting an unprefixed property only would
lead to reading the prefixed property through the CSSOM return the empty string,
rather than the value set on the unprefixed property.

* fast/css/prefixed-unprefixed-variant-style-declaration-expected.txt: Added.
* fast/css/prefixed-unprefixed-variant-style-declaration.html: Added.
New test checking that setting one of two of a property's unprefixed and prefixed
variants correctly allows to read the style through the CSS OM for both variants,
while only serializing the property that was set through cssText.

* fast/css/shorthand-omitted-initial-value-overrides-shorthand-expected.txt: Added.
* fast/css/shorthand-omitted-initial-value-overrides-shorthand.html: Added.
New test checking that setting a longhand property and then the shorthand for that
longhand correctly resets the initial values, even if they were omitted in the shorthand.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsanimationsfillmodeforwardszerodurationhtml">trunk/LayoutTests/animations/fill-mode-forwards-zero-duration.html</a></li>
<li><a href="#trunkLayoutTestsanimationsplaystatestartpausedhtml">trunk/LayoutTests/animations/play-state-start-paused.html</a></li>
<li><a href="#trunkLayoutTestsanimationsunprefixedpropertiesexpectedtxt">trunk/LayoutTests/animations/unprefixed-properties-expected.txt</a></li>
<li><a href="#trunkLayoutTestsanimationsunprefixedpropertieshtml">trunk/LayoutTests/animations/unprefixed-properties.html</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecssCSSParsercpp">trunk/Source/WebCore/css/CSSParser.cpp</a></li>
<li><a href="#trunkSourceWebCorecssCSSParserh">trunk/Source/WebCore/css/CSSParser.h</a></li>
<li><a href="#trunkSourceWebCorecssCSSPropertyNamesin">trunk/Source/WebCore/css/CSSPropertyNames.in</a></li>
<li><a href="#trunkSourceWebCorecssPropertySetCSSStyleDeclarationcpp">trunk/Source/WebCore/css/PropertySetCSSStyleDeclaration.cpp</a></li>
<li><a href="#trunkSourceWebCorecssStylePropertiescpp">trunk/Source/WebCore/css/StyleProperties.cpp</a></li>
<li><a href="#trunkSourceWebCorecssStylePropertiesh">trunk/Source/WebCore/css/StyleProperties.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastcssprefixedunprefixedvariantstyledeclarationexpectedtxt">trunk/LayoutTests/fast/css/prefixed-unprefixed-variant-style-declaration-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastcssprefixedunprefixedvariantstyledeclarationhtml">trunk/LayoutTests/fast/css/prefixed-unprefixed-variant-style-declaration.html</a></li>
<li><a href="#trunkLayoutTestsfastcssshorthandomittedinitialvalueoverridesshorthandexpectedtxt">trunk/LayoutTests/fast/css/shorthand-omitted-initial-value-overrides-shorthand-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastcssshorthandomittedinitialvalueoverridesshorthandhtml">trunk/LayoutTests/fast/css/shorthand-omitted-initial-value-overrides-shorthand.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (200768 => 200769)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-05-12 12:26:55 UTC (rev 200768)
+++ trunk/LayoutTests/ChangeLog        2016-05-12 12:47:21 UTC (rev 200769)
</span><span class="lines">@@ -1,3 +1,34 @@
</span><ins>+2016-05-12  Antoine Quint  &lt;graouts@apple.com&gt;
+
+        Correctly handle prefixed and unprefixed variants in CSSStyleDeclaration
+        https://bugs.webkit.org/show_bug.cgi?id=157569
+        &lt;rdar://problem/26223115&gt;
+
+        Reviewed by Dean Jackson.
+
+        * animations/fill-mode-forwards-zero-duration.html:
+        * animations/play-state-start-paused.html:
+        These two tests incorrectly expected a shorthand property not to reset
+        longhand properties that it covers to their initial values even if left
+        out of the shorthand.
+
+        * animations/unprefixed-properties-expected.txt:
+        * animations/unprefixed-properties.html:
+        This test incorrectly expected that setting an unprefixed property only would
+        lead to reading the prefixed property through the CSSOM return the empty string,
+        rather than the value set on the unprefixed property.
+
+        * fast/css/prefixed-unprefixed-variant-style-declaration-expected.txt: Added.
+        * fast/css/prefixed-unprefixed-variant-style-declaration.html: Added.
+        New test checking that setting one of two of a property's unprefixed and prefixed
+        variants correctly allows to read the style through the CSS OM for both variants,
+        while only serializing the property that was set through cssText.
+
+        * fast/css/shorthand-omitted-initial-value-overrides-shorthand-expected.txt: Added.
+        * fast/css/shorthand-omitted-initial-value-overrides-shorthand.html: Added.
+        New test checking that setting a longhand property and then the shorthand for that
+        longhand correctly resets the initial values, even if they were omitted in the shorthand.
+
</ins><span class="cx"> 2016-05-12  Manuel Rego Casasnovas  &lt;rego@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [css-grid] Incorrect parsing when using just 'span&quot; as grid-line value
</span></span></pre></div>
<a id="trunkLayoutTestsanimationsfillmodeforwardszerodurationhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/animations/fill-mode-forwards-zero-duration.html (200768 => 200769)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/animations/fill-mode-forwards-zero-duration.html        2016-05-12 12:26:55 UTC (rev 200768)
+++ trunk/LayoutTests/animations/fill-mode-forwards-zero-duration.html        2016-05-12 12:47:21 UTC (rev 200769)
</span><span class="lines">@@ -9,8 +9,7 @@
</span><span class="cx">       height: 100px;
</span><span class="cx">       width: 100px;
</span><span class="cx">       background-color: blue;
</span><del>-      animation-fill-mode: forwards;
-      animation: anim1 0 2s linear;
</del><ins>+      animation: anim1 0 2s linear forwards;
</ins><span class="cx">     }
</span><span class="cx">     @keyframes anim1 {
</span><span class="cx">         from { left: 400px; }
</span></span></pre></div>
<a id="trunkLayoutTestsanimationsplaystatestartpausedhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/animations/play-state-start-paused.html (200768 => 200769)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/animations/play-state-start-paused.html        2016-05-12 12:26:55 UTC (rev 200768)
+++ trunk/LayoutTests/animations/play-state-start-paused.html        2016-05-12 12:47:21 UTC (rev 200769)
</span><span class="lines">@@ -13,8 +13,6 @@
</span><span class="cx">             width: 100px;
</span><span class="cx">             height: 100px;
</span><span class="cx">             background-color: green;
</span><del>-            animation-delay: -0.5s;
-            animation-play-state: paused;
</del><span class="cx">         }
</span><span class="cx">         
</span><span class="cx">         /* For manual testing. */
</span><span class="lines">@@ -23,11 +21,11 @@
</span><span class="cx">         }
</span><span class="cx">         
</span><span class="cx">         .mover {
</span><del>-            animation: move 1s linear;
</del><ins>+            animation: move 1s linear -0.5s paused;
</ins><span class="cx">         }
</span><span class="cx">         
</span><span class="cx">         .slider {
</span><del>-            animation: slide 1s linear;
</del><ins>+            animation: slide 1s linear -0.5s paused;
</ins><span class="cx">         }
</span><span class="cx">         
</span><span class="cx">         @keyframes move {
</span></span></pre></div>
<a id="trunkLayoutTestsanimationsunprefixedpropertiesexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/animations/unprefixed-properties-expected.txt (200768 => 200769)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/animations/unprefixed-properties-expected.txt        2016-05-12 12:26:55 UTC (rev 200768)
+++ trunk/LayoutTests/animations/unprefixed-properties-expected.txt        2016-05-12 12:47:21 UTC (rev 200769)
</span><span class="lines">@@ -6,13 +6,13 @@
</span><span class="cx"> 
</span><span class="cx"> Parsing - Basic animation-name : waldo
</span><span class="cx"> PASS cssRule.type is 1
</span><del>-PASS declaration.length is 2
</del><ins>+PASS declaration.length is 1
</ins><span class="cx"> PASS declaration.getPropertyValue('animation-name') is 'waldo'
</span><span class="cx"> PASS declaration.getPropertyValue('-webkit-animation-name') is 'waldo'
</span><span class="cx"> 
</span><span class="cx"> Parsing - Multiple animation-names : waldo, wally
</span><span class="cx"> PASS cssRule.type is 1
</span><del>-PASS declaration.length is 2
</del><ins>+PASS declaration.length is 1
</ins><span class="cx"> PASS declaration.getPropertyValue('animation-name') is 'waldo, wally'
</span><span class="cx"> PASS declaration.getPropertyValue('-webkit-animation-name') is 'waldo, wally'
</span><span class="cx"> PASS subRule.cssText is 'waldo'
</span><span class="lines">@@ -20,13 +20,13 @@
</span><span class="cx"> 
</span><span class="cx"> Parsing - Basic animation-duration : 5s
</span><span class="cx"> PASS cssRule.type is 1
</span><del>-PASS declaration.length is 2
</del><ins>+PASS declaration.length is 1
</ins><span class="cx"> PASS declaration.getPropertyValue('animation-duration') is '5s'
</span><span class="cx"> PASS declaration.getPropertyValue('-webkit-animation-duration') is '5s'
</span><span class="cx"> 
</span><span class="cx"> Parsing - Multiple animation-durations : 10s, 20ms
</span><span class="cx"> PASS cssRule.type is 1
</span><del>-PASS declaration.length is 2
</del><ins>+PASS declaration.length is 1
</ins><span class="cx"> PASS declaration.getPropertyValue('animation-duration') is '10s, 20ms'
</span><span class="cx"> PASS declaration.getPropertyValue('-webkit-animation-duration') is '10s, 20ms'
</span><span class="cx"> PASS subRule.cssText is '10s'
</span><span class="lines">@@ -34,13 +34,13 @@
</span><span class="cx"> 
</span><span class="cx"> Parsing - Basic animation-delay : 5s
</span><span class="cx"> PASS cssRule.type is 1
</span><del>-PASS declaration.length is 2
</del><ins>+PASS declaration.length is 1
</ins><span class="cx"> PASS declaration.getPropertyValue('animation-delay') is '5s'
</span><span class="cx"> PASS declaration.getPropertyValue('-webkit-animation-delay') is '5s'
</span><span class="cx"> 
</span><span class="cx"> Parsing - Multiple animation-delays : 10s, 20ms
</span><span class="cx"> PASS cssRule.type is 1
</span><del>-PASS declaration.length is 2
</del><ins>+PASS declaration.length is 1
</ins><span class="cx"> PASS declaration.getPropertyValue('animation-delay') is '10s, 20ms'
</span><span class="cx"> PASS declaration.getPropertyValue('-webkit-animation-delay') is '10s, 20ms'
</span><span class="cx"> PASS subRule.cssText is '10s'
</span><span class="lines">@@ -48,19 +48,19 @@
</span><span class="cx"> 
</span><span class="cx"> Parsing - Basic animation-timing-function : ease-in-out
</span><span class="cx"> PASS cssRule.type is 1
</span><del>-PASS declaration.length is 2
</del><ins>+PASS declaration.length is 1
</ins><span class="cx"> PASS declaration.getPropertyValue('animation-timing-function') is 'ease-in-out'
</span><span class="cx"> PASS declaration.getPropertyValue('-webkit-animation-timing-function') is 'ease-in-out'
</span><span class="cx"> 
</span><span class="cx"> Parsing - animation-timing-function with bezier : cubic-bezier(0.2, 0.3, 0.4, 0.5)
</span><span class="cx"> PASS cssRule.type is 1
</span><del>-PASS declaration.length is 2
</del><ins>+PASS declaration.length is 1
</ins><span class="cx"> PASS declaration.getPropertyValue('animation-timing-function') is 'cubic-bezier(0.2, 0.3, 0.4, 0.5)'
</span><span class="cx"> PASS declaration.getPropertyValue('-webkit-animation-timing-function') is 'cubic-bezier(0.2, 0.3, 0.4, 0.5)'
</span><span class="cx"> 
</span><span class="cx"> Parsing - Multiple animation-timing-functions : ease-in, ease-out
</span><span class="cx"> PASS cssRule.type is 1
</span><del>-PASS declaration.length is 2
</del><ins>+PASS declaration.length is 1
</ins><span class="cx"> PASS declaration.getPropertyValue('animation-timing-function') is 'ease-in, ease-out'
</span><span class="cx"> PASS declaration.getPropertyValue('-webkit-animation-timing-function') is 'ease-in, ease-out'
</span><span class="cx"> PASS subRule.cssText is 'ease-in'
</span><span class="lines">@@ -68,19 +68,19 @@
</span><span class="cx"> 
</span><span class="cx"> Parsing - Basic animation-iteration-count : 4
</span><span class="cx"> PASS cssRule.type is 1
</span><del>-PASS declaration.length is 2
</del><ins>+PASS declaration.length is 1
</ins><span class="cx"> PASS declaration.getPropertyValue('animation-iteration-count') is '4'
</span><span class="cx"> PASS declaration.getPropertyValue('-webkit-animation-iteration-count') is '4'
</span><span class="cx"> 
</span><span class="cx"> Parsing - animation-iteration-count with keyword : infinite
</span><span class="cx"> PASS cssRule.type is 1
</span><del>-PASS declaration.length is 2
</del><ins>+PASS declaration.length is 1
</ins><span class="cx"> PASS declaration.getPropertyValue('animation-iteration-count') is 'infinite'
</span><span class="cx"> PASS declaration.getPropertyValue('-webkit-animation-iteration-count') is 'infinite'
</span><span class="cx"> 
</span><span class="cx"> Parsing - Multiple animation-iteration-counts : 2, infinite, 4
</span><span class="cx"> PASS cssRule.type is 1
</span><del>-PASS declaration.length is 2
</del><ins>+PASS declaration.length is 1
</ins><span class="cx"> PASS declaration.getPropertyValue('animation-iteration-count') is '2, infinite, 4'
</span><span class="cx"> PASS declaration.getPropertyValue('-webkit-animation-iteration-count') is '2, infinite, 4'
</span><span class="cx"> PASS subRule.cssText is '2'
</span><span class="lines">@@ -89,31 +89,31 @@
</span><span class="cx"> 
</span><span class="cx"> Parsing - Normal animation-direction : normal
</span><span class="cx"> PASS cssRule.type is 1
</span><del>-PASS declaration.length is 2
</del><ins>+PASS declaration.length is 1
</ins><span class="cx"> PASS declaration.getPropertyValue('animation-direction') is 'normal'
</span><span class="cx"> PASS declaration.getPropertyValue('-webkit-animation-direction') is 'normal'
</span><span class="cx"> 
</span><span class="cx"> Parsing - Alternate animation-direction : alternate
</span><span class="cx"> PASS cssRule.type is 1
</span><del>-PASS declaration.length is 2
</del><ins>+PASS declaration.length is 1
</ins><span class="cx"> PASS declaration.getPropertyValue('animation-direction') is 'alternate'
</span><span class="cx"> PASS declaration.getPropertyValue('-webkit-animation-direction') is 'alternate'
</span><span class="cx"> 
</span><span class="cx"> Parsing - Reverse animation-direction : reverse
</span><span class="cx"> PASS cssRule.type is 1
</span><del>-PASS declaration.length is 2
</del><ins>+PASS declaration.length is 1
</ins><span class="cx"> PASS declaration.getPropertyValue('animation-direction') is 'reverse'
</span><span class="cx"> PASS declaration.getPropertyValue('-webkit-animation-direction') is 'reverse'
</span><span class="cx"> 
</span><span class="cx"> Parsing - Alternate Reverse animation-direction : alternate-reverse
</span><span class="cx"> PASS cssRule.type is 1
</span><del>-PASS declaration.length is 2
</del><ins>+PASS declaration.length is 1
</ins><span class="cx"> PASS declaration.getPropertyValue('animation-direction') is 'alternate-reverse'
</span><span class="cx"> PASS declaration.getPropertyValue('-webkit-animation-direction') is 'alternate-reverse'
</span><span class="cx"> 
</span><span class="cx"> Parsing - Multiple animation-directions : alternate, alternate, normal
</span><span class="cx"> PASS cssRule.type is 1
</span><del>-PASS declaration.length is 2
</del><ins>+PASS declaration.length is 1
</ins><span class="cx"> PASS declaration.getPropertyValue('animation-direction') is 'alternate, alternate, normal'
</span><span class="cx"> PASS declaration.getPropertyValue('-webkit-animation-direction') is 'alternate, alternate, normal'
</span><span class="cx"> PASS subRule.cssText is 'alternate'
</span><span class="lines">@@ -122,31 +122,31 @@
</span><span class="cx"> 
</span><span class="cx"> Parsing - None animation-fill-mode : none
</span><span class="cx"> PASS cssRule.type is 1
</span><del>-PASS declaration.length is 2
</del><ins>+PASS declaration.length is 1
</ins><span class="cx"> PASS declaration.getPropertyValue('animation-fill-mode') is 'none'
</span><span class="cx"> PASS declaration.getPropertyValue('-webkit-animation-fill-mode') is 'none'
</span><span class="cx"> 
</span><span class="cx"> Parsing - Forwards animation-fill-mode : forwards
</span><span class="cx"> PASS cssRule.type is 1
</span><del>-PASS declaration.length is 2
</del><ins>+PASS declaration.length is 1
</ins><span class="cx"> PASS declaration.getPropertyValue('animation-fill-mode') is 'forwards'
</span><span class="cx"> PASS declaration.getPropertyValue('-webkit-animation-fill-mode') is 'forwards'
</span><span class="cx"> 
</span><span class="cx"> Parsing - Backwards animation-fill-mode : backwards
</span><span class="cx"> PASS cssRule.type is 1
</span><del>-PASS declaration.length is 2
</del><ins>+PASS declaration.length is 1
</ins><span class="cx"> PASS declaration.getPropertyValue('animation-fill-mode') is 'backwards'
</span><span class="cx"> PASS declaration.getPropertyValue('-webkit-animation-fill-mode') is 'backwards'
</span><span class="cx"> 
</span><span class="cx"> Parsing - Both animation-fill-mode : both
</span><span class="cx"> PASS cssRule.type is 1
</span><del>-PASS declaration.length is 2
</del><ins>+PASS declaration.length is 1
</ins><span class="cx"> PASS declaration.getPropertyValue('animation-fill-mode') is 'both'
</span><span class="cx"> PASS declaration.getPropertyValue('-webkit-animation-fill-mode') is 'both'
</span><span class="cx"> 
</span><span class="cx"> Parsing - Multiple animation-fill-modes : none, forwards, backwards, both
</span><span class="cx"> PASS cssRule.type is 1
</span><del>-PASS declaration.length is 2
</del><ins>+PASS declaration.length is 1
</ins><span class="cx"> PASS declaration.getPropertyValue('animation-fill-mode') is 'none, forwards, backwards, both'
</span><span class="cx"> PASS declaration.getPropertyValue('-webkit-animation-fill-mode') is 'none, forwards, backwards, both'
</span><span class="cx"> PASS subRule.cssText is 'none'
</span></span></pre></div>
<a id="trunkLayoutTestsanimationsunprefixedpropertieshtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/animations/unprefixed-properties.html (200768 => 200769)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/animations/unprefixed-properties.html        2016-05-12 12:26:55 UTC (rev 200768)
+++ trunk/LayoutTests/animations/unprefixed-properties.html        2016-05-12 12:47:21 UTC (rev 200769)
</span><span class="lines">@@ -27,7 +27,7 @@
</span><span class="cx">     shouldBe(&quot;cssRule.type&quot;, &quot;1&quot;);
</span><span class="cx"> 
</span><span class="cx">     declaration = cssRule.style;
</span><del>-    shouldBe(&quot;declaration.length&quot;, &quot;2&quot;); // We set both the prefixed and unprefixed version.
</del><ins>+    shouldBe(&quot;declaration.length&quot;, &quot;1&quot;);
</ins><span class="cx">     shouldBe(&quot;declaration.getPropertyValue('&quot; + property + &quot;')&quot;, &quot;'&quot; + value + &quot;'&quot;);
</span><span class="cx">     shouldBe(&quot;declaration.getPropertyValue('-webkit-&quot; + property + &quot;')&quot;, &quot;'&quot; + value + &quot;'&quot;);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsfastcssprefixedunprefixedvariantstyledeclarationexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/css/prefixed-unprefixed-variant-style-declaration-expected.txt (0 => 200769)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css/prefixed-unprefixed-variant-style-declaration-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/css/prefixed-unprefixed-variant-style-declaration-expected.txt        2016-05-12 12:47:21 UTC (rev 200769)
</span><span class="lines">@@ -0,0 +1,369 @@
</span><ins>+Test the prefixed or the unprefixed variant of a property allows reading from the CSS OM with both the prefixed and unprefixed variant.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+Setting &quot;transition-property&quot; to &quot;width&quot;
+PASS element.style.transitionProperty
+PASS element.style.webkitTransitionProperty
+PASS element.style.getPropertyValue(&quot;transition-property&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-transition-property&quot;)
+PASS element.style.getPropertyCSSValue(&quot;transition-property&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-transition-property&quot;)
+PASS getComputedStyle(element).transitionProperty
+PASS getComputedStyle(element).webkitTransitionProperty
+PASS getComputedStyle(element).getPropertyValue(&quot;transition-property&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-transition-property&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;transition-property&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-transition-property&quot;)
+PASS element.style.cssText
+
+Setting &quot;-webkit-transition-property&quot; to &quot;width&quot;
+PASS element.style.transitionProperty
+PASS element.style.webkitTransitionProperty
+PASS element.style.getPropertyValue(&quot;transition-property&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-transition-property&quot;)
+PASS element.style.getPropertyCSSValue(&quot;transition-property&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-transition-property&quot;)
+PASS getComputedStyle(element).transitionProperty
+PASS getComputedStyle(element).webkitTransitionProperty
+PASS getComputedStyle(element).getPropertyValue(&quot;transition-property&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-transition-property&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;transition-property&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-transition-property&quot;)
+PASS element.style.cssText
+
+Setting &quot;transition-duration&quot; to &quot;1s&quot;
+PASS element.style.transitionDuration
+PASS element.style.webkitTransitionDuration
+PASS element.style.getPropertyValue(&quot;transition-duration&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-transition-duration&quot;)
+PASS element.style.getPropertyCSSValue(&quot;transition-duration&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-transition-duration&quot;)
+PASS getComputedStyle(element).transitionDuration
+PASS getComputedStyle(element).webkitTransitionDuration
+PASS getComputedStyle(element).getPropertyValue(&quot;transition-duration&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-transition-duration&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;transition-duration&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-transition-duration&quot;)
+PASS element.style.cssText
+
+Setting &quot;-webkit-transition-duration&quot; to &quot;1s&quot;
+PASS element.style.transitionDuration
+PASS element.style.webkitTransitionDuration
+PASS element.style.getPropertyValue(&quot;transition-duration&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-transition-duration&quot;)
+PASS element.style.getPropertyCSSValue(&quot;transition-duration&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-transition-duration&quot;)
+PASS getComputedStyle(element).transitionDuration
+PASS getComputedStyle(element).webkitTransitionDuration
+PASS getComputedStyle(element).getPropertyValue(&quot;transition-duration&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-transition-duration&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;transition-duration&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-transition-duration&quot;)
+PASS element.style.cssText
+
+Setting &quot;transition-timing-function&quot; to &quot;linear&quot;
+PASS element.style.transitionTimingFunction
+PASS element.style.webkitTransitionTimingFunction
+PASS element.style.getPropertyValue(&quot;transition-timing-function&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-transition-timing-function&quot;)
+PASS element.style.getPropertyCSSValue(&quot;transition-timing-function&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-transition-timing-function&quot;)
+PASS getComputedStyle(element).transitionTimingFunction
+PASS getComputedStyle(element).webkitTransitionTimingFunction
+PASS getComputedStyle(element).getPropertyValue(&quot;transition-timing-function&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-transition-timing-function&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;transition-timing-function&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-transition-timing-function&quot;)
+PASS element.style.cssText
+
+Setting &quot;-webkit-transition-timing-function&quot; to &quot;linear&quot;
+PASS element.style.transitionTimingFunction
+PASS element.style.webkitTransitionTimingFunction
+PASS element.style.getPropertyValue(&quot;transition-timing-function&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-transition-timing-function&quot;)
+PASS element.style.getPropertyCSSValue(&quot;transition-timing-function&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-transition-timing-function&quot;)
+PASS getComputedStyle(element).transitionTimingFunction
+PASS getComputedStyle(element).webkitTransitionTimingFunction
+PASS getComputedStyle(element).getPropertyValue(&quot;transition-timing-function&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-transition-timing-function&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;transition-timing-function&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-transition-timing-function&quot;)
+PASS element.style.cssText
+
+Setting &quot;transition-delay&quot; to &quot;0.5s&quot;
+PASS element.style.transitionDelay
+PASS element.style.webkitTransitionDelay
+PASS element.style.getPropertyValue(&quot;transition-delay&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-transition-delay&quot;)
+PASS element.style.getPropertyCSSValue(&quot;transition-delay&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-transition-delay&quot;)
+PASS getComputedStyle(element).transitionDelay
+PASS getComputedStyle(element).webkitTransitionDelay
+PASS getComputedStyle(element).getPropertyValue(&quot;transition-delay&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-transition-delay&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;transition-delay&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-transition-delay&quot;)
+PASS element.style.cssText
+
+Setting &quot;-webkit-transition-delay&quot; to &quot;0.5s&quot;
+PASS element.style.transitionDelay
+PASS element.style.webkitTransitionDelay
+PASS element.style.getPropertyValue(&quot;transition-delay&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-transition-delay&quot;)
+PASS element.style.getPropertyCSSValue(&quot;transition-delay&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-transition-delay&quot;)
+PASS getComputedStyle(element).transitionDelay
+PASS getComputedStyle(element).webkitTransitionDelay
+PASS getComputedStyle(element).getPropertyValue(&quot;transition-delay&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-transition-delay&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;transition-delay&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-transition-delay&quot;)
+PASS element.style.cssText
+
+Setting &quot;animation-name&quot; to &quot;foo&quot;
+PASS element.style.animationName
+PASS element.style.webkitAnimationName
+PASS element.style.getPropertyValue(&quot;animation-name&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-animation-name&quot;)
+PASS element.style.getPropertyCSSValue(&quot;animation-name&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-animation-name&quot;)
+PASS getComputedStyle(element).animationName
+PASS getComputedStyle(element).webkitAnimationName
+PASS getComputedStyle(element).getPropertyValue(&quot;animation-name&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-animation-name&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;animation-name&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-animation-name&quot;)
+PASS element.style.cssText
+
+Setting &quot;-webkit-animation-name&quot; to &quot;foo&quot;
+PASS element.style.animationName
+PASS element.style.webkitAnimationName
+PASS element.style.getPropertyValue(&quot;animation-name&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-animation-name&quot;)
+PASS element.style.getPropertyCSSValue(&quot;animation-name&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-animation-name&quot;)
+PASS getComputedStyle(element).animationName
+PASS getComputedStyle(element).webkitAnimationName
+PASS getComputedStyle(element).getPropertyValue(&quot;animation-name&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-animation-name&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;animation-name&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-animation-name&quot;)
+PASS element.style.cssText
+
+Setting &quot;animation-duration&quot; to &quot;1s&quot;
+PASS element.style.animationDuration
+PASS element.style.webkitAnimationDuration
+PASS element.style.getPropertyValue(&quot;animation-duration&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-animation-duration&quot;)
+PASS element.style.getPropertyCSSValue(&quot;animation-duration&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-animation-duration&quot;)
+PASS getComputedStyle(element).animationDuration
+PASS getComputedStyle(element).webkitAnimationDuration
+PASS getComputedStyle(element).getPropertyValue(&quot;animation-duration&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-animation-duration&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;animation-duration&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-animation-duration&quot;)
+PASS element.style.cssText
+
+Setting &quot;-webkit-animation-duration&quot; to &quot;1s&quot;
+PASS element.style.animationDuration
+PASS element.style.webkitAnimationDuration
+PASS element.style.getPropertyValue(&quot;animation-duration&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-animation-duration&quot;)
+PASS element.style.getPropertyCSSValue(&quot;animation-duration&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-animation-duration&quot;)
+PASS getComputedStyle(element).animationDuration
+PASS getComputedStyle(element).webkitAnimationDuration
+PASS getComputedStyle(element).getPropertyValue(&quot;animation-duration&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-animation-duration&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;animation-duration&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-animation-duration&quot;)
+PASS element.style.cssText
+
+Setting &quot;animation-timing-function&quot; to &quot;linear&quot;
+PASS element.style.animationTimingFunction
+PASS element.style.webkitAnimationTimingFunction
+PASS element.style.getPropertyValue(&quot;animation-timing-function&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-animation-timing-function&quot;)
+PASS element.style.getPropertyCSSValue(&quot;animation-timing-function&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-animation-timing-function&quot;)
+PASS getComputedStyle(element).animationTimingFunction
+PASS getComputedStyle(element).webkitAnimationTimingFunction
+PASS getComputedStyle(element).getPropertyValue(&quot;animation-timing-function&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-animation-timing-function&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;animation-timing-function&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-animation-timing-function&quot;)
+PASS element.style.cssText
+
+Setting &quot;-webkit-animation-timing-function&quot; to &quot;linear&quot;
+PASS element.style.animationTimingFunction
+PASS element.style.webkitAnimationTimingFunction
+PASS element.style.getPropertyValue(&quot;animation-timing-function&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-animation-timing-function&quot;)
+PASS element.style.getPropertyCSSValue(&quot;animation-timing-function&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-animation-timing-function&quot;)
+PASS getComputedStyle(element).animationTimingFunction
+PASS getComputedStyle(element).webkitAnimationTimingFunction
+PASS getComputedStyle(element).getPropertyValue(&quot;animation-timing-function&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-animation-timing-function&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;animation-timing-function&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-animation-timing-function&quot;)
+PASS element.style.cssText
+
+Setting &quot;animation-iteration-count&quot; to &quot;5&quot;
+PASS element.style.animationIterationCount
+PASS element.style.webkitAnimationIterationCount
+PASS element.style.getPropertyValue(&quot;animation-iteration-count&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-animation-iteration-count&quot;)
+PASS element.style.getPropertyCSSValue(&quot;animation-iteration-count&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-animation-iteration-count&quot;)
+PASS getComputedStyle(element).animationIterationCount
+PASS getComputedStyle(element).webkitAnimationIterationCount
+PASS getComputedStyle(element).getPropertyValue(&quot;animation-iteration-count&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-animation-iteration-count&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;animation-iteration-count&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-animation-iteration-count&quot;)
+PASS element.style.cssText
+
+Setting &quot;-webkit-animation-iteration-count&quot; to &quot;5&quot;
+PASS element.style.animationIterationCount
+PASS element.style.webkitAnimationIterationCount
+PASS element.style.getPropertyValue(&quot;animation-iteration-count&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-animation-iteration-count&quot;)
+PASS element.style.getPropertyCSSValue(&quot;animation-iteration-count&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-animation-iteration-count&quot;)
+PASS getComputedStyle(element).animationIterationCount
+PASS getComputedStyle(element).webkitAnimationIterationCount
+PASS getComputedStyle(element).getPropertyValue(&quot;animation-iteration-count&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-animation-iteration-count&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;animation-iteration-count&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-animation-iteration-count&quot;)
+PASS element.style.cssText
+
+Setting &quot;animation-direction&quot; to &quot;reverse&quot;
+PASS element.style.animationDirection
+PASS element.style.webkitAnimationDirection
+PASS element.style.getPropertyValue(&quot;animation-direction&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-animation-direction&quot;)
+PASS element.style.getPropertyCSSValue(&quot;animation-direction&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-animation-direction&quot;)
+PASS getComputedStyle(element).animationDirection
+PASS getComputedStyle(element).webkitAnimationDirection
+PASS getComputedStyle(element).getPropertyValue(&quot;animation-direction&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-animation-direction&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;animation-direction&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-animation-direction&quot;)
+PASS element.style.cssText
+
+Setting &quot;-webkit-animation-direction&quot; to &quot;reverse&quot;
+PASS element.style.animationDirection
+PASS element.style.webkitAnimationDirection
+PASS element.style.getPropertyValue(&quot;animation-direction&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-animation-direction&quot;)
+PASS element.style.getPropertyCSSValue(&quot;animation-direction&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-animation-direction&quot;)
+PASS getComputedStyle(element).animationDirection
+PASS getComputedStyle(element).webkitAnimationDirection
+PASS getComputedStyle(element).getPropertyValue(&quot;animation-direction&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-animation-direction&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;animation-direction&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-animation-direction&quot;)
+PASS element.style.cssText
+
+Setting &quot;animation-play-state&quot; to &quot;paused&quot;
+PASS element.style.animationPlayState
+PASS element.style.webkitAnimationPlayState
+PASS element.style.getPropertyValue(&quot;animation-play-state&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-animation-play-state&quot;)
+PASS element.style.getPropertyCSSValue(&quot;animation-play-state&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-animation-play-state&quot;)
+PASS getComputedStyle(element).animationPlayState
+PASS getComputedStyle(element).webkitAnimationPlayState
+PASS getComputedStyle(element).getPropertyValue(&quot;animation-play-state&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-animation-play-state&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;animation-play-state&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-animation-play-state&quot;)
+PASS element.style.cssText
+
+Setting &quot;-webkit-animation-play-state&quot; to &quot;paused&quot;
+PASS element.style.animationPlayState
+PASS element.style.webkitAnimationPlayState
+PASS element.style.getPropertyValue(&quot;animation-play-state&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-animation-play-state&quot;)
+PASS element.style.getPropertyCSSValue(&quot;animation-play-state&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-animation-play-state&quot;)
+PASS getComputedStyle(element).animationPlayState
+PASS getComputedStyle(element).webkitAnimationPlayState
+PASS getComputedStyle(element).getPropertyValue(&quot;animation-play-state&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-animation-play-state&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;animation-play-state&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-animation-play-state&quot;)
+PASS element.style.cssText
+
+Setting &quot;animation-delay&quot; to &quot;0.5s&quot;
+PASS element.style.animationDelay
+PASS element.style.webkitAnimationDelay
+PASS element.style.getPropertyValue(&quot;animation-delay&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-animation-delay&quot;)
+PASS element.style.getPropertyCSSValue(&quot;animation-delay&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-animation-delay&quot;)
+PASS getComputedStyle(element).animationDelay
+PASS getComputedStyle(element).webkitAnimationDelay
+PASS getComputedStyle(element).getPropertyValue(&quot;animation-delay&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-animation-delay&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;animation-delay&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-animation-delay&quot;)
+PASS element.style.cssText
+
+Setting &quot;-webkit-animation-delay&quot; to &quot;0.5s&quot;
+PASS element.style.animationDelay
+PASS element.style.webkitAnimationDelay
+PASS element.style.getPropertyValue(&quot;animation-delay&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-animation-delay&quot;)
+PASS element.style.getPropertyCSSValue(&quot;animation-delay&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-animation-delay&quot;)
+PASS getComputedStyle(element).animationDelay
+PASS getComputedStyle(element).webkitAnimationDelay
+PASS getComputedStyle(element).getPropertyValue(&quot;animation-delay&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-animation-delay&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;animation-delay&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-animation-delay&quot;)
+PASS element.style.cssText
+
+Setting &quot;animation-fill-mode&quot; to &quot;forwards&quot;
+PASS element.style.animationFillMode
+PASS element.style.webkitAnimationFillMode
+PASS element.style.getPropertyValue(&quot;animation-fill-mode&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-animation-fill-mode&quot;)
+PASS element.style.getPropertyCSSValue(&quot;animation-fill-mode&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-animation-fill-mode&quot;)
+PASS getComputedStyle(element).animationFillMode
+PASS getComputedStyle(element).webkitAnimationFillMode
+PASS getComputedStyle(element).getPropertyValue(&quot;animation-fill-mode&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-animation-fill-mode&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;animation-fill-mode&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-animation-fill-mode&quot;)
+PASS element.style.cssText
+
+Setting &quot;-webkit-animation-fill-mode&quot; to &quot;forwards&quot;
+PASS element.style.animationFillMode
+PASS element.style.webkitAnimationFillMode
+PASS element.style.getPropertyValue(&quot;animation-fill-mode&quot;)
+PASS element.style.getPropertyValue(&quot;-webkit-animation-fill-mode&quot;)
+PASS element.style.getPropertyCSSValue(&quot;animation-fill-mode&quot;)
+PASS element.style.getPropertyCSSValue(&quot;-webkit-animation-fill-mode&quot;)
+PASS getComputedStyle(element).animationFillMode
+PASS getComputedStyle(element).webkitAnimationFillMode
+PASS getComputedStyle(element).getPropertyValue(&quot;animation-fill-mode&quot;)
+PASS getComputedStyle(element).getPropertyValue(&quot;-webkit-animation-fill-mode&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;animation-fill-mode&quot;)
+PASS getComputedStyle(element).getPropertyCSSValue(&quot;-webkit-animation-fill-mode&quot;)
+PASS element.style.cssText
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastcssprefixedunprefixedvariantstyledeclarationhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/css/prefixed-unprefixed-variant-style-declaration.html (0 => 200769)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css/prefixed-unprefixed-variant-style-declaration.html                                (rev 0)
+++ trunk/LayoutTests/fast/css/prefixed-unprefixed-variant-style-declaration.html        2016-05-12 12:47:21 UTC (rev 200769)
</span><span class="lines">@@ -0,0 +1,84 @@
</span><ins>+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;body&gt;
+&lt;script&gt;
+
+description(&quot;Test the prefixed or the unprefixed variant of a property allows reading from the CSS OM with both the prefixed and unprefixed variant.&quot;);
+
+const PREFIX = &quot;-webkit-&quot;;
+
+function testPropertyVariants(property, value) {
+
+    function accessorForProperty(property) {
+        var firstIndexToTranspose = property.indexOf(PREFIX) === 0 ? 2 : 1;
+        return property.split(&quot;-&quot;).map(function(component, index) {
+            if (index &lt; firstIndexToTranspose)
+                return component;
+            return component.charAt(0).toUpperCase() + component.substr(1);
+        }).join(&quot;&quot;);
+    }
+
+    var accessor = accessorForProperty(property);
+    var prefixedProperty = PREFIX + property;
+    var prefixedAccessor = accessorForProperty(prefixedProperty);
+
+    testProperty(property, property, prefixedProperty, accessor, prefixedAccessor, value);
+    testProperty(prefixedProperty, property, prefixedProperty, accessor, prefixedAccessor, value);
+}
+
+function testProperty(propertyToSet, unprefixedProperty, prefixedProperty, unprefixedAccessor, prefixedAccessor, value) {
+
+    function test(message, actual, expected) {
+        expected = expected || value;
+        if (actual === expected)
+            testPassed(message);
+        else
+            testFailed(`expected ${message} to be &quot;${expected}&quot; but got &quot;${actual}&quot;`);
+    }
+
+    var element = document.body.appendChild(document.createElement(&quot;div&quot;));
+    element.style.setProperty(propertyToSet, value);
+
+    debug(`Setting &quot;${propertyToSet}&quot; to &quot;${value}&quot;`);
+
+    var style = element.style;
+    test(`element.style.${unprefixedAccessor}`, style[unprefixedAccessor]);
+    test(`element.style.${prefixedAccessor}`, style[prefixedAccessor]);
+    test(`element.style.getPropertyValue(&quot;${unprefixedProperty}&quot;)`, style.getPropertyValue(unprefixedProperty));
+    test(`element.style.getPropertyValue(&quot;${prefixedProperty}&quot;)`, style.getPropertyValue(prefixedProperty));
+    test(`element.style.getPropertyCSSValue(&quot;${unprefixedProperty}&quot;)`, style.getPropertyCSSValue(unprefixedProperty).cssText);
+    test(`element.style.getPropertyCSSValue(&quot;${prefixedProperty}&quot;)`, style.getPropertyCSSValue(prefixedProperty).cssText);
+
+    var computedStyle = window.getComputedStyle(element);
+    test(`getComputedStyle(element).${unprefixedAccessor}`, computedStyle[unprefixedAccessor]);
+    test(`getComputedStyle(element).${prefixedAccessor}`, computedStyle[prefixedAccessor]);
+    test(`getComputedStyle(element).getPropertyValue(&quot;${unprefixedProperty}&quot;)`, computedStyle.getPropertyValue(unprefixedProperty));
+    test(`getComputedStyle(element).getPropertyValue(&quot;${prefixedProperty}&quot;)`, computedStyle.getPropertyValue(prefixedProperty));
+    test(`getComputedStyle(element).getPropertyCSSValue(&quot;${unprefixedProperty}&quot;)`, computedStyle.getPropertyCSSValue(unprefixedProperty).cssText);
+    test(`getComputedStyle(element).getPropertyCSSValue(&quot;${prefixedProperty}&quot;)`, computedStyle.getPropertyCSSValue(prefixedProperty).cssText);
+
+    test(`element.style.cssText`, element.style.cssText, `${propertyToSet}: ${value};`);
+
+    element.remove();
+
+    debug(&quot;&quot;);
+}
+
+testPropertyVariants(&quot;transition-property&quot;, &quot;width&quot;);
+testPropertyVariants(&quot;transition-duration&quot;, &quot;1s&quot;);
+testPropertyVariants(&quot;transition-timing-function&quot;, &quot;linear&quot;);
+testPropertyVariants(&quot;transition-delay&quot;, &quot;0.5s&quot;);
+
+testPropertyVariants(&quot;animation-name&quot;, &quot;foo&quot;);
+testPropertyVariants(&quot;animation-duration&quot;, &quot;1s&quot;);
+testPropertyVariants(&quot;animation-timing-function&quot;, &quot;linear&quot;);
+testPropertyVariants(&quot;animation-iteration-count&quot;, &quot;5&quot;);
+testPropertyVariants(&quot;animation-direction&quot;, &quot;reverse&quot;);
+testPropertyVariants(&quot;animation-play-state&quot;, &quot;paused&quot;);
+testPropertyVariants(&quot;animation-delay&quot;, &quot;0.5s&quot;);
+testPropertyVariants(&quot;animation-fill-mode&quot;, &quot;forwards&quot;);
+
+successfullyParsed = true;
+
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkLayoutTestsfastcssshorthandomittedinitialvalueoverridesshorthandexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/css/shorthand-omitted-initial-value-overrides-shorthand-expected.txt (0 => 200769)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css/shorthand-omitted-initial-value-overrides-shorthand-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/css/shorthand-omitted-initial-value-overrides-shorthand-expected.txt        2016-05-12 12:47:21 UTC (rev 200769)
</span><span class="lines">@@ -0,0 +1,25 @@
</span><ins>+Test that initial values implicitly set via a shorthand property override previously defined shorthand properties.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+Transition properties
+PASS transition-property
+PASS transition-duration
+PASS transition-timing-function
+PASS transition-delay
+
+Animation properties
+PASS animation-name
+PASS animation-duration
+PASS animation-timing-function
+PASS animation-iteration-count
+PASS animation-direction
+PASS animation-play-state
+PASS animation-delay
+PASS animation-fill-mode
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastcssshorthandomittedinitialvalueoverridesshorthandhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/css/shorthand-omitted-initial-value-overrides-shorthand.html (0 => 200769)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css/shorthand-omitted-initial-value-overrides-shorthand.html                                (rev 0)
+++ trunk/LayoutTests/fast/css/shorthand-omitted-initial-value-overrides-shorthand.html        2016-05-12 12:47:21 UTC (rev 200769)
</span><span class="lines">@@ -0,0 +1,42 @@
</span><ins>+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;body&gt;
+&lt;script&gt;
+
+description(&quot;Test that initial values implicitly set via a shorthand property override previously defined shorthand properties.&quot;);
+
+function testStyle(cssText, property, expected) {
+    var element = document.body.appendChild(document.createElement(&quot;div&quot;));
+    element.setAttribute(&quot;style&quot;, cssText);
+
+    var actual = getComputedStyle(element).getPropertyValue(property);
+    if (actual === expected)
+        testPassed(property);
+    else
+        testFailed(`expected that setting &quot;${cssText}&quot; would compute ${property} to &quot;${expected}&quot; but got &quot;${actual}&quot;`);
+
+    element.remove();
+}
+
+debug(&quot;Transition properties&quot;);
+testStyle(&quot;transition-property: none; transition: 1s;&quot;, &quot;transition-property&quot;, &quot;all&quot;);
+testStyle(&quot;transition-duration: 1s; transition: none;&quot;, &quot;transition-duration&quot;, &quot;0s&quot;);
+testStyle(&quot;transition-timing-function: linear; transition: none;&quot;, &quot;transition-timing-function&quot;, &quot;ease&quot;);
+testStyle(&quot;transition-delay: 1s; transition: none;&quot;, &quot;transition-delay&quot;, &quot;0s&quot;);
+
+debug(&quot;&quot;);
+debug(&quot;Animation properties&quot;);
+testStyle(&quot;animation-name: foo; animation: 1s;&quot;, &quot;animation-name&quot;, &quot;none&quot;);
+testStyle(&quot;animation-duration: 1s; animation: none;&quot;, &quot;animation-duration&quot;, &quot;0s&quot;);
+testStyle(&quot;animation-timing-function: linear; animation: none;&quot;, &quot;animation-timing-function&quot;, &quot;ease&quot;);
+testStyle(&quot;animation-iteration-count: 5; animation: none;&quot;, &quot;animation-iteration-count&quot;, &quot;1&quot;);
+testStyle(&quot;animation-direction: reverse; animation: none;&quot;, &quot;animation-direction&quot;, &quot;normal&quot;);
+testStyle(&quot;animation-play-state: paused; animation: none;&quot;, &quot;animation-play-state&quot;, &quot;running&quot;);
+testStyle(&quot;animation-delay: 1s; animation: none;&quot;, &quot;animation-delay&quot;, &quot;0s&quot;);
+testStyle(&quot;animation-fill-mode: forwards; animation: none;&quot;, &quot;animation-fill-mode&quot;, &quot;none&quot;);
+
+debug(&quot;&quot;);
+successfullyParsed = true;
+
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (200768 => 200769)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-05-12 12:26:55 UTC (rev 200768)
+++ trunk/Source/WebCore/ChangeLog        2016-05-12 12:47:21 UTC (rev 200769)
</span><span class="lines">@@ -1,3 +1,63 @@
</span><ins>+2016-05-12  Antoine Quint  &lt;graouts@apple.com&gt;
+
+        Correctly handle prefixed and unprefixed variants in CSSStyleDeclaration
+        https://bugs.webkit.org/show_bug.cgi?id=157569
+        &lt;rdar://problem/26223115&gt;
+
+        Reviewed by Dean Jackson.
+
+        Tests: fast/css/prefixed-unprefixed-variant-style-declaration.html
+               fast/css/shorthand-omitted-initial-value-overrides-shorthand.html
+
+        We essentially revert the code added with https://bugs.webkit.org/show_bug.cgi?id=110011
+        which duplicated properties that had a prefixed or unprefixed variant. What we do now is
+        to return the value of the prefixed or unprefixed variant through a CSSStyleDeclaration,
+        but only return the properties specified by the author when reading from the `cssText` property.
+
+        * css/CSSParser.cpp:
+        (WebCore::CSSParser::parseValue):
+        (WebCore::CSSParser::parseTransitionShorthand):
+        (WebCore::CSSParser::addPropertyWithPrefixingVariant): Deleted.
+        * css/CSSParser.h:
+        Remove all code adding duplicated properties for the prefixed or unprefixed
+        variant of properties that exist in both forms.
+
+        * css/CSSPropertyNames.in:
+        Treat transition properties as we do animation properties. 
+
+        * css/PropertySetCSSStyleDeclaration.cpp:
+        (WebCore::PropertySetCSSStyleDeclaration::getPropertyCSSValue):
+        (WebCore::PropertySetCSSStyleDeclaration::getPropertyValue):
+        Make these two methods call into the matching getXXXInternal() variant instead
+        of going through the property set directly so that they would correctly pick up
+        on the prefixed or unprefixed variant should there be one when the specified property
+        is not specified directly.
+
+        (WebCore::PropertySetCSSStyleDeclaration::getPropertyCSSValueInternal):
+        (WebCore::PropertySetCSSStyleDeclaration::getPropertyValueInternal):
+        We used to simply return the value for the given property from the property set, which
+        we still do but now also check if there is prefixed or unprefixed variant for the provided
+        property in case it was absent.
+
+        * css/StyleProperties.cpp:
+        (WebCore::MutableStyleProperties::removeShorthandProperty):
+        Remove all code adding duplicated properties for the prefixed or unprefixed
+        variant of properties that exist in both forms.
+
+        (WebCore::StyleProperties::asText):
+        Drive-by fix to also handle the animation-play-state and -webkit-animation-play-state properties
+        when serializing to the shorthand.
+
+        (WebCore::MutableStyleProperties::removeProperty): Deleted.
+        (WebCore::MutableStyleProperties::removePrefixedOrUnprefixedProperty): Deleted.
+        (WebCore::MutableStyleProperties::setProperty): Deleted.
+        (WebCore::getIndexInShorthandVectorForPrefixingVariant): Deleted.
+        (WebCore::MutableStyleProperties::appendPrefixingVariantProperty): Deleted.
+        (WebCore::MutableStyleProperties::setPrefixingVariantProperty): Deleted.
+        * css/StyleProperties.h:
+        Remove all code adding duplicated properties for the prefixed or unprefixed
+        variant of properties that exist in both forms.
+
</ins><span class="cx"> 2016-05-12  Commit Queue  &lt;commit-queue@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r200766.
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSParser.cpp (200768 => 200769)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSParser.cpp        2016-05-12 12:26:55 UTC (rev 200768)
+++ trunk/Source/WebCore/css/CSSParser.cpp        2016-05-12 12:47:21 UTC (rev 200769)
</span><span class="lines">@@ -1637,24 +1637,6 @@
</span><span class="cx">     return ImmutableStyleProperties::create(results.data(), results.size(), m_context.mode);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void CSSParser::addPropertyWithPrefixingVariant(CSSPropertyID propId, PassRefPtr&lt;CSSValue&gt; value, bool important, bool implicit)
-{
-    RefPtr&lt;CSSValue&gt; val = value.get();
-    addProperty(propId, value, important, implicit);
-
-    CSSPropertyID prefixingVariant = prefixingVariantForPropertyId(propId);
-    if (prefixingVariant == propId)
-        return;
-
-    if (m_currentShorthand) {
-        // We can't use ShorthandScope here as we can already be inside one (e.g we are parsing CSSTransition).
-        m_currentShorthand = prefixingVariantForPropertyId(m_currentShorthand);
-        addProperty(prefixingVariant, val.release(), important, implicit);
-        m_currentShorthand = prefixingVariantForPropertyId(m_currentShorthand);
-    } else
-        addProperty(prefixingVariant, val.release(), important, implicit);
-}
-
</del><span class="cx"> void CSSParser::addProperty(CSSPropertyID propId, PassRefPtr&lt;CSSValue&gt; value, bool important, bool implicit)
</span><span class="cx"> {
</span><span class="cx">     // This property doesn't belong to a shorthand or is a CSS variable (which will be resolved later).
</span><span class="lines">@@ -2766,7 +2748,7 @@
</span><span class="cx">         RefPtr&lt;CSSValue&gt; val;
</span><span class="cx">         AnimationParseContext context;
</span><span class="cx">         if (parseAnimationProperty(propId, val, context)) {
</span><del>-            addPropertyWithPrefixingVariant(propId, val.release(), important);
</del><ins>+            addProperty(propId, val.release(), important);
</ins><span class="cx">             return true;
</span><span class="cx">         }
</span><span class="cx">         return false;
</span><span class="lines">@@ -3995,7 +3977,7 @@
</span><span class="cx"> 
</span><span class="cx">     // Now add all of the properties we found.
</span><span class="cx">     for (i = 0; i &lt; numProperties; ++i)
</span><del>-        addPropertyWithPrefixingVariant(shorthand.properties()[i], values[i].release(), important);
</del><ins>+        addProperty(shorthand.properties()[i], values[i].release(), important);
</ins><span class="cx"> 
</span><span class="cx">     return true;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSParserh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSParser.h (200768 => 200769)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSParser.h        2016-05-12 12:26:55 UTC (rev 200768)
+++ trunk/Source/WebCore/css/CSSParser.h        2016-05-12 12:47:21 UTC (rev 200769)
</span><span class="lines">@@ -132,7 +132,6 @@
</span><span class="cx">     static Ref&lt;ImmutableStyleProperties&gt; parseInlineStyleDeclaration(const String&amp;, Element*);
</span><span class="cx">     std::unique_ptr&lt;MediaQuery&gt; parseMediaQuery(const String&amp;);
</span><span class="cx"> 
</span><del>-    void addPropertyWithPrefixingVariant(CSSPropertyID, PassRefPtr&lt;CSSValue&gt;, bool important, bool implicit = false);
</del><span class="cx">     void addProperty(CSSPropertyID, PassRefPtr&lt;CSSValue&gt;, bool important, bool implicit = false);
</span><span class="cx">     void rollbackLastProperties(int num);
</span><span class="cx">     bool hasProperties() const { return !m_parsedProperties.isEmpty(); }
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSPropertyNamesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSPropertyNames.in (200768 => 200769)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSPropertyNames.in        2016-05-12 12:26:55 UTC (rev 200768)
+++ trunk/Source/WebCore/css/CSSPropertyNames.in        2016-05-12 12:47:21 UTC (rev 200769)
</span><span class="lines">@@ -348,10 +348,10 @@
</span><span class="cx"> text-underline-width [SkipBuilder]
</span><span class="cx"> top [Initial=initialOffset, Converter=LengthOrAuto]
</span><span class="cx"> transition [Longhands=transition-property|transition-duration|transition-timing-function|transition-delay]
</span><del>-transition-delay [SkipBuilder]
-transition-duration [SkipBuilder]
-transition-property [SkipBuilder]
-transition-timing-function [SkipBuilder]
</del><ins>+transition-delay [AnimationProperty, NameForMethods=Delay]
+transition-duration [AnimationProperty, NameForMethods=Duration]
+transition-property [AnimationProperty, NameForMethods=Property]
+transition-timing-function [AnimationProperty, NameForMethods=TimingFunction]
</ins><span class="cx"> 
</span><span class="cx"> unicode-bidi
</span><span class="cx"> unicode-range [SkipBuilder]
</span></span></pre></div>
<a id="trunkSourceWebCorecssPropertySetCSSStyleDeclarationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/PropertySetCSSStyleDeclaration.cpp (200768 => 200769)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/PropertySetCSSStyleDeclaration.cpp        2016-05-12 12:26:55 UTC (rev 200768)
+++ trunk/Source/WebCore/css/PropertySetCSSStyleDeclaration.cpp        2016-05-12 12:47:21 UTC (rev 200769)
</span><span class="lines">@@ -171,7 +171,7 @@
</span><span class="cx">     CSSPropertyID propertyID = cssPropertyID(propertyName);
</span><span class="cx">     if (!propertyID)
</span><span class="cx">         return nullptr;
</span><del>-    return cloneAndCacheForCSSOM(m_propertySet-&gt;getPropertyCSSValue(propertyID).get());
</del><ins>+    return cloneAndCacheForCSSOM(getPropertyCSSValueInternal(propertyID).get());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> String PropertySetCSSStyleDeclaration::getPropertyValue(const String&amp; propertyName)
</span><span class="lines">@@ -182,7 +182,7 @@
</span><span class="cx">     CSSPropertyID propertyID = cssPropertyID(propertyName);
</span><span class="cx">     if (!propertyID)
</span><span class="cx">         return String();
</span><del>-    return m_propertySet-&gt;getPropertyValue(propertyID);
</del><ins>+    return getPropertyValueInternal(propertyID);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> String PropertySetCSSStyleDeclaration::getPropertyPriority(const String&amp; propertyName)
</span><span class="lines">@@ -264,12 +264,28 @@
</span><span class="cx"> 
</span><span class="cx"> RefPtr&lt;CSSValue&gt; PropertySetCSSStyleDeclaration::getPropertyCSSValueInternal(CSSPropertyID propertyID)
</span><span class="cx"> {
</span><del>-    return m_propertySet-&gt;getPropertyCSSValue(propertyID);
</del><ins>+    RefPtr&lt;CSSValue&gt; value = m_propertySet-&gt;getPropertyCSSValue(propertyID);
+    if (value)
+        return value;
+
+    CSSPropertyID prefixingVariant = prefixingVariantForPropertyId(propertyID);
+    if (prefixingVariant != propertyID)
+        return m_propertySet-&gt;getPropertyCSSValue(prefixingVariant);
+
+    return nullptr;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> String PropertySetCSSStyleDeclaration::getPropertyValueInternal(CSSPropertyID propertyID)
</span><del>-{ 
-    return m_propertySet-&gt;getPropertyValue(propertyID);
</del><ins>+{
+    String value = m_propertySet-&gt;getPropertyValue(propertyID);
+    if (!value.isEmpty())
+        return value;
+
+    CSSPropertyID prefixingVariant = prefixingVariantForPropertyId(propertyID);
+    if (prefixingVariant != propertyID)
+        return m_propertySet-&gt;getPropertyValue(prefixingVariant);
+
+    return String();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool PropertySetCSSStyleDeclaration::setPropertyInternal(CSSPropertyID propertyID, const String&amp; value, bool important, ExceptionCode&amp; ec)
</span></span></pre></div>
<a id="trunkSourceWebCorecssStylePropertiescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/StyleProperties.cpp (200768 => 200769)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/StyleProperties.cpp        2016-05-12 12:26:55 UTC (rev 200768)
+++ trunk/Source/WebCore/css/StyleProperties.cpp        2016-05-12 12:47:21 UTC (rev 200769)
</span><span class="lines">@@ -638,15 +638,7 @@
</span><span class="cx">     StylePropertyShorthand shorthand = shorthandForProperty(propertyID);
</span><span class="cx">     if (!shorthand.length())
</span><span class="cx">         return false;
</span><del>-
-    bool ret = removePropertiesInSet(shorthand.properties(), shorthand.length());
-
-    CSSPropertyID prefixingVariant = prefixingVariantForPropertyId(propertyID);
-    if (prefixingVariant == propertyID)
-        return ret;
-
-    StylePropertyShorthand shorthandPrefixingVariant = shorthandForProperty(prefixingVariant);
-    return removePropertiesInSet(shorthandPrefixingVariant.properties(), shorthandPrefixingVariant.length());
</del><ins>+    return removePropertiesInSet(shorthand.properties(), shorthand.length());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool MutableStyleProperties::removeProperty(CSSPropertyID propertyID, String* returnText)
</span><span class="lines">@@ -672,8 +664,6 @@
</span><span class="cx">     // and sweeping them when the vector grows too big.
</span><span class="cx">     m_propertyVector.remove(foundPropertyIndex);
</span><span class="cx"> 
</span><del>-    removePrefixedOrUnprefixedProperty(propertyID);
-
</del><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -696,14 +686,6 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MutableStyleProperties::removePrefixedOrUnprefixedProperty(CSSPropertyID propertyID)
-{
-    int foundPropertyIndex = findPropertyIndex(prefixingVariantForPropertyId(propertyID));
-    if (foundPropertyIndex == -1)
-        return;
-    m_propertyVector.remove(foundPropertyIndex);
-}
-
</del><span class="cx"> bool StyleProperties::propertyIsImportant(CSSPropertyID propertyID) const
</span><span class="cx"> {
</span><span class="cx">     int foundPropertyIndex = findPropertyIndex(propertyID);
</span><span class="lines">@@ -801,42 +783,14 @@
</span><span class="cx">                 return false;
</span><span class="cx"> 
</span><span class="cx">             *toReplace = property;
</span><del>-            setPrefixingVariantProperty(property);
</del><span class="cx">             return true;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return appendPrefixingVariantProperty(property);
-}
-
-static unsigned getIndexInShorthandVectorForPrefixingVariant(const CSSProperty&amp; property, CSSPropertyID prefixingVariant)
-{
-    if (!property.isSetFromShorthand())
-        return 0;
-
-    CSSPropertyID prefixedShorthand = prefixingVariantForPropertyId(property.shorthandID());
-    return indexOfShorthandForLonghand(prefixedShorthand, matchingShorthandsForLonghand(prefixingVariant));
-}
-
-bool MutableStyleProperties::appendPrefixingVariantProperty(const CSSProperty&amp; property)
-{
</del><span class="cx">     m_propertyVector.append(property);
</span><del>-    CSSPropertyID prefixingVariant = prefixingVariantForPropertyId(property.id());
-    if (prefixingVariant == property.id())
-        return true;
-
-    m_propertyVector.append(CSSProperty(prefixingVariant, property.value(), property.isImportant(), property.isSetFromShorthand(), getIndexInShorthandVectorForPrefixingVariant(property, prefixingVariant), property.metadata().m_implicit));
</del><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MutableStyleProperties::setPrefixingVariantProperty(const CSSProperty&amp; property)
-{
-    CSSPropertyID prefixingVariant = prefixingVariantForPropertyId(property.id());
-    CSSProperty* toReplace = findCSSPropertyWithID(prefixingVariant);
-    if (toReplace &amp;&amp; prefixingVariant != property.id())
-        *toReplace = CSSProperty(prefixingVariant, property.value(), property.isImportant(), property.isSetFromShorthand(), getIndexInShorthandVectorForPrefixingVariant(property, prefixingVariant), property.metadata().m_implicit);
-}
-
</del><span class="cx"> bool MutableStyleProperties::setProperty(CSSPropertyID propertyID, CSSValueID identifier, bool important)
</span><span class="cx"> {
</span><span class="cx">     return setProperty(CSSProperty(propertyID, CSSValuePool::singleton().createIdentifierValue(identifier), important));
</span><span class="lines">@@ -925,6 +879,7 @@
</span><span class="cx">             case CSSPropertyAnimationIterationCount:
</span><span class="cx">             case CSSPropertyAnimationDirection:
</span><span class="cx">             case CSSPropertyAnimationFillMode:
</span><ins>+            case CSSPropertyAnimationPlayState:
</ins><span class="cx">                 shorthandPropertyID = CSSPropertyAnimation;
</span><span class="cx">                 break;
</span><span class="cx">             case CSSPropertyBackgroundPositionX:
</span><span class="lines">@@ -1024,6 +979,7 @@
</span><span class="cx">             case CSSPropertyWebkitAnimationIterationCount:
</span><span class="cx">             case CSSPropertyWebkitAnimationDirection:
</span><span class="cx">             case CSSPropertyWebkitAnimationFillMode:
</span><ins>+            case CSSPropertyWebkitAnimationPlayState:
</ins><span class="cx">                 shorthandPropertyID = CSSPropertyWebkitAnimation;
</span><span class="cx">                 break;
</span><span class="cx">             case CSSPropertyFlexDirection:
</span></span></pre></div>
<a id="trunkSourceWebCorecssStylePropertiesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/StyleProperties.h (200768 => 200769)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/StyleProperties.h        2016-05-12 12:26:55 UTC (rev 200768)
+++ trunk/Source/WebCore/css/StyleProperties.h        2016-05-12 12:47:21 UTC (rev 200769)
</span><span class="lines">@@ -211,12 +211,9 @@
</span><span class="cx">     // These do not. FIXME: This is too messy, we can do better.
</span><span class="cx">     bool setProperty(CSSPropertyID, CSSValueID identifier, bool important = false);
</span><span class="cx">     bool setProperty(CSSPropertyID, CSSPropertyID identifier, bool important = false);
</span><del>-    bool appendPrefixingVariantProperty(const CSSProperty&amp;);
-    void setPrefixingVariantProperty(const CSSProperty&amp;);
</del><span class="cx">     bool setProperty(const CSSProperty&amp;, CSSProperty* slot = nullptr);
</span><span class="cx"> 
</span><span class="cx">     bool removeProperty(CSSPropertyID, String* returnText = nullptr);
</span><del>-    void removePrefixedOrUnprefixedProperty(CSSPropertyID);
</del><span class="cx">     void removeBlockProperties();
</span><span class="cx">     bool removePropertiesInSet(const CSSPropertyID* set, unsigned length);
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>