UserGestureIndicator.cpp [plain text]
#include "config.h"
#include "UserGestureIndicator.h"
#include "Document.h"
#include <wtf/MainThread.h>
#include <wtf/NeverDestroyed.h>
namespace WebCore {
static RefPtr<UserGestureToken>& currentToken()
{
static NeverDestroyed<RefPtr<UserGestureToken>> token;
return token;
}
UserGestureToken::~UserGestureToken()
{
for (auto& observer : m_destructionObservers)
observer(*this);
}
UserGestureIndicator::UserGestureIndicator(Optional<ProcessingUserGestureState> state, Document* document)
: m_previousToken(currentToken())
{
if (!isMainThread())
return;
if (state)
currentToken() = UserGestureToken::create(state.value());
if (document && currentToken()->processingUserGesture())
document->topDocument().updateLastHandledUserGestureTimestamp();
}
UserGestureIndicator::UserGestureIndicator(RefPtr<UserGestureToken> token)
: m_previousToken(currentToken())
{
if (!isMainThread())
return;
if (token)
currentToken() = token;
}
UserGestureIndicator::~UserGestureIndicator()
{
if (!isMainThread())
return;
currentToken() = m_previousToken;
}
RefPtr<UserGestureToken> UserGestureIndicator::currentUserGesture()
{
if (!isMainThread())
return nullptr;
return currentToken();
}
bool UserGestureIndicator::processingUserGesture()
{
if (!isMainThread())
return false;
return currentToken() ? currentToken()->processingUserGesture() : false;
}
bool UserGestureIndicator::processingUserGestureForMedia()
{
if (!isMainThread())
return false;
return currentToken() ? currentToken()->processingUserGestureForMedia() : false;
}
}