<!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>[192420] branches/safari-601.1.46-branch</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/192420">192420</a></dd>
<dt>Author</dt> <dd>matthew_hanson@apple.com</dd>
<dt>Date</dt> <dd>2015-11-13 09:02:56 -0800 (Fri, 13 Nov 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/188512">r188512</a>. rdar://problem/23432371</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#branchessafari601146branchLayoutTestsChangeLog">branches/safari-601.1.46-branch/LayoutTests/ChangeLog</a></li>
<li><a href="#branchessafari601146branchSourceWebCoreCMakeListstxt">branches/safari-601.1.46-branch/Source/WebCore/CMakeLists.txt</a></li>
<li><a href="#branchessafari601146branchSourceWebCoreChangeLog">branches/safari-601.1.46-branch/Source/WebCore/ChangeLog</a></li>
<li><a href="#branchessafari601146branchSourceWebCoreWebCorevcxprojWebCorevcxproj">branches/safari-601.1.46-branch/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj</a></li>
<li><a href="#branchessafari601146branchSourceWebCoreWebCorevcxprojWebCorevcxprojfilters">branches/safari-601.1.46-branch/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters</a></li>
<li><a href="#branchessafari601146branchSourceWebCoreWebCorexcodeprojprojectpbxproj">branches/safari-601.1.46-branch/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#branchessafari601146branchSourceWebCorecssCSSComputedStyleDeclarationcpp">branches/safari-601.1.46-branch/Source/WebCore/css/CSSComputedStyleDeclaration.cpp</a></li>
<li><a href="#branchessafari601146branchSourceWebCorecssCSSParsercpp">branches/safari-601.1.46-branch/Source/WebCore/css/CSSParser.cpp</a></li>
<li><a href="#branchessafari601146branchSourceWebCorecssCSSParserh">branches/safari-601.1.46-branch/Source/WebCore/css/CSSParser.h</a></li>
<li><a href="#branchessafari601146branchSourceWebCorecssCSSPrimitiveValueh">branches/safari-601.1.46-branch/Source/WebCore/css/CSSPrimitiveValue.h</a></li>
<li><a href="#branchessafari601146branchSourceWebCorecssCSSPropertyNamesin">branches/safari-601.1.46-branch/Source/WebCore/css/CSSPropertyNames.in</a></li>
<li><a href="#branchessafari601146branchSourceWebCorecssCSSValueKeywordsin">branches/safari-601.1.46-branch/Source/WebCore/css/CSSValueKeywords.in</a></li>
<li><a href="#branchessafari601146branchSourceWebCorecssStyleBuilderCustomh">branches/safari-601.1.46-branch/Source/WebCore/css/StyleBuilderCustom.h</a></li>
<li><a href="#branchessafari601146branchSourceWebCorerenderingstyleRenderStylecpp">branches/safari-601.1.46-branch/Source/WebCore/rendering/style/RenderStyle.cpp</a></li>
<li><a href="#branchessafari601146branchSourceWebCorerenderingstyleRenderStyleh">branches/safari-601.1.46-branch/Source/WebCore/rendering/style/RenderStyle.h</a></li>
<li><a href="#branchessafari601146branchSourceWebCorerenderingstyleStyleAllInOnecpp">branches/safari-601.1.46-branch/Source/WebCore/rendering/style/StyleAllInOne.cpp</a></li>
<li><a href="#branchessafari601146branchSourceWebCorerenderingstyleStyleRareNonInheritedDatacpp">branches/safari-601.1.46-branch/Source/WebCore/rendering/style/StyleRareNonInheritedData.cpp</a></li>
<li><a href="#branchessafari601146branchSourceWebCorerenderingstyleStyleRareNonInheritedDatah">branches/safari-601.1.46-branch/Source/WebCore/rendering/style/StyleRareNonInheritedData.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#branchessafari601146branchLayoutTestsfastcsswillchangeparsingexpectedtxt">branches/safari-601.1.46-branch/LayoutTests/fast/css/will-change-parsing-expected.txt</a></li>
<li><a href="#branchessafari601146branchLayoutTestsfastcsswillchangeparsinghtml">branches/safari-601.1.46-branch/LayoutTests/fast/css/will-change-parsing.html</a></li>
<li><a href="#branchessafari601146branchSourceWebCorerenderingstyleWillChangeDatacpp">branches/safari-601.1.46-branch/Source/WebCore/rendering/style/WillChangeData.cpp</a></li>
<li><a href="#branchessafari601146branchSourceWebCorerenderingstyleWillChangeDatah">branches/safari-601.1.46-branch/Source/WebCore/rendering/style/WillChangeData.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="branchessafari601146branchLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1.46-branch/LayoutTests/ChangeLog (192419 => 192420)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1.46-branch/LayoutTests/ChangeLog        2015-11-13 17:02:48 UTC (rev 192419)
+++ branches/safari-601.1.46-branch/LayoutTests/ChangeLog        2015-11-13 17:02:56 UTC (rev 192420)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2015-11-13  Matthew Hanson  &lt;matthew_hanson@apple.com&gt;
+
+        Merge r188512. rdar://problem/23432371
+
+    2015-08-14  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+            Implement parsing for CSS will-change
+            https://bugs.webkit.org/show_bug.cgi?id=148052
+
+            Reviewed by Dean Jackson.
+
+            will-change parsing test.
+
+            * fast/css/will-change-parsing-expected.txt: Added.
+            * fast/css/will-change-parsing.html: Added.
+
</ins><span class="cx"> 2015-10-29  Lucas Forschler  &lt;lforschler@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Merge r191706. rdar://problem/23319282
</span></span></pre></div>
<a id="branchessafari601146branchLayoutTestsfastcsswillchangeparsingexpectedtxt"></a>
<div class="addfile"><h4>Added: branches/safari-601.1.46-branch/LayoutTests/fast/css/will-change-parsing-expected.txt (0 => 192420)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1.46-branch/LayoutTests/fast/css/will-change-parsing-expected.txt                                (rev 0)
+++ branches/safari-601.1.46-branch/LayoutTests/fast/css/will-change-parsing-expected.txt        2015-11-13 17:02:56 UTC (rev 192420)
</span><span class="lines">@@ -0,0 +1,33 @@
</span><ins>+This tests checks that will-change parses correctly.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+PASS testComputedStyle(&quot;will-change:;&quot;) is &quot;auto&quot;
+PASS testComputedStyle(&quot;will-change: contents, all;&quot;) is &quot;auto&quot;
+PASS testComputedStyle(&quot;will-change: contents;&quot;) is &quot;contents&quot;
+PASS test(&quot;will-change: inherit;&quot;) is &quot;inherit&quot;
+PASS test(&quot;will-change: initial;&quot;) is &quot;initial&quot;
+PASS test(&quot;will-change: all;&quot;) is &quot;&quot;
+PASS test(&quot;will-change: none;&quot;) is &quot;&quot;
+PASS test(&quot;will-change: default;&quot;) is &quot;&quot;
+PASS test(&quot;will-change: will-change;&quot;) is &quot;&quot;
+PASS test(&quot;will-change: auto;&quot;) is &quot;auto&quot;
+PASS test(&quot;will-change: auto, contents;&quot;) is &quot;&quot;
+PASS test(&quot;will-change: scroll-position;&quot;) is &quot;scroll-position&quot;
+PASS test(&quot;will-change: contents;&quot;) is &quot;contents&quot;
+PASS test(&quot;will-change: scroll-position, scroll-position;&quot;) is &quot;scroll-position, scroll-position&quot;
+PASS test(&quot;will-change: contents, scroll-position, transform;&quot;) is &quot;contents, scroll-position, transform&quot;
+PASS test(&quot;will-change: contents, transform, scroll-position, transform;&quot;) is &quot;contents, transform, scroll-position, transform&quot;
+PASS test(&quot;will-change: , background;&quot;) is &quot;&quot;
+PASS test(&quot;will-change: background, transform;&quot;) is &quot;background, transform&quot;
+PASS test(&quot;will-change: background transform;&quot;) is &quot;&quot;
+PASS test(&quot;will-change: background, all;&quot;) is &quot;&quot;
+PASS test(&quot;will-change: background, will-change;&quot;) is &quot;&quot;
+PASS test(&quot;will-change: unknown-property;&quot;) is &quot;unknown-property&quot;
+PASS test(&quot;will-change: transform, initial;&quot;) is &quot;&quot;
+PASS test(&quot;will-change: default;&quot;) is &quot;&quot;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="branchessafari601146branchLayoutTestsfastcsswillchangeparsinghtml"></a>
<div class="addfile"><h4>Added: branches/safari-601.1.46-branch/LayoutTests/fast/css/will-change-parsing.html (0 => 192420)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1.46-branch/LayoutTests/fast/css/will-change-parsing.html                                (rev 0)
+++ branches/safari-601.1.46-branch/LayoutTests/fast/css/will-change-parsing.html        2015-11-13 17:02:56 UTC (rev 192420)
</span><span class="lines">@@ -0,0 +1,66 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+    &lt;head&gt;
+        &lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+    &lt;/head&gt;
+    &lt;body&gt;
+        &lt;script&gt;
+            description(&quot;This tests checks that will-change parses correctly.&quot;);
+
+            function test(value)
+            {
+                var div = document.createElement(&quot;div&quot;);
+                div.setAttribute(&quot;style&quot;, value);
+                document.body.appendChild(div);
+
+                var result = div.style.getPropertyValue(&quot;will-change&quot;);
+                document.body.removeChild(div);
+                return result;
+            }
+
+            function testComputedStyle(value)
+            {
+                var div = document.createElement(&quot;div&quot;);
+                div.setAttribute(&quot;style&quot;, value);
+                document.body.appendChild(div);
+
+                var result = window.getComputedStyle(div).willChange;
+                document.body.removeChild(div);
+                return result;
+            }
+
+            shouldBe('testComputedStyle(&quot;will-change:;&quot;)', '&quot;auto&quot;');
+            shouldBe('testComputedStyle(&quot;will-change: contents, all;&quot;)', '&quot;auto&quot;');
+            shouldBe('testComputedStyle(&quot;will-change: contents;&quot;)', '&quot;contents&quot;');
+            
+            shouldBe('test(&quot;will-change: inherit;&quot;)', '&quot;inherit&quot;');
+            shouldBe('test(&quot;will-change: initial;&quot;)', '&quot;initial&quot;');
+            shouldBe('test(&quot;will-change: all;&quot;)', '&quot;&quot;');
+            shouldBe('test(&quot;will-change: none;&quot;)', '&quot;&quot;');
+            shouldBe('test(&quot;will-change: default;&quot;)', '&quot;&quot;');
+            shouldBe('test(&quot;will-change: will-change;&quot;)', '&quot;&quot;');
+
+            shouldBe('test(&quot;will-change: auto;&quot;)', '&quot;auto&quot;');
+            shouldBe('test(&quot;will-change: auto, contents;&quot;)', '&quot;&quot;');
+            shouldBe('test(&quot;will-change: scroll-position;&quot;)', '&quot;scroll-position&quot;');
+            shouldBe('test(&quot;will-change: contents;&quot;)', '&quot;contents&quot;');
+            
+            shouldBe('test(&quot;will-change: scroll-position, scroll-position;&quot;)', '&quot;scroll-position, scroll-position&quot;');
+
+            shouldBe('test(&quot;will-change: contents, scroll-position, transform;&quot;)', '&quot;contents, scroll-position, transform&quot;');
+            shouldBe('test(&quot;will-change: contents, transform, scroll-position, transform;&quot;)', '&quot;contents, transform, scroll-position, transform&quot;');
+
+            shouldBe('test(&quot;will-change: , background;&quot;)', '&quot;&quot;');
+            shouldBe('test(&quot;will-change: background, transform;&quot;)', '&quot;background, transform&quot;');
+            shouldBe('test(&quot;will-change: background transform;&quot;)', '&quot;&quot;');
+            shouldBe('test(&quot;will-change: background, all;&quot;)', '&quot;&quot;');
+            shouldBe('test(&quot;will-change: background, will-change;&quot;)', '&quot;&quot;');
+
+            shouldBe('test(&quot;will-change: unknown-property;&quot;)', '&quot;unknown-property&quot;');
+            
+            shouldBe('test(&quot;will-change: transform, initial;&quot;)', '&quot;&quot;');
+            shouldBe('test(&quot;will-change: default;&quot;)', '&quot;&quot;');
+        &lt;/script&gt;
+        &lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+    &lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="branchessafari601146branchSourceWebCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1.46-branch/Source/WebCore/CMakeLists.txt (192419 => 192420)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1.46-branch/Source/WebCore/CMakeLists.txt        2015-11-13 17:02:48 UTC (rev 192419)
+++ branches/safari-601.1.46-branch/Source/WebCore/CMakeLists.txt        2015-11-13 17:02:56 UTC (rev 192420)
</span><span class="lines">@@ -2499,6 +2499,7 @@
</span><span class="cx">     rendering/style/StyleSurroundData.cpp
</span><span class="cx">     rendering/style/StyleTransformData.cpp
</span><span class="cx">     rendering/style/StyleVisualData.cpp
</span><ins>+    rendering/style/WillChangeData.cpp
</ins><span class="cx"> 
</span><span class="cx">     rendering/svg/RenderSVGBlock.cpp
</span><span class="cx">     rendering/svg/RenderSVGContainer.cpp
</span></span></pre></div>
<a id="branchessafari601146branchSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1.46-branch/Source/WebCore/ChangeLog (192419 => 192420)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1.46-branch/Source/WebCore/ChangeLog        2015-11-13 17:02:48 UTC (rev 192419)
+++ branches/safari-601.1.46-branch/Source/WebCore/ChangeLog        2015-11-13 17:02:56 UTC (rev 192420)
</span><span class="lines">@@ -1,3 +1,79 @@
</span><ins>+2015-11-13  Matthew Hanson  &lt;matthew_hanson@apple.com&gt;
+
+        Merge r188512. rdar://problem/23432371
+
+    2015-08-14  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+            Implement parsing for CSS will-change
+            https://bugs.webkit.org/show_bug.cgi?id=148052
+
+            Reviewed by Dean Jackson.
+
+            Syntax is
+                will-change: auto | &lt;animateable-feature&gt;#
+            where
+                &lt;animateable-feature&gt; = scroll-position | contents | &lt;custom-ident&gt;
+
+            To support this, add WillChangeData which stores a vector of &quot;feature&quot;
+            and CSS property squished into 16 bits. This is stored in rareNonInheritedData.
+            If null or an empty list, the property value is 'auto'. The list preserves
+            unknown properties.
+
+            Test: fast/css/will-change-parsing.html
+
+            * CMakeLists.txt:
+            * WebCore.vcxproj/WebCore.vcxproj:
+            * WebCore.vcxproj/WebCore.vcxproj.filters:
+            * WebCore.xcodeproj/project.pbxproj:
+            * css/CSSComputedStyleDeclaration.cpp:
+            (WebCore::getWillChangePropertyValue):
+            (WebCore::ComputedStyleExtractor::propertyValue):
+            * css/CSSParser.cpp:
+            (WebCore::CSSParser::parseValue):
+            (WebCore::isValidGridPositionCustomIdent): Renamed from isValidCustomIdent(),
+            since it's grid-specific.
+            (WebCore::CSSParser::parseIntegerOrCustomIdentFromGridPosition):
+            (WebCore::valueIsCSSKeyword): Returns true for the &quot;CSS-wide&quot; keywords like
+            &quot;initial&quot;, &quot;inherit&quot; and &quot;default&quot;.
+            (WebCore::CSSParser::parseFontFamily):
+            (WebCore::isValidWillChangeAnimatableFeature):
+            (WebCore::CSSParser::parseWillChange):
+            (WebCore::isValidCustomIdent): Deleted.
+            * css/CSSParser.h:
+            * css/CSSPrimitiveValue.h:
+            (WebCore::CSSPrimitiveValue::isPropertyID): New utility function.
+            * css/CSSPropertyNames.in:
+            * css/CSSValueKeywords.in:
+            * css/StyleBuilderCustom.h:
+            (WebCore::StyleBuilderCustom::applyValueWillChange):
+            * rendering/style/RenderStyle.cpp:
+            (WebCore::RenderStyle::setWillChange):
+            * rendering/style/RenderStyle.h:
+            * rendering/style/StyleAllInOne.cpp:
+            * rendering/style/StyleRareNonInheritedData.cpp:
+            (WebCore::StyleRareNonInheritedData::StyleRareNonInheritedData):
+            (WebCore::StyleRareNonInheritedData::operator==):
+            (WebCore::StyleRareNonInheritedData::willChangeDataEquivalent):
+            * rendering/style/StyleRareNonInheritedData.h:
+            * rendering/style/WillChangeData.cpp: Added.
+            (WebCore::WillChangeData::operator==):
+            (WebCore::WillChangeData::containsScrollPosition):
+            (WebCore::WillChangeData::containsContents):
+            (WebCore::WillChangeData::containsProperty):
+            (WebCore::WillChangeData::addFeature):
+            (WebCore::WillChangeData::featureAt):
+            * rendering/style/WillChangeData.h: Added.
+            (WebCore::WillChangeData::create):
+            (WebCore::WillChangeData::operator!=):
+            (WebCore::WillChangeData::isAuto):
+            (WebCore::WillChangeData::numFeatures):
+            (WebCore::WillChangeData::WillChangeData):
+            (WebCore::WillChangeData::AnimatableFeature::feature):
+            (WebCore::WillChangeData::AnimatableFeature::property):
+            (WebCore::WillChangeData::AnimatableFeature::featurePropertyPair):
+            (WebCore::WillChangeData::AnimatableFeature::AnimatableFeature):
+            (WebCore::WillChangeData::AnimatableFeature::operator==):
+
</ins><span class="cx"> 2015-11-12  Matthew Hanson  &lt;matthew_hanson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Merge r190574. rdar://problem/22846841
</span></span></pre></div>
<a id="branchessafari601146branchSourceWebCoreWebCorevcxprojWebCorevcxproj"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1.46-branch/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj (192419 => 192420)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1.46-branch/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj        2015-11-13 17:02:48 UTC (rev 192419)
+++ branches/safari-601.1.46-branch/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj        2015-11-13 17:02:56 UTC (rev 192420)
</span><span class="lines">@@ -12292,6 +12292,20 @@
</span><span class="cx">       &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Production|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
</span><span class="cx">       &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Production|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\rendering\style\WillChangeData.cpp&quot;&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Debug|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Debug|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Debug_WinCairo|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='DebugSuffix|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Release|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Release|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Release_WinCairo|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Production|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Production|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+    &lt;/ClCompile&gt;
</ins><span class="cx">     &lt;ClCompile Include=&quot;..\rendering\style\SVGRenderStyle.cpp&quot;&gt;
</span><span class="cx">       &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Debug|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
</span><span class="cx">       &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Debug|x64'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
</span><span class="lines">@@ -21045,6 +21059,7 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\rendering\style\StyleTransformData.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\rendering\style\StyleVariableData.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\rendering\style\StyleVisualData.h&quot; /&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\rendering\style\WillChangeData.h&quot; /&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\rendering\style\SVGRenderStyle.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\rendering\style\SVGRenderStyleDefs.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\rendering\svg\RenderSVGEllipse.h&quot; /&gt;
</span></span></pre></div>
<a id="branchessafari601146branchSourceWebCoreWebCorevcxprojWebCorevcxprojfilters"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1.46-branch/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters (192419 => 192420)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1.46-branch/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters        2015-11-13 17:02:48 UTC (rev 192419)
+++ branches/safari-601.1.46-branch/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters        2015-11-13 17:02:56 UTC (rev 192420)
</span><span class="lines">@@ -2832,6 +2832,9 @@
</span><span class="cx">     &lt;ClCompile Include=&quot;..\rendering\style\StyleVisualData.cpp&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;rendering\style&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\rendering\style\WillChangeData.cpp&quot;&gt;
+      &lt;Filter&gt;rendering\style&lt;/Filter&gt;
+    &lt;/ClCompile&gt;
</ins><span class="cx">     &lt;ClCompile Include=&quot;..\rendering\style\SVGRenderStyle.cpp&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;rendering\style&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><span class="lines">@@ -9890,6 +9893,9 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\rendering\style\StyleVisualData.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;rendering\style&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\rendering\style\WillChangeData.h&quot;&gt;
+      &lt;Filter&gt;rendering\style&lt;/Filter&gt;
+    &lt;/ClInclude&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\rendering\style\SVGRenderStyle.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;rendering\style&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span></span></pre></div>
<a id="branchessafari601146branchSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1.46-branch/Source/WebCore/WebCore.xcodeproj/project.pbxproj (192419 => 192420)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1.46-branch/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2015-11-13 17:02:48 UTC (rev 192419)
+++ branches/safari-601.1.46-branch/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2015-11-13 17:02:56 UTC (rev 192420)
</span><span class="lines">@@ -471,6 +471,8 @@
</span><span class="cx">                 0F13163E16ED0CC80035CC04 /* PlatformCAFilters.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F13163D16ED0CC80035CC04 /* PlatformCAFilters.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0F13164016ED0CDE0035CC04 /* PlatformCAFiltersCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0F13163F16ED0CDE0035CC04 /* PlatformCAFiltersCocoa.mm */; };
</span><span class="cx">                 0F15DA8A0F3AAEE70000CE47 /* AnimationControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F15DA890F3AAEE70000CE47 /* AnimationControllerPrivate.h */; };
</span><ins>+                0F15ED5B1B7EC7C500EDDFEB /* WillChangeData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F15ED591B7EC7C500EDDFEB /* WillChangeData.cpp */; };
+                0F15ED5C1B7EC7C500EDDFEB /* WillChangeData.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F15ED5A1B7EC7C500EDDFEB /* WillChangeData.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 0F1774801378B772009DA76A /* ScrollAnimatorIOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F17747E1378B771009DA76A /* ScrollAnimatorIOS.h */; };
</span><span class="cx">                 0F1774811378B772009DA76A /* ScrollAnimatorIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0F17747F1378B772009DA76A /* ScrollAnimatorIOS.mm */; };
</span><span class="cx">                 0F3C725E1974874B00AEDD0C /* ImageSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F3C725D1974874B00AEDD0C /* ImageSource.cpp */; };
</span><span class="lines">@@ -7578,6 +7580,8 @@
</span><span class="cx">                 0F13163D16ED0CC80035CC04 /* PlatformCAFilters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlatformCAFilters.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F13163F16ED0CDE0035CC04 /* PlatformCAFiltersCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PlatformCAFiltersCocoa.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F15DA890F3AAEE70000CE47 /* AnimationControllerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AnimationControllerPrivate.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                0F15ED591B7EC7C500EDDFEB /* WillChangeData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WillChangeData.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                0F15ED5A1B7EC7C500EDDFEB /* WillChangeData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WillChangeData.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 0F17747E1378B771009DA76A /* ScrollAnimatorIOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScrollAnimatorIOS.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F17747F1378B772009DA76A /* ScrollAnimatorIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ScrollAnimatorIOS.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F3C725D1974874B00AEDD0C /* ImageSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ImageSource.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -21606,6 +21610,8 @@
</span><span class="cx">                                 BC2274760E8366E200E7F975 /* SVGRenderStyleDefs.cpp */,
</span><span class="cx">                                 BC2274770E8366E200E7F975 /* SVGRenderStyleDefs.h */,
</span><span class="cx">                                 448B1B780F3A2F9B0047A9E2 /* TextSizeAdjustment.h */,
</span><ins>+                                0F15ED591B7EC7C500EDDFEB /* WillChangeData.cpp */,
+                                0F15ED5A1B7EC7C500EDDFEB /* WillChangeData.h */,
</ins><span class="cx">                         );
</span><span class="cx">                         path = style;
</span><span class="cx">                         sourceTree = &quot;&lt;group&gt;&quot;;
</span><span class="lines">@@ -25532,6 +25538,7 @@
</span><span class="cx">                                 A31C4E5416E02B40002F7957 /* JSOESTextureHalfFloat.h in Headers */,
</span><span class="cx">                                 31078CCA1880AACE008099DC /* JSOESTextureHalfFloatLinear.h in Headers */,
</span><span class="cx">                                 77A17AA712F28B2A004E02F6 /* JSOESVertexArrayObject.h in Headers */,
</span><ins>+                                0F15ED5C1B7EC7C500EDDFEB /* WillChangeData.h in Headers */,
</ins><span class="cx">                                 FDF6BAF9134A4C9800822920 /* JSOfflineAudioCompletionEvent.h in Headers */,
</span><span class="cx">                                 FDA9326716703BA9008982DC /* JSOfflineAudioContext.h in Headers */,
</span><span class="cx">                                 FDEA6243152102E200479DF0 /* JSOscillatorNode.h in Headers */,
</span><span class="lines">@@ -29279,6 +29286,7 @@
</span><span class="cx">                                 B2FA3DAC0AB75A6F000E5AC4 /* JSSVGMatrix.cpp in Sources */,
</span><span class="cx">                                 B2FA3DAE0AB75A6F000E5AC4 /* JSSVGMetadataElement.cpp in Sources */,
</span><span class="cx">                                 B27B28290CEF0C0700D39D54 /* JSSVGMissingGlyphElement.cpp in Sources */,
</span><ins>+                                0F15ED5B1B7EC7C500EDDFEB /* WillChangeData.cpp in Sources */,
</ins><span class="cx">                                 4496E3A2139813CB003EE32A /* JSSVGMPathElement.cpp in Sources */,
</span><span class="cx">                                 8542A7980AE5C94300DF58DF /* JSSVGNumber.cpp in Sources */,
</span><span class="cx">                                 B2FA3DB00AB75A6F000E5AC4 /* JSSVGNumberList.cpp in Sources */,
</span></span></pre></div>
<a id="branchessafari601146branchSourceWebCorecssCSSComputedStyleDeclarationcpp"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1.46-branch/Source/WebCore/css/CSSComputedStyleDeclaration.cpp (192419 => 192420)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1.46-branch/Source/WebCore/css/CSSComputedStyleDeclaration.cpp        2015-11-13 17:02:48 UTC (rev 192419)
+++ branches/safari-601.1.46-branch/Source/WebCore/css/CSSComputedStyleDeclaration.cpp        2015-11-13 17:02:56 UTC (rev 192420)
</span><span class="lines">@@ -67,6 +67,7 @@
</span><span class="cx"> #include &quot;WebKitCSSFilterValue.h&quot;
</span><span class="cx"> #include &quot;WebKitCSSTransformValue.h&quot;
</span><span class="cx"> #include &quot;WebKitFontFamilyNames.h&quot;
</span><ins>+#include &quot;WillChangeData.h&quot;
</ins><span class="cx"> #include &lt;wtf/NeverDestroyed.h&gt;
</span><span class="cx"> #include &lt;wtf/text/StringBuilder.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -1160,6 +1161,33 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+static Ref&lt;CSSValue&gt; getWillChangePropertyValue(const WillChangeData* willChangeData)
+{
+    if (!willChangeData || !willChangeData-&gt;numFeatures())
+        return cssValuePool().createIdentifierValue(CSSValueAuto);
+
+    auto list = CSSValueList::createCommaSeparated();
+    for (size_t i = 0; i &lt; willChangeData-&gt;numFeatures(); ++i) {
+        WillChangeData::FeaturePropertyPair feature = willChangeData-&gt;featureAt(i);
+        switch (feature.first) {
+        case WillChangeData::ScrollPosition:
+            list.get().append(cssValuePool().createIdentifierValue(CSSValueScrollPosition));
+            break;
+        case WillChangeData::Contents:
+            list.get().append(cssValuePool().createIdentifierValue(CSSValueContents));
+            break;
+        case WillChangeData::Property:
+            list.get().append(cssValuePool().createIdentifierValue(feature.second));
+            break;
+        case WillChangeData::Invalid:
+            ASSERT_NOT_REACHED();
+            break;
+        }
+    }
+
+    return WTF::move(list);
+}
+
</ins><span class="cx"> static Ref&lt;CSSValueList&gt; getDelayValue(const AnimationList* animList)
</span><span class="cx"> {
</span><span class="cx">     auto list = CSSValueList::createCommaSeparated();
</span><span class="lines">@@ -2649,6 +2677,9 @@
</span><span class="cx">                 return zoomAdjustedPixelValue(sizingBox(*renderer).width(), *style);
</span><span class="cx">             }
</span><span class="cx">             return zoomAdjustedPixelValueForLength(style-&gt;width(), *style);
</span><ins>+        case CSSPropertyWillChange:
+            return getWillChangePropertyValue(style-&gt;willChange());
+            break;
</ins><span class="cx">         case CSSPropertyWordBreak:
</span><span class="cx">             return cssValuePool().createValue(style-&gt;wordBreak());
</span><span class="cx">         case CSSPropertyWordSpacing:
</span></span></pre></div>
<a id="branchessafari601146branchSourceWebCorecssCSSParsercpp"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1.46-branch/Source/WebCore/css/CSSParser.cpp (192419 => 192420)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1.46-branch/Source/WebCore/css/CSSParser.cpp        2015-11-13 17:02:48 UTC (rev 192419)
+++ branches/safari-601.1.46-branch/Source/WebCore/css/CSSParser.cpp        2015-11-13 17:02:56 UTC (rev 192420)
</span><span class="lines">@@ -2794,6 +2794,13 @@
</span><span class="cx">         break;
</span><span class="cx">     // End of CSS3 properties
</span><span class="cx"> 
</span><ins>+    case CSSPropertyWillChange: // auto | [scroll-position | contents | &lt;custom-ident&gt;]#
+        if (id == CSSValueAuto)
+            validPrimitive = true;
+        else
+            return parseWillChange(important);
+        break;
+
</ins><span class="cx">     // Apple specific properties.  These will never be standardized and are purely to
</span><span class="cx">     // support custom WebKit-based Apple applications.
</span><span class="cx">     case CSSPropertyWebkitLineClamp:
</span><span class="lines">@@ -5227,7 +5234,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(CSS_GRID_LAYOUT)
</span><del>-static inline bool isValidCustomIdent(const CSSParserValue&amp; value)
</del><ins>+static inline bool isValidGridPositionCustomIdent(const CSSParserValue&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     return value.unit == CSSPrimitiveValue::CSS_IDENT &amp;&amp; value.id != CSSValueSpan &amp;&amp; value.id != CSSValueAuto;
</span><span class="cx"> }
</span><span class="lines">@@ -5239,14 +5246,14 @@
</span><span class="cx">     if (validateUnit(valueWithCalculation, FInteger) &amp;&amp; valueWithCalculation.value().fValue) {
</span><span class="cx">         numericValue = createPrimitiveNumericValue(valueWithCalculation);
</span><span class="cx">         CSSParserValue* nextValue = m_valueList-&gt;next();
</span><del>-        if (nextValue &amp;&amp; isValidCustomIdent(*nextValue)) {
</del><ins>+        if (nextValue &amp;&amp; isValidGridPositionCustomIdent(*nextValue)) {
</ins><span class="cx">             gridLineName = createPrimitiveStringValue(*nextValue);
</span><span class="cx">             m_valueList-&gt;next();
</span><span class="cx">         }
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (isValidCustomIdent(valueWithCalculation)) {
</del><ins>+    if (isValidGridPositionCustomIdent(valueWithCalculation)) {
</ins><span class="cx">         gridLineName = createPrimitiveStringValue(valueWithCalculation);
</span><span class="cx">         if (CSSParserValue* nextValue = m_valueList-&gt;next()) {
</span><span class="cx">             ValueWithCalculation nextValueWithCalculation(*nextValue);
</span><span class="lines">@@ -6683,6 +6690,12 @@
</span><span class="cx">     CSSValueList&amp; m_list;
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+static bool valueIsCSSKeyword(const CSSParserValue&amp; value)
+{
+    // FIXME: when we add &quot;unset&quot;, we should handle it here.
+    return value.id == CSSValueInitial || value.id == CSSValueInherit || value.id == CSSValueDefault;
+}
+
</ins><span class="cx"> PassRefPtr&lt;CSSValueList&gt; CSSParser::parseFontFamily()
</span><span class="cx"> {
</span><span class="cx">     RefPtr&lt;CSSValueList&gt; list = CSSValueList::createCommaSeparated();
</span><span class="lines">@@ -6699,7 +6712,7 @@
</span><span class="cx">             ((nextValue-&gt;id &gt;= CSSValueSerif &amp;&amp; nextValue-&gt;id &lt;= CSSValueWebkitBody) ||
</span><span class="cx">             (nextValue-&gt;unit == CSSPrimitiveValue::CSS_STRING || nextValue-&gt;unit == CSSPrimitiveValue::CSS_IDENT));
</span><span class="cx"> 
</span><del>-        bool valueIsKeyword = value-&gt;id == CSSValueInitial || value-&gt;id == CSSValueInherit || value-&gt;id == CSSValueDefault;
</del><ins>+        bool valueIsKeyword = valueIsCSSKeyword(*value);
</ins><span class="cx">         if (valueIsKeyword &amp;&amp; !inFamily) {
</span><span class="cx">             if (nextValBreaksFont)
</span><span class="cx">                 value = m_valueList-&gt;next();
</span><span class="lines">@@ -10460,6 +10473,59 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static inline bool isValidWillChangeAnimatableFeature(const CSSParserValue&amp; value)
+{
+    if (value.id == CSSValueNone || value.id == CSSValueAuto || value.id == CSSValueAll)
+        return false;
+
+    if (valueIsCSSKeyword(value))
+        return false;
+
+    if (cssPropertyID(value.string) == CSSPropertyWillChange)
+        return false;
+
+    return true;
+}
+
+bool CSSParser::parseWillChange(bool important)
+{
+    RefPtr&lt;CSSValueList&gt; willChangePropertyValues = CSSValueList::createCommaSeparated();
+
+    bool expectComma = false;
+    for (CSSParserValue* value = m_valueList-&gt;current(); value; value = m_valueList-&gt;next()) {
+        if (expectComma) {
+            if (!isComma(value))
+                return false;
+            
+            expectComma = false;
+            continue;
+        }
+
+        if (value-&gt;unit != CSSPrimitiveValue::CSS_IDENT)
+            return false;
+
+        if (!isValidWillChangeAnimatableFeature(*value))
+            return false;
+
+        RefPtr&lt;CSSValue&gt; cssValue;
+        if (value-&gt;id == CSSValueScrollPosition || value-&gt;id == CSSValueContents)
+            cssValue = cssValuePool().createIdentifierValue(value-&gt;id);
+        else {
+            CSSPropertyID propertyID = cssPropertyID(value-&gt;string);
+            if (propertyID != CSSPropertyInvalid)
+                cssValue = cssValuePool().createIdentifierValue(propertyID);
+            else // This might be a property we don't support.
+                cssValue = createPrimitiveStringValue(*value);
+        }
+
+        willChangePropertyValues-&gt;append(cssValue.releaseNonNull());
+        expectComma = true;
+    }
+
+    addProperty(CSSPropertyWillChange, willChangePropertyValues.release(), important);
+    return true;
+}
+
</ins><span class="cx"> RefPtr&lt;CSSCalcValue&gt; CSSParser::parseCalculation(CSSParserValue&amp; value, CalculationPermittedValueRange range)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(isCalculation(value));
</span></span></pre></div>
<a id="branchessafari601146branchSourceWebCorecssCSSParserh"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1.46-branch/Source/WebCore/css/CSSParser.h (192419 => 192420)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1.46-branch/Source/WebCore/css/CSSParser.h        2015-11-13 17:02:48 UTC (rev 192419)
+++ branches/safari-601.1.46-branch/Source/WebCore/css/CSSParser.h        2015-11-13 17:02:56 UTC (rev 192420)
</span><span class="lines">@@ -345,6 +345,8 @@
</span><span class="cx"> 
</span><span class="cx">     bool parseFontVariantLigatures(bool important);
</span><span class="cx"> 
</span><ins>+    bool parseWillChange(bool important);
+
</ins><span class="cx">     // Faster than doing a new/delete each time since it keeps one vector.
</span><span class="cx">     std::unique_ptr&lt;Vector&lt;std::unique_ptr&lt;CSSParserSelector&gt;&gt;&gt; createSelectorVector();
</span><span class="cx">     void recycleSelectorVector(std::unique_ptr&lt;Vector&lt;std::unique_ptr&lt;CSSParserSelector&gt;&gt;&gt;);
</span></span></pre></div>
<a id="branchessafari601146branchSourceWebCorecssCSSPrimitiveValueh"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1.46-branch/Source/WebCore/css/CSSPrimitiveValue.h (192419 => 192420)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1.46-branch/Source/WebCore/css/CSSPrimitiveValue.h        2015-11-13 17:02:48 UTC (rev 192419)
+++ branches/safari-601.1.46-branch/Source/WebCore/css/CSSPrimitiveValue.h        2015-11-13 17:02:56 UTC (rev 192420)
</span><span class="lines">@@ -206,6 +206,7 @@
</span><span class="cx"> #if ENABLE(CSS_SCROLL_SNAP)
</span><span class="cx">     bool isLengthRepeat() const { return m_primitiveUnitType == CSS_LENGTH_REPEAT; }
</span><span class="cx"> #endif
</span><ins>+    bool isPropertyID() const { return m_primitiveUnitType == CSS_PROPERTY_ID; }
</ins><span class="cx">     bool isRGBColor() const { return m_primitiveUnitType == CSS_RGBCOLOR; }
</span><span class="cx">     bool isShape() const { return m_primitiveUnitType == CSS_SHAPE; }
</span><span class="cx">     bool isString() const { return m_primitiveUnitType == CSS_STRING; }
</span></span></pre></div>
<a id="branchessafari601146branchSourceWebCorecssCSSPropertyNamesin"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1.46-branch/Source/WebCore/css/CSSPropertyNames.in (192419 => 192420)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1.46-branch/Source/WebCore/css/CSSPropertyNames.in        2015-11-13 17:02:48 UTC (rev 192419)
+++ branches/safari-601.1.46-branch/Source/WebCore/css/CSSPropertyNames.in        2015-11-13 17:02:56 UTC (rev 192420)
</span><span class="lines">@@ -349,6 +349,7 @@
</span><span class="cx"> white-space [Inherited]
</span><span class="cx"> widows [Inherited, AutoFunctions]
</span><span class="cx"> width [Initial=initialSize, Converter=LengthSizing]
</span><ins>+will-change [Custom=Value]
</ins><span class="cx"> word-break [Inherited]
</span><span class="cx"> -epub-word-break = word-break
</span><span class="cx"> word-spacing [Inherited, ConditionalConverter=WordSpacing]
</span></span></pre></div>
<a id="branchessafari601146branchSourceWebCorecssCSSValueKeywordsin"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1.46-branch/Source/WebCore/css/CSSValueKeywords.in (192419 => 192420)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1.46-branch/Source/WebCore/css/CSSValueKeywords.in        2015-11-13 17:02:48 UTC (rev 192419)
+++ branches/safari-601.1.46-branch/Source/WebCore/css/CSSValueKeywords.in        2015-11-13 17:02:56 UTC (rev 192420)
</span><span class="lines">@@ -1130,4 +1130,8 @@
</span><span class="cx"> 
</span><span class="cx"> // font-synthesis
</span><span class="cx"> weight
</span><del>-style
</del><span class="cx">\ No newline at end of file
</span><ins>+style
+
+// will-change
+scroll-position
+contents
</ins></span></pre></div>
<a id="branchessafari601146branchSourceWebCorecssStyleBuilderCustomh"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1.46-branch/Source/WebCore/css/StyleBuilderCustom.h (192419 => 192420)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1.46-branch/Source/WebCore/css/StyleBuilderCustom.h        2015-11-13 17:02:48 UTC (rev 192419)
+++ branches/safari-601.1.46-branch/Source/WebCore/css/StyleBuilderCustom.h        2015-11-13 17:02:56 UTC (rev 192420)
</span><span class="lines">@@ -49,6 +49,7 @@
</span><span class="cx"> #include &quot;StyleFontSizeFunctions.h&quot;
</span><span class="cx"> #include &quot;StyleGeneratedImage.h&quot;
</span><span class="cx"> #include &quot;StyleResolver.h&quot;
</span><ins>+#include &quot;WillChangeData.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -133,6 +134,7 @@
</span><span class="cx">     static void applyInitialWebkitScrollSnapPointsY(StyleResolver&amp;);
</span><span class="cx">     static void applyInheritWebkitScrollSnapPointsY(StyleResolver&amp;);
</span><span class="cx"> #endif
</span><ins>+    static void applyValueWillChange(StyleResolver&amp;, CSSValue&amp;);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     static void resetEffectiveZoom(StyleResolver&amp;);
</span><span class="lines">@@ -1709,6 +1711,37 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+inline void StyleBuilderCustom::applyValueWillChange(StyleResolver&amp; styleResolver, CSSValue&amp; value)
+{
+    if (is&lt;CSSPrimitiveValue&gt;(value)) {
+        ASSERT(downcast&lt;CSSPrimitiveValue&gt;(value).getValueID() == CSSValueAuto);
+        styleResolver.style()-&gt;setWillChange(nullptr);
+        return;
+    }
+
+    Ref&lt;WillChangeData&gt; willChange = WillChangeData::create();
+    for (auto&amp; item : downcast&lt;CSSValueList&gt;(value)) {
+        if (!is&lt;CSSPrimitiveValue&gt;(item.get()))
+            continue;
+
+        const auto&amp; primitiveValue = downcast&lt;CSSPrimitiveValue&gt;(item.get());
+        switch (primitiveValue.getValueID()) {
+        case CSSValueScrollPosition:
+            willChange-&gt;addFeature(WillChangeData::Feature::ScrollPosition);
+            break;
+        case CSSValueContents:
+            willChange-&gt;addFeature(WillChangeData::Feature::Contents);
+            break;
+        default:
+            if (primitiveValue.isPropertyID())
+                willChange-&gt;addFeature(WillChangeData::Feature::Property, primitiveValue.getPropertyID());
+            break;
+        }
+    }
+
+    styleResolver.style()-&gt;setWillChange(WTF::move(willChange));
+}
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif // StyleBuilderCustom_h
</span></span></pre></div>
<a id="branchessafari601146branchSourceWebCorerenderingstyleRenderStylecpp"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1.46-branch/Source/WebCore/rendering/style/RenderStyle.cpp (192419 => 192420)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1.46-branch/Source/WebCore/rendering/style/RenderStyle.cpp        2015-11-13 17:02:48 UTC (rev 192419)
+++ branches/safari-601.1.46-branch/Source/WebCore/rendering/style/RenderStyle.cpp        2015-11-13 17:02:56 UTC (rev 192420)
</span><span class="lines">@@ -40,6 +40,7 @@
</span><span class="cx"> #include &quot;StyleResolver.h&quot;
</span><span class="cx"> #include &quot;StyleScrollSnapPoints.h&quot;
</span><span class="cx"> #include &quot;StyleSelfAlignmentData.h&quot;
</span><ins>+#include &quot;WillChangeData.h&quot;
</ins><span class="cx"> #include &lt;wtf/MathExtras.h&gt;
</span><span class="cx"> #include &lt;wtf/StdLibExtras.h&gt;
</span><span class="cx"> #include &lt;algorithm&gt;
</span><span class="lines">@@ -925,6 +926,15 @@
</span><span class="cx">     rareInheritedData.access()-&gt;quotes = q;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RenderStyle::setWillChange(PassRefPtr&lt;WillChangeData&gt; willChangeData)
+{
+    if (rareNonInheritedData-&gt;m_willChange == willChangeData
+        || (rareNonInheritedData-&gt;m_willChange &amp;&amp; willChangeData &amp;&amp; *rareNonInheritedData-&gt;m_willChange == *willChangeData))
+        return;
+
+    rareNonInheritedData.access()-&gt;m_willChange = WTF::move(willChangeData);
+}
+
</ins><span class="cx"> void RenderStyle::clearCursorList()
</span><span class="cx"> {
</span><span class="cx">     if (rareInheritedData-&gt;cursorData)
</span></span></pre></div>
<a id="branchessafari601146branchSourceWebCorerenderingstyleRenderStyleh"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1.46-branch/Source/WebCore/rendering/style/RenderStyle.h (192419 => 192420)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1.46-branch/Source/WebCore/rendering/style/RenderStyle.h        2015-11-13 17:02:48 UTC (rev 192419)
+++ branches/safari-601.1.46-branch/Source/WebCore/rendering/style/RenderStyle.h        2015-11-13 17:02:56 UTC (rev 192420)
</span><span class="lines">@@ -113,6 +113,7 @@
</span><span class="cx"> class StyleInheritedData;
</span><span class="cx"> class StyleResolver;
</span><span class="cx"> class TransformationMatrix;
</span><ins>+class WillChangeData;
</ins><span class="cx"> 
</span><span class="cx"> struct ScrollSnapPoints;
</span><span class="cx"> 
</span><span class="lines">@@ -1777,7 +1778,7 @@
</span><span class="cx">     }
</span><span class="cx">     ClipPathOperation* clipPath() const { return rareNonInheritedData-&gt;m_clipPath.get(); }
</span><span class="cx"> 
</span><del>-    static ClipPathOperation* initialClipPath() { return 0; }
</del><ins>+    static ClipPathOperation* initialClipPath() { return nullptr; }
</ins><span class="cx"> 
</span><span class="cx">     bool hasContent() const { return contentData(); }
</span><span class="cx">     const ContentData* contentData() const { return rareNonInheritedData-&gt;m_content.get(); }
</span><span class="lines">@@ -1797,6 +1798,9 @@
</span><span class="cx">     QuotesData* quotes() const { return rareInheritedData-&gt;quotes.get(); }
</span><span class="cx">     void setQuotes(PassRefPtr&lt;QuotesData&gt;);
</span><span class="cx"> 
</span><ins>+    WillChangeData* willChange() const { return rareNonInheritedData-&gt;m_willChange.get(); }
+    void setWillChange(PassRefPtr&lt;WillChangeData&gt;);
+
</ins><span class="cx">     const AtomicString&amp; hyphenString() const;
</span><span class="cx"> 
</span><span class="cx">     bool inheritedNotEqual(const RenderStyle*) const;
</span><span class="lines">@@ -2003,6 +2007,8 @@
</span><span class="cx">     static QuotesData* initialQuotes() { return nullptr; }
</span><span class="cx">     static const AtomicString&amp; initialContentAltText() { return emptyAtom; }
</span><span class="cx"> 
</span><ins>+    static WillChangeData* initialWillChange() { return nullptr; }
+
</ins><span class="cx"> #if ENABLE(CSS_SCROLL_SNAP)
</span><span class="cx">     static ScrollSnapType initialScrollSnapType() { return ScrollSnapType::None; }
</span><span class="cx">     static ScrollSnapPoints* initialScrollSnapPointsX() { return nullptr; }
</span></span></pre></div>
<a id="branchessafari601146branchSourceWebCorerenderingstyleStyleAllInOnecpp"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1.46-branch/Source/WebCore/rendering/style/StyleAllInOne.cpp (192419 => 192420)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1.46-branch/Source/WebCore/rendering/style/StyleAllInOne.cpp        2015-11-13 17:02:48 UTC (rev 192419)
+++ branches/safari-601.1.46-branch/Source/WebCore/rendering/style/StyleAllInOne.cpp        2015-11-13 17:02:56 UTC (rev 192420)
</span><span class="lines">@@ -57,3 +57,4 @@
</span><span class="cx"> #include &quot;StyleSurroundData.cpp&quot;
</span><span class="cx"> #include &quot;StyleTransformData.cpp&quot;
</span><span class="cx"> #include &quot;StyleVisualData.cpp&quot;
</span><ins>+#include &quot;WillChangeData.cpp&quot;
</ins></span></pre></div>
<a id="branchessafari601146branchSourceWebCorerenderingstyleStyleRareNonInheritedDatacpp"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1.46-branch/Source/WebCore/rendering/style/StyleRareNonInheritedData.cpp (192419 => 192420)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1.46-branch/Source/WebCore/rendering/style/StyleRareNonInheritedData.cpp        2015-11-13 17:02:48 UTC (rev 192419)
+++ branches/safari-601.1.46-branch/Source/WebCore/rendering/style/StyleRareNonInheritedData.cpp        2015-11-13 17:02:56 UTC (rev 192420)
</span><span class="lines">@@ -59,8 +59,8 @@
</span><span class="cx"> #if ENABLE(CSS_SCROLL_SNAP)
</span><span class="cx">     , m_scrollSnapPoints(StyleScrollSnapPoints::create())
</span><span class="cx"> #endif
</span><ins>+    , m_willChange(RenderStyle::initialWillChange())
</ins><span class="cx">     , m_mask(FillLayer(MaskFillLayer))
</span><del>-    , m_pageSize()
</del><span class="cx"> #if ENABLE(CSS_SHAPES)
</span><span class="cx">     , m_shapeOutside(RenderStyle::initialShapeOutside())
</span><span class="cx">     , m_shapeMargin(RenderStyle::initialShapeMargin())
</span><span class="lines">@@ -136,6 +136,7 @@
</span><span class="cx">     , m_counterDirectives(o.m_counterDirectives ? clone(*o.m_counterDirectives) : nullptr)
</span><span class="cx">     , m_altText(o.m_altText)
</span><span class="cx">     , m_boxShadow(o.m_boxShadow ? std::make_unique&lt;ShadowData&gt;(*o.m_boxShadow) : nullptr)
</span><ins>+    , m_willChange(o.m_willChange)
</ins><span class="cx">     , m_boxReflect(o.m_boxReflect)
</span><span class="cx">     , m_animations(o.m_animations ? std::make_unique&lt;AnimationList&gt;(*o.m_animations) : nullptr)
</span><span class="cx">     , m_transitions(o.m_transitions ? std::make_unique&lt;AnimationList&gt;(*o.m_transitions) : nullptr)
</span><span class="lines">@@ -234,6 +235,7 @@
</span><span class="cx">         &amp;&amp; contentDataEquivalent(o)
</span><span class="cx">         &amp;&amp; counterDataEquivalent(o)
</span><span class="cx">         &amp;&amp; shadowDataEquivalent(o)
</span><ins>+        &amp;&amp; willChangeDataEquivalent(o)
</ins><span class="cx">         &amp;&amp; reflectionDataEquivalent(o)
</span><span class="cx">         &amp;&amp; animationDataEquivalent(o)
</span><span class="cx">         &amp;&amp; transitionDataEquivalent(o)
</span><span class="lines">@@ -245,7 +247,7 @@
</span><span class="cx">         &amp;&amp; m_shapeMargin == o.m_shapeMargin
</span><span class="cx">         &amp;&amp; m_shapeImageThreshold == o.m_shapeImageThreshold
</span><span class="cx"> #endif
</span><del>-        &amp;&amp; m_clipPath == o.m_clipPath
</del><ins>+        &amp;&amp; m_clipPath == o.m_clipPath // FIXME: This needs to compare values.
</ins><span class="cx">         &amp;&amp; m_textDecorationColor == o.m_textDecorationColor
</span><span class="cx">         &amp;&amp; m_visitedLinkTextDecorationColor == o.m_visitedLinkTextDecorationColor
</span><span class="cx">         &amp;&amp; m_visitedLinkBackgroundColor == o.m_visitedLinkBackgroundColor
</span><span class="lines">@@ -323,6 +325,16 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool StyleRareNonInheritedData::willChangeDataEquivalent(const StyleRareNonInheritedData&amp; o) const
+{
+    if (m_willChange != o.m_willChange) {
+        if (!m_willChange || !o.m_willChange)
+            return false;
+        return *m_willChange == *o.m_willChange;
+    }
+    return true;
+}
+
</ins><span class="cx"> bool StyleRareNonInheritedData::reflectionDataEquivalent(const StyleRareNonInheritedData&amp; o) const
</span><span class="cx"> {
</span><span class="cx">     if (m_boxReflect != o.m_boxReflect) {
</span></span></pre></div>
<a id="branchessafari601146branchSourceWebCorerenderingstyleStyleRareNonInheritedDatah"></a>
<div class="modfile"><h4>Modified: branches/safari-601.1.46-branch/Source/WebCore/rendering/style/StyleRareNonInheritedData.h (192419 => 192420)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1.46-branch/Source/WebCore/rendering/style/StyleRareNonInheritedData.h        2015-11-13 17:02:48 UTC (rev 192419)
+++ branches/safari-601.1.46-branch/Source/WebCore/rendering/style/StyleRareNonInheritedData.h        2015-11-13 17:02:56 UTC (rev 192420)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #define StyleRareNonInheritedData_h
</span><span class="cx"> 
</span><span class="cx"> #include &quot;BasicShapes.h&quot;
</span><ins>+#include &quot;CSSPropertyNames.h&quot;
</ins><span class="cx"> #include &quot;ClipPathOperation.h&quot;
</span><span class="cx"> #include &quot;CounterDirectives.h&quot;
</span><span class="cx"> #include &quot;CursorData.h&quot;
</span><span class="lines">@@ -36,6 +37,7 @@
</span><span class="cx"> #include &quot;ShapeValue.h&quot;
</span><span class="cx"> #include &quot;StyleContentAlignmentData.h&quot;
</span><span class="cx"> #include &quot;StyleSelfAlignmentData.h&quot;
</span><ins>+#include &quot;WillChangeData.h&quot;
</ins><span class="cx"> #include &lt;memory&gt;
</span><span class="cx"> #include &lt;wtf/PassRefPtr.h&gt;
</span><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span><span class="lines">@@ -92,6 +94,7 @@
</span><span class="cx">     bool contentDataEquivalent(const StyleRareNonInheritedData&amp;) const;
</span><span class="cx">     bool counterDataEquivalent(const StyleRareNonInheritedData&amp;) const;
</span><span class="cx">     bool shadowDataEquivalent(const StyleRareNonInheritedData&amp;) const;
</span><ins>+    bool willChangeDataEquivalent(const StyleRareNonInheritedData&amp;) const;
</ins><span class="cx">     bool reflectionDataEquivalent(const StyleRareNonInheritedData&amp;) const;
</span><span class="cx">     bool animationDataEquivalent(const StyleRareNonInheritedData&amp;) const;
</span><span class="cx">     bool transitionDataEquivalent(const StyleRareNonInheritedData&amp;) const;
</span><span class="lines">@@ -144,6 +147,8 @@
</span><span class="cx">     String m_altText;
</span><span class="cx"> 
</span><span class="cx">     std::unique_ptr&lt;ShadowData&gt; m_boxShadow; // For box-shadow decorations.
</span><ins>+
+    RefPtr&lt;WillChangeData&gt; m_willChange; // Null indicates 'auto'.
</ins><span class="cx">     
</span><span class="cx">     RefPtr&lt;StyleReflection&gt; m_boxReflect;
</span><span class="cx"> 
</span></span></pre></div>
<a id="branchessafari601146branchSourceWebCorerenderingstyleWillChangeDatacpp"></a>
<div class="addfile"><h4>Added: branches/safari-601.1.46-branch/Source/WebCore/rendering/style/WillChangeData.cpp (0 => 192420)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1.46-branch/Source/WebCore/rendering/style/WillChangeData.cpp                                (rev 0)
+++ branches/safari-601.1.46-branch/Source/WebCore/rendering/style/WillChangeData.cpp        2015-11-13 17:02:56 UTC (rev 192420)
</span><span class="lines">@@ -0,0 +1,77 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;WillChangeData.h&quot;
+
+namespace WebCore {
+
+bool WillChangeData::operator==(const WillChangeData&amp; other) const
+{
+    return m_animatableFeatures == other.m_animatableFeatures;
+}
+
+bool WillChangeData::containsScrollPosition() const
+{
+    for (const auto&amp; feature : m_animatableFeatures) {
+        if (feature.feature() == ScrollPosition)
+            return true;
+    }
+    return false;
+}
+
+bool WillChangeData::containsContents() const
+{
+    for (const auto&amp; feature : m_animatableFeatures) {
+        if (feature.feature() == Contents)
+            return true;
+    }
+    return false;
+}
+
+bool WillChangeData::containsProperty(CSSPropertyID property) const
+{
+    for (const auto&amp; feature : m_animatableFeatures) {
+        if (feature.property() == property)
+            return true;
+    }
+    return false;
+}
+
+void WillChangeData::addFeature(Feature feature, CSSPropertyID propertyID)
+{
+    ASSERT(feature == Property || propertyID == CSSPropertyInvalid);
+    m_animatableFeatures.append(AnimatableFeature(feature, propertyID));
+}
+
+WillChangeData::FeaturePropertyPair WillChangeData::featureAt(size_t index) const
+{
+    if (index &gt;= m_animatableFeatures.size())
+        return FeaturePropertyPair(Invalid, CSSPropertyInvalid);
+
+    return m_animatableFeatures[index].featurePropertyPair();
+}
+
+} // namespace WebCore
</ins></span></pre></div>
<a id="branchessafari601146branchSourceWebCorerenderingstyleWillChangeDatah"></a>
<div class="addfile"><h4>Added: branches/safari-601.1.46-branch/Source/WebCore/rendering/style/WillChangeData.h (0 => 192420)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-601.1.46-branch/Source/WebCore/rendering/style/WillChangeData.h                                (rev 0)
+++ branches/safari-601.1.46-branch/Source/WebCore/rendering/style/WillChangeData.h        2015-11-13 17:02:56 UTC (rev 192420)
</span><span class="lines">@@ -0,0 +1,125 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WillChangeData_h
+#define WillChangeData_h
+
+#include &quot;CSSPropertyNames.h&quot;
+#include &quot;RenderStyleConstants.h&quot;
+#include &lt;wtf/RefCounted.h&gt;
+#include &lt;wtf/Vector.h&gt;
+
+namespace WebCore {
+
+class WillChangeData : public RefCounted&lt;WillChangeData&gt; {
+    WTF_MAKE_FAST_ALLOCATED;
+public:
+    static Ref&lt;WillChangeData&gt; create()
+    {
+        return adoptRef(*new WillChangeData);
+    }
+    
+    bool operator==(const WillChangeData&amp;) const;
+    bool operator!=(const WillChangeData&amp; o) const
+    {
+        return !(*this == o);
+    }
+
+    bool isAuto() const { return m_animatableFeatures.isEmpty(); }
+    size_t numFeatures() const { return m_animatableFeatures.size(); }
+
+    bool containsScrollPosition() const;
+    bool containsContents() const;
+    bool containsProperty(CSSPropertyID) const;
+
+    enum Feature {
+        ScrollPosition,
+        Contents,
+        Property,
+        Invalid
+    };
+
+    void addFeature(Feature, CSSPropertyID = CSSPropertyInvalid);
+    
+    typedef std::pair&lt;Feature, CSSPropertyID&gt; FeaturePropertyPair;
+    FeaturePropertyPair featureAt(size_t) const;
+
+private:
+    WillChangeData()
+    {
+    }
+
+    struct AnimatableFeature {
+        static const int numCSSPropertyIDBits = 14;
+        COMPILE_ASSERT(numCSSProperties &lt; (1 &lt;&lt; numCSSPropertyIDBits), CSSPropertyID_should_fit_in_14_bits);
+
+        unsigned m_feature : 2;
+        unsigned m_cssPropertyID : numCSSPropertyIDBits;
+
+        Feature feature() const
+        {
+            return static_cast&lt;Feature&gt;(m_feature);
+        }
+
+        CSSPropertyID property() const
+        {
+            return feature() == Property ? static_cast&lt;CSSPropertyID&gt;(m_cssPropertyID) : CSSPropertyInvalid;
+        }
+        
+        FeaturePropertyPair featurePropertyPair() const
+        {
+            return FeaturePropertyPair(feature(), property());
+        }
+
+        AnimatableFeature(Feature willChange, CSSPropertyID willChangeProperty = CSSPropertyInvalid)
+        {
+            switch (willChange) {
+            case Property:
+                ASSERT(willChangeProperty != CSSPropertyInvalid);
+                m_cssPropertyID = willChangeProperty;
+                FALLTHROUGH;
+            case ScrollPosition:
+            case Contents:
+                m_feature = static_cast&lt;unsigned&gt;(willChange);
+                break;
+            case Invalid:
+                ASSERT_NOT_REACHED();
+                break;
+            }
+        }
+        
+        bool operator==(const AnimatableFeature&amp; other) const
+        {
+            return m_feature == other.m_feature &amp;&amp; m_cssPropertyID == other.m_cssPropertyID;
+        }
+    };
+
+    Vector&lt;AnimatableFeature, 1&gt; m_animatableFeatures;
+};
+
+
+} // namespace WebCore
+
+#endif // WillChangeData_h
</ins></span></pre>
</div>
</div>

</body>
</html>