tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

ElementInternals.h (11214B)


      1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim:set ts=2 sw=2 sts=2 et cindent: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #ifndef mozilla_dom_ElementInternals_h
      8 #define mozilla_dom_ElementInternals_h
      9 
     10 #include "AttrArray.h"
     11 #include "js/TypeDecls.h"
     12 #include "mozilla/ErrorResult.h"
     13 #include "mozilla/dom/CustomStateSet.h"
     14 #include "mozilla/dom/ElementInternalsBinding.h"
     15 #include "mozilla/dom/UnionTypes.h"
     16 #include "nsCycleCollectionParticipant.h"
     17 #include "nsGkAtoms.h"
     18 #include "nsIConstraintValidation.h"
     19 #include "nsIFormControl.h"
     20 #include "nsWrapperCache.h"
     21 
     22 #define ARIA_REFLECT_ATTR(method, attr)                             \
     23  void Get##method(nsAString& aValue) const {                       \
     24    GetAttr(nsGkAtoms::attr, aValue);                               \
     25  }                                                                 \
     26  void Set##method(const nsAString& aValue, ErrorResult& aResult) { \
     27    aResult = ErrorResult(SetAttr(nsGkAtoms::attr, aValue));        \
     28  }
     29 
     30 #define ARIA_REFLECT_ATTR_ELEMENT(method, attr)                            \
     31  Element* Get##method() const { return GetAttrElement(nsGkAtoms::attr); } \
     32                                                                           \
     33  void Set##method(Element* aElement) {                                    \
     34    SetAttrElement(nsGkAtoms::attr, aElement);                             \
     35  }
     36 
     37 #define ARIA_REFLECT_ATTR_ELEMENTS(method, attr)                     \
     38  void Get##method(bool* aUseCachedValue,                            \
     39                   Nullable<nsTArray<RefPtr<Element>>>& aElements) { \
     40    GetAttrElements(nsGkAtoms::attr, aUseCachedValue, aElements);    \
     41  }                                                                  \
     42                                                                     \
     43  void Set##method(                                                  \
     44      const Nullable<Sequence<OwningNonNull<Element>>>& aElements) { \
     45    SetAttrElements(nsGkAtoms::attr, aElements);                     \
     46  }
     47 
     48 class nsINodeList;
     49 class nsGenericHTMLElement;
     50 
     51 namespace mozilla::dom {
     52 
     53 class DocGroup;
     54 class HTMLElement;
     55 class HTMLFieldSetElement;
     56 class HTMLFormElement;
     57 class ShadowRoot;
     58 class ValidityState;
     59 
     60 class ElementInternals final : public nsIFormControl,
     61                               public nsIConstraintValidation,
     62                               public nsWrapperCache {
     63 public:
     64  NS_DECL_CYCLE_COLLECTING_ISUPPORTS
     65  NS_DECL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS_AMBIGUOUS(ElementInternals,
     66                                                        nsIFormControl)
     67 
     68  explicit ElementInternals(HTMLElement* aTarget);
     69 
     70  nsISupports* GetParentObject();
     71 
     72  virtual JSObject* WrapObject(JSContext* aCx,
     73                               JS::Handle<JSObject*> aGivenProto) override;
     74 
     75  // WebIDL
     76  ShadowRoot* GetShadowRoot() const;
     77  void SetFormValue(const Nullable<FileOrUSVStringOrFormData>& aValue,
     78                    const Optional<Nullable<FileOrUSVStringOrFormData>>& aState,
     79                    ErrorResult& aRv);
     80  mozilla::dom::HTMLFormElement* GetForm(ErrorResult& aRv) const;
     81  void SetValidity(const ValidityStateFlags& aFlags,
     82                   const Optional<nsAString>& aMessage,
     83                   const Optional<NonNull<nsGenericHTMLElement>>& aAnchor,
     84                   ErrorResult& aRv);
     85  bool GetWillValidate(ErrorResult& aRv) const;
     86  ValidityState* GetValidity(ErrorResult& aRv);
     87  void GetValidationMessage(nsAString& aValidationMessage,
     88                            ErrorResult& aRv) const;
     89  bool CheckValidity(ErrorResult& aRv);
     90  bool ReportValidity(ErrorResult& aRv);
     91  already_AddRefed<nsINodeList> GetLabels(ErrorResult& aRv) const;
     92  nsGenericHTMLElement* GetValidationAnchor(ErrorResult& aRv) const;
     93  CustomStateSet* States();
     94 
     95  // nsIFormControl
     96  mozilla::dom::HTMLFieldSetElement* GetFieldSet() override {
     97    return mFieldSet;
     98  }
     99  mozilla::dom::HTMLFormElement* GetForm() const override { return mForm; }
    100  void SetForm(mozilla::dom::HTMLFormElement* aForm) override;
    101  void ClearForm(bool aRemoveFromForm, bool aUnbindOrDelete) override;
    102  NS_IMETHOD Reset() override;
    103  NS_IMETHOD SubmitNamesValues(mozilla::dom::FormData* aFormData) override;
    104  int32_t GetParserInsertedControlNumberForStateKey() const override {
    105    return mControlNumber;
    106  }
    107 
    108  void SetFieldSet(mozilla::dom::HTMLFieldSetElement* aFieldSet) {
    109    mFieldSet = aFieldSet;
    110  }
    111 
    112  const Nullable<OwningFileOrUSVStringOrFormData>& GetFormSubmissionValue()
    113      const {
    114    return mSubmissionValue;
    115  }
    116 
    117  const Nullable<OwningFileOrUSVStringOrFormData>& GetFormState() const {
    118    return mState;
    119  }
    120 
    121  void RestoreFormValue(Nullable<OwningFileOrUSVStringOrFormData>&& aValue,
    122                        Nullable<OwningFileOrUSVStringOrFormData>&& aState);
    123 
    124  const nsCString& GetStateKey() const { return mStateKey; }
    125  void SetStateKey(nsCString&& key) {
    126    MOZ_ASSERT(mStateKey.IsEmpty(), "FACE state key should only be set once!");
    127    mStateKey = key;
    128  }
    129  void InitializeControlNumber();
    130 
    131  void UpdateFormOwner();
    132  void UpdateBarredFromConstraintValidation();
    133 
    134  void Unlink();
    135 
    136  // AccessibilityRole
    137  ARIA_REFLECT_ATTR(Role, role)
    138 
    139  // AriaAttributes
    140  ARIA_REFLECT_ATTR_ELEMENT(AriaActiveDescendantElement, aria_activedescendant)
    141  ARIA_REFLECT_ATTR(AriaAtomic, aria_atomic)
    142  ARIA_REFLECT_ATTR(AriaAutoComplete, aria_autocomplete)
    143  ARIA_REFLECT_ATTR(AriaBusy, aria_busy)
    144  ARIA_REFLECT_ATTR(AriaBrailleLabel, aria_braillelabel)
    145  ARIA_REFLECT_ATTR(AriaBrailleRoleDescription, aria_brailleroledescription)
    146  ARIA_REFLECT_ATTR(AriaChecked, aria_checked)
    147  ARIA_REFLECT_ATTR(AriaColCount, aria_colcount)
    148  ARIA_REFLECT_ATTR(AriaColIndex, aria_colindex)
    149  ARIA_REFLECT_ATTR(AriaColIndexText, aria_colindextext)
    150  ARIA_REFLECT_ATTR(AriaColSpan, aria_colspan)
    151  ARIA_REFLECT_ATTR_ELEMENTS(AriaControlsElements, aria_controls)
    152  ARIA_REFLECT_ATTR(AriaCurrent, aria_current)
    153  ARIA_REFLECT_ATTR_ELEMENTS(AriaDescribedByElements, aria_describedby)
    154  ARIA_REFLECT_ATTR(AriaDescription, aria_description)
    155  ARIA_REFLECT_ATTR_ELEMENTS(AriaDetailsElements, aria_details)
    156  ARIA_REFLECT_ATTR(AriaDisabled, aria_disabled)
    157  ARIA_REFLECT_ATTR_ELEMENTS(AriaErrorMessageElements, aria_errormessage)
    158  ARIA_REFLECT_ATTR(AriaExpanded, aria_expanded)
    159  ARIA_REFLECT_ATTR_ELEMENTS(AriaFlowToElements, aria_flowto)
    160  ARIA_REFLECT_ATTR(AriaHasPopup, aria_haspopup)
    161  ARIA_REFLECT_ATTR(AriaHidden, aria_hidden)
    162  ARIA_REFLECT_ATTR(AriaInvalid, aria_invalid)
    163  ARIA_REFLECT_ATTR(AriaKeyShortcuts, aria_keyshortcuts)
    164  ARIA_REFLECT_ATTR(AriaLabel, aria_label)
    165  ARIA_REFLECT_ATTR_ELEMENTS(AriaLabelledByElements, aria_labelledby)
    166  ARIA_REFLECT_ATTR(AriaLevel, aria_level)
    167  ARIA_REFLECT_ATTR(AriaLive, aria_live)
    168  ARIA_REFLECT_ATTR(AriaModal, aria_modal)
    169  ARIA_REFLECT_ATTR(AriaMultiLine, aria_multiline)
    170  ARIA_REFLECT_ATTR(AriaMultiSelectable, aria_multiselectable)
    171  ARIA_REFLECT_ATTR(AriaOrientation, aria_orientation)
    172  ARIA_REFLECT_ATTR_ELEMENTS(AriaOwnsElements, aria_owns)
    173  ARIA_REFLECT_ATTR(AriaPlaceholder, aria_placeholder)
    174  ARIA_REFLECT_ATTR(AriaPosInSet, aria_posinset)
    175  ARIA_REFLECT_ATTR(AriaPressed, aria_pressed)
    176  ARIA_REFLECT_ATTR(AriaReadOnly, aria_readonly)
    177  ARIA_REFLECT_ATTR(AriaRelevant, aria_relevant)
    178  ARIA_REFLECT_ATTR(AriaRequired, aria_required)
    179  ARIA_REFLECT_ATTR(AriaRoleDescription, aria_roledescription)
    180  ARIA_REFLECT_ATTR(AriaRowCount, aria_rowcount)
    181  ARIA_REFLECT_ATTR(AriaRowIndex, aria_rowindex)
    182  ARIA_REFLECT_ATTR(AriaRowIndexText, aria_rowindextext)
    183  ARIA_REFLECT_ATTR(AriaRowSpan, aria_rowspan)
    184  ARIA_REFLECT_ATTR(AriaSelected, aria_selected)
    185  ARIA_REFLECT_ATTR(AriaSetSize, aria_setsize)
    186  ARIA_REFLECT_ATTR(AriaSort, aria_sort)
    187  ARIA_REFLECT_ATTR(AriaValueMax, aria_valuemax)
    188  ARIA_REFLECT_ATTR(AriaValueMin, aria_valuemin)
    189  ARIA_REFLECT_ATTR(AriaValueNow, aria_valuenow)
    190  ARIA_REFLECT_ATTR(AriaValueText, aria_valuetext)
    191 
    192  void GetAttr(const nsAtom* aName, nsAString& aResult) const;
    193 
    194  nsresult SetAttr(nsAtom* aName, const nsAString& aValue);
    195 
    196  bool GetAttrElements(nsAtom* aAttr, nsTArray<Element*>& aElements);
    197 
    198  const AttrArray& GetAttrs() const { return mAttrs; }
    199 
    200  DocGroup* GetDocGroup();
    201 
    202 private:
    203  ~ElementInternals() = default;
    204 
    205  /**
    206   * Gets the attribute element for the given attribute.
    207   * https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#explicitly-set-attr-element
    208   */
    209  Element* GetAttrElement(nsAtom* aAttr) const;
    210 
    211  /**
    212   * Sets an attribute element for the given attribute.
    213   * https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#explicitly-set-attr-element
    214   */
    215  void SetAttrElement(nsAtom* aAttr, Element* aElement);
    216 
    217  void SetAttrElements(
    218      nsAtom* aAttr,
    219      const Nullable<Sequence<OwningNonNull<Element>>>& aElements);
    220 
    221  void GetAttrElements(nsAtom* aAttr, bool* aUseCachedValue,
    222                       Nullable<nsTArray<RefPtr<Element>>>& aElements);
    223 
    224  nsresult SetAttrInternal(nsAtom* aName, const nsAString& aValue);
    225 
    226  nsresult UnsetAttrInternal(nsAtom* aName);
    227 
    228  // It's a target element which is a custom element.
    229  RefPtr<HTMLElement> mTarget;
    230 
    231  // The form that contains the target element.
    232  // It's safe to use raw pointer because it will be reset via
    233  // CustomElementData::Unlink when mTarget is released or unlinked.
    234  HTMLFormElement* mForm;
    235 
    236  // This is a pointer to the target element's closest fieldset parent if any.
    237  // It's safe to use raw pointer because it will be reset via
    238  // CustomElementData::Unlink when mTarget is released or unlinked.
    239  HTMLFieldSetElement* mFieldSet;
    240 
    241  // https://html.spec.whatwg.org/#face-submission-value
    242  Nullable<OwningFileOrUSVStringOrFormData> mSubmissionValue;
    243 
    244  // https://html.spec.whatwg.org/#face-state
    245  // TODO: Bug 1734841 - Figure out how to support autocomplete for
    246  //       form-associated custom element.
    247  Nullable<OwningFileOrUSVStringOrFormData> mState;
    248 
    249  // https://html.spec.whatwg.org/#face-validation-message
    250  nsString mValidationMessage;
    251 
    252  // https://html.spec.whatwg.org/#face-validation-anchor
    253  RefPtr<nsGenericHTMLElement> mValidationAnchor;
    254 
    255  AttrArray mAttrs;
    256 
    257  // Used to store the key to a form-associated custom element in the current
    258  // session. Is empty until element has been upgraded.
    259  nsCString mStateKey;
    260 
    261  RefPtr<CustomStateSet> mCustomStateSet;
    262 
    263  // A number for a form-associated custom element that is unique within its
    264  // owner document. This is only set to a number for elements inserted into the
    265  // document by the parser from the network. Otherwise, it is -1.
    266  int32_t mControlNumber;
    267 
    268  /**
    269   * Explicitly set attr-elements, see
    270   * https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#explicitly-set-attr-element
    271   */
    272  nsTHashMap<RefPtr<nsAtom>, nsWeakPtr> mAttrElementMap;
    273 
    274  nsTHashMap<RefPtr<nsAtom>,
    275             std::pair<nsTArray<nsWeakPtr>, nsTArray<RefPtr<Element>>>>
    276      mAttrElementsMap;
    277 };
    278 
    279 }  // namespace mozilla::dom
    280 
    281 #undef ARIA_REFLECT_ATTR
    282 
    283 #endif  // mozilla_dom_ElementInternals_h