<!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>[173696] 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/173696">173696</a></dd>
<dt>Author</dt> <dd>barraclough@apple.com</dd>
<dt>Date</dt> <dd>2014-09-17 11:27:42 -0700 (Wed, 17 Sep 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Aways have a PageThrottler (sometimes have a UserActivity::Impl)
https://bugs.webkit.org/show_bug.cgi?id=136892

Reviewed by Geoffrey Garen.

Some instances of Page have a PageThrottler to track activity on the Page, and some do not.
(Specifically, those created from WebPage in WK2 do, those related to WK1, SVG &amp; inspector do not).

We do this for three reasons:
    * We do not need to take AppNap assertions on WK1.
    * Some Pages do not track their visibility correctly, and would always claim to be visible.
    * Page VisibilityState is not set until after construction, so if we instantiate

Creating the entire PageThrottler lazily has the drawback that we have to check for its existence at
numerous points throughout the code, and we'll miss activity that occurs between the Page being created
&amp; the PageThrottler added to it (really a theoretical problem right now, since they're currently always
created pretty much back to back).

Instead, Page should always have a PageThrottler, &amp; instead make the UserActivity::Impl on the
PageThrottler be added later.

Source/WebCore:

* WebCore.exp.in:
    - createPageThrottler -&gt; enablePageThrottler
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::parseAttribute):
    - Page::pageThrottler now returns a reference rather than a pointer
* loader/FrameLoader.cpp:
(WebCore::FrameLoader::started):
    - Page::pageThrottler now returns a reference rather than a pointer
* page/Page.cpp:
(WebCore::Page::Page):
    - instantiate PageThrottler in constructor
(WebCore::Page::enablePageThrottler):
    - renamed from createPageThrottler, instead of creating the PageThrottler this method now
      instruct PageThrottler to create a UserActivity::Impl
(WebCore::Page::setViewState):
    - m_pageThrottler is not a pointer
(WebCore::Page::createPageThrottler): Deleted.
    - renamed to enablePageThrottler
* page/Page.h:
(WebCore::Page::pageThrottler):
    - now returns a reference
* page/PageThrottler.cpp:
(WebCore::PageThrottler::PageThrottler):
    - no longer instantiate m_activity
(WebCore::PageThrottler::createUserActivity):
    - lazily instantiate m_activity, call updateUserActivity
(WebCore::PageThrottler::updateUserActivity):
    - m_activity may not yet be instantiated; added early return
* page/PageThrottler.h:
    - m_activity becomes a std::unique_ptr, added createUserActivity

Source/WebKit2:

* WebProcess/Plugins/Netscape/NPRuntimeObjectMap.cpp:
(WebKit::NPRuntimeObjectMap::evaluate):
    - createPageThrottler -&gt; enablePageThrottler
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::WebPage):
(WebKit::WebPage::mouseEvent):
(WebKit::WebPage::wheelEvent):
(WebKit::WebPage::keyEvent):
    - Page::pageThrottler now returns a reference rather than a pointer</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCoreexpin">trunk/Source/WebCore/WebCore.exp.in</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementcpp">trunk/Source/WebCore/html/HTMLMediaElement.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderFrameLoadercpp">trunk/Source/WebCore/loader/FrameLoader.cpp</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="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2WebProcessPluginsNetscapeNPRuntimeObjectMapcpp">trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NPRuntimeObjectMap.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (173695 => 173696)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-09-17 18:18:02 UTC (rev 173695)
