From 36d22d82aa202bb199967e9512281e9a53db42c9 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 21:33:14 +0200 Subject: Adding upstream version 115.7.0esr. Signed-off-by: Daniel Baumann --- dom/base/PopoverData.h | 105 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 dom/base/PopoverData.h (limited to 'dom/base/PopoverData.h') diff --git a/dom/base/PopoverData.h b/dom/base/PopoverData.h new file mode 100644 index 0000000000..e0afe70560 --- /dev/null +++ b/dom/base/PopoverData.h @@ -0,0 +1,105 @@ +/* -*- 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_PopoverData_h +#define mozilla_dom_PopoverData_h + +#include "Element.h" +#include "nsINode.h" +#include "nsIRunnable.h" +#include "nsIWeakReferenceUtils.h" +#include "nsStringFwd.h" +#include "nsThreadUtils.h" + +namespace mozilla::dom { + +// https://html.spec.whatwg.org/#attr-popover +enum class PopoverAttributeState : uint8_t { + None, + Auto, ///< https://html.spec.whatwg.org/#attr-popover-auto-state + Manual, ///< https://html.spec.whatwg.org/#attr-popover-manual-state +}; + +enum class PopoverVisibilityState : uint8_t { + Hidden, + Showing, +}; + +class PopoverToggleEventTask : public Runnable { + public: + explicit PopoverToggleEventTask(nsWeakPtr aElement, + PopoverVisibilityState aOldState); + + // MOZ_CAN_RUN_SCRIPT_BOUNDARY until Runnable::Run is MOZ_CAN_RUN_SCRIPT. See + // bug 1535398. + MOZ_CAN_RUN_SCRIPT_BOUNDARY NS_IMETHOD Run() override; + + PopoverVisibilityState GetOldState() const { return mOldState; } + + private: + nsWeakPtr mElement; + PopoverVisibilityState mOldState; +}; + +class PopoverData { + public: + PopoverData() = default; + ~PopoverData() = default; + + PopoverAttributeState GetPopoverAttributeState() const { return mState; } + void SetPopoverAttributeState(PopoverAttributeState aState) { + mState = aState; + } + + PopoverVisibilityState GetPopoverVisibilityState() const { + return mVisibilityState; + } + void SetPopoverVisibilityState(PopoverVisibilityState aVisibilityState) { + mVisibilityState = aVisibilityState; + } + + nsWeakPtr GetPreviouslyFocusedElement() const { + return mPreviouslyFocusedElement; + } + void SetPreviouslyFocusedElement(nsWeakPtr aPreviouslyFocusedElement) { + mPreviouslyFocusedElement = aPreviouslyFocusedElement; + } + + RefPtr GetInvoker() const { + return do_QueryReferent(mInvokerElement); + } + void SetInvoker(Element* aInvokerElement) { + mInvokerElement = + do_GetWeakReference(static_cast(aInvokerElement)); + } + + PopoverToggleEventTask* GetToggleEventTask() const { return mTask; } + void SetToggleEventTask(PopoverToggleEventTask* aTask) { mTask = aTask; } + void ClearToggleEventTask() { mTask = nullptr; } + + bool IsHiding() const { return mIsHiding; } + void SetIsHiding(bool aIsHiding) { mIsHiding = aIsHiding; } + + private: + PopoverVisibilityState mVisibilityState = PopoverVisibilityState::Hidden; + PopoverAttributeState mState = PopoverAttributeState::None; + // Popover and dialog don't share mPreviouslyFocusedElement for there are + // chances to lose the previously focused element. + // See, https://github.com/whatwg/html/issues/9063 + nsWeakPtr mPreviouslyFocusedElement = nullptr; + + // https://html.spec.whatwg.org/#popover-invoker + // Since having a popover invoker only makes a difference if the invoker + // is in the document (in another open popover to be precise) we can make + // this a weak reference, as if the element goes away it's necessarily not + // connected to our document. + nsWeakPtr mInvokerElement; + bool mIsHiding = false; + RefPtr mTask; +}; +} // namespace mozilla::dom + +#endif -- cgit v1.2.3