c789d44a4d6fe7c0f9938dfaec2056b371fcf558
[WebKit-https.git] / WebCore / khtml / ecma / kjs_dom.h
1 // -*- c-basic-offset: 2 -*-
2 /*
3  *  This file is part of the KDE libraries
4  *  Copyright (C) 2000 Harri Porten (porten@kde.org)
5  *  Copyright (C) 2003 Apple Computer, Inc.
6  *
7  *  This library is free software; you can redistribute it and/or
8  *  modify it under the terms of the GNU Lesser General Public
9  *  License as published by the Free Software Foundation; either
10  *  version 2 of the License, or (at your option) any later version.
11  *
12  *  This library is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  *  Lesser General Public License for more details.
16  *
17  *  You should have received a copy of the GNU Lesser General Public
18  *  License along with this library; if not, write to the Free Software
19  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  */
21
22 #ifndef _KJS_DOM_H_
23 #define _KJS_DOM_H_
24
25 #include "dom/dom_node.h"
26 #include "dom/dom_doc.h"
27 #include "dom/dom_element.h"
28 #include "dom/dom_xml.h"
29
30 #include "ecma/kjs_binding.h"
31
32 #include "qvaluelist.h"
33
34 namespace KJS {
35
36   class DOMNode : public DOMObject {
37   public:
38     // Build a DOMNode
39     DOMNode(ExecState *exec, const DOM::Node &n);
40     // Constructor for inherited classes
41     DOMNode(const Object &proto, const DOM::Node &n);
42     virtual bool toBoolean(ExecState *) const;
43     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
44     Value getValueProperty(ExecState *exec, int token) const;
45
46     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
47     void putValue(ExecState *exec, int token, const Value& value, int attr);
48     virtual DOM::Node toNode() const { return node; }
49     virtual const ClassInfo* classInfo() const { return &info; }
50     static const ClassInfo info;
51
52     virtual Value toPrimitive(ExecState *exec, Type preferred = UndefinedType) const;
53     virtual UString toString(ExecState *exec) const;
54     void setListener(ExecState *exec, int eventId, Value func) const;
55     Value getListener(int eventId) const;
56     virtual void pushEventHandlerScope(ExecState *exec, ScopeChain &scope) const;
57
58     enum { NodeName, NodeValue, NodeType, ParentNode, ParentElement,
59            ChildNodes, FirstChild, LastChild, PreviousSibling, NextSibling, Item,
60            Attributes, NamespaceURI, Prefix, LocalName, OwnerDocument, InsertBefore,
61            ReplaceChild, RemoveChild, AppendChild, HasAttributes, HasChildNodes,
62            CloneNode, Normalize, IsSupported, AddEventListener, RemoveEventListener,
63            DispatchEvent, Contains,
64            OnAbort, OnBlur, OnChange, OnClick, OnContextMenu, OnDblClick, OnDragDrop, OnError,
65            OnDragEnter, OnDragOver, OnDragLeave, OnDrop, OnDragStart, OnDrag, OnDragEnd,
66            OnBeforeCut, OnCut, OnBeforeCopy, OnCopy, OnBeforePaste, OnPaste, OnSelectStart,
67            OnFocus, OnInput, OnKeyDown, OnKeyPress, OnKeyUp, OnLoad, OnMouseDown,
68            OnMouseMove, OnMouseOut, OnMouseOver, OnMouseUp, OnMove, OnReset,
69            OnResize, OnScroll, OnSearch, OnSelect, OnSubmit, OnUnload,
70            OffsetLeft, OffsetTop, OffsetWidth, OffsetHeight, OffsetParent,
71            ClientWidth, ClientHeight, ScrollLeft, ScrollTop, ScrollWidth, ScrollHeight };
72
73   protected:
74     DOM::Node node;
75   };
76
77   class DOMNodeList : public DOMObject {
78   public:
79     DOMNodeList(ExecState *, const DOM::NodeList &l) : list(l) { }
80     ~DOMNodeList();
81     virtual bool hasProperty(ExecState *exec, const Identifier &p) const;
82     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
83     virtual Value call(ExecState *exec, Object &thisObj, const List&args);
84     virtual Value tryCall(ExecState *exec, Object &thisObj, const List&args);
85     virtual bool implementsCall() const { return true; }
86     // no put - all read-only
87     virtual const ClassInfo* classInfo() const { return &info; }
88     virtual bool toBoolean(ExecState *) const { return true; }
89     static const ClassInfo info;
90     DOM::NodeList nodeList() const { return list; }
91
92     virtual Value toPrimitive(ExecState *exec, Type preferred = UndefinedType) const;
93
94   private:
95     DOM::NodeList list;
96   };
97
98   class DOMNodeListFunc : public DOMFunction {
99     friend class DOMNodeList;
100   public:
101     DOMNodeListFunc(ExecState *exec, int id, int len);
102     virtual Value tryCall(ExecState *exec, Object &thisObj, const List &);
103     enum { Item };
104   private:
105     int id;
106   };
107
108   class DOMDocument : public DOMNode {
109   public:
110     // Build a DOMDocument
111     DOMDocument(ExecState *exec, const DOM::Document &d);
112     // Constructor for inherited classes
113     DOMDocument(const Object &proto, const DOM::Document &d);
114     ~DOMDocument();
115     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
116     Value getValueProperty(ExecState *exec, int token) const;
117     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
118     void putValue(ExecState *exec, int token, const Value& value, int attr);
119     virtual const ClassInfo* classInfo() const { return &info; }
120     static const ClassInfo info;
121     enum { DocType, Implementation, DocumentElement,
122            // Functions
123            CreateElement, CreateDocumentFragment, CreateTextNode, CreateComment,
124            CreateCDATASection, CreateProcessingInstruction, CreateAttribute,
125            CreateEntityReference, GetElementsByTagName, ImportNode, CreateElementNS,
126            CreateAttributeNS, GetElementsByTagNameNS, GetElementById,
127            CreateRange, CreateNodeIterator, CreateTreeWalker, DefaultView,
128            CreateEvent, StyleSheets, PreferredStylesheetSet, 
129            SelectedStylesheetSet, GetOverrideStyle, ReadyState, 
130            ExecCommand, QueryCommandEnabled, QueryCommandIndeterm, QueryCommandState, 
131            QueryCommandSupported, QueryCommandValue };
132   };
133
134   class DOMAttr : public DOMNode {
135   public:
136     DOMAttr(ExecState *exec, const DOM::Attr &a) : DOMNode(exec, a) { }
137     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
138     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
139     Value getValueProperty(ExecState *exec, int token) const;
140     void putValue(ExecState *exec, int token, const Value& value, int attr);
141     virtual const ClassInfo* classInfo() const { return &info; }
142     static const ClassInfo info;
143     enum { Name, Specified, ValueProperty, OwnerElement };
144   };
145
146   class DOMElement : public DOMNode {
147   public:
148     // Build a DOMElement
149     DOMElement(ExecState *exec, const DOM::Element &e);
150     // Constructor for inherited classes
151     DOMElement(const Object &proto, const DOM::Element &e);
152     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
153     // no put - all read-only
154     virtual const ClassInfo* classInfo() const { return &info; }
155     static const ClassInfo info;
156     enum { TagName, Style,
157            GetAttribute, SetAttribute, RemoveAttribute, GetAttributeNode,
158            SetAttributeNode, RemoveAttributeNode, GetElementsByTagName,
159            GetAttributeNS, SetAttributeNS, RemoveAttributeNS, GetAttributeNodeNS,
160            SetAttributeNodeNS, GetElementsByTagNameNS, HasAttribute, HasAttributeNS };
161   };
162
163   class DOMDOMImplementation : public DOMObject {
164   public:
165     // Build a DOMDOMImplementation
166     DOMDOMImplementation(ExecState *, const DOM::DOMImplementation &i);
167     ~DOMDOMImplementation();
168     // no put - all functions
169     virtual const ClassInfo* classInfo() const { return &info; }
170     virtual bool toBoolean(ExecState *) const { return true; }
171     static const ClassInfo info;
172     enum { HasFeature, CreateDocumentType, CreateDocument, CreateCSSStyleSheet, CreateHTMLDocument };
173     DOM::DOMImplementation toImplementation() const { return implementation; }
174   private:
175     DOM::DOMImplementation implementation;
176   };
177
178   class DOMDocumentType : public DOMNode {
179   public:
180     // Build a DOMDocumentType
181     DOMDocumentType(ExecState *exec, const DOM::DocumentType &dt);
182     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
183     Value getValueProperty(ExecState *exec, int token) const;
184     // no put - all read-only
185     virtual const ClassInfo* classInfo() const { return &info; }
186     static const ClassInfo info;
187     enum { Name, Entities, Notations, PublicId, SystemId, InternalSubset };
188   };
189
190   class DOMNamedNodeMap : public DOMObject {
191   public:
192     DOMNamedNodeMap(ExecState *, const DOM::NamedNodeMap &m);
193     ~DOMNamedNodeMap();
194     virtual bool hasProperty(ExecState *exec, const Identifier &p) const;
195     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
196     // no put - all read-only
197     virtual const ClassInfo* classInfo() const { return &info; }
198     virtual bool toBoolean(ExecState *) const { return true; }
199     static const ClassInfo info;
200     enum { GetNamedItem, SetNamedItem, RemoveNamedItem, Item,
201            GetNamedItemNS, SetNamedItemNS, RemoveNamedItemNS };
202     DOM::NamedNodeMap toMap() const { return map; }
203   private:
204     DOM::NamedNodeMap map;
205   };
206
207   class DOMProcessingInstruction : public DOMNode {
208   public:
209     DOMProcessingInstruction(ExecState *exec, const DOM::ProcessingInstruction &pi) : DOMNode(exec, pi) { }
210     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
211     Value getValueProperty(ExecState *exec, int token) const;
212     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
213     virtual const ClassInfo* classInfo() const { return &info; }
214     static const ClassInfo info;
215     enum { Target, Data, Sheet };
216   };
217
218   class DOMNotation : public DOMNode {
219   public:
220     DOMNotation(ExecState *exec, const DOM::Notation &n) : DOMNode(exec, n) { }
221     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
222     Value getValueProperty(ExecState *exec, int token) const;
223     // no put - all read-only
224     virtual const ClassInfo* classInfo() const { return &info; }
225     static const ClassInfo info;
226     enum { PublicId, SystemId };
227   };
228
229   class DOMEntity : public DOMNode {
230   public:
231     DOMEntity(ExecState *exec, const DOM::Entity &e) : DOMNode(exec, e) { }
232     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
233     Value getValueProperty(ExecState *exec, int token) const;
234     // no put - all read-only
235     virtual const ClassInfo* classInfo() const { return &info; }
236     static const ClassInfo info;
237     enum { PublicId, SystemId, NotationName };
238   };
239
240   // Constructor for Node - constructor stuff not implemented yet
241   class NodeConstructor : public DOMObject {
242   public:
243     NodeConstructor(ExecState *) : DOMObject() { }
244     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
245     Value getValueProperty(ExecState *exec, int token) const;
246     // no put - all read-only
247     virtual const ClassInfo* classInfo() const { return &info; }
248     static const ClassInfo info;
249   };
250
251   // Constructor for DOMException - constructor stuff not implemented yet
252   class DOMExceptionConstructor : public DOMObject {
253   public:
254     DOMExceptionConstructor(ExecState *) : DOMObject() { }
255     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
256     Value getValueProperty(ExecState *exec, int token) const;
257     // no put - all read-only
258     virtual const ClassInfo* classInfo() const { return &info; }
259     static const ClassInfo info;
260   };
261
262   Value getDOMDocumentNode(ExecState *exec, const DOM::Document &n);
263   bool checkNodeSecurity(ExecState *exec, const DOM::Node& n);
264 #if APPLE_CHANGES
265   Value getRuntimeObject(ExecState *exec, const DOM::Node &n);
266 #endif
267   Value getDOMNode(ExecState *exec, const DOM::Node &n);
268   Value getDOMNamedNodeMap(ExecState *exec, const DOM::NamedNodeMap &m);
269   Value getDOMNodeList(ExecState *exec, const DOM::NodeList &l);
270   Value getDOMDOMImplementation(ExecState *exec, const DOM::DOMImplementation &i);
271   Object getNodeConstructor(ExecState *exec);
272   Object getDOMExceptionConstructor(ExecState *exec);
273
274   // Internal class, used for the collection return by e.g. document.forms.myinput
275   // when multiple nodes have the same name.
276   class DOMNamedNodesCollection : public DOMObject {
277   public:
278     DOMNamedNodesCollection(ExecState *exec, const QValueList<DOM::Node>& nodes );
279     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
280   private:
281     QValueList<DOM::Node> m_nodes;
282   };
283
284   class DOMCharacterData : public DOMNode {
285   public:
286     // Build a DOMCharacterData
287     DOMCharacterData(ExecState *exec, const DOM::CharacterData &d);
288     // Constructor for inherited classes
289     DOMCharacterData(const Object &proto, const DOM::CharacterData &d);
290     virtual Value tryGet(ExecState *exec,const Identifier &propertyName) const;
291     Value getValueProperty(ExecState *, int token) const;
292     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
293     virtual const ClassInfo* classInfo() const { return &info; }
294     static const ClassInfo info;
295     DOM::CharacterData toData() const { return static_cast<DOM::CharacterData>(node); }
296     enum { Data, Length,
297            SubstringData, AppendData, InsertData, DeleteData, ReplaceData };
298   };
299
300   class DOMText : public DOMCharacterData {
301   public:
302     DOMText(ExecState *exec, const DOM::Text &t);
303     virtual Value tryGet(ExecState *exec,const Identifier &propertyName) const;
304     Value getValueProperty(ExecState *, int token) const;
305     virtual const ClassInfo* classInfo() const { return &info; }
306     static const ClassInfo info;
307     DOM::Text toText() const { return static_cast<DOM::Text>(node); }
308     enum { SplitText };
309   };
310
311 }; // namespace
312
313 #endif