Changing id, className, or attribute should invalidate distribution
[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 isLabelable() const { return false; }
110
111 protected:
112     HTMLElement(const QualifiedName& tagName, Document*, ConstructionType);
113
114     void addHTMLLengthToStyle(StylePropertySet*, CSSPropertyID, const String& value);
115     void addHTMLColorToStyle(StylePropertySet*, CSSPropertyID, const String& color);
116
117     void applyAlignmentAttributeToStyle(const Attribute&, StylePropertySet*);
118     void applyBorderAttributeToStyle(const Attribute&, StylePropertySet*);
119
120     virtual void parseAttribute(const QualifiedName&, const AtomicString&) OVERRIDE;
121     virtual bool isPresentationAttribute(const QualifiedName&) const OVERRIDE;
122     virtual void collectStyleForPresentationAttribute(const Attribute&, StylePropertySet*) OVERRIDE;
123
124     virtual void childrenChanged(bool changedByParser = false, Node* beforeChange = 0, Node* afterChange = 0, int childCountDelta = 0);
125     void calculateAndAdjustDirectionality();
126
127     virtual bool isURLAttribute(const Attribute&) const OVERRIDE;
128
129 private:
130     virtual String nodeName() const;
131
132     void mapLanguageAttributeToLocale(const Attribute&, StylePropertySet*);
133
134     virtual HTMLFormElement* virtualForm() const;
135
136     Node* insertAdjacent(const String& where, Node* newChild, ExceptionCode&);
137     PassRefPtr<DocumentFragment> textToFragment(const String&, ExceptionCode&);
138
139     void dirAttributeChanged(const AtomicString&);
140     void adjustDirectionalityIfNeededAfterChildAttributeChanged(Element* child);
141     void adjustDirectionalityIfNeededAfterChildrenChanged(Node* beforeChange, int childCountDelta);
142     TextDirection directionality(Node** strongDirectionalityTextNode= 0) const;
143
144     TranslateAttributeMode translateAttributeMode() const;
145
146 #if ENABLE(MICRODATA)
147     virtual String itemValueText() const;
148     virtual void setItemValueText(const String&, ExceptionCode&);
149 #endif
150 };
151
152 inline HTMLElement* toHTMLElement(Node* node)
153 {
154     ASSERT(!node || node->isHTMLElement());
155     return static_cast<HTMLElement*>(node);
156 }
157
158 inline const HTMLElement* toHTMLElement(const Node* node)
159 {
160     ASSERT(!node || node->isHTMLElement());
161     return static_cast<const HTMLElement*>(node);
162 }
163
164 // This will catch anyone doing an unnecessary cast.
165 void toHTMLElement(const HTMLElement*);
166
167 inline HTMLElement::HTMLElement(const QualifiedName& tagName, Document* document, ConstructionType type = CreateHTMLElement)
168     : StyledElement(tagName, document, type)
169 {
170     ASSERT(tagName.localName().impl());
171 }
172
173 } // namespace WebCore
174
175 #endif // HTMLElement_h