WebCore:
[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 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 ClassNames;
38 class ElementRareData;
39 class IntSize;
40
41 class Element : public ContainerNode {
42 public:
43     Element(const QualifiedName&, Document*);
44     ~Element();
45
46     // Used to quickly determine whether or not an element has a given CSS class.
47     virtual const ClassNames* getClassNames() const;
48     const AtomicString& getIDAttribute() const;
49     bool hasAttribute(const QualifiedName&) const;
50     const AtomicString& getAttribute(const QualifiedName&) const;
51     void setAttribute(const QualifiedName&, StringImpl* value, ExceptionCode&);
52     void removeAttribute(const QualifiedName&, ExceptionCode&);
53
54     bool hasAttributes() const;
55
56     bool hasAttribute(const String& name) const;
57     bool hasAttributeNS(const String& namespaceURI, const String& localName) const;
58
59     const AtomicString& getAttribute(const String& name) const;
60     const AtomicString& getAttributeNS(const String& namespaceURI, const String& localName) const;
61
62     void setAttribute(const String& name, const String& value, ExceptionCode&);
63     void setAttributeNS(const String& namespaceURI, const String& qualifiedName, const String& value, ExceptionCode&);
64
65     void scrollIntoView (bool alignToTop = true);
66     void scrollIntoViewIfNeeded(bool centerIfNeeded = true);
67
68     void scrollByUnits(int units, ScrollGranularity);
69     void scrollByLines(int lines);
70     void scrollByPages(int pages);
71
72     int offsetLeft();
73     int offsetTop();
74     int offsetWidth();
75     int offsetHeight();
76     Element* offsetParent();
77     int clientLeft();
78     int clientTop();
79     int clientWidth();
80     int clientHeight();
81     int scrollLeft();
82     int scrollTop();
83     void setScrollLeft(int);
84     void setScrollTop(int);
85     int scrollWidth();
86     int scrollHeight();
87
88     void removeAttribute(const String& name, ExceptionCode&);
89     void removeAttributeNS(const String& namespaceURI, const String& localName, ExceptionCode&);
90
91     PassRefPtr<Attr> getAttributeNode(const String& name);
92     PassRefPtr<Attr> getAttributeNodeNS(const String& namespaceURI, const String& localName);
93     PassRefPtr<Attr> setAttributeNode(Attr*, ExceptionCode&);
94     PassRefPtr<Attr> setAttributeNodeNS(Attr*, ExceptionCode&);
95     PassRefPtr<Attr> removeAttributeNode(Attr*, ExceptionCode&);
96     
97     virtual CSSStyleDeclaration* style();
98
99     const QualifiedName& tagQName() const { return m_tagName; }
100     String tagName() const { return nodeName(); }
101     virtual bool hasTagName(const QualifiedName& tagName) const { return m_tagName.matches(tagName); }
102     
103     // A fast function for checking the local name against another atomic string.
104     bool hasLocalName(const AtomicString& other) const { return m_tagName.localName() == other; }
105     bool hasLocalName(const QualifiedName& other) const { return m_tagName.localName() == other.localName(); }
106
107     virtual const AtomicString& localName() const { return m_tagName.localName(); }
108     virtual const AtomicString& prefix() const { return m_tagName.prefix(); }
109     virtual void setPrefix(const AtomicString &_prefix, ExceptionCode&);
110     virtual const AtomicString& namespaceURI() const { return m_tagName.namespaceURI(); }
111
112     virtual String baseURI() const;
113
114     // DOM methods overridden from  parent classes
115     virtual NodeType nodeType() const;
116     virtual PassRefPtr<Node> cloneNode(bool deep);
117     virtual String nodeName() const;
118     virtual bool isElementNode() const { return true; }
119     virtual void insertedIntoDocument();
120     virtual void removedFromDocument();
121
122     virtual bool isInputTypeHidden() const { return false; }
123
124     String nodeNamePreservingCase() const;
125
126     // convenience methods which ignore exceptions
127     void setAttribute(const QualifiedName&, const String& value);
128     void setBooleanAttribute(const QualifiedName& name, bool);
129
130     virtual NamedAttrMap* attributes() const;
131     NamedAttrMap* attributes(bool readonly) const;
132
133     // This method is called whenever an attribute is added, changed or removed.
134     virtual void attributeChanged(Attribute*, bool preserveDecls = false) {}
135
136     // not part of the DOM
137     void setAttributeMap(NamedAttrMap*);
138
139     virtual void copyNonAttributeProperties(const Element* source) {}
140
141     virtual void attach();
142     virtual void detach();
143     virtual RenderStyle* styleForRenderer(RenderObject* parent);
144     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
145     virtual void recalcStyle(StyleChange = NoChange);
146
147     virtual RenderStyle* computedStyle();
148
149     virtual bool childTypeAllowed(NodeType);
150
151     virtual Attribute* createAttribute(const QualifiedName& name, StringImpl* value);
152     
153     void dispatchAttrRemovalEvent(Attribute*);
154     void dispatchAttrAdditionEvent(Attribute*);
155
156     virtual void accessKeyAction(bool sendToAnyEvent) { }
157
158     virtual String toString() const;
159
160     virtual bool isURLAttribute(Attribute*) const;
161     virtual const QualifiedName& imageSourceAttributeName() const;
162     virtual String target() const { return String(); }
163         
164     virtual void focus(bool restorePreviousSelection = true);
165     virtual void updateFocusAppearance(bool restorePreviousSelection);
166     void blur();
167
168 #ifndef NDEBUG
169     virtual void dump(TextStream* , DeprecatedString ind = "") const;
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 private:
193     ElementRareData* rareData();
194     const ElementRareData* rareData() const;
195     ElementRareData* createRareData();
196
197     virtual void createAttributeMap() const;
198
199     virtual void updateStyleAttributeIfNeeded() const {}
200     
201     void updateFocusAppearanceSoonAfterAttach();
202     void cancelFocusAppearanceUpdate();
203
204 protected:
205     mutable RefPtr<NamedAttrMap> namedAttrMap;
206
207 private:
208     QualifiedName m_tagName;
209 };
210
211 } //namespace
212
213 #endif