Title: [177378] trunk/Source/WebCore
Revision
177378
Author
barraclo...@apple.com
Date
2014-12-16 11:50:36 -0800 (Tue, 16 Dec 2014)

Log Message

Introduce PageActivityState
https://bugs.webkit.org/show_bug.cgi?id=139687

Reviewed by Anders Carlsson.

Add a bitfield to track each of the activities on the page separately.
Split the hysteresis & counters so we can track these separately.

* page/PageThrottler.cpp:
(WebCore::PageThrottler::PageThrottler):
    - initialze new hysteresis, counters; closures call setActivityFlag.
(WebCore::PageThrottler::mediaActivityToken):
(WebCore::PageThrottler::pageLoadActivityToken):
    - split m_pageActivityCounter -> m_mediaActivityCounter, m_pageLoadActivityCounter.
(WebCore::PageThrottler::updateUserActivity):
    - use m_activityState to check for activity.
(WebCore::PageThrottler::setActivityFlag):
    - helper to clear/set a bit in m_activityState, and call updateUserActivity as necessary.
* page/PageThrottler.h:
(WebCore::PageThrottler::didReceiveUserInput):
(WebCore::PageThrottler::pluginDidEvaluateWhileAudioIsPlaying):
    - split m_hysteresis -> m_userInputHysteresis, m_audiblePluginHysteresis

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (177377 => 177378)


--- trunk/Source/WebCore/ChangeLog	2014-12-16 19:28:57 UTC (rev 177377)
+++ trunk/Source/WebCore/ChangeLog	2014-12-16 19:50:36 UTC (rev 177378)
@@ -1,3 +1,28 @@
+2014-12-16  Gavin Barraclough  <barraclo...@apple.com>
+
+        Introduce PageActivityState
+        https://bugs.webkit.org/show_bug.cgi?id=139687
+
+        Reviewed by Anders Carlsson.
+
+        Add a bitfield to track each of the activities on the page separately.
+        Split the hysteresis & counters so we can track these separately.
+
+        * page/PageThrottler.cpp:
+        (WebCore::PageThrottler::PageThrottler):
+            - initialze new hysteresis, counters; closures call setActivityFlag.
+        (WebCore::PageThrottler::mediaActivityToken):
+        (WebCore::PageThrottler::pageLoadActivityToken):
+            - split m_pageActivityCounter -> m_mediaActivityCounter, m_pageLoadActivityCounter.
+        (WebCore::PageThrottler::updateUserActivity):
+            - use m_activityState to check for activity.
+        (WebCore::PageThrottler::setActivityFlag):
+            - helper to clear/set a bit in m_activityState, and call updateUserActivity as necessary.
+        * page/PageThrottler.h:
+        (WebCore::PageThrottler::didReceiveUserInput):
+        (WebCore::PageThrottler::pluginDidEvaluateWhileAudioIsPlaying):
+            - split m_hysteresis -> m_userInputHysteresis, m_audiblePluginHysteresis
+
 2014-12-16  Myles C. Maxfield  <lithe...@gmail.com>
 
         Ruby does not preserve expansion opportunities from enclosing context

Modified: trunk/Source/WebCore/page/PageThrottler.cpp (177377 => 177378)


--- trunk/Source/WebCore/page/PageThrottler.cpp	2014-12-16 19:28:57 UTC (rev 177377)
+++ trunk/Source/WebCore/page/PageThrottler.cpp	2014-12-16 19:50:36 UTC (rev 177378)
@@ -30,8 +30,10 @@
 
 PageThrottler::PageThrottler(ViewState::Flags viewState)
     : m_viewState(viewState)
-    , m_hysteresis([this](HysteresisState) { updateUserActivity(); })
-    , m_pageActivityCounter([this]() { updateUserActivity(); })
+    , m_userInputHysteresis([this](HysteresisState state) { setActivityFlag(PageActivityState::UserInputActivity, state == HysteresisState::Started); })
+    , m_audiblePluginHysteresis([this](HysteresisState state) { setActivityFlag(PageActivityState::AudiblePlugin, state == HysteresisState::Started); })
+    , m_mediaActivityCounter([this]() { setActivityFlag(PageActivityState::MediaActivity, m_mediaActivityCounter.value()); })
+    , m_pageLoadActivityCounter([this]() { setActivityFlag(PageActivityState::PageLoadActivity, m_pageLoadActivityCounter.value()); })
 {
 }
 
