From 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c Mon Sep 17 00:00:00 2001 From: Lorry Tar Creator Date: Tue, 27 Jun 2017 06:07:23 +0000 Subject: webkitgtk-2.16.5 --- Source/WebCore/dom/UserGestureIndicator.cpp | 64 +++++++++++++++++++++++------ 1 file changed, 52 insertions(+), 12 deletions(-) (limited to 'Source/WebCore/dom/UserGestureIndicator.cpp') diff --git a/Source/WebCore/dom/UserGestureIndicator.cpp b/Source/WebCore/dom/UserGestureIndicator.cpp index 5fd20b6c7..09a27a5b2 100644 --- a/Source/WebCore/dom/UserGestureIndicator.cpp +++ b/Source/WebCore/dom/UserGestureIndicator.cpp @@ -26,40 +26,80 @@ #include "config.h" #include "UserGestureIndicator.h" +#include "Document.h" #include +#include namespace WebCore { -static bool isDefinite(ProcessingUserGestureState state) +static RefPtr& currentToken() { - return state == DefinitelyProcessingUserGesture || state == DefinitelyNotProcessingUserGesture; + static NeverDestroyed> token; + return token; } -ProcessingUserGestureState UserGestureIndicator::s_state = DefinitelyNotProcessingUserGesture; +UserGestureToken::~UserGestureToken() +{ + for (auto& observer : m_destructionObservers) + observer(*this); +} -UserGestureIndicator::UserGestureIndicator(ProcessingUserGestureState state) - : m_previousState(s_state) +UserGestureIndicator::UserGestureIndicator(std::optional state, Document* document) + : m_previousToken(currentToken()) { // Silently ignore UserGestureIndicators on non main threads. if (!isMainThread()) return; - // We overwrite s_state only if the caller is definite about the gesture state. - if (isDefinite(state)) - s_state = state; - ASSERT(isDefinite(s_state)); + + if (state) + currentToken() = UserGestureToken::create(state.value()); + + if (document && currentToken()->processingUserGesture()) { + document->topDocument().updateLastHandledUserGestureTimestamp(); + document->topDocument().setUserDidInteractWithPage(true); + } +} + +UserGestureIndicator::UserGestureIndicator(RefPtr token) + : m_previousToken(currentToken()) +{ + if (!isMainThread()) + return; + + if (token) + currentToken() = token; } UserGestureIndicator::~UserGestureIndicator() { if (!isMainThread()) return; - s_state = m_previousState; - ASSERT(isDefinite(s_state)); + + currentToken() = m_previousToken; +} + +RefPtr UserGestureIndicator::currentUserGesture() +{ + if (!isMainThread()) + return nullptr; + + return currentToken(); } bool UserGestureIndicator::processingUserGesture() { - return isMainThread() ? s_state == DefinitelyProcessingUserGesture : false; + if (!isMainThread()) + return false; + + return currentToken() ? currentToken()->processingUserGesture() : false; +} + +bool UserGestureIndicator::processingUserGestureForMedia() +{ + if (!isMainThread()) + return false; + + return currentToken() ? currentToken()->processingUserGestureForMedia() : false; } } -- cgit v1.2.1