summaryrefslogtreecommitdiff
path: root/Source/WebCore/dom/UserGestureIndicator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/dom/UserGestureIndicator.cpp')
-rw-r--r--Source/WebCore/dom/UserGestureIndicator.cpp64
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;
}
}