2008-04-02 Beth Dakin <bdakin@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 ElementRareData;
38 class IntSize;
39
40 class Element : public ContainerNode {
41 public:
42     Element(const QualifiedName&, Document*);
43     ~Element();
44
45     const AtomicString& getIDAttribute() const;
46     bool hasAttribute(const QualifiedName&) const;
47     const AtomicString& getAttribute(const QualifiedName&) const;
48     void setAttribute(const QualifiedName&, const AtomicString& value, ExceptionCode&);
49     void removeAttribute(const QualifiedName&, ExceptionCode&);
50
51     bool hasAttributes() const;
52
53     bool hasAttribute(const String& name) const;
54     bool hasAttributeNS(const String& namespaceURI, const String& localName) const;
55
56     const AtomicString& getAttribute(const String& name) const;
57     const AtomicString& getAttributeNS(const String& namespaceURI, const String& localName) const;
58
59     void setAttribute(const AtomicString& name, const AtomicString& value, ExceptionCode&);
60     void setAttributeNS(const AtomicString& namespaceURI, const AtomicString& qualifiedName, const AtomicString& value, ExceptionCode&);
61
62     void scrollIntoView (bool alignToTop = true);
63     void scrollIntoViewIfNeeded(bool centerIfNeeded = true);
64
65     void scrollByUnits(int units, ScrollGranularity);
66     void scrollByLines(int lines);
67     void scrollByPages(int pages);
68
69     int offsetLeft();
70     int offsetTop();
71     int offsetWidth();
72     int offsetHeight();
73     Element* offsetParent();
74     int clientLeft();
75     int clientTop();
76     int clientWidth();
77     int clientHeight();
78     int scrollLeft();
79     int scrollTop();
80     void setScrollLeft(int);
81     void setScrollTop(int);
82     int scrollWidth();
83     int scrollHeight();
84
85     void removeAttribute(const String& name, ExceptionCode&);
86     void removeAttributeNS(const String& namespaceURI, const String& localName, ExceptionCode&);
87
88     PassRefPtr<Attr> getAttributeNode(const String& name);
89     PassRefPtr<Attr> getAttributeNodeNS(const String& namespaceURI, const String& localName);
90     PassRefPtr<Attr> setAttributeNode(Attr*, ExceptionCode&);
91     PassRefPtr<Attr> setAttributeNodeNS(Attr*, ExceptionCode&);
92     PassRefPtr<Attr> removeAttributeNode(Attr*, ExceptionCode&);
93     
94     virtual CSSStyleDeclaration* style();
95
96     const QualifiedName& tagQName() const { return m_tagName; }
97     String tagName() const { return nodeName(); }
98     bool hasTagName(const QualifiedName& tagName) const { return m_tagName.matches(tagName); }
99     
100     // A fast function for checking the local name against another atomic string.
101     bool hasLocalName(const AtomicString& other) const { return m_tagName.localName() == other; }
102     bool hasLocalName(const QualifiedName& other) const { return m_tagName.localName() == other.localName(); }
103
104     virtual const AtomicString& localName() const { return m_tagName.localName(); }
105     virtual const AtomicString& prefix() const { return m_tagName.prefix(); }
106     virtual void setPrefix(const AtomicString &_prefix, ExceptionCode&);
107     virtual const AtomicString& namespaceURI() const { return m_tagName.namespaceURI(); }
108
109     virtual KURL baseURI() const;
110
111     // DOM methods overridden from parent classes
112     virtual NodeType nodeType() const;
113     virtual PassRefPtr<Node> cloneNode(bool deep);
114     virtual String nodeName() const;
115     virtual bool isElementNode() const { return true; }
116     virtual void insertedIntoDocument();
117     virtual void removedFromDocument();
118     virtual void childrenChanged(bool changedByParser = false, Node* beforeChange = 0, Node* afterChange = 0, int childCountDelta = 0);
119
120     void normalizeAttributes();
121
122     virtual bool isInputTypeHidden() const { return false; }
123     virtual bool isPasswordField() const { return false; }
124
125     String nodeNamePreservingCase() const;
126
127     // convenience methods which ignore exceptions
128     void setAttribute(const QualifiedName&, const AtomicString& value);
129     void setBooleanAttribute(const QualifiedName& name, bool);
130
131     virtual NamedAttrMap* attributes() const;
132     NamedAttrMap* attributes(bool readonly) const;
133
134     // This method is called whenever an attribute is added, changed or removed.
135     virtual void attributeChanged(Attribute*, bool preserveDecls = false) {}
136
137     // not part of the DOM
138     void setAttributeMap(PassRefPtr<NamedAttrMap>);
139
140     virtual void copyNonAttributeProperties(const Element* source) {}
141
142     virtual void attach();
143     virtual void detach();
144     virtual RenderStyle* styleForRenderer(RenderObject* parent);
145     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
146     virtual void recalcStyle(StyleChange = NoChange);
147
148     virtual RenderStyle* computedStyle();
149
150     virtual bool childTypeAllowed(NodeType);
151
152     virtual Attribute* createAttribute(const QualifiedName& name, const AtomicString& value);
153     
154     void dispatchAttrRemovalEvent(Attribute*);
155     void dispatchAttrAdditionEvent(Attribute*);
156
157     virtual void accessKeyAction(bool sendToAnyEvent) { }
158
159     virtual String toString() const;
160
161     virtual bool isURLAttribute(Attribute*) const;
162     virtual const QualifiedName& imageSourceAttributeName() const;
163     virtual String target() const { return String(); }
164         
165     virtual void focus(bool restorePreviousSelection = true);
166     virtual void updateFocusAppearance(bool restorePreviousSelection);
167     void blur();
168
169 #ifndef NDEBUG
170     virtual void formatForDebugger(char* buffer, unsigned length) const;
171 #endif
172
173     Node* insertAdjacentElement(const String& where, Node* newChild, ExceptionCode&);
174     bool contains(const Node*) const;
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::registerForPageCacheCallbacks() to subscribe these
189     virtual void willSaveToCache() { }
190     virtual void didRestoreFromCache() { }
191     
192     bool isFinishedParsingChildren() const { return m_parsingChildrenFinished; }
193     virtual void finishParsingChildren();
194     virtual void beginParsingChildren() { m_parsingChildrenFinished = false; }
195
196 private:
197     ElementRareData* rareData();
198     const ElementRareData* rareData() const;
199     ElementRareData* createRareData();
200
201     virtual void createAttributeMap() const;
202
203     virtual void updateStyleAttributeIfNeeded() const {}
204     
205     void updateFocusAppearanceSoonAfterAttach();
206     void cancelFocusAppearanceUpdate();
207
208     virtual bool virtualHasTagName(const QualifiedName&) const;
209
210 private:
211     QualifiedName m_tagName;
212
213 protected:
214     mutable RefPtr<NamedAttrMap> namedAttrMap;
215
216     // These two bits are really used by the StyledElement subclass, but they are pulled up here in order to be shared with other
217     // Element bits.
218     mutable bool m_isStyleAttributeValid : 1;
219     mutable bool m_synchronizingStyleAttribute : 1;
220     
221 private:
222     bool m_parsingChildrenFinished : 1;
223 };
224
225 } //namespace
226
227 #endif