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