<!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>[207372] 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/207372">207372</a></dd>
<dt>Author</dt> <dd>antti@apple.com</dd>
<dt>Date</dt> <dd>2016-10-15 01:27:19 -0700 (Sat, 15 Oct 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>100% CPU on homedepot.com page
https://bugs.webkit.org/show_bug.cgi?id=163452
&lt;rdar://problem/28730708&gt;

Reviewed by Simon Fraser.

Source/WebCore:

The site has a keyframe animation on body. Currently this causes the animation to invalidate the
style of the entire document.

Animations use SyntheticStyleChange to invalidate elements when animation progresses and currently
that causes full subtree invalidation. However animation only ever affect individual elements and
the normal style resolution mechanism should be able to deal with things like inheritance as needed.

Test: fast/animation/animation-style-update-size.html

* dom/Document.cpp:
(WebCore::Document::recalcStyle):
* dom/Document.h:
(WebCore::Document::lastStyleUpdateSizeForTesting):

    Testing support.

* style/StyleTreeResolver.cpp:
(WebCore::Style::TreeResolver::resolveElement):

    Don't force subtree style resolution for SyntheticStyleChange.

* style/StyleUpdate.h:
(WebCore::Style::Update::size):
* testing/Internals.cpp:
(WebCore::Internals::lastStyleUpdateSize):
* testing/Internals.h:
* testing/Internals.idl:

LayoutTests:

* fast/animation/animation-style-update-size-expected.txt: Added.
* fast/animation/animation-style-update-size.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoredomDocumentcpp">trunk/Source/WebCore/dom/Document.cpp</a></li>
<li><a href="#trunkSourceWebCoredomDocumenth">trunk/Source/WebCore/dom/Document.h</a></li>
<li><a href="#trunkSourceWebCorestyleStyleTreeResolvercpp">trunk/Source/WebCore/style/StyleTreeResolver.cpp</a></li>
<li><a href="#trunkSourceWebCorestyleStyleUpdateh">trunk/Source/WebCore/style/StyleUpdate.h</a></li>
<li><a href="#trunkSourceWebCoretestingInternalscpp">trunk/Source/WebCore/testing/Internals.cpp</a></li>
<li><a href="#trunkSourceWebCoretestingInternalsh">trunk/Source/WebCore/testing/Internals.h</a></li>
<li><a href="#trunkSourceWebCoretestingInternalsidl">trunk/Source/WebCore/testing/Internals.idl</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastanimationanimationstyleupdatesizeexpectedtxt">trunk/LayoutTests/fast/animation/animation-style-update-size-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastanimationanimationstyleupdatesizehtml">trunk/LayoutTests/fast/animation/animation-style-update-size.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (207371 => 207372)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-10-15 07:22:03 UTC (rev 207371)
+++ trunk/LayoutTests/ChangeLog        2016-10-15 08:27:19 UTC (rev 207372)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2016-10-14  Antti Koivisto  &lt;antti@apple.com&gt;
+
+        100% CPU on homedepot.com page
+        https://bugs.webkit.org/show_bug.cgi?id=163452
+        &lt;rdar://problem/28730708&gt;
+
+        Reviewed by Simon Fraser.
+
+        * fast/animation/animation-style-update-size-expected.txt: Added.
+        * fast/animation/animation-style-update-size.html: Added.
+
</ins><span class="cx"> 2016-10-14  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r207319.
</span></span></pre></div>
<a id="trunkLayoutTestsfastanimationanimationstyleupdatesizeexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/animation/animation-style-update-size-expected.txt (0 => 207372)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/animation/animation-style-update-size-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/animation/animation-style-update-size-expected.txt        2016-10-15 08:27:19 UTC (rev 207372)
</span><span class="lines">@@ -0,0 +1,2 @@
</span><ins>+Test that animation on an element doesn't invalidate the entire subtree for style resolution.
+Animation frame resolved style for 1 element(s)
</ins></span></pre></div>
<a id="trunkLayoutTestsfastanimationanimationstyleupdatesizehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/animation/animation-style-update-size.html (0 => 207372)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/animation/animation-style-update-size.html                                (rev 0)
+++ trunk/LayoutTests/fast/animation/animation-style-update-size.html        2016-10-15 08:27:19 UTC (rev 207372)
</span><span class="lines">@@ -0,0 +1,25 @@
</span><ins>+&lt;script&gt;
+testRunner.dumpAsText();
+testRunner.waitUntilDone();
+&lt;/script&gt;
+&lt;style&gt;
+body {
+    animation: testframes infinite 1s;
+}
+
+@keyframes testframes {
+    from { padding: 0 }
+    to { padding: 120px }
+}
+&lt;/style&gt;
+&lt;body&gt;
+&lt;div&gt;Test that animation on an element doesn't invalidate the entire subtree for style resolution.&lt;/div&gt;
+&lt;log&gt;&lt;/log&gt;
+&lt;script&gt;
+
+document.body.addEventListener(&quot;animationiteration&quot;, () =&gt; {
+    document.querySelector(&quot;log&quot;).textContent = &quot;Animation frame resolved style for &quot; + internals.lastStyleUpdateSize + &quot; element(s)&quot;;
+    testRunner.notifyDone();
+});
+
+&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (207371 => 207372)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-10-15 07:22:03 UTC (rev 207371)
+++ trunk/Source/WebCore/ChangeLog        2016-10-15 08:27:19 UTC (rev 207372)
</span><span class="lines">@@ -1,3 +1,39 @@
</span><ins>+2016-10-14  Antti Koivisto  &lt;antti@apple.com&gt;
+
+        100% CPU on homedepot.com page
+        https://bugs.webkit.org/show_bug.cgi?id=163452
+        &lt;rdar://problem/28730708&gt;
+
+        Reviewed by Simon Fraser.
+
+        The site has a keyframe animation on body. Currently this causes the animation to invalidate the
+        style of the entire document.
+
+        Animations use SyntheticStyleChange to invalidate elements when animation progresses and currently
+        that causes full subtree invalidation. However animation only ever affect individual elements and
+        the normal style resolution mechanism should be able to deal with things like inheritance as needed.
+
+        Test: fast/animation/animation-style-update-size.html
+
+        * dom/Document.cpp:
+        (WebCore::Document::recalcStyle):
+        * dom/Document.h:
+        (WebCore::Document::lastStyleUpdateSizeForTesting):
+
+            Testing support.
+
+        * style/StyleTreeResolver.cpp:
+        (WebCore::Style::TreeResolver::resolveElement):
+
+            Don't force subtree style resolution for SyntheticStyleChange.
+
+        * style/StyleUpdate.h:
+        (WebCore::Style::Update::size):
+        * testing/Internals.cpp:
+        (WebCore::Internals::lastStyleUpdateSize):
+        * testing/Internals.h:
+        * testing/Internals.idl:
+
</ins><span class="cx"> 2016-10-14  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Setting HTMLMediaElement.muted to the same value should not fire a volume change event
</span></span></pre></div>
<a id="trunkSourceWebCoredomDocumentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Document.cpp (207371 => 207372)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Document.cpp        2016-10-15 07:22:03 UTC (rev 207371)
+++ trunk/Source/WebCore/dom/Document.cpp        2016-10-15 08:27:19 UTC (rev 207372)
</span><span class="lines">@@ -1851,6 +1851,8 @@
</span><span class="cx">         Style::TreeResolver resolver(*this);
</span><span class="cx">         auto styleUpdate = resolver.resolve(change);
</span><span class="cx"> 
</span><ins>+        m_lastStyleUpdateSizeForTesting = styleUpdate ? styleUpdate-&gt;size() : 0;
+
</ins><span class="cx">         clearNeedsStyleRecalc();
</span><span class="cx">         clearChildNeedsStyleRecalc();
</span><span class="cx">         unscheduleStyleRecalc();
</span></span></pre></div>
<a id="trunkSourceWebCoredomDocumenth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Document.h (207371 => 207372)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Document.h        2016-10-15 07:22:03 UTC (rev 207371)
+++ trunk/Source/WebCore/dom/Document.h        2016-10-15 08:27:19 UTC (rev 207372)
</span><span class="lines">@@ -535,6 +535,7 @@
</span><span class="cx">     void recalcStyle(Style::Change = Style::NoChange);
</span><span class="cx">     WEBCORE_EXPORT void updateStyleIfNeeded();
</span><span class="cx">     bool needsStyleRecalc() const;
</span><ins>+    unsigned lastStyleUpdateSizeForTesting() const { return m_lastStyleUpdateSizeForTesting; }
</ins><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT void updateLayout();
</span><span class="cx">     
</span><span class="lines">@@ -1488,6 +1489,7 @@
</span><span class="cx">     bool m_inStyleRecalc;
</span><span class="cx">     bool m_closeAfterStyleRecalc;
</span><span class="cx">     bool m_inRenderTreeUpdate { false };
</span><ins>+    unsigned m_lastStyleUpdateSizeForTesting { 0 };
</ins><span class="cx"> 
</span><span class="cx">     bool m_gotoAnchorNeededAfterStylesheetsLoad;
</span><span class="cx">     bool m_isDNSPrefetchEnabled;
</span></span></pre></div>
<a id="trunkSourceWebCorestyleStyleTreeResolvercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/style/StyleTreeResolver.cpp (207371 => 207372)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/style/StyleTreeResolver.cpp        2016-10-15 07:22:03 UTC (rev 207371)
+++ trunk/Source/WebCore/style/StyleTreeResolver.cpp        2016-10-15 08:27:19 UTC (rev 207372)
</span><span class="lines">@@ -233,7 +233,7 @@
</span><span class="cx">             update.change = Detach;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (update.change != Detach &amp;&amp; (parent().change == Force || element.styleChangeType() &gt;= FullStyleChange))
</del><ins>+    if (update.change != Detach &amp;&amp; (parent().change == Force || element.styleChangeType() == FullStyleChange))
</ins><span class="cx">         update.change = Force;
</span><span class="cx"> 
</span><span class="cx">     return update;
</span></span></pre></div>
<a id="trunkSourceWebCorestyleStyleUpdateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/style/StyleUpdate.h (207371 => 207372)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/style/StyleUpdate.h        2016-10-15 07:22:03 UTC (rev 207371)
+++ trunk/Source/WebCore/style/StyleUpdate.h        2016-10-15 08:27:19 UTC (rev 207372)
</span><span class="lines">@@ -68,6 +68,8 @@
</span><span class="cx"> 
</span><span class="cx">     const Document&amp; document() const { return m_document; }
</span><span class="cx"> 
</span><ins>+    unsigned size() const { return m_elements.size() + m_texts.size(); }
+
</ins><span class="cx">     void addElement(Element&amp;, Element* parent, ElementUpdate&amp;&amp;);
</span><span class="cx">     void addText(Text&amp;, Element* parent);
</span><span class="cx">     void addText(Text&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCoretestingInternalscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/testing/Internals.cpp (207371 => 207372)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/testing/Internals.cpp        2016-10-15 07:22:03 UTC (rev 207371)
+++ trunk/Source/WebCore/testing/Internals.cpp        2016-10-15 08:27:19 UTC (rev 207372)
</span><span class="lines">@@ -2385,6 +2385,14 @@
</span><span class="cx">     return document-&gt;styleRecalcCount();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+unsigned Internals::lastStyleUpdateSize() const
+{
+    Document* document = contextDocument();
+    if (!document)
+        return 0;
+    return document-&gt;lastStyleUpdateSizeForTesting();
+}
+
</ins><span class="cx"> void Internals::startTrackingCompositingUpdates(ExceptionCode&amp; ec)
</span><span class="cx"> {
</span><span class="cx">     Document* document = contextDocument();
</span></span></pre></div>
<a id="trunkSourceWebCoretestingInternalsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/testing/Internals.h (207371 => 207372)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/testing/Internals.h        2016-10-15 07:22:03 UTC (rev 207371)
+++ trunk/Source/WebCore/testing/Internals.h        2016-10-15 08:27:19 UTC (rev 207372)
</span><span class="lines">@@ -329,6 +329,7 @@
</span><span class="cx">     
</span><span class="cx">     void startTrackingStyleRecalcs(ExceptionCode&amp;);
</span><span class="cx">     unsigned styleRecalcCount(ExceptionCode&amp;);
</span><ins>+    unsigned lastStyleUpdateSize() const;
</ins><span class="cx"> 
</span><span class="cx">     void startTrackingCompositingUpdates(ExceptionCode&amp;);
</span><span class="cx">     unsigned compositingUpdateCount(ExceptionCode&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCoretestingInternalsidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/testing/Internals.idl (207371 => 207372)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/testing/Internals.idl        2016-10-15 07:22:03 UTC (rev 207371)
+++ trunk/Source/WebCore/testing/Internals.idl        2016-10-15 08:27:19 UTC (rev 207372)
</span><span class="lines">@@ -327,6 +327,7 @@
</span><span class="cx"> 
</span><span class="cx">     [MayThrowLegacyException] void startTrackingStyleRecalcs();
</span><span class="cx">     [MayThrowLegacyException] unsigned long styleRecalcCount();
</span><ins>+    readonly attribute unsigned long lastStyleUpdateSize;
</ins><span class="cx"> 
</span><span class="cx">     [MayThrowLegacyException] void startTrackingCompositingUpdates();
</span><span class="cx">     [MayThrowLegacyException] unsigned long compositingUpdateCount();
</span></span></pre>
</div>
</div>

</body>
</html>