4128eaddb440f92b0f60a974368f351c5636d940
[WebKit-https.git] / WebCore / dom / Element.h
1 /*
2  * This file is part of the DOM implementation for KDE.
3  *
4  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
5  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
6  *           (C) 2001 Peter Kelly (pmk@post.com)
7  *           (C) 2001 Dirk Mueller (mueller@kde.org)
8  * Copyright (C) 2003, 2004, 2005, 2006 Apple Computer, Inc.
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Library General Public
12  * License as published by the Free Software Foundation; either
13  * version 2 of the License, or (at your option) any later version.
14  *
15  * This library is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Library General Public License for more details.
19  *
20  * You should have received a copy of the GNU Library General Public License
21  * along with this library; see the file COPYING.LIB.  If not, write to
22  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23  * Boston, MA 02111-1307, USA.
24  *
25  */
26
27 #ifndef Element_h
28 #define Element_h
29
30 #include "Attr.h"
31 #include "ScrollBar.h"
32 #include "Timer.h"
33
34 namespace WebCore {
35
36 class AtomicStringList;
37 class Attribute;
38
39 class Element : public ContainerNode {
40     friend class Document;
41     friend class NamedAttrMap;
42     friend class Attr;
43     friend class Node;
44     friend class CSSStyleSelector;
45 public:
46     Element(const QualifiedName&, Document*);
47     ~Element();
48
49     // Used to quickly determine whether or not an element has a given CSS class.
50     virtual const AtomicStringList* getClassList() const;
51     const AtomicString& getIDAttribute() const;
52     bool hasAttribute(const QualifiedName& name) const;
53     const AtomicString& getAttribute(const QualifiedName& name) const;
54     void setAttribute(const QualifiedName& name, StringImpl* value, ExceptionCode&);
55     void removeAttribute(const QualifiedName& name, ExceptionCode&);
56
57     bool hasAttributes() const;
58
59     bool hasAttribute(const String& name) const;
60     bool hasAttributeNS(const String& namespaceURI, const String& localName) const;
61
62     const AtomicString& getAttribute(const String& name) const;
63     const AtomicString& getAttributeNS(const String& namespaceURI, const String& localName) const;
64
65     void setAttribute(const String& name, const String& value, ExceptionCode&);
66     void setAttributeNS(const String& namespaceURI, const String& qualifiedName, const String& value, ExceptionCode&);
67
68     void scrollIntoView (bool alignToTop = true);
69     void scrollIntoViewIfNeeded(bool centerIfNeeded = true);
70
71     void scrollByUnits(int units, ScrollGranularity granularity);
72     void scrollByLines(int lines);
73     void scrollByPages(int pages);
74
75     int offsetLeft();
76     int offsetTop();
77     int offsetWidth();
78     int offsetHeight();
79     Element* offsetParent();
80     int clientWidth();
81     int clientHeight();
82     int scrollLeft();
83     int scrollTop();
84     void setScrollLeft(int);
85     void setScrollTop(int);
86     int scrollWidth();
87     int scrollHeight();
88
89     void removeAttribute(const String &name, ExceptionCode& ec);
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* newAttr, ExceptionCode& ec) { return setAttributeNode(newAttr, ec); }
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     virtual 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     virtual const AtomicString& localName() const { return m_tagName.localName(); }
109     virtual const AtomicString& prefix() const { return m_tagName.prefix(); }
110     virtual void setPrefix(const AtomicString &_prefix, ExceptionCode&);
111     virtual const AtomicString& namespaceURI() const { return m_tagName.namespaceURI(); }
112     
113     // DOM methods overridden from  parent classes
114     virtual NodeType nodeType() const;
115     virtual PassRefPtr<Node> cloneNode(bool deep);
116     virtual String nodeName() const;
117     virtual bool isElementNode() const { return true; }
118     virtual void insertedIntoDocument();
119     virtual void removedFromDocument();
120
121     String nodeNamePreservingCase() const;
122
123     // convenience methods which ignore exceptions
124     void setAttribute(const QualifiedName& name, const String& value);
125
126     virtual NamedAttrMap *attributes() const;
127     NamedAttrMap* attributes(bool readonly) const;
128
129     // This method is called whenever an attribute is added, changed or removed.
130     virtual void attributeChanged(Attribute* attr, bool preserveDecls = false) {}
131
132     // not part of the DOM
133     void setAttributeMap(NamedAttrMap*);
134
135     virtual void copyNonAttributeProperties(const Element *source) {}
136
137     virtual void attach();
138     virtual void detach();
139     virtual RenderStyle *styleForRenderer(RenderObject *parent);
140     virtual RenderObject *createRenderer(RenderArena *, RenderStyle *);
141     virtual void recalcStyle( StyleChange = NoChange );
142
143     virtual bool childTypeAllowed(NodeType);
144
145     virtual Attribute* createAttribute(const QualifiedName& name, StringImpl* value);
146     
147     void dispatchAttrRemovalEvent(Attribute *attr);
148     void dispatchAttrAdditionEvent(Attribute *attr);
149
150     virtual void accessKeyAction(bool sendToAnyEvent) { }
151
152     virtual String toString() const;
153
154     virtual bool isURLAttribute(Attribute *attr) const;
155         
156     virtual void focus();
157     virtual void updateFocusAppearance();
158     void blur();
159     bool needsFocusAppearanceUpdate() const { return m_needsFocusAppearanceUpdate; }
160     void setNeedsFocusAppearanceUpdate(bool b) { m_needsFocusAppearanceUpdate = b; }
161     
162 #ifndef NDEBUG
163     virtual void dump(TextStream *stream, DeprecatedString ind = "") const;
164     virtual void formatForDebugger(char *buffer, unsigned length) const;
165 #endif
166
167     Node* insertAdjacentElement(const String& where, Node* newChild, int& exception);
168     bool contains(const Element*) const;
169  
170 protected:
171     virtual void createAttributeMap() const;
172     String openTagStartToString() const;
173
174 private:
175     void updateId(const AtomicString& oldId, const AtomicString& newId);
176
177     virtual void updateStyleAttributeIfNeeded() const {}
178     
179     void updateFocusAppearanceTimerFired(Timer<Element>*);
180     void stopUpdateFocusAppearanceTimer();
181     Timer<Element> m_updateFocusAppearanceTimer;
182     bool m_needsFocusAppearanceUpdate;
183
184 protected: // member variables
185     mutable RefPtr<NamedAttrMap> namedAttrMap;
186     QualifiedName m_tagName;
187 };
188
189 } //namespace
190
191 #endif