e837df449e08e4a2074ca453aef6a0dd427351ca
[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 HTMLCollection;
32 class HTMLFormElement;
33
34 #if ENABLE(MICRODATA)
35 class HTMLPropertiesCollection;
36 class MicroDataItemValue;
37 #endif
38
39 enum TranslateAttributeMode {
40     TranslateAttributeYes,
41     TranslateAttributeNo,
42     TranslateAttributeInherit
43 };
44
45 class HTMLElement : public StyledElement {
46 public:
47     static PassRefPtr<HTMLElement> create(const QualifiedName& tagName, Document*);
48
49     PassRefPtr<HTMLCollection> children();
50
51     virtual String title() const;
52
53     virtual short tabIndex() const;
54     void setTabIndex(int);
55
56     String innerHTML() const;
57     String outerHTML() const;
58     void setInnerHTML(const String&, ExceptionCode&);
59     void setOuterHTML(const String&, ExceptionCode&);
60     void setInnerText(const String&, ExceptionCode&);
61     void setOuterText(const String&, ExceptionCode&);
62
63     Element* insertAdjacentElement(const String& where, Element* newChild, ExceptionCode&);
64     void insertAdjacentHTML(const String& where, const String& html, ExceptionCode&);
65     void insertAdjacentText(const String& where, const String& text, ExceptionCode&);
66
67     virtual bool hasCustomFocusLogic() const;
68     virtual bool supportsFocus() const;
69
70     String contentEditable() const;
71     void setContentEditable(const String&, ExceptionCode&);
72
73     virtual bool draggable() const;
74     void setDraggable(bool);
75
76     bool spellcheck() const;
77     void setSpellcheck(bool);
78
79     bool translate() const;
80     void setTranslate(bool);
81
82     void click();
83
84     virtual void accessKeyAction(bool sendMouseEvents);
85
86     bool ieForbidsInsertHTML() const;
87
88     virtual bool rendererIsNeeded(const NodeRenderingContext&);
89     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
90
91     HTMLFormElement* form() const { return virtualForm(); }
92
93     HTMLFormElement* findFormAncestor() const;
94
95     bool hasDirectionAuto() const;
96     TextDirection directionalityIfhasDirAutoAttribute(bool& isAuto) const;
97
98 #if ENABLE(MICRODATA)
99     void setItemValue(const String&, ExceptionCode&);
100     PassRefPtr<MicroDataItemValue> itemValue() const;
101     PassRefPtr<HTMLPropertiesCollection> properties();
102     void getItemRefElements(Vector<HTMLElement*>&);
103 #endif
104
105 #ifndef NDEBUG
106     virtual bool isHTMLUnknownElement() const { return false; }
107 #endif
108
109     virtual bool isInsertionPoint() const { return false; }
110     virtual bool isLabelable() const { return false; }
111
112 protected:
113     HTMLElement(const QualifiedName& tagName, Document*, ConstructionType);
114
115     void addHTMLLengthToStyle(StylePropertySet*, CSSPropertyID, const String& value);
116     void addHTMLColorToStyle(StylePropertySet*, CSSPropertyID, const String& color);
117
118     void applyAlignmentAttributeToStyle(const Attribute&, StylePropertySet*);
119     void applyBorderAttributeToStyle(const Attribute&, StylePropertySet*);
120
121     virtual void parseAttribute(const QualifiedName&, const AtomicString&) OVERRIDE;
122     virtual bool isPresentationAttribute(const QualifiedName&) const OVERRIDE;
123     virtual void collectStyleForPresentationAttribute(const Attribute&, StylePropertySet*) OVERRIDE;
124
125     virtual void childrenChanged(bool changedByParser = false, Node* beforeChange = 0, Node* afterChange = 0, int childCountDelta = 0);
126     void calculateAndAdjustDirectionality();
127
128     virtual bool isURLAttribute(const Attribute&) const OVERRIDE;
129
130 private:
131     virtual String nodeName() const;
132
133     void mapLanguageAttributeToLocale(const Attribute&, StylePropertySet*);
134
135     virtual HTMLFormElement* virtualForm() const;
136
137     Node* insertAdjacent(const String& where, Node* newChild, ExceptionCode&);
138     PassRefPtr<DocumentFragment> textToFragment(const String&, ExceptionCode&);
139
140     void dirAttributeChanged(const AtomicString&);
141     void adjustDirectionalityIfNeededAfterChildAttributeChanged(Element* child);
142     void adjustDirectionalityIfNeededAfterChildrenChanged(Node* beforeChange, int childCountDelta);
143     TextDirection directionality(Node** strongDirectionalityTextNode= 0) const;
144
145     TranslateAttributeMode translateAttributeMode() const;
146
147 #if ENABLE(MICRODATA)
148     virtual String itemValueText() const;
149     virtual void setItemValueText(const String&, ExceptionCode&);
150 #endif
151 };
152
153 inline HTMLElement* toHTMLElement(Node* node)
154 {
155     ASSERT(!node || node->isHTMLElement());
156     return static_cast<HTMLElement*>(node);
157 }
158
159 inline const HTMLElement* toHTMLElement(const Node* node)
160 {
161     ASSERT(!node || node->isHTMLElement());
162     return static_cast<const HTMLElement*>(node);
163 }
164
165 // This will catch anyone doing an unnecessary cast.
166 void toHTMLElement(const HTMLElement*);
167
168 inline HTMLElement::HTMLElement(const QualifiedName& tagName, Document* document, ConstructionType type = CreateHTMLElement)
169     : StyledElement(tagName, document, type)
170 {
171     ASSERT(tagName.localName().impl());
172 }
173
174 } // namespace WebCore
175
176 #endif // HTMLElement_h