@@ -44,12 +46,12 @@
 
 PageActivityAssertionToken PageThrottler::mediaActivityToken()
 {
-    return m_pageActivityCounter.count();
+    return m_mediaActivityCounter.count();
 }
 
 PageActivityAssertionToken PageThrottler::pageLoadActivityToken()
 {
-    return m_pageActivityCounter.count();
+    return m_pageLoadActivityCounter.count();
 }
 
 void PageThrottler::updateUserActivity()
@@ -58,12 +60,27 @@
         return;
 
     // Allow throttling if there is no page activity, and the page is visually idle.
-    if (!m_pageActivityCounter.value() && m_hysteresis.state() == HysteresisState::Stopped && m_viewState & ViewState::IsVisuallyIdle)
+    if (!m_activityState && m_viewState & ViewState::IsVisuallyIdle)
         m_activity->stop();
     else
         m_activity->start();
 }
 
+void PageThrottler::setActivityFlag(PageActivityState::Flags flag, bool value)
+{
+    PageActivityState::Flags activityState = m_activityState;
+    if (value)
+        activityState |= flag;
+    else
+        activityState &= ~flag;
+
+    if (m_activityState == activityState)
+        return;
+    m_activityState = activityState;
+
+    updateUserActivity();
+}
+
 void PageThrottler::setViewState(ViewState::Flags viewState)
 {
     ViewState::Flags changed = m_viewState ^ viewState;

Modified: trunk/Source/WebCore/page/PageThrottler.h (177377 => 177378)


--- trunk/Source/WebCore/page/PageThrottler.h	2014-12-16 19:28:57 UTC (rev 177377)
+++ trunk/Source/WebCore/page/PageThrottler.h	2014-12-16 19:50:36 UTC (rev 177378)
@@ -36,6 +36,20 @@
 
 typedef RefPtr<RefCounter::Count> PageActivityAssertionToken;
 
+struct PageActivityState {
+    enum {
+        UserInputActivity = 1 << 0,
+        AudiblePlugin = 1 << 1,
+        MediaActivity = 1 << 2,
+        PageLoadActivity = 1 << 3,
+    };
+
+    typedef unsigned Flags;
+
+    static const Flags NoFlags = 0;
+    static const Flags AllFlags = UserInputActivity | AudiblePlugin | MediaActivity | PageLoadActivity;
+};
+
 class PageThrottler {
     WTF_MAKE_FAST_ALLOCATED;
 public:
@@ -44,18 +58,22 @@
     void createUserActivity();
     void setViewState(ViewState::Flags);
 
-    void didReceiveUserInput() { m_hysteresis.impulse(); }
-    void pluginDidEvaluateWhileAudioIsPlaying() { m_hysteresis.impulse(); }
+    void didReceiveUserInput() { m_userInputHysteresis.impulse(); }
+    void pluginDidEvaluateWhileAudioIsPlaying() { m_audiblePluginHysteresis.impulse(); }
     PageActivityAssertionToken mediaActivityToken();
     PageActivityAssertionToken pageLoadActivityToken();
 
 private:
     void updateUserActivity();
+    void setActivityFlag(PageActivityState::Flags, bool);
 
     ViewState::Flags m_viewState;
-    HysteresisActivity m_hysteresis;
+    PageActivityState::Flags m_activityState { PageActivityState::NoFlags };
+    HysteresisActivity m_userInputHysteresis;
+    HysteresisActivity m_audiblePluginHysteresis;
+    RefCounter m_mediaActivityCounter;
+    RefCounter m_pageLoadActivityCounter;
     std::unique_ptr<UserActivity> m_activity;
-    RefCounter m_pageActivityCounter;
 };
 
 }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to