<!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>[197472] 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/197472">197472</a></dd>
<dt>Author</dt> <dd>barraclough@apple.com</dd>
<dt>Date</dt> <dd>2016-03-02 16:19:05 -0800 (Wed, 02 Mar 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Disable timer throttling increases for visually idle / active pages.
https://bugs.webkit.org/show_bug.cgi?id=154935

Reviewed by Chris Dumez.

Currently any page that is visually idle can timer throttle, and all are eligible for throttling
allow throttling to increase.

Instead, still allow any visually idle page to timer throttle, but only allow increasing in those
that are fully hidden &amp; inactive (no page loading or media activity).

* page/Page.cpp:
(WebCore::Page::setTimerThrottlingState):
    - Updated policy per commet above.
(WebCore::Page::setPageActivityState):
(WebCore::Page::setIsVisible):
    - We now may need to updated timer throttling when these change.</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>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (197471 => 197472)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-03-03 00:17:12 UTC (rev 197471)
+++ trunk/Source/WebCore/ChangeLog        2016-03-03 00:19:05 UTC (rev 197472)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2016-03-02  Gavin Barraclough  &lt;barraclough@apple.com&gt;
+
+        Disable timer throttling increases for visually idle / active pages.
+        https://bugs.webkit.org/show_bug.cgi?id=154935
+
+        Reviewed by Chris Dumez.
+
+        Currently any page that is visually idle can timer throttle, and all are eligible for throttling
+        allow throttling to increase.
+
+        Instead, still allow any visually idle page to timer throttle, but only allow increasing in those
+        that are fully hidden &amp; inactive (no page loading or media activity).
+
+        * page/Page.cpp:
+        (WebCore::Page::setTimerThrottlingState):
+            - Updated policy per commet above.
+        (WebCore::Page::setPageActivityState):
+        (WebCore::Page::setIsVisible):
+            - We now may need to updated timer throttling when these change.
+
</ins><span class="cx"> 2016-03-02  Konstantin Tokarev  &lt;annulen@yandex.ru&gt;
</span><span class="cx"> 
</span><span class="cx">         [cmake] Moved PRE/POST_BUILD_COMMAND to WEBKIT_FRAMEWORK.
</span></span></pre></div>
<a id="trunkSourceWebCorepagePagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Page.cpp (197471 => 197472)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Page.cpp        2016-03-03 00:17:12 UTC (rev 197471)
+++ trunk/Source/WebCore/page/Page.cpp        2016-03-03 00:19:05 UTC (rev 197472)
</span><span class="lines">@@ -1031,8 +1031,6 @@
</span><span class="cx"> 
</span><span class="cx"> void Page::setIsVisuallyIdleInternal(bool isVisuallyIdle)
</span><span class="cx"> {
</span><del>-    updateTimerThrottlingState();
-    
</del><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">@@ -1185,12 +1183,21 @@
</span><span class="cx"> 
</span><span class="cx"> void Page::updateTimerThrottlingState()
</span><span class="cx"> {
</span><del>-    TimerThrottlingState state = TimerThrottlingState::Disabled;
</del><ins>+    // Timer throttling disabled if page is visually active, or disabled by setting.
+    if (!m_settings-&gt;hiddenPageDOMTimerThrottlingEnabled() || !(m_viewState &amp; ViewState::IsVisuallyIdle)) {
+        setTimerThrottlingState(TimerThrottlingState::Disabled);
+        return;
+    }
</ins><span class="cx"> 
</span><del>-    if (m_settings-&gt;hiddenPageDOMTimerThrottlingEnabled() &amp;&amp; m_viewState &amp; ViewState::IsVisuallyIdle)
-        state = m_settings-&gt;hiddenPageDOMTimerThrottlingAutoIncreases() ? TimerThrottlingState::EnabledIncreasing : TimerThrottlingState::Enabled;
</del><ins>+    // If the page is visible (but idle), there is any activity (loading, media playing, etc), or per setting,
+    // we allow timer throttling, but not increasing timer throttling.
+    if (!m_settings-&gt;hiddenPageDOMTimerThrottlingAutoIncreases() || m_viewState &amp; ViewState::IsVisible || m_pageThrottler.activityState()) {
+        setTimerThrottlingState(TimerThrottlingState::Enabled);
+        return;
+    }
</ins><span class="cx"> 
</span><del>-    setTimerThrottlingState(state);
</del><ins>+    // If we get here increasing timer throttling is enabled.
+    setTimerThrottlingState(TimerThrottlingState::EnabledIncreasing);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Page::setTimerThrottlingState(TimerThrottlingState state)
</span><span class="lines">@@ -1395,6 +1402,9 @@
</span><span class="cx">     if (changed &amp; ViewState::IsVisuallyIdle)
</span><span class="cx">         setIsVisuallyIdleInternal(viewState &amp; ViewState::IsVisuallyIdle);
</span><span class="cx"> 
</span><ins>+    if (changed &amp; (ViewState::IsVisible | ViewState::IsVisuallyIdle))
+        updateTimerThrottlingState();
+
</ins><span class="cx">     for (auto* observer : m_viewStateChangeObservers)
</span><span class="cx">         observer-&gt;viewStateDidChange(oldViewState, m_viewState);
</span><span class="cx"> }
</span><span class="lines">@@ -1402,6 +1412,7 @@
</span><span class="cx"> void Page::setPageActivityState(PageActivityState::Flags activityState)
</span><span class="cx"> {
</span><span class="cx">     chrome().client().setPageActivityState(activityState);
</span><ins>+    updateTimerThrottlingState();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Page::setIsVisible(bool isVisible)
</span></span></pre>
</div>
</div>

</body>
</html>