diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/dom/UserGestureIndicator.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/dom/UserGestureIndicator.cpp')
-rw-r--r-- | Source/WebCore/dom/UserGestureIndicator.cpp | 64 |
1 files changed, 52 insertions, 12 deletions
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 <wtf/MainThread.h> +#include <wtf/NeverDestroyed.h> namespace WebCore { -static bool isDefinite(ProcessingUserGestureState state) +static RefPtr<UserGestureToken>& currentToken() { - return state == DefinitelyProcessingUserGesture || state == DefinitelyNotProcessingUserGesture; + static NeverDestroyed<RefPtr<UserGestureToken>> 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<ProcessingUserGestureState> 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<UserGestureToken> 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<UserGestureToken> 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; } } |