2892bdfa8aa50e0d7c96836b17623b72bf78045f
[WebKit-https.git] / Source / WebCore / dom / Element.h
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2001 Peter Kelly (pmk@post.com)
5  *           (C) 2001 Dirk Mueller (mueller@kde.org)
6  * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2013 Apple Inc. All rights reserved.
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public License
19  * along with this library; see the file COPYING.LIB.  If not, write to
20  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21  * Boston, MA 02110-1301, USA.
22  *
23  */
24
25 #ifndef Element_h
26 #define Element_h
27
28 #include "CollectionType.h"
29 #include "Document.h"
30 #include "ElementData.h"
31 #include "HTMLNames.h"
32 #include "RegionOversetState.h"
33 #include "ScrollTypes.h"
34 #include "SimulatedClickOptions.h"
35 #include "StyleResolveTree.h"
36
37 namespace WebCore {
38
39 class ClientRect;
40 class ClientRectList;
41 class DatasetDOMStringMap;
42 class DOMTokenList;
43 class ElementRareData;
44 class HTMLDocument;
45 class IntSize;
46 class Locale;
47 class PlatformKeyboardEvent;
48 class PlatformMouseEvent;
49 class PlatformWheelEvent;
50 class PseudoElement;
51 class RenderNamedFlowFragment;
52 class ShadowRoot;
53
54 enum AffectedSelectorType {
55     AffectedSelectorChecked = 1,
56     AffectedSelectorEnabled = 1 << 1,
57     AffectedSelectorDisabled = 1 << 2,
58     AffectedSelectorIndeterminate = 1 << 3,
59     AffectedSelectorLink = 1 << 4,
60     AffectedSelectorTarget = 1 << 5,
61     AffectedSelectorVisited = 1 << 6
62 };
63 typedef int AffectedSelectorMask;
64
65 enum SpellcheckAttributeState {
66     SpellcheckAttributeTrue,
67     SpellcheckAttributeFalse,
68     SpellcheckAttributeDefault
69 };
70
71 class Element : public ContainerNode {
72 public:
73     static PassRefPtr<Element> create(const QualifiedName&, Document&);
74     virtual ~Element();
75
76     DEFINE_ATTRIBUTE_EVENT_LISTENER(abort);
77     DEFINE_ATTRIBUTE_EVENT_LISTENER(change);
78     DEFINE_ATTRIBUTE_EVENT_LISTENER(click);
79     DEFINE_ATTRIBUTE_EVENT_LISTENER(contextmenu);
80     DEFINE_ATTRIBUTE_EVENT_LISTENER(dblclick);
81     DEFINE_ATTRIBUTE_EVENT_LISTENER(dragenter);
82     DEFINE_ATTRIBUTE_EVENT_LISTENER(dragover);
83     DEFINE_ATTRIBUTE_EVENT_LISTENER(dragleave);
84     DEFINE_ATTRIBUTE_EVENT_LISTENER(drop);
85     DEFINE_ATTRIBUTE_EVENT_LISTENER(dragstart);
86     DEFINE_ATTRIBUTE_EVENT_LISTENER(drag);
87     DEFINE_ATTRIBUTE_EVENT_LISTENER(dragend);
88     DEFINE_ATTRIBUTE_EVENT_LISTENER(input);
89     DEFINE_ATTRIBUTE_EVENT_LISTENER(invalid);
90     DEFINE_ATTRIBUTE_EVENT_LISTENER(keydown);
91     DEFINE_ATTRIBUTE_EVENT_LISTENER(keypress);
92     DEFINE_ATTRIBUTE_EVENT_LISTENER(keyup);
93     DEFINE_ATTRIBUTE_EVENT_LISTENER(mousedown);
94     DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseenter);
95     DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseleave);
96     DEFINE_ATTRIBUTE_EVENT_LISTENER(mousemove);
97     DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseout);
98     DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseover);
99     DEFINE_ATTRIBUTE_EVENT_LISTENER(mouseup);
100     DEFINE_ATTRIBUTE_EVENT_LISTENER(mousewheel);
101     DEFINE_ATTRIBUTE_EVENT_LISTENER(scroll);
102     DEFINE_ATTRIBUTE_EVENT_LISTENER(select);
103     DEFINE_ATTRIBUTE_EVENT_LISTENER(submit);
104 #if ENABLE(WILL_REVEAL_EDGE_EVENTS)
105     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitwillrevealbottom);
106     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitwillrevealleft);
107     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitwillrevealright);
108     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitwillrevealtop);
109 #endif
110     DEFINE_ATTRIBUTE_EVENT_LISTENER(wheel);
111
112     // These four attribute event handler attributes are overridden by HTMLBodyElement
113     // and HTMLFrameSetElement to forward to the DOMWindow.
114     DECLARE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(blur);
115     DECLARE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(error);
116     DECLARE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(focus);
117     DECLARE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(load);
118
119     // WebKit extensions
120     DEFINE_ATTRIBUTE_EVENT_LISTENER(beforecut);
121     DEFINE_ATTRIBUTE_EVENT_LISTENER(cut);
122     DEFINE_ATTRIBUTE_EVENT_LISTENER(beforecopy);
123     DEFINE_ATTRIBUTE_EVENT_LISTENER(copy);
124     DEFINE_ATTRIBUTE_EVENT_LISTENER(beforepaste);
125     DEFINE_ATTRIBUTE_EVENT_LISTENER(paste);
126     DEFINE_ATTRIBUTE_EVENT_LISTENER(reset);
127     DEFINE_ATTRIBUTE_EVENT_LISTENER(search);
128     DEFINE_ATTRIBUTE_EVENT_LISTENER(selectstart);
129 #if ENABLE(TOUCH_EVENTS)
130     DEFINE_ATTRIBUTE_EVENT_LISTENER(touchstart);
131     DEFINE_ATTRIBUTE_EVENT_LISTENER(touchmove);
132     DEFINE_ATTRIBUTE_EVENT_LISTENER(touchend);
133     DEFINE_ATTRIBUTE_EVENT_LISTENER(touchcancel);
134 #endif
135 #if ENABLE(IOS_GESTURE_EVENTS)
136     DEFINE_ATTRIBUTE_EVENT_LISTENER(gesturestart);
137     DEFINE_ATTRIBUTE_EVENT_LISTENER(gesturechange);
138     DEFINE_ATTRIBUTE_EVENT_LISTENER(gestureend);
139 #endif
140 #if ENABLE(FULLSCREEN_API)
141     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitfullscreenchange);
142     DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitfullscreenerror);
143 #endif
144
145     WEBCORE_EXPORT bool hasAttribute(const QualifiedName&) const;
146     WEBCORE_EXPORT const AtomicString& getAttribute(const QualifiedName&) const;
147     WEBCORE_EXPORT void setAttribute(const QualifiedName&, const AtomicString& value);
148     void setAttributeWithoutSynchronization(const QualifiedName&, const AtomicString& value);
149     void setSynchronizedLazyAttribute(const QualifiedName&, const AtomicString& value);
150     bool removeAttribute(const QualifiedName&);
151
152     // Typed getters and setters for language bindings.
153     int getIntegralAttribute(const QualifiedName& attributeName) const;
154     void setIntegralAttribute(const QualifiedName& attributeName, int value);
155     unsigned getUnsignedIntegralAttribute(const QualifiedName& attributeName) const;
156     void setUnsignedIntegralAttribute(const QualifiedName& attributeName, unsigned value);
157
158     // Call this to get the value of an attribute that is known not to be the style
159     // attribute or one of the SVG animatable attributes.
160     bool fastHasAttribute(const QualifiedName&) const;
161     const AtomicString& fastGetAttribute(const QualifiedName&) const;
162 #ifndef NDEBUG
163     WEBCORE_EXPORT bool fastAttributeLookupAllowed(const QualifiedName&) const;
164 #endif
165
166 #ifdef DUMP_NODE_STATISTICS
167     bool hasNamedNodeMap() const;
168 #endif
169     bool hasAttributes() const;
170     // This variant will not update the potentially invalid attributes. To be used when not interested
171     // in style attribute or one of the SVG animation attributes.
172     bool hasAttributesWithoutUpdate() const;
173
174     WEBCORE_EXPORT bool hasAttribute(const AtomicString& name) const;
175     bool hasAttributeNS(const AtomicString& namespaceURI, const AtomicString& localName) const;
176
177     WEBCORE_EXPORT const AtomicString& getAttribute(const AtomicString& name) const;
178     const AtomicString& getAttributeNS(const AtomicString& namespaceURI, const AtomicString& localName) const;
179
180     WEBCORE_EXPORT void setAttribute(const AtomicString& name, const AtomicString& value, ExceptionCode&);
181     static bool parseAttributeName(QualifiedName&, const AtomicString& namespaceURI, const AtomicString& qualifiedName, ExceptionCode&);
182     void setAttributeNS(const AtomicString& namespaceURI, const AtomicString& qualifiedName, const AtomicString& value, ExceptionCode&);
183
184     const AtomicString& getIdAttribute() const;
185     void setIdAttribute(const AtomicString&);
186
187     const AtomicString& getNameAttribute() const;
188
189     // Call this to get the value of the id attribute for style resolution purposes.
190     // The value will already be lowercased if the document is in compatibility mode,
191     // so this function is not suitable for non-style uses.
192     const AtomicString& idForStyleResolution() const;
193
194     // Internal methods that assume the existence of attribute storage, one should use hasAttributes()
195     // before calling them.
196     AttributeIteratorAccessor attributesIterator() const { return elementData()->attributesIterator(); }
197     unsigned attributeCount() const;
198     const Attribute& attributeAt(unsigned index) const;
199     const Attribute* findAttributeByName(const QualifiedName&) const;
200     unsigned findAttributeIndexByName(const QualifiedName& name) const { return elementData()->findAttributeIndexByName(name); }
201     unsigned findAttributeIndexByName(const AtomicString& name, bool shouldIgnoreAttributeCase) const { return elementData()->findAttributeIndexByName(name, shouldIgnoreAttributeCase); }
202
203     void scrollIntoView(bool alignToTop = true);
204     void scrollIntoViewIfNeeded(bool centerIfNeeded = true);
205
206     void scrollByLines(int lines);
207     void scrollByPages(int pages);
208
209     double offsetLeft();
210     double offsetTop();
211     double offsetWidth();
212     double offsetHeight();
213
214     // FIXME: Replace uses of offsetParent in the platform with calls
215     // to the render layer and merge bindingsOffsetParent and offsetParent.
216     Element* bindingsOffsetParent();
217
218     Element* offsetParent();
219     double clientLeft();
220     double clientTop();
221     double clientWidth();
222     double clientHeight();
223     virtual int scrollLeft();
224     virtual int scrollTop();
225     virtual void setScrollLeft(int);
226     virtual void setScrollTop(int);
227     virtual int scrollWidth();
228     virtual int scrollHeight();
229
230     WEBCORE_EXPORT IntRect boundsInRootViewSpace();
231
232     PassRefPtr<ClientRectList> getClientRects();
233     PassRefPtr<ClientRect> getBoundingClientRect();
234     
235     // Returns the absolute bounding box translated into client coordinates.
236     WEBCORE_EXPORT IntRect clientRect() const;
237     // Returns the absolute bounding box translated into screen coordinates.
238     WEBCORE_EXPORT IntRect screenRect() const;
239
240     bool removeAttribute(const AtomicString& name);
241     bool removeAttributeNS(const AtomicString& namespaceURI, const AtomicString& localName);
242
243     PassRefPtr<Attr> detachAttribute(unsigned index);
244
245     PassRefPtr<Attr> getAttributeNode(const AtomicString& name);
246     PassRefPtr<Attr> getAttributeNodeNS(const AtomicString& namespaceURI, const AtomicString& localName);
247     PassRefPtr<Attr> setAttributeNode(Attr*, ExceptionCode&);
248     PassRefPtr<Attr> setAttributeNodeNS(Attr*, ExceptionCode&);
249     PassRefPtr<Attr> removeAttributeNode(Attr*, ExceptionCode&);
250
251     PassRefPtr<Attr> attrIfExists(const QualifiedName&);
252     PassRefPtr<Attr> ensureAttr(const QualifiedName&);
253
254     const Vector<RefPtr<Attr>>& attrNodeList();
255
256     virtual CSSStyleDeclaration* style();
257
258     const QualifiedName& tagQName() const { return m_tagName; }
259 #if ENABLE(CSS_SELECTOR_JIT)
260     static ptrdiff_t tagQNameMemoryOffset() { return OBJECT_OFFSETOF(Element, m_tagName); }
261 #endif // ENABLE(CSS_SELECTOR_JIT)
262     String tagName() const { return nodeName(); }
263     bool hasTagName(const QualifiedName& tagName) const { return m_tagName.matches(tagName); }
264     bool hasTagName(const HTMLQualifiedName& tagName) const { return ContainerNode::hasTagName(tagName); }
265     bool hasTagName(const MathMLQualifiedName& tagName) const { return ContainerNode::hasTagName(tagName); }
266     bool hasTagName(const SVGQualifiedName& tagName) const { return ContainerNode::hasTagName(tagName); }
267
268     // A fast function for checking the local name against another atomic string.
269     bool hasLocalName(const AtomicString& other) const { return m_tagName.localName() == other; }
270
271     virtual const AtomicString& localName() const override final { return m_tagName.localName(); }
272     virtual const AtomicString& prefix() const override final { return m_tagName.prefix(); }
273     virtual const AtomicString& namespaceURI() const override final { return m_tagName.namespaceURI(); }
274
275     virtual URL baseURI() const override final;
276
277     virtual String nodeName() const override;
278
279     PassRefPtr<Element> cloneElementWithChildren();
280     PassRefPtr<Element> cloneElementWithoutChildren();
281
282     void normalizeAttributes();
283     String nodeNamePreservingCase() const;
284
285     void setBooleanAttribute(const QualifiedName& name, bool);
286
287     // For exposing to DOM only.
288     NamedNodeMap& attributes() const;
289
290     enum AttributeModificationReason {
291         ModifiedDirectly,
292         ModifiedByCloning
293     };
294
295     // This method is called whenever an attribute is added, changed or removed.
296     virtual void attributeChanged(const QualifiedName&, const AtomicString& oldValue, const AtomicString& newValue, AttributeModificationReason = ModifiedDirectly);
297     virtual void parseAttribute(const QualifiedName&, const AtomicString&) { }
298
299     // Only called by the parser immediately after element construction.
300     void parserSetAttributes(const Vector<Attribute>&);
301
302     // Remove attributes that might introduce scripting from the vector leaving the element unchanged.
303     void stripScriptingAttributes(Vector<Attribute>&) const;
304
305     const ElementData* elementData() const { return m_elementData.get(); }
306     static ptrdiff_t elementDataMemoryOffset() { return OBJECT_OFFSETOF(Element, m_elementData); }
307     UniqueElementData& ensureUniqueElementData();
308
309     void synchronizeAllAttributes() const;
310
311     // Clones attributes only.
312     void cloneAttributesFromElement(const Element&);
313
314     // Clones all attribute-derived data, including subclass specifics (through copyNonAttributeProperties.)
315     void cloneDataFromElement(const Element&);
316
317     bool hasEquivalentAttributes(const Element* other) const;
318
319     virtual void copyNonAttributePropertiesFromElement(const Element&) { }
320
321     void lazyReattach();
322
323     virtual RenderPtr<RenderElement> createElementRenderer(PassRef<RenderStyle>);
324     virtual bool rendererIsNeeded(const RenderStyle&);
325     void didAffectSelector(AffectedSelectorMask);
326
327     WEBCORE_EXPORT ShadowRoot* shadowRoot() const;
328     WEBCORE_EXPORT PassRefPtr<ShadowRoot> createShadowRoot(ExceptionCode&);
329
330     ShadowRoot* userAgentShadowRoot() const;
331     ShadowRoot& ensureUserAgentShadowRoot();
332
333     // FIXME: this should not be virtual, do not override this.
334     virtual const AtomicString& shadowPseudoId() const;
335
336     bool inActiveChain() const { return isUserActionElement() && isUserActionElementInActiveChain(); }
337     bool active() const { return isUserActionElement() && isUserActionElementActive(); }
338     bool hovered() const { return isUserActionElement() && isUserActionElementHovered(); }
339     bool focused() const { return isUserActionElement() && isUserActionElementFocused(); }
340
341     virtual void setActive(bool flag = true, bool pause = false);
342     virtual void setHovered(bool flag = true);
343     virtual void setFocus(bool flag);
344
345     virtual bool supportsFocus() const;
346     virtual bool isFocusable() const;
347     virtual bool isKeyboardFocusable(KeyboardEvent*) const;
348     virtual bool isMouseFocusable() const;
349
350     virtual bool shouldUseInputMethod();
351
352     virtual short tabIndex() const;
353     void setTabIndex(int);
354     virtual Element* focusDelegate();
355
356     virtual RenderStyle* computedStyle(PseudoId = NOPSEUDO) override;
357
358     // Methods for indicating the style is affected by dynamic updates (e.g., children changing, our position changing in our sibling list, etc.)
359     bool styleAffectedByEmpty() const { return hasRareData() && rareDataStyleAffectedByEmpty(); }
360     bool childrenAffectedByHover() const { return getFlag(ChildrenAffectedByHoverRulesFlag); }
361     bool childrenAffectedByActive() const { return hasRareData() && rareDataChildrenAffectedByActive(); }
362     bool childrenAffectedByDrag() const { return hasRareData() && rareDataChildrenAffectedByDrag(); }
363     bool childrenAffectedByFirstChildRules() const { return getFlag(ChildrenAffectedByFirstChildRulesFlag); }
364     bool childrenAffectedByLastChildRules() const { return getFlag(ChildrenAffectedByLastChildRulesFlag); }
365     bool childrenAffectedByBackwardPositionalRules() const { return hasRareData() && rareDataChildrenAffectedByBackwardPositionalRules(); }
366     bool affectsNextSiblingElementStyle() const { return getFlag(AffectsNextSiblingElementStyle); }
367     unsigned childIndex() const { return hasRareData() ? rareDataChildIndex() : 0; }
368
369     bool hasFlagsSetDuringStylingOfChildren() const;
370
371     void setStyleAffectedByEmpty();
372     void setChildrenAffectedByHover() { setFlag(ChildrenAffectedByHoverRulesFlag); }
373     void setChildrenAffectedByActive();
374     void setChildrenAffectedByDrag();
375     void setChildrenAffectedByFirstChildRules() { setFlag(ChildrenAffectedByFirstChildRulesFlag); }
376     void setChildrenAffectedByLastChildRules() { setFlag(ChildrenAffectedByLastChildRulesFlag); }
377     void setChildrenAffectedByBackwardPositionalRules();
378     void setAffectsNextSiblingElementStyle() { setFlag(AffectsNextSiblingElementStyle); }
379     void setStyleIsAffectedByPreviousSibling() { setFlag(StyleIsAffectedByPreviousSibling); }
380     void setChildIndex(unsigned);
381
382     void setRegionOversetState(RegionOversetState);
383     RegionOversetState regionOversetState() const;
384
385     AtomicString computeInheritedLanguage() const;
386     Locale& locale() const;
387
388     virtual void accessKeyAction(bool /*sendToAnyEvent*/) { }
389
390     virtual bool isURLAttribute(const Attribute&) const { return false; }
391     virtual bool attributeContainsURL(const Attribute& attribute) const { return isURLAttribute(attribute); }
392     virtual String completeURLsInAttributeValue(const URL& base, const Attribute&) const;
393     virtual bool isHTMLContentAttribute(const Attribute&) const { return false; }
394
395     WEBCORE_EXPORT URL getURLAttribute(const QualifiedName&) const;
396     URL getNonEmptyURLAttribute(const QualifiedName&) const;
397
398     virtual const AtomicString& imageSourceURL() const;
399     virtual String target() const { return String(); }
400
401     void updateFocusAppearanceAfterAttachIfNeeded();
402     virtual void focus(bool restorePreviousSelection = true, FocusDirection = FocusDirectionNone);
403     virtual void updateFocusAppearance(bool restorePreviousSelection);
404     virtual void blur();
405
406     WEBCORE_EXPORT String innerText();
407     String outerText();
408  
409     virtual String title() const;
410
411     const AtomicString& pseudo() const;
412     WEBCORE_EXPORT void setPseudo(const AtomicString&);
413
414     LayoutSize minimumSizeForResizing() const;
415     void setMinimumSizeForResizing(const LayoutSize&);
416
417     // Use Document::registerForDocumentActivationCallbacks() to subscribe to these
418     virtual void documentWillSuspendForPageCache() { }
419     virtual void documentDidResumeFromPageCache() { }
420
421     // Use Document::registerForMediaVolumeCallbacks() to subscribe to this
422     virtual void mediaVolumeDidChange() { }
423
424     // Use Document::registerForPrivateBrowsingStateChangedCallbacks() to subscribe to this.
425     virtual void privateBrowsingStateDidChange() { }
426
427     virtual void didBecomeFullscreenElement() { }
428     virtual void willStopBeingFullscreenElement() { }
429
430     // Use Document::registerForVisibilityStateChangedCallbacks() to subscribe to this.
431     virtual void visibilityStateChanged() { }
432
433 #if ENABLE(VIDEO_TRACK)
434     virtual void captionPreferencesChanged() { }
435 #endif
436
437     bool isFinishedParsingChildren() const { return isParsingChildrenFinished(); }
438     virtual void finishParsingChildren() override;
439     virtual void beginParsingChildren() override final;
440
441     WEBCORE_EXPORT PseudoElement* beforePseudoElement() const;
442     WEBCORE_EXPORT PseudoElement* afterPseudoElement() const;
443     bool childNeedsShadowWalker() const;
444     void didShadowTreeAwareChildrenChange();
445
446     // ElementTraversal API
447     Element* firstElementChild() const;
448     Element* lastElementChild() const;
449     Element* previousElementSibling() const;
450     Element* nextElementSibling() const;
451     unsigned childElementCount() const;
452
453     virtual bool matchesReadWritePseudoClass() const;
454     bool matches(const String& selectors, ExceptionCode&);
455     virtual bool shouldAppearIndeterminate() const;
456
457     DOMTokenList& classList();
458
459     DatasetDOMStringMap& dataset();
460
461 #if ENABLE(VIDEO)
462     virtual bool isMediaElement() const { return false; }
463 #endif
464
465     virtual bool isFormControlElement() const { return false; }
466     virtual bool isSpinButtonElement() const { return false; }
467     virtual bool isTextFormControl() const { return false; }
468     virtual bool isOptionalFormControl() const { return false; }
469     virtual bool isRequiredFormControl() const { return false; }
470     virtual bool isDefaultButtonForForm() const { return false; }
471     virtual bool willValidate() const { return false; }
472     virtual bool isValidFormControlElement() const { return false; }
473     virtual bool isInRange() const { return false; }
474     virtual bool isOutOfRange() const { return false; }
475     virtual bool isFrameElementBase() const { return false; }
476     virtual bool isSearchFieldCancelButtonElement() const { return false; }
477
478     virtual bool canContainRangeEndPoint() const override;
479
480     // Used for disabled form elements; if true, prevents mouse events from being dispatched
481     // to event listeners, and prevents DOMActivate events from being sent at all.
482     virtual bool isDisabledFormControl() const { return false; }
483
484     virtual bool childShouldCreateRenderer(const Node&) const;
485
486     bool hasPendingResources() const;
487     void setHasPendingResources();
488     void clearHasPendingResources();
489     virtual void buildPendingResource() { };
490
491 #if ENABLE(FULLSCREEN_API)
492     enum {
493         ALLOW_KEYBOARD_INPUT = 1 << 0,
494         LEGACY_MOZILLA_REQUEST = 1 << 1,
495     };
496     
497     void webkitRequestFullScreen(unsigned short flags);
498     WEBCORE_EXPORT bool containsFullScreenElement() const;
499     void setContainsFullScreenElement(bool);
500     void setContainsFullScreenElementOnAncestorsCrossingFrameBoundaries(bool);
501
502     // W3C API
503     void webkitRequestFullscreen();
504 #endif
505
506 #if ENABLE(POINTER_LOCK)
507     void requestPointerLock();
508 #endif
509
510 #if ENABLE(INDIE_UI)
511     void setUIActions(const AtomicString&);
512     const AtomicString& UIActions() const;
513 #endif
514     
515     virtual bool isSpellCheckingEnabled() const;
516
517     RenderNamedFlowFragment* renderNamedFlowFragment() const;
518
519 #if ENABLE(CSS_REGIONS)
520     virtual bool shouldMoveToFlowThread(const RenderStyle&) const;
521     
522     const AtomicString& webkitRegionOverset() const;
523     Vector<RefPtr<Range>> webkitGetRegionFlowRanges() const;
524 #endif
525
526     bool hasID() const;
527     bool hasClass() const;
528     bool hasName() const;
529     const SpaceSplitString& classNames() const;
530
531     IntSize savedLayerScrollOffset() const;
532     void setSavedLayerScrollOffset(const IntSize&);
533
534     bool dispatchMouseEvent(const PlatformMouseEvent&, const AtomicString& eventType, int clickCount = 0, Element* relatedTarget = nullptr);
535     bool dispatchWheelEvent(const PlatformWheelEvent&);
536     bool dispatchKeyEvent(const PlatformKeyboardEvent&);
537     void dispatchSimulatedClick(Event* underlyingEvent, SimulatedClickMouseEventOptions = SendNoEvents, SimulatedClickVisualOptions = ShowPressedLook);
538     void dispatchFocusInEvent(const AtomicString& eventType, PassRefPtr<Element> oldFocusedElement);
539     void dispatchFocusOutEvent(const AtomicString& eventType, PassRefPtr<Element> newFocusedElement);
540     virtual void dispatchFocusEvent(PassRefPtr<Element> oldFocusedElement, FocusDirection);
541     virtual void dispatchBlurEvent(PassRefPtr<Element> newFocusedElement);
542
543     virtual bool willRecalcStyle(Style::Change);
544     virtual void didRecalcStyle(Style::Change);
545     virtual void willResetComputedStyle();
546     virtual void willAttachRenderers();
547     virtual void didAttachRenderers();
548     virtual void willDetachRenderers();
549     virtual void didDetachRenderers();
550     virtual PassRefPtr<RenderStyle> customStyleForRenderer(RenderStyle& parentStyle);
551
552     void setBeforePseudoElement(PassRefPtr<PseudoElement>);
553     void setAfterPseudoElement(PassRefPtr<PseudoElement>);
554     void clearBeforePseudoElement();
555     void clearAfterPseudoElement();
556     void resetComputedStyle();
557     void clearStyleDerivedDataBeforeDetachingRenderer();
558     void clearHoverAndActiveStatusBeforeDetachingRenderer();
559
560     WEBCORE_EXPORT URL absoluteLinkURL() const;
561
562 protected:
563     Element(const QualifiedName&, Document&, ConstructionType);
564
565     virtual InsertionNotificationRequest insertedInto(ContainerNode&) override;
566     virtual void removedFrom(ContainerNode&) override;
567     virtual void childrenChanged(const ChildChange&) override;
568     virtual void removeAllEventListeners() override final;
569
570     void clearTabIndexExplicitlyIfNeeded();    
571     void setTabIndexExplicitly(short);
572
573     PassRefPtr<HTMLCollection> ensureCachedHTMLCollection(CollectionType);
574     HTMLCollection* cachedHTMLCollection(CollectionType);
575
576     // classAttributeChanged() exists to share code between
577     // parseAttribute (called via setAttribute()) and
578     // svgAttributeChanged (called when element.className.baseValue is set)
579     void classAttributeChanged(const AtomicString& newClassString);
580
581 private:
582     bool isTextNode() const;
583
584     bool isUserActionElementInActiveChain() const;
585     bool isUserActionElementActive() const;
586     bool isUserActionElementFocused() const;
587     bool isUserActionElementHovered() const;
588
589     void resetNeedsNodeRenderingTraversalSlowPath();
590
591     virtual void didAddUserAgentShadowRoot(ShadowRoot*) { }
592     virtual bool alwaysCreateUserAgentShadowRoot() const { return false; }
593
594     // FIXME: Remove the need for Attr to call willModifyAttribute/didModifyAttribute.
595     friend class Attr;
596
597     enum SynchronizationOfLazyAttribute { NotInSynchronizationOfLazyAttribute = 0, InSynchronizationOfLazyAttribute };
598
599     void didAddAttribute(const QualifiedName&, const AtomicString&);
600     void willModifyAttribute(const QualifiedName&, const AtomicString& oldValue, const AtomicString& newValue);
601     void didModifyAttribute(const QualifiedName&, const AtomicString& oldValue, const AtomicString& newValue);
602     void didRemoveAttribute(const QualifiedName&, const AtomicString& oldValue);
603
604     void synchronizeAttribute(const QualifiedName&) const;
605     void synchronizeAttribute(const AtomicString& localName) const;
606
607     void updateName(const AtomicString& oldName, const AtomicString& newName);
608     void updateNameForTreeScope(TreeScope&, const AtomicString& oldName, const AtomicString& newName);
609     void updateNameForDocument(HTMLDocument&, const AtomicString& oldName, const AtomicString& newName);
610     void updateId(const AtomicString& oldId, const AtomicString& newId);
611     void updateIdForTreeScope(TreeScope&, const AtomicString& oldId, const AtomicString& newId);
612     enum HTMLDocumentNamedItemMapsUpdatingCondition { AlwaysUpdateHTMLDocumentNamedItemMaps, UpdateHTMLDocumentNamedItemMapsOnlyIfDiffersFromNameAttribute };
613     void updateIdForDocument(HTMLDocument&, const AtomicString& oldId, const AtomicString& newId, HTMLDocumentNamedItemMapsUpdatingCondition);
614     void updateLabel(TreeScope&, const AtomicString& oldForAttributeValue, const AtomicString& newForAttributeValue);
615
616     void scrollByUnits(int units, ScrollGranularity);
617
618     virtual void setPrefix(const AtomicString&, ExceptionCode&) override final;
619     virtual NodeType nodeType() const override final;
620     virtual bool childTypeAllowed(NodeType) const override final;
621
622     void setAttributeInternal(unsigned index, const QualifiedName&, const AtomicString& value, SynchronizationOfLazyAttribute);
623     void addAttributeInternal(const QualifiedName&, const AtomicString& value, SynchronizationOfLazyAttribute);
624     void removeAttributeInternal(unsigned index, SynchronizationOfLazyAttribute);
625
626 #ifndef NDEBUG
627     virtual void formatForDebugger(char* buffer, unsigned length) const override;
628 #endif
629
630     void cancelFocusAppearanceUpdate();
631
632     // cloneNode is private so that non-virtual cloneElementWithChildren and cloneElementWithoutChildren
633     // are used instead.
634     virtual PassRefPtr<Node> cloneNode(bool deep) override;
635     virtual PassRefPtr<Element> cloneElementWithoutAttributesAndChildren();
636
637     void addShadowRoot(PassRefPtr<ShadowRoot>);
638     void removeShadowRoot();
639
640     bool rareDataStyleAffectedByEmpty() const;
641     bool rareDataChildrenAffectedByHover() const;
642     bool rareDataChildrenAffectedByActive() const;
643     bool rareDataChildrenAffectedByDrag() const;
644     bool rareDataChildrenAffectedByLastChildRules() const;
645     bool rareDataChildrenAffectedByBackwardPositionalRules() const;
646     unsigned rareDataChildIndex() const;
647
648     SpellcheckAttributeState spellcheckAttributeState() const;
649
650     void unregisterNamedFlowContentElement();
651
652     void createUniqueElementData();
653
654     ElementRareData* elementRareData() const;
655     ElementRareData& ensureElementRareData();
656
657     void detachAllAttrNodesFromElement();
658     void detachAttrNodeFromElementWithValue(Attr*, const AtomicString& value);
659
660     bool isJavaScriptURLAttribute(const Attribute&) const;
661
662     // Anyone thinking of using this should call document instead of ownerDocument.
663     void ownerDocument() const = delete;
664
665     QualifiedName m_tagName;
666     RefPtr<ElementData> m_elementData;
667 };
668
669 inline bool isElement(const Node& node) { return node.isElementNode(); }
670
671 NODE_TYPE_CASTS(Element)
672
673 template <>
674 struct NodeTypeCastTraits<const Element, const Node> {
675     static bool is(const Node& node) { return node.isElementNode(); }
676 };
677
678 inline bool Node::hasAttributes() const
679 {
680     return isElementNode() && toElement(this)->hasAttributes();
681 }
682
683 inline NamedNodeMap* Node::attributes() const
684 {
685     return isElementNode() ? &toElement(this)->attributes() : nullptr;
686 }
687
688 inline Element* Node::parentElement() const
689 {
690     ContainerNode* parent = parentNode();
691     return parent && parent->isElementNode() ? toElement(parent) : nullptr;
692 }
693
694 inline bool Element::fastHasAttribute(const QualifiedName& name) const
695 {
696     ASSERT(fastAttributeLookupAllowed(name));
697     return elementData() && findAttributeByName(name);
698 }
699
700 inline const AtomicString& Element::fastGetAttribute(const QualifiedName& name) const
701 {
702     ASSERT(fastAttributeLookupAllowed(name));
703     if (elementData()) {
704         if (const Attribute* attribute = findAttributeByName(name))
705             return attribute->value();
706     }
707     return nullAtom;
708 }
709
710 inline bool Element::hasAttributesWithoutUpdate() const
711 {
712     return elementData() && !elementData()->isEmpty();
713 }
714
715 inline const AtomicString& Element::idForStyleResolution() const
716 {
717     ASSERT(hasID());
718     return elementData()->idForStyleResolution();
719 }
720
721 inline const AtomicString& Element::getIdAttribute() const
722 {
723     if (hasID())
724         return elementData()->findAttributeByName(HTMLNames::idAttr)->value();
725     return nullAtom;
726 }
727
728 inline const AtomicString& Element::getNameAttribute() const
729 {
730     if (hasName())
731         return elementData()->findAttributeByName(HTMLNames::nameAttr)->value();
732     return nullAtom;
733 }
734
735 inline void Element::setIdAttribute(const AtomicString& value)
736 {
737     setAttribute(HTMLNames::idAttr, value);
738 }
739
740 inline const SpaceSplitString& Element::classNames() const
741 {
742     ASSERT(hasClass());
743     ASSERT(elementData());
744     return elementData()->classNames();
745 }
746
747 inline unsigned Element::attributeCount() const
748 {
749     ASSERT(elementData());
750     return elementData()->length();
751 }
752
753 inline const Attribute& Element::attributeAt(unsigned index) const
754 {
755     ASSERT(elementData());
756     return elementData()->attributeAt(index);
757 }
758
759 inline const Attribute* Element::findAttributeByName(const QualifiedName& name) const
760 {
761     ASSERT(elementData());
762     return elementData()->findAttributeByName(name);
763 }
764
765 inline bool Element::hasID() const
766 {
767     return elementData() && elementData()->hasID();
768 }
769
770 inline bool Element::hasClass() const
771 {
772     return elementData() && elementData()->hasClass();
773 }
774
775 inline bool Element::hasName() const
776 {
777     return elementData() && elementData()->hasName();
778 }
779
780 inline UniqueElementData& Element::ensureUniqueElementData()
781 {
782     if (!elementData() || !elementData()->isUnique())
783         createUniqueElementData();
784     return static_cast<UniqueElementData&>(*m_elementData);
785 }
786
787 } // namespace WebCore
788
789 #endif