Make DOM classes start with a reference count of 1, like all other RefCounted
[WebKit-https.git] / 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 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 "ContainerNode.h"
29 #include "QualifiedName.h"
30 #include "ScrollTypes.h"
31
32 namespace WebCore {
33
34 class Attr;
35 class Attribute;
36 class CSSStyleDeclaration;
37 class ClientRect;
38 class ClientRectList;
39 class ElementRareData;
40 class IntSize;
41
42 class Element : public ContainerNode {
43 public:
44     static PassRefPtr<Element> create(const QualifiedName&, Document*);
45     virtual ~Element();
46
47     const AtomicString& getIDAttribute() const;
48     bool hasAttribute(const QualifiedName&) const;
49     const AtomicString& getAttribute(const QualifiedName&) const;
50     void setAttribute(const QualifiedName&, const AtomicString& value, ExceptionCode&);
51     void removeAttribute(const QualifiedName&, ExceptionCode&);
52
53     bool hasAttributes() const;
54
55     bool hasAttribute(const String& name) const;
56     bool hasAttributeNS(const String& namespaceURI, const String& localName) const;
57
58     const AtomicString& getAttribute(const String& name) const;
59     const AtomicString& getAttributeNS(const String& namespaceURI, const String& localName) const;
60
61     void setAttribute(const AtomicString& name, const AtomicString& value, ExceptionCode&);
62     void setAttributeNS(const AtomicString& namespaceURI, const AtomicString& qualifiedName, const AtomicString& value, ExceptionCode&);
63
64     void scrollIntoView(bool alignToTop = true);
65     void scrollIntoViewIfNeeded(bool centerIfNeeded = true);
66
67     void scrollByLines(int lines);
68     void scrollByPages(int pages);
69
70     int offsetLeft();
71     int offsetTop();
72     int offsetWidth();
73     int offsetHeight();
74     Element* offsetParent();
75     int clientLeft();
76     int clientTop();
77     int clientWidth();
78     int clientHeight();
79     virtual int scrollLeft() const;
80     virtual int scrollTop() const;
81     virtual void setScrollLeft(int);
82     virtual void setScrollTop(int);
83     virtual int scrollWidth() const;
84     virtual int scrollHeight() const;
85
86     PassRefPtr<ClientRectList> getClientRects() const;
87     PassRefPtr<ClientRect> getBoundingClientRect() const;
88
89     void removeAttribute(const String& name, ExceptionCode&);
90     void removeAttributeNS(const String& namespaceURI, const String& localName, ExceptionCode&);
91
92     PassRefPtr<Attr> getAttributeNode(const String& name);
93     PassRefPtr<Attr> getAttributeNodeNS(const String& namespaceURI, const String& localName);
94     PassRefPtr<Attr> setAttributeNode(Attr*, ExceptionCode&);
95     PassRefPtr<Attr> setAttributeNodeNS(Attr*, ExceptionCode&);
96     PassRefPtr<Attr> removeAttributeNode(Attr*, ExceptionCode&);
97     
98     virtual CSSStyleDeclaration* style();
99
100     const QualifiedName& tagQName() const { return m_tagName; }
101     String tagName() const { return nodeName(); }
102     bool hasTagName(const QualifiedName& tagName) const { return m_tagName.matches(tagName); }
103     
104     // A fast function for checking the local name against another atomic string.
105     bool hasLocalName(const AtomicString& other) const { return m_tagName.localName() == other; }
106     bool hasLocalName(const QualifiedName& other) const { return m_tagName.localName() == other.localName(); }
107
108     const AtomicString& localName() const { return m_tagName.localName(); }
109     const AtomicString& prefix() const { return m_tagName.prefix(); }
110     const AtomicString& namespaceURI() const { return m_tagName.namespaceURI(); }
111
112     virtual KURL baseURI() const;
113
114     virtual String nodeName() const;
115
116     PassRefPtr<Element> cloneElementWithChildren();
117     PassRefPtr<Element> cloneElementWithoutChildren();
118
119     void normalizeAttributes();
120     String nodeNamePreservingCase() const;
121
122     // convenience methods which ignore exceptions
123     void setAttribute(const QualifiedName&, const AtomicString& value);
124     void setBooleanAttribute(const QualifiedName& name, bool);
125
126     virtual NamedNodeMap* attributes() const;
127     NamedNodeMap* attributes(bool readonly) const;
128
129     // This method is called whenever an attribute is added, changed or removed.
130     virtual void attributeChanged(Attribute*, bool preserveDecls = false);
131
132     // not part of the DOM
133     void setAttributeMap(PassRefPtr<NamedNodeMap>);
134     NamedNodeMap* attributeMap() const { return namedAttrMap.get(); }
135
136     virtual void copyNonAttributeProperties(const Element* /*source*/) { }
137
138     virtual void attach();
139     virtual void detach();
140     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
141     virtual void recalcStyle(StyleChange = NoChange);
142
143     virtual RenderStyle* computedStyle();
144
145     void dispatchAttrRemovalEvent(Attribute*);
146     void dispatchAttrAdditionEvent(Attribute*);
147
148     virtual void accessKeyAction(bool /*sendToAnyEvent*/) { }
149
150     virtual bool isURLAttribute(Attribute*) const;
151     KURL getURLAttribute(const QualifiedName&) const;
152     virtual const QualifiedName& imageSourceAttributeName() const;
153     virtual String target() const { return String(); }
154
155     virtual void focus(bool restorePreviousSelection = true);
156     virtual void updateFocusAppearance(bool restorePreviousSelection);
157     void blur();
158
159     String innerText() const;
160     String outerText() const;
161  
162     virtual String title() const;
163
164     String openTagStartToString() const;
165
166     void updateId(const AtomicString& oldId, const AtomicString& newId);
167
168     IntSize minimumSizeForResizing() const;
169     void setMinimumSizeForResizing(const IntSize&);
170
171     // Use Document::registerForDocumentActivationCallbacks() to subscribe to these
172     virtual void documentWillBecomeInactive() { }
173     virtual void documentDidBecomeActive() { }
174
175     // Use Document::registerForMediaVolumeCallbacks() to subscribe to this
176     virtual void mediaVolumeDidChange() { }
177
178     bool isFinishedParsingChildren() const { return m_parsingChildrenFinished; }
179     virtual void finishParsingChildren();
180     virtual void beginParsingChildren() { m_parsingChildrenFinished = false; }
181
182     // ElementTraversal API
183     Element* firstElementChild() const;
184     Element* lastElementChild() const;
185     Element* previousElementSibling() const;
186     Element* nextElementSibling() const;
187     unsigned childElementCount() const;
188
189     virtual bool isFormControlElement() const { return false; }
190     virtual bool isEnabledFormControl() const { return true; }
191     virtual bool isReadOnlyFormControl() const { return false; }
192     virtual bool isTextFormControl() const { return false; }
193     virtual bool isOptionalFormControl() const { return false; }
194     virtual bool isRequiredFormControl() const { return false; }
195     virtual bool isDefaultButtonForForm() const { return false; }
196     virtual bool willValidate() const { return false; }
197     virtual bool isValidFormControlElement() { return false; }
198
199     virtual bool formControlValueMatchesRenderer() const { return false; }
200     virtual void setFormControlValueMatchesRenderer(bool) { }
201
202     virtual const AtomicString& formControlName() const { return nullAtom; }
203     virtual const AtomicString& formControlType() const { return nullAtom; }
204
205     virtual bool saveFormControlState(String&) const { return false; }
206     virtual void restoreFormControlState(const String&) { }
207
208     virtual void dispatchFormControlChangeEvent() { }
209
210 protected:
211     Element(const QualifiedName&, Document*, ConstructionType);
212
213     virtual void insertedIntoDocument();
214     virtual void removedFromDocument();
215     virtual void childrenChanged(bool changedByParser = false, Node* beforeChange = 0, Node* afterChange = 0, int childCountDelta = 0);
216
217     // The implementation of Element::attributeChanged() calls the following two functions.
218     // They are separated to allow a different flow of control in StyledElement::attributeChanged().
219     void recalcStyleIfNeededAfterAttributeChanged(Attribute*);
220     void updateAfterAttributeChanged(Attribute*);
221
222 private:
223     void scrollByUnits(int units, ScrollGranularity);
224
225     virtual void setPrefix(const AtomicString&, ExceptionCode&);
226     virtual NodeType nodeType() const;
227     virtual bool childTypeAllowed(NodeType);
228
229     virtual PassRefPtr<Attribute> createAttribute(const QualifiedName&, const AtomicString& value);
230     
231 #ifndef NDEBUG
232     virtual void formatForDebugger(char* buffer, unsigned length) const;
233 #endif
234
235     bool pseudoStyleCacheIsInvalid(const RenderStyle* currentStyle, RenderStyle* newStyle);
236
237     virtual void createAttributeMap() const;
238
239     virtual void updateStyleAttribute() const { }
240
241 #if ENABLE(SVG)
242     virtual void updateAnimatedSVGAttribute(const String&) const { }
243 #endif
244
245     void updateFocusAppearanceSoonAfterAttach();
246     void cancelFocusAppearanceUpdate();
247
248     virtual const AtomicString& virtualPrefix() const { return prefix(); }
249     virtual const AtomicString& virtualLocalName() const { return localName(); }
250     virtual const AtomicString& virtualNamespaceURI() const { return namespaceURI(); }
251     
252     // cloneNode is private so that non-virtual cloneElementWithChildren and cloneElementWithoutChildren
253     // are used instead.
254     virtual PassRefPtr<Node> cloneNode(bool deep);
255
256     QualifiedName m_tagName;
257     virtual NodeRareData* createRareData();
258
259     ElementRareData* rareData() const;
260     ElementRareData* ensureRareData();
261     
262 protected:
263     mutable RefPtr<NamedNodeMap> namedAttrMap;
264 };
265     
266 inline bool Node::hasTagName(const QualifiedName& name) const
267 {
268     return isElementNode() && static_cast<const Element*>(this)->hasTagName(name);
269 }
270
271 inline bool Node::hasAttributes() const
272 {
273     return isElementNode() && static_cast<const Element*>(this)->hasAttributes();
274 }
275
276 inline NamedNodeMap* Node::attributes() const
277 {
278     return isElementNode() ? static_cast<const Element*>(this)->attributes() : 0;
279 }
280
281 inline Element* Node::parentElement() const
282 {
283     Node* parent = parentNode();
284     return parent && parent->isElementNode() ? static_cast<Element*>(parent) : 0;
285 }
286
287 } //namespace
288
289 #endif