2009-03-30 Darin Adler <darin@apple.com>
[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 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     Element(const QualifiedName&, Document*);
45     ~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 scrollByUnits(int units, ScrollGranularity);
68     void scrollByLines(int lines);
69     void scrollByPages(int pages);
70
71     int offsetLeft();
72     int offsetTop();
73     int offsetWidth();
74     int offsetHeight();
75     Element* offsetParent();
76     int clientLeft();
77     int clientTop();
78     int clientWidth();
79     int clientHeight();
80     virtual int scrollLeft() const;
81     virtual int scrollTop() const;
82     virtual void setScrollLeft(int);
83     virtual void setScrollTop(int);
84     virtual int scrollWidth() const;
85     virtual int scrollHeight() const;
86
87     PassRefPtr<ClientRectList> getClientRects() const;
88     PassRefPtr<ClientRect> getBoundingClientRect() const;
89
90     void removeAttribute(const String& name, ExceptionCode&);
91     void removeAttributeNS(const String& namespaceURI, const String& localName, ExceptionCode&);
92
93     PassRefPtr<Attr> getAttributeNode(const String& name);
94     PassRefPtr<Attr> getAttributeNodeNS(const String& namespaceURI, const String& localName);
95     PassRefPtr<Attr> setAttributeNode(Attr*, ExceptionCode&);
96     PassRefPtr<Attr> setAttributeNodeNS(Attr*, ExceptionCode&);
97     PassRefPtr<Attr> removeAttributeNode(Attr*, ExceptionCode&);
98     
99     virtual CSSStyleDeclaration* style();
100
101     const QualifiedName& tagQName() const { return m_tagName; }
102     String tagName() const { return nodeName(); }
103     bool hasTagName(const QualifiedName& tagName) const { return m_tagName.matches(tagName); }
104     
105     // A fast function for checking the local name against another atomic string.
106     bool hasLocalName(const AtomicString& other) const { return m_tagName.localName() == other; }
107     bool hasLocalName(const QualifiedName& other) const { return m_tagName.localName() == other.localName(); }
108
109     const AtomicString& localName() const { return m_tagName.localName(); }
110     const AtomicString& prefix() const { return m_tagName.prefix(); }
111     virtual void setPrefix(const AtomicString&, ExceptionCode&);
112     const AtomicString& namespaceURI() const { return m_tagName.namespaceURI(); }
113
114     virtual KURL baseURI() const;
115
116     // DOM methods overridden from parent classes
117     virtual NodeType nodeType() const;
118     virtual String nodeName() const;
119     virtual void insertedIntoDocument();
120     virtual void removedFromDocument();
121     virtual void childrenChanged(bool changedByParser = false, Node* beforeChange = 0, Node* afterChange = 0, int childCountDelta = 0);
122
123     PassRefPtr<Element> cloneElementWithChildren();
124     PassRefPtr<Element> cloneElementWithoutChildren();
125
126     void normalizeAttributes();
127
128     virtual bool isFormControlElement() const { return false; }
129     virtual bool isFormControlElementWithState() const { return false; }
130
131     String nodeNamePreservingCase() const;
132
133     // convenience methods which ignore exceptions
134     void setAttribute(const QualifiedName&, const AtomicString& value);
135     void setBooleanAttribute(const QualifiedName& name, bool);
136
137     virtual NamedNodeMap* attributes() const;
138     NamedNodeMap* attributes(bool readonly) const;
139
140     // This method is called whenever an attribute is added, changed or removed.
141     virtual void attributeChanged(Attribute*, bool preserveDecls = false);
142
143     // not part of the DOM
144     void setAttributeMap(PassRefPtr<NamedNodeMap>);
145
146     virtual void copyNonAttributeProperties(const Element* /*source*/) { }
147
148     virtual void attach();
149     virtual void detach();
150     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
151     virtual void recalcStyle(StyleChange = NoChange);
152
153     virtual RenderStyle* computedStyle();
154
155     virtual bool childTypeAllowed(NodeType);
156
157     virtual PassRefPtr<Attribute> createAttribute(const QualifiedName&, const AtomicString& value);
158     
159     void dispatchAttrRemovalEvent(Attribute*);
160     void dispatchAttrAdditionEvent(Attribute*);
161
162     virtual void accessKeyAction(bool /*sendToAnyEvent*/) { }
163
164     virtual bool isURLAttribute(Attribute*) const;
165     virtual const QualifiedName& imageSourceAttributeName() const;
166     virtual String target() const { return String(); }
167
168     virtual void focus(bool restorePreviousSelection = true);
169     virtual void updateFocusAppearance(bool restorePreviousSelection);
170     void blur();
171
172 #ifndef NDEBUG
173     virtual void formatForDebugger(char* buffer, unsigned length) const;
174 #endif
175
176     String innerText() const;
177     String outerText() const;
178  
179     virtual String title() const;
180
181     String openTagStartToString() const;
182
183     void updateId(const AtomicString& oldId, const AtomicString& newId);
184
185     IntSize minimumSizeForResizing() const;
186     void setMinimumSizeForResizing(const IntSize&);
187
188     // Use Document::registerForDocumentActivationCallbacks() to subscribe to these
189     virtual void documentWillBecomeInactive() { }
190     virtual void documentDidBecomeActive() { }
191
192     // Use Document::registerForMediaVolumeCallbacks() to subscribe to this
193     virtual void mediaVolumeDidChange() { }
194
195     bool isFinishedParsingChildren() const { return m_parsingChildrenFinished; }
196     virtual void finishParsingChildren();
197     virtual void beginParsingChildren() { m_parsingChildrenFinished = false; }
198
199     // ElementTraversal API
200     Element* firstElementChild() const;
201     Element* lastElementChild() const;
202     Element* previousElementSibling() const;
203     Element* nextElementSibling() const;
204     unsigned childElementCount() const;
205
206 private:
207     virtual void createAttributeMap() const;
208
209     virtual void updateStyleAttribute() const {}
210
211 #if ENABLE(SVG)
212     virtual void updateAnimatedSVGAttribute(const String&) const {}
213 #endif
214
215     void updateFocusAppearanceSoonAfterAttach();
216     void cancelFocusAppearanceUpdate();
217
218     virtual const AtomicString& virtualPrefix() const { return prefix(); }
219     virtual const AtomicString& virtualLocalName() const { return localName(); }
220     virtual const AtomicString& virtualNamespaceURI() const { return namespaceURI(); }
221     
222     // cloneNode is private so that non-virtual cloneElementWithChildren and cloneElementWithoutChildren
223     // are used instead.
224     virtual PassRefPtr<Node> cloneNode(bool deep);
225
226     QualifiedName m_tagName;
227     virtual NodeRareData* createRareData();
228
229 protected:
230     ElementRareData* rareData() const;
231     ElementRareData* ensureRareData();
232     
233     mutable RefPtr<NamedNodeMap> namedAttrMap;
234 };
235     
236 inline bool Node::hasTagName(const QualifiedName& name) const
237 {
238     return isElementNode() && static_cast<const Element*>(this)->hasTagName(name);
239 }
240
241 inline bool Node::hasAttributes() const
242 {
243     return isElementNode() && static_cast<const Element*>(this)->hasAttributes();
244 }
245
246 inline NamedNodeMap* Node::attributes() const
247 {
248     return isElementNode() ? static_cast<const Element*>(this)->attributes() : 0;
249 }
250
251 inline Element* Node::parentElement() const
252 {
253     Node* parent = parentNode();
254     return parent && parent->isElementNode() ? static_cast<Element*>(parent) : 0;
255 }
256
257 } //namespace
258
259 #endif