<!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>[167522] trunk/Source/WebCore</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/167522">167522</a></dd>
<dt>Author</dt> <dd>slewis@apple.com</dd>
<dt>Date</dt> <dd>2014-04-18 17:44:47 -0700 (Fri, 18 Apr 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Move DOM throttling out of the page throttler
&lt;rdar://problem/16473004&gt;
https://bugs.webkit.org/show_bug.cgi?id=131697

Reviewed by Gavin Barraclough.

No new tests since it's not web exposed.

DOM timer throttling is currently part of the page throttler which uses per process
state and per page state to determine when to throttle.  This led us to being overly
conservative when turning DOM throttling off.  It should only respond to view state changes.

Additionally since creating extra page throttlers SVG images caused bugs
in tracking state we'll reserve the page throttler for WebKit2 views.  To avoid regressing
WebKit1 we should move DOM timer throttling back to the page.

* page/Page.cpp:
(WebCore::Page::Page): set DOM timer throttling.
(WebCore::Page::setIsVisuallyIdleInternal): ditto.
(WebCore::Page::hiddenPageDOMTimerThrottlingStateChanged): ditto.
(WebCore::Page::setIsVisible): Update view state masks for WebKit1 to include IsVisibleOrOccluded and IsVisuallyIdle
* page/Page.h:
* page/PageThrottler.cpp:
(WebCore::PageThrottler::PageThrottler): remove DOM timer throttling.
(WebCore::PageThrottler::started): ditto.
(WebCore::PageThrottler::stopped): ditto.
(WebCore::PageThrottler::hiddenPageDOMTimerThrottlingStateChanged): Deleted.
* page/PageThrottler.h:
* page/Settings.cpp:
(WebCore::Settings::setHiddenPageDOMTimerThrottlingEnabled):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorepagePagecpp">trunk/Source/WebCore/page/Page.cpp</a></li>
<li><a href="#trunkSourceWebCorepagePageh">trunk/Source/WebCore/page/Page.h</a></li>
<li><a href="#trunkSourceWebCorepagePageThrottlercpp">trunk/Source/WebCore/page/PageThrottler.cpp</a></li>
<li><a href="#trunkSourceWebCorepagePageThrottlerh">trunk/Source/WebCore/page/PageThrottler.h</a></li>
<li><a href="#trunkSourceWebCorepageSettingscpp">trunk/Source/WebCore/page/Settings.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (167521 => 167522)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-04-19 00:33:46 UTC (rev 167521)
+++ trunk/Source/WebCore/ChangeLog        2014-04-19 00:44:47 UTC (rev 167522)
</span><span class="lines">@@ -1,3 +1,36 @@
</span><ins>+2014-04-18  Stephanie Lewis  &lt;slewis@apple.com&gt;
+
+        Move DOM throttling out of the page throttler
+        &lt;rdar://problem/16473004&gt;
+        https://bugs.webkit.org/show_bug.cgi?id=131697
+
+        Reviewed by Gavin Barraclough.
+
+        No new tests since it's not web exposed.
+
+        DOM timer throttling is currently part of the page throttler which uses per process 
+        state and per page state to determine when to throttle.  This led us to being overly 
+        conservative when turning DOM throttling off.  It should only respond to view state changes.
+
+        Additionally since creating extra page throttlers SVG images caused bugs 
+        in tracking state we'll reserve the page throttler for WebKit2 views.  To avoid regressing 
+        WebKit1 we should move DOM timer throttling back to the page.
+
+        * page/Page.cpp:
+        (WebCore::Page::Page): set DOM timer throttling.
+        (WebCore::Page::setIsVisuallyIdleInternal): ditto.
+        (WebCore::Page::hiddenPageDOMTimerThrottlingStateChanged): ditto.
+        (WebCore::Page::setIsVisible): Update view state masks for WebKit1 to include IsVisibleOrOccluded and IsVisuallyIdle
+        * page/Page.h:
+        * page/PageThrottler.cpp:
+        (WebCore::PageThrottler::PageThrottler): remove DOM timer throttling.
+        (WebCore::PageThrottler::started): ditto.
+        (WebCore::PageThrottler::stopped): ditto.
+        (WebCore::PageThrottler::hiddenPageDOMTimerThrottlingStateChanged): Deleted.
+        * page/PageThrottler.h:
+        * page/Settings.cpp:
+        (WebCore::Settings::setHiddenPageDOMTimerThrottlingEnabled):
+
</ins><span class="cx"> 2014-04-18  Dean Jackson  &lt;dino@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WebGL] Limit maximum texture sizes on older Intel hardware
</span></span></pre></div>
<a id="trunkSourceWebCorepagePagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Page.cpp (167521 => 167522)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Page.cpp        2014-04-19 00:33:46 UTC (rev 167521)
+++ trunk/Source/WebCore/page/Page.cpp        2014-04-19 00:44:47 UTC (rev 167522)
</span><span class="lines">@@ -199,7 +199,9 @@
</span><span class="cx">     , m_sessionID(SessionID::defaultSessionID())
</span><span class="cx"> {
</span><span class="cx">     ASSERT(m_editorClient);
</span><del>-
</del><ins>+    
+    setTimerThrottlingEnabled(m_viewState &amp; ViewState::IsVisuallyIdle);
+    
</ins><span class="cx">     if (m_visitedLinkStore)
</span><span class="cx">         m_visitedLinkStore-&gt;addPage(*this);
</span><span class="cx"> 
</span><span class="lines">@@ -896,6 +898,8 @@
</span><span class="cx"> 
</span><span class="cx"> void Page::setIsVisuallyIdleInternal(bool isVisuallyIdle)
</span><span class="cx"> {
</span><ins>+    setTimerThrottlingEnabled(isVisuallyIdle);
+    
</ins><span class="cx">     for (Frame* frame = &amp;mainFrame(); frame; frame = frame-&gt;tree().traverseNext()) {
</span><span class="cx">         if (frame-&gt;document())
</span><span class="cx">             frame-&gt;document()-&gt;scriptedAnimationControllerSetThrottled(isVisuallyIdle);
</span><span class="lines">@@ -1063,6 +1067,11 @@
</span><span class="cx">     return m_minimumTimerInterval;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Page::hiddenPageDOMTimerThrottlingStateChanged()
+{
+    setTimerThrottlingEnabled(m_viewState &amp; ViewState::IsVisuallyIdle);
+}
+
</ins><span class="cx"> void Page::setTimerThrottlingEnabled(bool enabled)
</span><span class="cx"> {
</span><span class="cx"> #if ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING)
</span><span class="lines">@@ -1172,7 +1181,10 @@
</span><span class="cx"> 
</span><span class="cx"> void Page::setIsVisible(bool isVisible)
</span><span class="cx"> {
</span><del>-    setViewState(isVisible ? m_viewState | ViewState::IsVisible : m_viewState &amp; ~ViewState::IsVisible);
</del><ins>+    if (isVisible)
+        setViewState((m_viewState &amp; ~ViewState::IsVisuallyIdle) | ViewState::IsVisible | ViewState::IsVisibleOrOccluded);
+    else
+        setViewState((m_viewState &amp; ~(ViewState::IsVisible | ViewState::IsVisibleOrOccluded)) | ViewState::IsVisuallyIdle);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Page::setIsVisibleInternal(bool isVisible)
</span></span></pre></div>
<a id="trunkSourceWebCorepagePageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Page.h (167521 => 167522)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Page.h        2014-04-19 00:33:46 UTC (rev 167521)
+++ trunk/Source/WebCore/page/Page.h        2014-04-19 00:44:47 UTC (rev 167522)
</span><span class="lines">@@ -449,6 +449,7 @@
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;Ref&lt;PluginViewBase&gt;&gt; pluginViews();
</span><span class="cx"> 
</span><ins>+    void hiddenPageDOMTimerThrottlingStateChanged();
</ins><span class="cx">     void setTimerThrottlingEnabled(bool);
</span><span class="cx"> 
</span><span class="cx">     const std::unique_ptr&lt;Chrome&gt; m_chrome;
</span></span></pre></div>
<a id="trunkSourceWebCorepagePageThrottlercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/PageThrottler.cpp (167521 => 167522)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/PageThrottler.cpp        2014-04-19 00:33:46 UTC (rev 167521)
+++ trunk/Source/WebCore/page/PageThrottler.cpp        2014-04-19 00:44:47 UTC (rev 167522)
</span><span class="lines">@@ -43,19 +43,10 @@
</span><span class="cx">     , m_activity(&quot;Page is active.&quot;)
</span><span class="cx">     , m_activityCount(0)
</span><span class="cx"> {
</span><del>-    if (m_viewState &amp; ViewState::IsVisuallyIdle)
-        m_page.setTimerThrottlingEnabled(true);
-    else
</del><ins>+    if (!(m_viewState &amp; ViewState::IsVisuallyIdle))
</ins><span class="cx">         m_hysteresis.start();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void PageThrottler::hiddenPageDOMTimerThrottlingStateChanged()
-{
-    // If timer throttling is enabled, this will temporarily disable it.
-    // After a timeout it will be reenabled, rereading the setting.
-    m_hysteresis.impulse();
-}
-
</del><span class="cx"> std::unique_ptr&lt;PageActivityAssertionToken&gt; PageThrottler::mediaActivityToken()
</span><span class="cx"> {
</span><span class="cx">     return std::make_unique&lt;PageActivityAssertionToken&gt;(*this);
</span><span class="lines">@@ -97,13 +88,11 @@
</span><span class="cx"> 
</span><span class="cx"> void PageThrottler::started()
</span><span class="cx"> {
</span><del>-    m_page.setTimerThrottlingEnabled(false);
</del><span class="cx">     m_activity.beginActivity();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void PageThrottler::stopped()
</span><span class="cx"> {
</span><del>-    m_page.setTimerThrottlingEnabled(true);
</del><span class="cx">     m_activity.endActivity();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorepagePageThrottlerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/PageThrottler.h (167521 => 167522)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/PageThrottler.h        2014-04-19 00:33:46 UTC (rev 167521)
+++ trunk/Source/WebCore/page/PageThrottler.h        2014-04-19 00:44:47 UTC (rev 167522)
</span><span class="lines">@@ -51,8 +51,6 @@
</span><span class="cx">     std::unique_ptr&lt;PageActivityAssertionToken&gt; mediaActivityToken();
</span><span class="cx">     std::unique_ptr&lt;PageActivityAssertionToken&gt; pageLoadActivityToken();
</span><span class="cx"> 
</span><del>-    void hiddenPageDOMTimerThrottlingStateChanged();
-
</del><span class="cx"> private:
</span><span class="cx">     friend class PageActivityAssertionToken;
</span><span class="cx">     WeakPtr&lt;PageThrottler&gt; weakPtr() { return m_weakPtrFactory.createWeakPtr(); }
</span></span></pre></div>
<a id="trunkSourceWebCorepageSettingscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Settings.cpp (167521 => 167522)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Settings.cpp        2014-04-19 00:33:46 UTC (rev 167521)
+++ trunk/Source/WebCore/page/Settings.cpp        2014-04-19 00:44:47 UTC (rev 167522)
</span><span class="lines">@@ -656,7 +656,7 @@
</span><span class="cx">     if (m_hiddenPageDOMTimerThrottlingEnabled == flag)
</span><span class="cx">         return;
</span><span class="cx">     m_hiddenPageDOMTimerThrottlingEnabled = flag;
</span><del>-    m_page-&gt;pageThrottler().hiddenPageDOMTimerThrottlingStateChanged();
</del><ins>+    m_page-&gt;hiddenPageDOMTimerThrottlingStateChanged();
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>