diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /dom/base/UserActivation.h | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/base/UserActivation.h')
-rw-r--r-- | dom/base/UserActivation.h | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/dom/base/UserActivation.h b/dom/base/UserActivation.h new file mode 100644 index 0000000000..1ebdddccfa --- /dev/null +++ b/dom/base/UserActivation.h @@ -0,0 +1,182 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_dom_UserActivation_h +#define mozilla_dom_UserActivation_h + +#include "mozilla/Assertions.h" +#include "mozilla/EventForwards.h" +#include "mozilla/TimeStamp.h" +#include "nsCycleCollectionParticipant.h" +#include "nsWrapperCache.h" +#include "nsPIDOMWindow.h" + +namespace IPC { +template <class P> +struct ParamTraits; +} // namespace IPC + +namespace mozilla::dom { + +class UserActivation final : public nsISupports, public nsWrapperCache { + public: + // WebIDL UserActivation + + NS_DECL_CYCLE_COLLECTING_ISUPPORTS + NS_DECL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(UserActivation) + + explicit UserActivation(nsPIDOMWindowInner* aWindow); + + nsPIDOMWindowInner* GetParentObject() const { return mWindow; } + JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) final; + + bool HasBeenActive() const; + bool IsActive() const; + + // End of WebIDL UserActivation + + enum class State : uint8_t { + // Not activated. + None, + // It is considered as has-been-activated, but not transient-activated given + // that it is being consumed. + HasBeenActivated, + // It is considered as has-been-activated, and also transient-activated if + // haven't timed out. + FullActivated, + EndGuard_ + }; + + class StateAndModifiers; + + // Modifier keys held while the user activation. + class Modifiers { + public: + static constexpr uint8_t Shift = 0x10; + static constexpr uint8_t Meta = 0x20; + static constexpr uint8_t Control = 0x40; + static constexpr uint8_t Alt = 0x80; + + static constexpr uint8_t Mask = 0xF0; + + constexpr Modifiers() = default; + explicit constexpr Modifiers(uint8_t aModifiers) : mModifiers(aModifiers) {} + + static constexpr Modifiers None() { return Modifiers(0); } + + void SetShift() { mModifiers |= Shift; } + void SetMeta() { mModifiers |= Meta; } + void SetControl() { mModifiers |= Control; } + void SetAlt() { mModifiers |= Alt; } + + bool IsShift() const { return mModifiers & Shift; } + bool IsMeta() const { return mModifiers & Meta; } + bool IsControl() const { return mModifiers & Control; } + bool IsAlt() const { return mModifiers & Alt; } + + private: + uint8_t mModifiers = 0; + + friend class StateAndModifiers; + template <class P> + friend struct IPC::ParamTraits; + }; + + // State and Modifiers encoded into single data, for WindowContext field. + class StateAndModifiers { + public: + using DataT = uint8_t; + + constexpr StateAndModifiers() = default; + explicit constexpr StateAndModifiers(DataT aStateAndModifiers) + : mStateAndModifiers(aStateAndModifiers) {} + + DataT GetRawData() const { return mStateAndModifiers; } + + State GetState() const { return State(RawState()); } + void SetState(State aState) { + MOZ_ASSERT((uint8_t(aState) & Modifiers::Mask) == 0); + mStateAndModifiers = uint8_t(aState) | RawModifiers(); + } + + Modifiers GetModifiers() const { return Modifiers(RawModifiers()); } + void SetModifiers(Modifiers aModifiers) { + mStateAndModifiers = RawState() | aModifiers.mModifiers; + } + + private: + uint8_t RawState() const { return mStateAndModifiers & ~Modifiers::Mask; } + + uint8_t RawModifiers() const { + return mStateAndModifiers & Modifiers::Mask; + } + + uint8_t mStateAndModifiers = 0; + }; + + /** + * Returns true if the current code is being executed as a result of + * user input or keyboard input. The former includes anything that is + * initiated by user, with the exception of page load events or mouse + * over events. And the latter returns true when one of the user inputs + * is an input from keyboard. If these methods are called from asynchronously + * executed code, such as during layout reflows, it will return false. + */ + static bool IsHandlingUserInput(); + static bool IsHandlingKeyboardInput(); + + /** + * Returns true if the event is considered as user interaction event. I.e., + * enough obvious input to allow to open popup, etc. Otherwise, returns false. + */ + static bool IsUserInteractionEvent(const WidgetEvent* aEvent); + + /** + * StartHandlingUserInput() is called when we start to handle a user input. + * StopHandlingUserInput() is called when we finish handling a user input. + * If the caller knows which input event caused that, it should set + * aMessage to the event message. Otherwise, set eVoidEvent. + * Note that StopHandlingUserInput() caller should call it with exactly same + * event message as its corresponding StartHandlingUserInput() call because + * these methods may count the number of specific event message. + */ + static void StartHandlingUserInput(EventMessage aMessage); + static void StopHandlingUserInput(EventMessage aMessage); + + static TimeStamp GetHandlingInputStart(); + + /** + * Get the timestamp at which the latest user input was handled. + * + * Guaranteed to be monotonic. Until the first user input, return + * the epoch. + */ + static TimeStamp LatestUserInputStart(); + + private: + ~UserActivation() = default; + + nsCOMPtr<nsPIDOMWindowInner> mWindow; +}; + +/** + * This class is used while processing real user input. During this time, popups + * are allowed. For mousedown events, mouse capturing is also permitted. + */ +class MOZ_RAII AutoHandlingUserInputStatePusher final { + public: + explicit AutoHandlingUserInputStatePusher(bool aIsHandlingUserInput, + WidgetEvent* aEvent = nullptr); + ~AutoHandlingUserInputStatePusher(); + + protected: + EventMessage mMessage; + bool mIsHandlingUserInput; +}; + +} // namespace mozilla::dom + +#endif // mozilla_dom_UserActivation_h |