Title: [197480] trunk/Source/WebCore
Revision
197480
Author
[email protected]
Date
2016-03-02 17:19:51 -0800 (Wed, 02 Mar 2016)

Log Message

PageThrottler should apply hysteresis to media activity
https://bugs.webkit.org/show_bug.cgi?id=154940

Reviewed by Ryosuke Niwa.

Currently PageThrottler keeps a track of audible plugin activity and HTML media element
activity separately. Audible plugin activity also gets an extra 5s hysteresis applied,
so that after audio playback has completed there is a chance to queue up more audio
before timer throttling kicks in. HTML audio does not get this grace. Funnel both
together into a single activity flag, such that the hysteresis is applied to both.

* page/PageThrottler.cpp:
(WebCore::PageThrottler::PageThrottler):
(WebCore::m_mediaActivityHysteresis):
    - PageActivityState::AudiblePlugin -> PageActivityState::MediaActivity.
(WebCore::m_mediaActivityCounter):
    - when m_mediaActivityCounter value changes call mediaActivityCounterChanged().
(WebCore::PageThrottler::mediaActivityCounterChanged):
    - Drive PageActivityState::MediaActivity indirectly via m_mediaActivityHysteresis,
      such that a 5s hysteresis is applied.
* page/PageThrottler.h:
    - Removed AudiblePlugin (merged in with MediaActivity).
(WebCore::PageThrottler::pluginDidEvaluateWhileAudioIsPlaying):
    - m_audiblePluginHysteresis.impulse -> m_mediaActivityHysteresis.impulse.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (197479 => 197480)


--- trunk/Source/WebCore/ChangeLog	2016-03-03 00:34:59 UTC (rev 197479)
+++ trunk/Source/WebCore/ChangeLog	2016-03-03 01:19:51 UTC (rev 197480)
@@ -1,3 +1,30 @@
+2016-03-02  Gavin Barraclough  <[email protected]>
+
+        PageThrottler should apply hysteresis to media activity
+        https://bugs.webkit.org/show_bug.cgi?id=154940
+
+        Reviewed by Ryosuke Niwa.
+
+        Currently PageThrottler keeps a track of audible plugin activity and HTML media element
+        activity separately. Audible plugin activity also gets an extra 5s hysteresis applied,
+        so that after audio playback has completed there is a chance to queue up more audio
+        before timer throttling kicks in. HTML audio does not get this grace. Funnel both
+        together into a single activity flag, such that the hysteresis is applied to both.
+
+        * page/PageThrottler.cpp:
+        (WebCore::PageThrottler::PageThrottler):
+        (WebCore::m_mediaActivityHysteresis):
+            - PageActivityState::AudiblePlugin -> PageActivityState::MediaActivity.
+        (WebCore::m_mediaActivityCounter):
+            - when m_mediaActivityCounter value changes call mediaActivityCounterChanged().
+        (WebCore::PageThrottler::mediaActivityCounterChanged):
+            - Drive PageActivityState::MediaActivity indirectly via m_mediaActivityHysteresis,
+              such that a 5s hysteresis is applied.
+        * page/PageThrottler.h:
+            - Removed AudiblePlugin (merged in with MediaActivity).
+        (WebCore::PageThrottler::pluginDidEvaluateWhileAudioIsPlaying):
+            - m_audiblePluginHysteresis.impulse -> m_mediaActivityHysteresis.impulse.
+
 2016-03-01  Ada Chan  <[email protected]>
 
         Update the media element's presentation mode properly after going in and out of full screen via the Full Screen API

Modified: trunk/Source/WebCore/page/PageThrottler.cpp (197479 => 197480)


--- trunk/Source/WebCore/page/PageThrottler.cpp	2016-03-03 00:34:59 UTC (rev 197479)
+++ trunk/Source/WebCore/page/PageThrottler.cpp	2016-03-03 01:19:51 UTC (rev 197480)
@@ -33,8 +33,8 @@
 PageThrottler::PageThrottler(Page& page)
     : m_page(page)
     , 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](RefCounterEvent) { setActivityFlag(PageActivityState::MediaActivity, m_mediaActivityCounter.value()); })
+    , m_mediaActivityHysteresis([this](HysteresisState state) { setActivityFlag(PageActivityState::MediaActivity, state == HysteresisState::Started); })
+    , m_mediaActivityCounter([this](RefCounterEvent) { mediaActivityCounterChanged(); })
     , m_pageLoadActivityCounter([this](RefCounterEvent) { setActivityFlag(PageActivityState::PageLoadActivity, m_pageLoadActivityCounter.value()); })
 {
 }
@@ -49,6 +49,14 @@
     return m_pageLoadActivityCounter.count();
 }
 
+void PageThrottler::mediaActivityCounterChanged()
+{
+    if (m_mediaActivityCounter.value())
+        m_mediaActivityHysteresis.start();
+    else
+        m_mediaActivityHysteresis.stop();
+}
+
 void PageThrottler::setActivityFlag(PageActivityState::Flags flag, bool value)
 {
     PageActivityState::Flags activityState = m_activityState;

Modified: trunk/Source/WebCore/page/PageThrottler.h (197479 => 197480)


--- trunk/Source/WebCore/page/PageThrottler.h	2016-03-03 00:34:59 UTC (rev 197479)
+++ trunk/Source/WebCore/page/PageThrottler.h	2016-03-03 01:19:51 UTC (rev 197480)
@@ -43,15 +43,14 @@
 struct PageActivityState {
     enum {
         UserInputActivity = 1 << 0,
-        AudiblePlugin = 1 << 1,
-        MediaActivity = 1 << 2,
-        PageLoadActivity = 1 << 3,
+        MediaActivity = 1 << 1,
+        PageLoadActivity = 1 << 2,
     };
 
     typedef unsigned Flags;
 
     static const Flags NoFlags = 0;
-    static const Flags AllFlags = UserInputActivity | AudiblePlugin | MediaActivity | PageLoadActivity;
+    static const Flags AllFlags = UserInputActivity | MediaActivity | PageLoadActivity;
 };
 
 class PageThrottler {
@@ -61,17 +60,18 @@
 
     void didReceiveUserInput() { m_userInputHysteresis.impulse(); }
     PageActivityState::Flags activityState() { return m_activityState; }
-    void pluginDidEvaluateWhileAudioIsPlaying() { m_audiblePluginHysteresis.impulse(); }
+    void pluginDidEvaluateWhileAudioIsPlaying() { m_mediaActivityHysteresis.impulse(); }
     PageActivityAssertionToken mediaActivityToken();
     PageActivityAssertionToken pageLoadActivityToken();
 
 private:
+    void mediaActivityCounterChanged();
     void setActivityFlag(PageActivityState::Flags, bool);
 
     Page& m_page;
     PageActivityState::Flags m_activityState { PageActivityState::NoFlags };
     HysteresisActivity m_userInputHysteresis;
-    HysteresisActivity m_audiblePluginHysteresis;
+    HysteresisActivity m_mediaActivityHysteresis;
     PageActivityCounter m_mediaActivityCounter;
     PageActivityCounter m_pageLoadActivityCounter;
 };
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to