<!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>[173693] 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/173693">173693</a></dd>
<dt>Author</dt> <dd>barraclough@apple.com</dd>
<dt>Date</dt> <dd>2014-09-17 09:32:10 -0700 (Wed, 17 Sep 2014)</dd>
</dl>
<h3>Log Message</h3>
<pre>Exclude page visibility from PageThrottler's hysteresis
https://bugs.webkit.org/show_bug.cgi?id=136866
Reviewed by Geoff Garen.
Including visibility in the hysteresis mechanism has the effect of prolonging the visually
idle timeout, and causing the page hide event to be run at foreground priority. Neither of
these are particularly desirable. Instead separate visibility from the rest of the page
activities we track (and apply hysteresis to), and feed this directly into determination
of the UserActivity state.
* page/PageThrottler.cpp:
(WebCore::PageThrottler::PageThrottler):
- when the PageThrottler is instantiated call updateUserActivity to set initial UserActivity.
(WebCore::PageThrottler::incrementActivityCount):
- simplified - when m_activityCount becomes non-zero, start m_hysteresis.
(WebCore::PageThrottler::decrementActivityCount):
- simplified - when m_activityCount becomes zero, stop m_hysteresis.
(WebCore::PageThrottler::updateUserActivity):
- end the UserActivity (allow AppNap) if visually idle and no page activity is taking place.
(WebCore::PageThrottler::setViewState):
- when the visually idle state changed call updateUserActivity to update the UserActivity.
(WebCore::PageThrottler::started):
(WebCore::PageThrottler::stopped):
- when the hysteresis state changed call updateUserActivity to update the UserActivity.
(WebCore::PageThrottler::updateHysteresis): Deleted.
- removed: simplified the hysteresis trigger, we now incorporate visually idle state in updateUserActivity.
* page/PageThrottler.h:
- removed updateHysteresis, added updateUserActivity.
* platform/HysteresisActivity.h:
(WebCore::HysteresisActivity::state):
- determine the curent state of the HysteresisActivity - started, waiting, or stopped.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</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="#trunkSourceWebCoreplatformHysteresisActivityh">trunk/Source/WebCore/platform/HysteresisActivity.h</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (173692 => 173693)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-09-17 16:12:50 UTC (rev 173692)
+++ trunk/Source/WebCore/ChangeLog        2014-09-17 16:32:10 UTC (rev 173693)
</span><span class="lines">@@ -1,3 +1,38 @@
</span><ins>+2014-09-16 Gavin Barraclough <baraclough@apple.com>
+
+ Exclude page visibility from PageThrottler's hysteresis
+ https://bugs.webkit.org/show_bug.cgi?id=136866
+
+ Reviewed by Geoff Garen.
+
+ Including visibility in the hysteresis mechanism has the effect of prolonging the visually
+ idle timeout, and causing the page hide event to be run at foreground priority. Neither of
+ these are particularly desirable. Instead separate visibility from the rest of the page
+ activities we track (and apply hysteresis to), and feed this directly into determination
+ of the UserActivity state.
+
+ * page/PageThrottler.cpp:
+ (WebCore::PageThrottler::PageThrottler):
+ - when the PageThrottler is instantiated call updateUserActivity to set initial UserActivity.
+ (WebCore::PageThrottler::incrementActivityCount):
+ - simplified - when m_activityCount becomes non-zero, start m_hysteresis.
+ (WebCore::PageThrottler::decrementActivityCount):
+ - simplified - when m_activityCount becomes zero, stop m_hysteresis.
+ (WebCore::PageThrottler::updateUserActivity):
+ - end the UserActivity (allow AppNap) if visually idle and no page activity is taking place.
+ (WebCore::PageThrottler::setViewState):
+ - when the visually idle state changed call updateUserActivity to update the UserActivity.
+ (WebCore::PageThrottler::started):
+ (WebCore::PageThrottler::stopped):
+ - when the hysteresis state changed call updateUserActivity to update the UserActivity.
+ (WebCore::PageThrottler::updateHysteresis): Deleted.
+ - removed: simplified the hysteresis trigger, we now incorporate visually idle state in updateUserActivity.
+ * page/PageThrottler.h:
+ - removed updateHysteresis, added updateUserActivity.
+ * platform/HysteresisActivity.h:
+ (WebCore::HysteresisActivity::state):
+ - determine the curent state of the HysteresisActivity - started, waiting, or stopped.
+
</ins><span class="cx"> 2014-09-17 Carlos Garcia Campos <cgarcia@igalia.com>
</span><span class="cx">
</span><span class="cx"> [GTK] Fix runtime critical warnings when writing to the clipboard after r173687
</span></span></pre></div>
<a id="trunkSourceWebCorepagePageThrottlercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/PageThrottler.cpp (173692 => 173693)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/PageThrottler.cpp        2014-09-17 16:12:50 UTC (rev 173692)
+++ trunk/Source/WebCore/page/PageThrottler.cpp        2014-09-17 16:32:10 UTC (rev 173693)
</span><span class="lines">@@ -26,12 +26,7 @@
</span><span class="cx"> #include "config.h"
</span><span class="cx"> #include "PageThrottler.h"
</span><span class="cx">
</span><del>-#include "Chrome.h"
-#include "ChromeClient.h"
-#include "MainFrame.h"
-#include "Page.h"
</del><span class="cx"> #include "PageActivityAssertionToken.h"
</span><del>-#include <wtf/StdLibExtras.h>
</del><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="lines">@@ -43,8 +38,7 @@
</span><span class="cx"> , m_activity("Page is active.")
</span><span class="cx"> , m_activityCount(0)
</span><span class="cx"> {
</span><del>- if (!(m_viewState & ViewState::IsVisuallyIdle))
- m_hysteresis.start();
</del><ins>+ updateUserActivity();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> std::unique_ptr<PageActivityAssertionToken> PageThrottler::mediaActivityToken()
</span><span class="lines">@@ -59,22 +53,33 @@
</span><span class="cx">
</span><span class="cx"> void PageThrottler::incrementActivityCount()
</span><span class="cx"> {
</span><del>- ++m_activityCount;
- updateHysteresis();
</del><ins>+ // If m_activityCount is nonzero, state must be Started; if m_activityCount is zero, state may be Waiting or Stopped.
+ ASSERT(!!m_activityCount == (m_hysteresis.state() == HysteresisState::Started));
+
+ if (!m_activityCount++)
+ m_hysteresis.start();
+
+ ASSERT(m_activityCount && m_hysteresis.state() == HysteresisState::Started);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void PageThrottler::decrementActivityCount()
</span><span class="cx"> {
</span><del>- --m_activityCount;
- updateHysteresis();
</del><ins>+ ASSERT(m_activityCount && m_hysteresis.state() == HysteresisState::Started);
+
+ if (!--m_activityCount)
+ m_hysteresis.stop();
+
+ // If m_activityCount is nonzero, state must be Started; if m_activityCount is zero, state may be Waiting or Stopped.
+ ASSERT(!!m_activityCount == (m_hysteresis.state() == HysteresisState::Started));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void PageThrottler::updateHysteresis()
</del><ins>+void PageThrottler::updateUserActivity()
</ins><span class="cx"> {
</span><del>- if (m_activityCount || !(m_viewState & ViewState::IsVisuallyIdle))
- m_hysteresis.start();
</del><ins>+ // Allow throttling if there is no page activity, and the page is visually idle.
+ if (m_hysteresis.state() == HysteresisState::Stopped && m_viewState & ViewState::IsVisuallyIdle)
+ m_activity.endActivity();
</ins><span class="cx"> else
</span><del>- m_hysteresis.stop();
</del><ins>+ m_activity.beginActivity();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void PageThrottler::setViewState(ViewState::Flags viewState)
</span><span class="lines">@@ -83,17 +88,17 @@
</span><span class="cx"> m_viewState = viewState;
</span><span class="cx">
</span><span class="cx"> if (changed & ViewState::IsVisuallyIdle)
</span><del>- updateHysteresis();
</del><ins>+ updateUserActivity();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void PageThrottler::started()
</span><span class="cx"> {
</span><del>- m_activity.beginActivity();
</del><ins>+ updateUserActivity();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void PageThrottler::stopped()
</span><span class="cx"> {
</span><del>- m_activity.endActivity();
</del><ins>+ updateUserActivity();
</ins><span class="cx"> }
</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 (173692 => 173693)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/PageThrottler.h        2014-09-17 16:12:50 UTC (rev 173692)
+++ trunk/Source/WebCore/page/PageThrottler.h        2014-09-17 16:32:10 UTC (rev 173693)
</span><span class="lines">@@ -30,7 +30,6 @@
</span><span class="cx">
</span><span class="cx"> #include "UserActivity.h"
</span><span class="cx"> #include "ViewState.h"
</span><del>-#include <wtf/HashSet.h>
</del><span class="cx"> #include <wtf/WeakPtr.h>
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -56,7 +55,7 @@
</span><span class="cx"> void incrementActivityCount();
</span><span class="cx"> void decrementActivityCount();
</span><span class="cx">
</span><del>- void updateHysteresis();
</del><ins>+ void updateUserActivity();
</ins><span class="cx">
</span><span class="cx"> friend class HysteresisActivity<PageThrottler>;
</span><span class="cx"> WEBCORE_EXPORT void started();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformHysteresisActivityh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/HysteresisActivity.h (173692 => 173693)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/HysteresisActivity.h        2014-09-17 16:12:50 UTC (rev 173692)
+++ trunk/Source/WebCore/platform/HysteresisActivity.h        2014-09-17 16:32:10 UTC (rev 173693)
</span><span class="lines">@@ -32,6 +32,12 @@
</span><span class="cx">
</span><span class="cx"> static const double DefaultHysteresisSeconds = 5.0;
</span><span class="cx">
</span><ins>+enum class HysteresisState {
+ Started,
+ WillStopPendingTimeout,
+ Stopped
+};
+
</ins><span class="cx"> template<typename Delegate>
</span><span class="cx"> class HysteresisActivity {
</span><span class="cx"> public:
</span><span class="lines">@@ -72,6 +78,15 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+ HysteresisState state() const
+ {
+ if (m_active)
+ return HysteresisState::Started;
+ if (m_timer.isActive())
+ return HysteresisState::WillStopPendingTimeout;
+ return HysteresisState::Stopped;
+ }
+
</ins><span class="cx"> private:
</span><span class="cx"> void hysteresisTimerFired(Timer<HysteresisActivity>&)
</span><span class="cx"> {
</span></span></pre>
</div>
</div>
</body>
</html>