<!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>[207699] trunk/Source</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/207699">207699</a></dd>
<dt>Author</dt> <dd>barraclough@apple.com</dd>
<dt>Date</dt> <dd>2016-10-21 16:20:11 -0700 (Fri, 21 Oct 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>WebPage should take UserActivity directly for user input
https://bugs.webkit.org/show_bug.cgi?id=163813

Reviewed by Anders Carlsson.

When we receive mouse/keyboard events in a page, we want to prevent AppNap. We currently do so
via the PageThrottler. This patch is to just make the WebPage drive the UserActivity directly.

Two reasons to do so: (1) to cleanup &amp; simplify for further refactoring. (2) The current code
isn't really achieving the desired effect. The page setting the flag in the throttler to get
the activity to be set is now a less effective way of achieving this goal, since the
PageActivityState bounces back across to the UI process &amp; then messages back to the WebContent
process to take the UserActivity. These extra hops defeat the purpose of making sure the boost
from the initial message isn't lost.

Source/WebCore:

* page/PageThrottler.cpp:
(WebCore::PageThrottler::PageThrottler):
(WebCore::m_userInputHysteresis): Deleted.
* page/PageThrottler.h:
(WebCore::PageThrottler::didReceiveUserInput): Deleted.
    - removed PageActivityState::UserInputActivity, didReceiveUserInput, m_userInputHysteresis.

Source/WebKit2:

* WebProcess/WebPage/WebPage.cpp:
(WebKit::m_userActivityHysteresis):
    - m_userActivityHysteresis triggers updateUserActivity.
(WebKit::WebPage::setPageSuppressed):
    - setPageSuppressed starts/stops m_userActivityHysteresis.
(WebKit::WebPage::updateUserActivity):
    - update UserActivity based on state of m_userActivityHysteresis.
(WebKit::WebPage::mouseEvent):
(WebKit::WebPage::wheelEvent):
(WebKit::WebPage::keyEvent):
    - input events impulse m_userActivityHysteresis.
* WebProcess/WebPage/WebPage.h:</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="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPageh">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (207698 => 207699)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-10-21 23:06:05 UTC (rev 207698)
+++ trunk/Source/WebCore/ChangeLog        2016-10-21 23:20:11 UTC (rev 207699)
</span><span class="lines">@@ -1,3 +1,27 @@
</span><ins>+2016-10-21  Gavin Barraclough  &lt;barraclough@apple.com&gt;
+
+        WebPage should take UserActivity directly for user input
+        https://bugs.webkit.org/show_bug.cgi?id=163813
+
+        Reviewed by Anders Carlsson.
+
+        When we receive mouse/keyboard events in a page, we want to prevent AppNap. We currently do so
+        via the PageThrottler. This patch is to just make the WebPage drive the UserActivity directly.
+
+        Two reasons to do so: (1) to cleanup &amp; simplify for further refactoring. (2) The current code
+        isn't really achieving the desired effect. The page setting the flag in the throttler to get
+        the activity to be set is now a less effective way of achieving this goal, since the
+        PageActivityState bounces back across to the UI process &amp; then messages back to the WebContent
+        process to take the UserActivity. These extra hops defeat the purpose of making sure the boost
+        from the initial message isn't lost.
+
+        * page/PageThrottler.cpp:
+        (WebCore::PageThrottler::PageThrottler):
+        (WebCore::m_userInputHysteresis): Deleted.
+        * page/PageThrottler.h:
+        (WebCore::PageThrottler::didReceiveUserInput): Deleted.
+            - removed PageActivityState::UserInputActivity, didReceiveUserInput, m_userInputHysteresis.
+
</ins><span class="cx"> 2016-10-21  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Support (insertFrom|deleteBy)Composition and (insert|delete)CompositionText inputTypes for InputEvents
</span></span></pre></div>
<a id="trunkSourceWebCorepagePageThrottlercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/PageThrottler.cpp (207698 => 207699)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/PageThrottler.cpp        2016-10-21 23:06:05 UTC (rev 207698)
+++ trunk/Source/WebCore/page/PageThrottler.cpp        2016-10-21 23:20:11 UTC (rev 207699)
</span><span class="lines">@@ -34,7 +34,6 @@
</span><span class="cx"> 
</span><span class="cx"> PageThrottler::PageThrottler(Page&amp; page)
</span><span class="cx">     : m_page(page)
</span><del>-    , m_userInputHysteresis([this](HysteresisState state) { setActivityFlag(PageActivityState::UserInputActivity, state == HysteresisState::Started); })
</del><span class="cx">     , m_mediaActivityHysteresis([this](HysteresisState state) { setActivityFlag(PageActivityState::MediaActivity, state == HysteresisState::Started); })
</span><span class="cx">     , m_pageLoadActivityHysteresis([this](HysteresisState state) { setActivityFlag(PageActivityState::PageLoadActivity, state == HysteresisState::Started); }, PageLoadHysteresisSeconds)
</span><span class="cx">     , m_mediaActivityCounter([this](RefCounterEvent) { mediaActivityCounterChanged(); })
</span></span></pre></div>
<a id="trunkSourceWebCorepagePageThrottlerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/PageThrottler.h (207698 => 207699)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/PageThrottler.h        2016-10-21 23:06:05 UTC (rev 207698)
+++ trunk/Source/WebCore/page/PageThrottler.h        2016-10-21 23:20:11 UTC (rev 207699)
</span><span class="lines">@@ -42,15 +42,14 @@
</span><span class="cx"> 
</span><span class="cx"> struct PageActivityState {
</span><span class="cx">     enum {
</span><del>-        UserInputActivity = 1 &lt;&lt; 0,
-        MediaActivity = 1 &lt;&lt; 1,
-        PageLoadActivity = 1 &lt;&lt; 2,
</del><ins>+        MediaActivity = 1 &lt;&lt; 0,
+        PageLoadActivity = 1 &lt;&lt; 1,
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     typedef unsigned Flags;
</span><span class="cx"> 
</span><span class="cx">     static const Flags NoFlags = 0;
</span><del>-    static const Flags AllFlags = UserInputActivity | MediaActivity | PageLoadActivity;
</del><ins>+    static const Flags AllFlags = MediaActivity | PageLoadActivity;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> class PageThrottler {
</span><span class="lines">@@ -58,7 +57,6 @@
</span><span class="cx"> public:
</span><span class="cx">     PageThrottler(Page&amp;);
</span><span class="cx"> 
</span><del>-    void didReceiveUserInput() { m_userInputHysteresis.impulse(); }
</del><span class="cx">     PageActivityState::Flags activityState() { return m_activityState; }
</span><span class="cx">     void pluginDidEvaluateWhileAudioIsPlaying() { m_mediaActivityHysteresis.impulse(); }
</span><span class="cx">     PageActivityAssertionToken mediaActivityToken();
</span><span class="lines">@@ -71,7 +69,6 @@
</span><span class="cx"> 
</span><span class="cx">     Page&amp; m_page;
</span><span class="cx">     PageActivityState::Flags m_activityState { PageActivityState::NoFlags };
</span><del>-    HysteresisActivity m_userInputHysteresis;
</del><span class="cx">     HysteresisActivity m_mediaActivityHysteresis;
</span><span class="cx">     HysteresisActivity m_pageLoadActivityHysteresis;
</span><span class="cx">     PageActivityCounter m_mediaActivityCounter;
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (207698 => 207699)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-10-21 23:06:05 UTC (rev 207698)
+++ trunk/Source/WebKit2/ChangeLog        2016-10-21 23:20:11 UTC (rev 207699)
</span><span class="lines">@@ -1,3 +1,33 @@
</span><ins>+2016-10-21  Gavin Barraclough  &lt;barraclough@apple.com&gt;
+
+        WebPage should take UserActivity directly for user input
+        https://bugs.webkit.org/show_bug.cgi?id=163813
+
+        Reviewed by Anders Carlsson.
+
+        When we receive mouse/keyboard events in a page, we want to prevent AppNap. We currently do so
+        via the PageThrottler. This patch is to just make the WebPage drive the UserActivity directly.
+
+        Two reasons to do so: (1) to cleanup &amp; simplify for further refactoring. (2) The current code
+        isn't really achieving the desired effect. The page setting the flag in the throttler to get
+        the activity to be set is now a less effective way of achieving this goal, since the
+        PageActivityState bounces back across to the UI process &amp; then messages back to the WebContent
+        process to take the UserActivity. These extra hops defeat the purpose of making sure the boost
+        from the initial message isn't lost.
+
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::m_userActivityHysteresis):
+            - m_userActivityHysteresis triggers updateUserActivity.
+        (WebKit::WebPage::setPageSuppressed):
+            - setPageSuppressed starts/stops m_userActivityHysteresis.
+        (WebKit::WebPage::updateUserActivity):
+            - update UserActivity based on state of m_userActivityHysteresis.
+        (WebKit::WebPage::mouseEvent):
+        (WebKit::WebPage::wheelEvent):
+        (WebKit::WebPage::keyEvent):
+            - input events impulse m_userActivityHysteresis.
+        * WebProcess/WebPage/WebPage.h:
+
</ins><span class="cx"> 2016-10-21  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Support (insertFrom|deleteBy)Composition and (insert|delete)CompositionText inputTypes for InputEvents
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (207698 => 207699)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2016-10-21 23:06:05 UTC (rev 207698)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2016-10-21 23:20:11 UTC (rev 207699)
</span><span class="lines">@@ -378,6 +378,7 @@
</span><span class="cx">     , m_useAsyncScrolling(false)
</span><span class="cx">     , m_viewState(parameters.viewState)
</span><span class="cx">     , m_userActivity(&quot;Process suppression disabled for page.&quot;)
</span><ins>+    , m_userActivityHysteresis([this](HysteresisState) { updateUserActivity(); })
</ins><span class="cx">     , m_pendingNavigationID(0)
</span><span class="cx"> #if ENABLE(WEBGL)
</span><span class="cx">     , m_systemWebGLPolicy(WebGLAllowCreation)
</span><span class="lines">@@ -590,9 +591,17 @@
</span><span class="cx">     // The UserActivity keeps the processes runnable. So if the page should be suppressed, stop the activity.
</span><span class="cx">     // If the page should not be supressed, start it.
</span><span class="cx">     if (pageSuppressed)
</span><del>-        m_userActivity.stop();
</del><ins>+        m_userActivityHysteresis.stop();
</ins><span class="cx">     else
</span><ins>+        m_userActivityHysteresis.start();
+}
+
+void WebPage::updateUserActivity()
+{
+    if (m_userActivityHysteresis.state() == HysteresisState::Started)
</ins><span class="cx">         m_userActivity.start();
</span><ins>+    else
+        m_userActivity.stop();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> WebPage::~WebPage()
</span><span class="lines">@@ -2238,7 +2247,7 @@
</span><span class="cx"> {
</span><span class="cx">     TemporaryChange&lt;bool&gt; userIsInteractingChange { m_userIsInteracting, true };
</span><span class="cx"> 
</span><del>-    m_page-&gt;pageThrottler().didReceiveUserInput();
</del><ins>+    m_userActivityHysteresis.impulse();
</ins><span class="cx"> 
</span><span class="cx">     bool shouldHandleEvent = true;
</span><span class="cx"> 
</span><span class="lines">@@ -2293,7 +2302,7 @@
</span><span class="cx"> 
</span><span class="cx"> void WebPage::wheelEvent(const WebWheelEvent&amp; wheelEvent)
</span><span class="cx"> {
</span><del>-    m_page-&gt;pageThrottler().didReceiveUserInput();
</del><ins>+    m_userActivityHysteresis.impulse();
</ins><span class="cx"> 
</span><span class="cx">     CurrentEvent currentEvent(wheelEvent);
</span><span class="cx"> 
</span><span class="lines">@@ -2316,7 +2325,7 @@
</span><span class="cx"> {
</span><span class="cx">     TemporaryChange&lt;bool&gt; userIsInteractingChange { m_userIsInteracting, true };
</span><span class="cx"> 
</span><del>-    m_page-&gt;pageThrottler().didReceiveUserInput();
</del><ins>+    m_userActivityHysteresis.impulse();
</ins><span class="cx"> 
</span><span class="cx">     CurrentEvent currentEvent(keyboardEvent);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (207698 => 207699)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2016-10-21 23:06:05 UTC (rev 207698)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2016-10-21 23:20:11 UTC (rev 207699)
</span><span class="lines">@@ -971,6 +971,8 @@
</span><span class="cx"> private:
</span><span class="cx">     WebPage(uint64_t pageID, const WebPageCreationParameters&amp;);
</span><span class="cx"> 
</span><ins>+    void updateUserActivity();
+
</ins><span class="cx">     // IPC::MessageSender
</span><span class="cx">     IPC::Connection* messageSenderConnection() override;
</span><span class="cx">     uint64_t messageSenderDestinationID() override;
</span><span class="lines">@@ -1486,6 +1488,7 @@
</span><span class="cx">     WebCore::ViewState::Flags m_viewState;
</span><span class="cx"> 
</span><span class="cx">     UserActivity m_userActivity;
</span><ins>+    WebCore::HysteresisActivity m_userActivityHysteresis;
</ins><span class="cx"> 
</span><span class="cx">     uint64_t m_pendingNavigationID;
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>