+++ trunk/Source/WebCore/ChangeLog        2014-09-17 18:27:42 UTC (rev 173696)
</span><span class="lines">@@ -1,3 +1,57 @@
</span><ins>+2014-09-17  Gavin Barraclough  &lt;baraclough@apple.com&gt;
+
+        Aways have a PageThrottler (sometimes have a UserActivity::Impl)
+        https://bugs.webkit.org/show_bug.cgi?id=136892
+
+        Reviewed by Geoffrey Garen.
+
+        Some instances of Page have a PageThrottler to track activity on the Page, and some do not.
+        (Specifically, those created from WebPage in WK2 do, those related to WK1, SVG &amp; inspector do not).
+
+        We do this for three reasons:
+            * We do not need to take AppNap assertions on WK1.
+            * Some Pages do not track their visibility correctly, and would always claim to be visible.
+            * Page VisibilityState is not set until after construction, so if we instantiate
+
+        Creating the entire PageThrottler lazily has the drawback that we have to check for its existence at
+        numerous points throughout the code, and we'll miss activity that occurs between the Page being created
+        &amp; the PageThrottler added to it (really a theoretical problem right now, since they're currently always
+        created pretty much back to back).
+
+        Instead, Page should always have a PageThrottler, &amp; instead make the UserActivity::Impl on the
+        PageThrottler be added later.
+
+        * WebCore.exp.in:
+            - createPageThrottler -&gt; enablePageThrottler
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::parseAttribute):
+            - Page::pageThrottler now returns a reference rather than a pointer
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::started):
+            - Page::pageThrottler now returns a reference rather than a pointer
+        * page/Page.cpp:
+        (WebCore::Page::Page):
+            - instantiate PageThrottler in constructor
+        (WebCore::Page::enablePageThrottler):
+            - renamed from createPageThrottler, instead of creating the PageThrottler this method now
+              instruct PageThrottler to create a UserActivity::Impl
+        (WebCore::Page::setViewState):
+            - m_pageThrottler is not a pointer
+        (WebCore::Page::createPageThrottler): Deleted.
+            - renamed to enablePageThrottler
+        * page/Page.h:
+        (WebCore::Page::pageThrottler):
+            - now returns a reference
+        * page/PageThrottler.cpp:
+        (WebCore::PageThrottler::PageThrottler):
+            - no longer instantiate m_activity
+        (WebCore::PageThrottler::createUserActivity):
+            - lazily instantiate m_activity, call updateUserActivity
+        (WebCore::PageThrottler::updateUserActivity):
+            - m_activity may not yet be instantiated; added early return
+        * page/PageThrottler.h:
+            - m_activity becomes a std::unique_ptr, added createUserActivity
+
</ins><span class="cx"> 2014-09-17  Daniel Bates  &lt;dabates@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [iOS] Make WebCore build with public iOS SDK
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCoreexpin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.exp.in (173695 => 173696)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.exp.in        2014-09-17 18:18:02 UTC (rev 173695)
+++ trunk/Source/WebCore/WebCore.exp.in        2014-09-17 18:27:42 UTC (rev 173696)
</span><span class="lines">@@ -1117,7 +1117,7 @@
</span><span class="cx"> __ZN7WebCore4Page18setPageScaleFactorEfRKNS_8IntPointEb
</span><span class="cx"> __ZN7WebCore4Page18setTopContentInsetEf
</span><span class="cx"> __ZN7WebCore4Page19addLayoutMilestonesEj
</span><del>-__ZN7WebCore4Page19createPageThrottlerEv
</del><ins>+__ZN7WebCore4Page19enablePageThrottlerEv
</ins><span class="cx"> __ZN7WebCore4Page20scrollingCoordinatorEv
</span><span class="cx"> __ZN7WebCore4Page20setDeviceScaleFactorEf
</span><span class="cx"> __ZN7WebCore4Page20unmarkAllTextMatchesEv
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (173695 => 173696)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.cpp        2014-09-17 18:18:02 UTC (rev 173695)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp        2014-09-17 18:27:42 UTC (rev 173696)
</span><span class="lines">@@ -4527,8 +4527,8 @@
</span><span class="cx"> 
</span><span class="cx">         if (hasMediaControls())
</span><span class="cx">             mediaControls()-&gt;playbackStarted();
</span><del>-        if (document().page() &amp;&amp; document().page()-&gt;pageThrottler())
-            m_activityToken = document().page()-&gt;pageThrottler()-&gt;mediaActivityToken();
</del><ins>+        if (document().page())
+            m_activityToken = document().page()-&gt;pageThrottler().mediaActivityToken();
</ins><span class="cx"> 
</span><span class="cx">         startPlaybackProgressTimer();
</span><span class="cx">         m_playing = true;
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderFrameLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/FrameLoader.cpp (173695 => 173696)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/FrameLoader.cpp        2014-09-17 18:18:02 UTC (rev 173695)
+++ trunk/Source/WebCore/loader/FrameLoader.cpp        2014-09-17 18:27:42 UTC (rev 173696)
</span><span class="lines">@@ -1154,8 +1154,8 @@
</span><span class="cx"> 
</span><span class="cx"> void FrameLoader::started()
</span><span class="cx"> {
</span><del>-    if (m_frame.page() &amp;&amp; m_frame.page()-&gt;pageThrottler())
-        m_activityAssertion = m_frame.page()-&gt;pageThrottler()-&gt;pageLoadActivityToken();
</del><ins>+    if (m_frame.page())
+        m_activityAssertion = m_frame.page()-&gt;pageThrottler().pageLoadActivityToken();
</ins><span class="cx">     for (Frame* frame = &amp;m_frame; frame; frame = frame-&gt;tree().parent())
</span><span class="cx">         frame-&gt;loader().m_isComplete = false;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorepagePagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Page.cpp (173695 => 173696)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Page.cpp        2014-09-17 18:18:02 UTC (rev 173695)
+++ trunk/Source/WebCore/page/Page.cpp        2014-09-17 18:27:42 UTC (rev 173696)
</span><span class="lines">@@ -192,6 +192,7 @@
</span><span class="cx"> #endif
</span><span class="cx">     , m_alternativeTextClient(pageClients.alternativeTextClient)
</span><span class="cx">     , m_scriptedAnimationsSuspended(false)
</span><ins>+    , m_pageThrottler(*this, m_viewState)
</ins><span class="cx">     , m_consoleClient(std::make_unique&lt;PageConsoleClient&gt;(*this))
</span><span class="cx"> #if ENABLE(REMOTE_INSPECTOR)
</span><span class="cx">     , m_inspectorDebuggable(std::make_unique&lt;PageDebuggable&gt;(*this))
</span><span class="lines">@@ -1207,10 +1208,9 @@
</span><span class="cx">         view-&gt;resumeVisibleImageAnimationsIncludingSubframes();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Page::createPageThrottler()
</del><ins>+void Page::enablePageThrottler()
</ins><span class="cx"> {
</span><del>-    ASSERT(!m_pageThrottler);
-    m_pageThrottler = std::make_unique&lt;PageThrottler&gt;(*this, m_viewState);
</del><ins>+    m_pageThrottler.createUserActivity();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Page::setViewState(ViewState::Flags viewState)
</span><span class="lines">@@ -1223,8 +1223,7 @@
</span><span class="cx"> 
</span><span class="cx">     m_viewState = viewState;
</span><span class="cx">     m_focusController-&gt;setViewState(viewState);
</span><del>-    if (m_pageThrottler)
-        m_pageThrottler-&gt;setViewState(viewState);
</del><ins>+    m_pageThrottler.setViewState(viewState);
</ins><span class="cx"> 
</span><span class="cx">     if (changed &amp; ViewState::IsVisible)
</span><span class="cx">         setIsVisibleInternal(viewState &amp; ViewState::IsVisible);
</span></span></pre></div>
<a id="trunkSourceWebCorepagePageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Page.h (173695 => 173696)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Page.h        2014-09-17 18:18:02 UTC (rev 173695)
+++ trunk/Source/WebCore/page/Page.h        2014-09-17 18:27:42 UTC (rev 173696)
</span><span class="lines">@@ -405,8 +405,8 @@
</span><span class="cx">     void sawMediaEngine(const String&amp; engineName);
</span><span class="cx">     void resetSeenMediaEngines();
</span><span class="cx"> 
</span><del>-    PageThrottler* pageThrottler() { return m_pageThrottler.get(); }
-    WEBCORE_EXPORT void createPageThrottler();
</del><ins>+    PageThrottler&amp; pageThrottler() { return m_pageThrottler; }
+    WEBCORE_EXPORT void enablePageThrottler();
</ins><span class="cx"> 
</span><span class="cx">     PageConsoleClient&amp; console() { return *m_consoleClient; }
</span><span class="cx"> 
</span><span class="lines">@@ -570,7 +570,7 @@
</span><span class="cx">     AlternativeTextClient* m_alternativeTextClient;
</span><span class="cx"> 
</span><span class="cx">     bool m_scriptedAnimationsSuspended;
</span><del>-    std::unique_ptr&lt;PageThrottler&gt; m_pageThrottler;
</del><ins>+    PageThrottler m_pageThrottler;
</ins><span class="cx">     const std::unique_ptr&lt;PageConsoleClient&gt; m_consoleClient;
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(REMOTE_INSPECTOR)
</span></span></pre></div>
<a id="trunkSourceWebCorepagePageThrottlercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/PageThrottler.cpp (173695 => 173696)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/PageThrottler.cpp        2014-09-17 18:18:02 UTC (rev 173695)
+++ trunk/Source/WebCore/page/PageThrottler.cpp        2014-09-17 18:27:42 UTC (rev 173696)
</span><span class="lines">@@ -35,12 +35,18 @@
</span><span class="cx">     , m_viewState(viewState)
</span><span class="cx">     , m_weakPtrFactory(this)
</span><span class="cx">     , m_hysteresis(*this)
</span><del>-    , m_activity(&quot;Page is active.&quot;)
</del><span class="cx">     , m_activityCount(0)
</span><span class="cx"> {
</span><span class="cx">     updateUserActivity();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void PageThrottler::createUserActivity()
+{
+    ASSERT(!m_activity);
+    m_activity = std::make_unique&lt;UserActivity::Impl&gt;(&quot;Page is active.&quot;);
+    updateUserActivity();
+}
+
</ins><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">@@ -75,11 +81,14 @@
</span><span class="cx"> 
</span><span class="cx"> void PageThrottler::updateUserActivity()
</span><span class="cx"> {
</span><ins>+    if (!m_activity)
+        return;
+
</ins><span class="cx">     // Allow throttling if there is no page activity, and the page is visually idle.
</span><span class="cx">     if (m_hysteresis.state() == HysteresisState::Stopped &amp;&amp; m_viewState &amp; ViewState::IsVisuallyIdle)
</span><del>-        m_activity.endActivity();
</del><ins>+        m_activity-&gt;endActivity();
</ins><span class="cx">     else
</span><del>-        m_activity.beginActivity();
</del><ins>+        m_activity-&gt;beginActivity();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void PageThrottler::setViewState(ViewState::Flags viewState)
</span></span></pre></div>
<a id="trunkSourceWebCorepagePageThrottlerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/PageThrottler.h (173695 => 173696)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/PageThrottler.h        2014-09-17 18:18:02 UTC (rev 173695)
+++ trunk/Source/WebCore/page/PageThrottler.h        2014-09-17 18:27:42 UTC (rev 173696)
</span><span class="lines">@@ -42,6 +42,7 @@
</span><span class="cx"> public:
</span><span class="cx">     PageThrottler(Page&amp;, ViewState::Flags);
</span><span class="cx"> 
</span><ins>+    void createUserActivity();
</ins><span class="cx">     void setViewState(ViewState::Flags);
</span><span class="cx"> 
</span><span class="cx">     void didReceiveUserInput() { m_hysteresis.impulse(); }
</span><span class="lines">@@ -65,7 +66,7 @@
</span><span class="cx">     ViewState::Flags m_viewState;
</span><span class="cx">     WeakPtrFactory&lt;PageThrottler&gt; m_weakPtrFactory;
</span><span class="cx">     HysteresisActivity&lt;PageThrottler&gt; m_hysteresis;
</span><del>-    UserActivity::Impl m_activity;
</del><ins>+    std::unique_ptr&lt;UserActivity::Impl&gt; m_activity;
</ins><span class="cx">     size_t m_activityCount;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (173695 => 173696)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-09-17 18:18:02 UTC (rev 173695)
+++ trunk/Source/WebKit2/ChangeLog        2014-09-17 18:27:42 UTC (rev 173696)
</span><span class="lines">@@ -1,3 +1,36 @@
</span><ins>+2014-09-17  Gavin Barraclough  &lt;baraclough@apple.com&gt;
+
+        Aways have a PageThrottler (sometimes have a UserActivity::Impl)
+        https://bugs.webkit.org/show_bug.cgi?id=136892
+
+        Reviewed by Geoffrey Garen.
+
+        Some instances of Page have a PageThrottler to track activity on the Page, and some do not.
+        (Specifically, those created from WebPage in WK2 do, those related to WK1, SVG &amp; inspector do not).
+
+        We do this for three reasons:
+            * We do not need to take AppNap assertions on WK1.
+            * Some Pages do not track their visibility correctly, and would always claim to be visible.
+            * Page VisibilityState is not set until after construction, so if we instantiate
+
+        Creating the entire PageThrottler lazily has the drawback that we have to check for its existence at
+        numerous points throughout the code, and we'll miss activity that occurs between the Page being created
+        &amp; the PageThrottler added to it (really a theoretical problem right now, since they're currently always
+        created pretty much back to back).
+
+        Instead, Page should always have a PageThrottler, &amp; instead make the UserActivity::Impl on the
+        PageThrottler be added later.
+
+        * WebProcess/Plugins/Netscape/NPRuntimeObjectMap.cpp:
+        (WebKit::NPRuntimeObjectMap::evaluate):
+            - createPageThrottler -&gt; enablePageThrottler
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::WebPage):
+        (WebKit::WebPage::mouseEvent):
+        (WebKit::WebPage::wheelEvent):
+        (WebKit::WebPage::keyEvent):
+            - Page::pageThrottler now returns a reference rather than a pointer
+
</ins><span class="cx"> 2014-09-17  Daniel Bates  &lt;dabates@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [iOS] Make WebCore build with public iOS SDK
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessPluginsNetscapeNPRuntimeObjectMapcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NPRuntimeObjectMap.cpp (173695 => 173696)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NPRuntimeObjectMap.cpp        2014-09-17 18:18:02 UTC (rev 173695)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NPRuntimeObjectMap.cpp        2014-09-17 18:27:42 UTC (rev 173696)
</span><span class="lines">@@ -192,8 +192,8 @@
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx">     if (m_pluginView &amp;&amp; !m_pluginView-&gt;isBeingDestroyed()) {
</span><span class="cx">         if (Page* page = m_pluginView-&gt;frame()-&gt;page()) {
</span><del>-            if (m_pluginView-&gt;audioHardwareActivity() != WebCore::AudioHardwareActivityType::IsInactive &amp;&amp; page-&gt;pageThrottler())
-                page-&gt;pageThrottler()-&gt;pluginDidEvaluateWhileAudioIsPlaying();
</del><ins>+            if (m_pluginView-&gt;audioHardwareActivity() != WebCore::AudioHardwareActivityType::IsInactive)
+                page-&gt;pageThrottler().pluginDidEvaluateWhileAudioIsPlaying();
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (173695 => 173696)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2014-09-17 18:18:02 UTC (rev 173695)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2014-09-17 18:27:42 UTC (rev 173696)
</span><span class="lines">@@ -423,7 +423,7 @@
</span><span class="cx">     m_page-&gt;setViewState(m_viewState);
</span><span class="cx">     if (!isVisible())
</span><span class="cx">         m_page-&gt;setIsPrerender();
</span><del>-    m_page-&gt;createPageThrottler();
</del><ins>+    m_page-&gt;enablePageThrottler();
</ins><span class="cx"> 
</span><span class="cx">     updateIsInWindow(true);
</span><span class="cx"> 
</span><span class="lines">@@ -1886,8 +1886,7 @@
</span><span class="cx"> 
</span><span class="cx"> void WebPage::mouseEvent(const WebMouseEvent&amp; mouseEvent)
</span><span class="cx"> {
</span><del>-    ASSERT(m_page-&gt;pageThrottler());
-    m_page-&gt;pageThrottler()-&gt;didReceiveUserInput();
</del><ins>+    m_page-&gt;pageThrottler().didReceiveUserInput();
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(CONTEXT_MENUS)
</span><span class="cx">     // Don't try to handle any pending mouse events if a context menu is showing.
</span><span class="lines">@@ -1955,8 +1954,7 @@
</span><span class="cx"> 
</span><span class="cx"> void WebPage::wheelEvent(const WebWheelEvent&amp; wheelEvent)
</span><span class="cx"> {
</span><del>-    ASSERT(m_page-&gt;pageThrottler());
-    m_page-&gt;pageThrottler()-&gt;didReceiveUserInput();
</del><ins>+    m_page-&gt;pageThrottler().didReceiveUserInput();
</ins><span class="cx"> 
</span><span class="cx">     bool handled = false;
</span><span class="cx"> 
</span><span class="lines">@@ -1990,8 +1988,7 @@
</span><span class="cx"> 
</span><span class="cx"> void WebPage::keyEvent(const WebKeyboardEvent&amp; keyboardEvent)
</span><span class="cx"> {
</span><del>-    ASSERT(m_page-&gt;pageThrottler());
-    m_page-&gt;pageThrottler()-&gt;didReceiveUserInput();
</del><ins>+    m_page-&gt;pageThrottler().didReceiveUserInput();
</ins><span class="cx"> 
</span><span class="cx">     bool handled = false;
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>