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