6f823a0e6d2bae80fd0832011c63233653739899
[WebKit-https.git] / Source / WebCore / html / HTMLElement.h
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4  * Copyright (C) 2004, 2005, 2006, 2007, 2009 Apple Inc. All rights reserved.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public License
17  * along with this library; see the file COPYING.LIB.  If not, write to
18  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  * Boston, MA 02110-1301, USA.
20  *
21  */
22
23 #ifndef HTMLElement_h
24 #define HTMLElement_h
25
26 #include "StyledElement.h"
27
28 namespace WebCore {
29
30 class DocumentFragment;
31 class FormNamedItem;
32 class HTMLCollection;
33 class HTMLFormElement;
34
35 enum TranslateAttributeMode {
36     TranslateAttributeYes,
37     TranslateAttributeNo,
38     TranslateAttributeInherit
39 };
40
41 class HTMLElement : public StyledElement {
42 public:
43     static PassRefPtr<HTMLElement> create(const QualifiedName& tagName, Document&);
44
45     PassRefPtr<HTMLCollection> children();
46
47     WEBCORE_EXPORT virtual String title() const override final;
48
49     virtual short tabIndex() const override;
50
51     String innerHTML() const;
52     String outerHTML() const;
53     void setInnerHTML(const String&, ExceptionCode&);
54     void setOuterHTML(const String&, ExceptionCode&);
55     void setInnerText(const String&, ExceptionCode&);
56     void setOuterText(const String&, ExceptionCode&);
57
58     Element* insertAdjacentElement(const String& where, Element* newChild, ExceptionCode&);
59     void insertAdjacentHTML(const String& where, const String& html, ExceptionCode&);
60     void insertAdjacentText(const String& where, const String& text, ExceptionCode&);
61
62     virtual bool hasCustomFocusLogic() const;
63     virtual bool supportsFocus() const override;
64
65     String contentEditable() const;
66     void setContentEditable(const String&, ExceptionCode&);
67
68     virtual bool draggable() const;
69     void setDraggable(bool);
70
71     bool spellcheck() const;
72     void setSpellcheck(bool);
73
74     bool translate() const;
75     void setTranslate(bool);
76
77     void click();
78
79     virtual void accessKeyAction(bool sendMouseEvents) override;
80
81     bool ieForbidsInsertHTML() const;
82
83     virtual bool rendererIsNeeded(const RenderStyle&) override;
84     virtual RenderPtr<RenderElement> createElementRenderer(PassRef<RenderStyle>) override;
85
86     HTMLFormElement* form() const { return virtualForm(); }
87
88     bool hasDirectionAuto() const;
89     TextDirection directionalityIfhasDirAutoAttribute(bool& isAuto) const;
90
91     virtual bool isHTMLUnknownElement() const { return false; }
92     virtual bool isTextControlInnerTextElement() const { return false; }
93
94     virtual bool willRespondToMouseMoveEvents() override;
95     virtual bool willRespondToMouseWheelEvents() override;
96     virtual bool willRespondToMouseClickEvents() override;
97
98     virtual bool isLabelable() const { return false; }
99     virtual FormNamedItem* asFormNamedItem() { return 0; }
100
101     static void populateEventNameForAttributeLocalNameMap(HashMap<AtomicStringImpl*, AtomicString>&);
102
103     bool hasTagName(const HTMLQualifiedName& name) const { return hasLocalName(name.localName()); }
104
105 protected:
106     HTMLElement(const QualifiedName& tagName, Document&, ConstructionType);
107
108     void addHTMLLengthToStyle(MutableStyleProperties&, CSSPropertyID, const String& value);
109     void addHTMLColorToStyle(MutableStyleProperties&, CSSPropertyID, const String& color);
110
111     void applyAlignmentAttributeToStyle(const AtomicString&, MutableStyleProperties&);
112     void applyBorderAttributeToStyle(const AtomicString&, MutableStyleProperties&);
113
114     virtual bool matchesReadWritePseudoClass() const;
115     virtual void parseAttribute(const QualifiedName&, const AtomicString&) override;
116     virtual bool isPresentationAttribute(const QualifiedName&) const override;
117     virtual void collectStyleForPresentationAttribute(const QualifiedName&, const AtomicString&, MutableStyleProperties&) override;
118     unsigned parseBorderWidthAttribute(const AtomicString&) const;
119
120     virtual void childrenChanged(const ChildChange&) override;
121     void calculateAndAdjustDirectionality();
122
123     virtual bool isURLAttribute(const Attribute&) const override;
124
125 private:
126     virtual String nodeName() const override final;
127
128     void mapLanguageAttributeToLocale(const AtomicString&, MutableStyleProperties&);
129
130     virtual HTMLFormElement* virtualForm() const;
131
132     Node* insertAdjacent(const String& where, Node* newChild, ExceptionCode&);
133     PassRefPtr<DocumentFragment> textToFragment(const String&, ExceptionCode&);
134
135     void dirAttributeChanged(const AtomicString&);
136     void adjustDirectionalityIfNeededAfterChildAttributeChanged(Element* child);
137     void adjustDirectionalityIfNeededAfterChildrenChanged(Element* beforeChange, ChildChangeType);
138     TextDirection directionality(Node** strongDirectionalityTextNode= 0) const;
139
140     TranslateAttributeMode translateAttributeMode() const;
141 };
142
143 inline HTMLElement::HTMLElement(const QualifiedName& tagName, Document& document, ConstructionType type = CreateHTMLElement)
144     : StyledElement(tagName, document, type)
145 {
146     ASSERT(tagName.localName().impl());
147 }
148
149 void isHTMLElement(const HTMLElement&); // Catch unnecessary runtime check of type known at compile time.
150 inline bool isHTMLElement(const Node& node) { return node.isHTMLElement(); }
151
152 template <typename ArgType>
153 struct NodeTypeCastTraits<const HTMLElement, ArgType> {
154     static bool is(ArgType& node) { return isHTMLElement(node); }
155 };
156
157 NODE_TYPE_CASTS(HTMLElement)
158
159 inline bool Node::hasTagName(const HTMLQualifiedName& name) const
160 {
161     return isHTMLElement() && toHTMLElement(*this).hasTagName(name);
162 }
163
164 } // namespace WebCore
165
166 #include "HTMLElementTypeHelpers.h"
167
168 #endif // HTMLElement_h