Implement support for the WinIE clientLeft and clientTop extensions.
[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 clientLeft();
81     int clientTop();
82     int clientWidth();
83     int clientHeight();
84     int scrollLeft();
85     int scrollTop();
86     void setScrollLeft(int);
87     void setScrollTop(int);
88     int scrollWidth();
89     int scrollHeight();
90
91     void removeAttribute(const String &name, ExceptionCode& ec);
92     void removeAttributeNS(const String &namespaceURI, const String& localName, ExceptionCode&);
93
94     PassRefPtr<Attr> getAttributeNode(const String& name);
95     PassRefPtr<Attr> getAttributeNodeNS(const String& namespaceURI, const String& localName);
96     PassRefPtr<Attr> setAttributeNode(Attr*, ExceptionCode&);
97     PassRefPtr<Attr> setAttributeNodeNS(Attr* newAttr, ExceptionCode& ec) { return setAttributeNode(newAttr, ec); }
98     PassRefPtr<Attr> removeAttributeNode(Attr*, ExceptionCode&);
99     
100     virtual CSSStyleDeclaration *style();
101
102     const QualifiedName& tagQName() const { return m_tagName; }
103     String tagName() const { return nodeName(); }
104     virtual bool hasTagName(const QualifiedName& tagName) const { return m_tagName.matches(tagName); }
105     
106     // A fast function for checking the local name against another atomic string.
107     bool hasLocalName(const AtomicString& other) const { return m_tagName.localName() == other; }
108     bool hasLocalName(const QualifiedName& other) const { return m_tagName.localName() == other.localName(); }
109
110     virtual const AtomicString& localName() const { return m_tagName.localName(); }
111     virtual const AtomicString& prefix() const { return m_tagName.prefix(); }
112     virtual void setPrefix(const AtomicString &_prefix, ExceptionCode&);
113     virtual const AtomicString& namespaceURI() const { return m_tagName.namespaceURI(); }
114     
115     // DOM methods overridden from  parent classes
116     virtual NodeType nodeType() const;
117     virtual PassRefPtr<Node> cloneNode(bool deep);
118     virtual String nodeName() const;
119     virtual bool isElementNode() const { return true; }
120     virtual void insertedIntoDocument();
121     virtual void removedFromDocument();
122
123     String nodeNamePreservingCase() const;
124
125     // convenience methods which ignore exceptions
126     void setAttribute(const QualifiedName& name, const String& value);
127
128     virtual NamedAttrMap *attributes() const;
129     NamedAttrMap* attributes(bool readonly) const;
130
131     // This method is called whenever an attribute is added, changed or removed.
132     virtual void attributeChanged(Attribute* attr, bool preserveDecls = false) {}
133
134     // not part of the DOM
135     void setAttributeMap(NamedAttrMap*);
136
137     virtual void copyNonAttributeProperties(const Element *source) {}
138
139     virtual void attach();
140     virtual void detach();
141     virtual RenderStyle *styleForRenderer(RenderObject *parent);
142     virtual RenderObject *createRenderer(RenderArena *, RenderStyle *);
143     virtual void recalcStyle( StyleChange = NoChange );
144
145     virtual bool childTypeAllowed(NodeType);
146
147     virtual Attribute* createAttribute(const QualifiedName& name, StringImpl* value);
148     
149     void dispatchAttrRemovalEvent(Attribute *attr);
150     void dispatchAttrAdditionEvent(Attribute *attr);
151
152     virtual void accessKeyAction(bool sendToAnyEvent) { }
153
154     virtual String toString() const;
155
156     virtual bool isURLAttribute(Attribute *attr) const;
157         
158     virtual void focus();
159     virtual void updateFocusAppearance();
160     void blur();
161     bool needsFocusAppearanceUpdate() const { return m_needsFocusAppearanceUpdate; }
162     void setNeedsFocusAppearanceUpdate(bool b) { m_needsFocusAppearanceUpdate = b; }
163     
164 #ifndef NDEBUG
165     virtual void dump(TextStream *stream, DeprecatedString ind = "") const;
166     virtual void formatForDebugger(char *buffer, unsigned length) const;
167 #endif
168
169     Node* insertAdjacentElement(const String& where, Node* newChild, int& exception);
170     bool contains(const Element*) const;
171  
172 protected:
173     virtual void createAttributeMap() const;
174     String openTagStartToString() const;
175
176 private:
177     void updateId(const AtomicString& oldId, const AtomicString& newId);
178
179     virtual void updateStyleAttributeIfNeeded() const {}
180     
181     void updateFocusAppearanceTimerFired(Timer<Element>*);
182     void stopUpdateFocusAppearanceTimer();
183     Timer<Element> m_updateFocusAppearanceTimer;
184     bool m_needsFocusAppearanceUpdate;
185
186 protected: // member variables
187     mutable RefPtr<NamedAttrMap> namedAttrMap;
188     QualifiedName m_tagName;
189 };
190
191 } //namespace
192
193 #endif