File: HTMLDialogElement.h

package info (click to toggle)
firefox 145.0.1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,653,528 kB
  • sloc: cpp: 7,594,999; javascript: 6,459,658; ansic: 3,752,909; python: 1,403,455; xml: 629,809; asm: 438,679; java: 186,421; sh: 67,287; makefile: 19,169; objc: 13,086; perl: 12,982; yacc: 4,583; cs: 3,846; pascal: 3,448; lex: 1,720; ruby: 1,003; exp: 762; php: 436; lisp: 258; awk: 247; sql: 66; sed: 54; csh: 10
file content (150 lines) | stat: -rw-r--r-- 4,987 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/* -*- 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 HTMLDialogElement_h
#define HTMLDialogElement_h

#include "mozilla/AsyncEventDispatcher.h"
#include "mozilla/Attributes.h"
#include "mozilla/dom/CloseWatcher.h"
#include "nsGenericHTMLElement.h"
#include "nsGkAtoms.h"

namespace mozilla::dom {

class HTMLDialogElement final : public nsGenericHTMLElement {
 public:
  using Element::Command;

  enum class ClosedBy : uint8_t {
    Auto,
    None,
    Any,
    CloseRequest,
  };

  explicit HTMLDialogElement(
      already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo)
      : nsGenericHTMLElement(std::move(aNodeInfo)),
        mPreviouslyFocusedElement(nullptr),
        mRequestCloseSourceElement(nullptr) {}

  NS_IMPL_FROMNODE_HTML_WITH_TAG(HTMLDialogElement, dialog)

  nsresult Clone(dom::NodeInfo* aNodeInfo, nsINode** aResult) const override;

  ClosedBy GetClosedBy() const;
  void GetClosedBy(nsAString& aValue) const;
  void SetClosedBy(const nsAString& aClosedby, ErrorResult& aError) {
    SetHTMLAttr(nsGkAtoms::closedby, aClosedby, aError);
  }
  bool ParseClosedByAttribute(const nsAString& aValue, nsAttrValue& aResult);

  // nsIContent
  bool ParseAttribute(int32_t aNamespaceID, nsAtom* aAttribute,
                      const nsAString& aValue,
                      nsIPrincipal* aMaybeScriptedPrincipal,
                      nsAttrValue& aResult) override;

  bool Open() const;
  void SetOpen(bool aOpen, ErrorResult& aError) {
    SetHTMLBoolAttr(nsGkAtoms::open, aOpen, aError);
  }

  void GetReturnValue(nsAString& aReturnValue) { aReturnValue = mReturnValue; }
  void SetReturnValue(const nsAString& aReturnValue) {
    mReturnValue = aReturnValue;
  }

  void GetRequestCloseReturnValue(Optional<nsAString>& aReturnValue) {
    if (mRequestCloseReturnValue.isSome()) {
      aReturnValue = &mRequestCloseReturnValue.ref();
    }
  }
  void ClearRequestCloseReturnValue() { mRequestCloseReturnValue.reset(); }
  void SetRequestCloseReturnValue(const nsAString& aReturnValue) {
    mRequestCloseReturnValue.emplace(aReturnValue);
  }

  nsresult BindToTree(BindContext&, nsINode&) override;
  void UnbindFromTree(UnbindContext&) override;

  MOZ_CAN_RUN_SCRIPT_BOUNDARY void Close(
      const mozilla::dom::Optional<nsAString>& aReturnValue) {
    return Close(nullptr, aReturnValue);
  }
  MOZ_CAN_RUN_SCRIPT_BOUNDARY void Close(
      Element* aSource, const mozilla::dom::Optional<nsAString>& aReturnValue);
  MOZ_CAN_RUN_SCRIPT void RequestClose(
      const mozilla::dom::Optional<nsAString>& aReturnValue) {
    RequestClose(nullptr, aReturnValue);
  }
  MOZ_CAN_RUN_SCRIPT_BOUNDARY void RequestClose(
      Element* aSource, const mozilla::dom::Optional<nsAString>& aReturnValue);

  RefPtr<Element> GetRequestCloseSourceElement();

  MOZ_CAN_RUN_SCRIPT void Show(ErrorResult& aError);

  MOZ_CAN_RUN_SCRIPT void ShowModal(Element* aSource, ErrorResult& aError);
  MOZ_CAN_RUN_SCRIPT void ShowModal(ErrorResult& aError) {
    return ShowModal(nullptr, aError);
  }

  void AfterSetAttr(int32_t aNameSpaceID, nsAtom* aName,
                    const nsAttrValue* aValue, const nsAttrValue* aOldValue,
                    nsIPrincipal* aMaybeScriptedPrincipal,
                    bool aNotify) override;

  void AsyncEventRunning(AsyncEventDispatcher* aEvent) override;

  bool IsInTopLayer() const;
  void QueueCancelDialog();
  MOZ_CAN_RUN_SCRIPT void RunCancelDialogSteps();

  MOZ_CAN_RUN_SCRIPT_BOUNDARY void FocusDialog();

  int32_t TabIndexDefault() override;

  bool IsValidCommandAction(Command aCommand) const override;
  MOZ_CAN_RUN_SCRIPT bool HandleCommandInternal(Element* aSource,
                                                Command aCommand,
                                                ErrorResult& aRv) override;

  Maybe<nsString> mRequestCloseReturnValue;
  nsString mReturnValue;

 protected:
  virtual ~HTMLDialogElement();
  JSObject* WrapNode(JSContext* aCx,
                     JS::Handle<JSObject*> aGivenProto) override;

 private:
  void AddToTopLayerIfNeeded();
  void RemoveFromTopLayerIfNeeded();
  void StorePreviouslyFocusedElement();
  MOZ_CAN_RUN_SCRIPT_BOUNDARY void QueueToggleEventTask(Element* aSource);
  void SetDialogCloseWatcherIfNeeded();
  void SetCloseWatcherEnabledState();

  void SetupSteps();
  void CleanupSteps();

  nsWeakPtr mPreviouslyFocusedElement;

  nsWeakPtr mRequestCloseSourceElement;

  RefPtr<AsyncEventDispatcher> mToggleEventDispatcher;

  // This won't need to be cycle collected as CloseWatcher only has strong
  // references to event listeners, which themselves have Weak References back
  // to the Node.
  RefPtr<CloseWatcher> mCloseWatcher;
};

}  // namespace mozilla::dom

#endif