Reviewed by Darin.
[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 namespace KJS {
33
34   class DOMNode : public DOMObject {
35   public:
36     // Build a DOMNode
37     DOMNode(ExecState *exec, const DOM::Node &n);
38     // Constructor for inherited classes
39     DOMNode(const Object &proto, const DOM::Node &n);
40     virtual bool toBoolean(ExecState *) const;
41     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
42     Value getValueProperty(ExecState *exec, int token) const;
43
44     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
45     void putValue(ExecState *exec, int token, const Value& value, int attr);
46     virtual DOM::Node toNode() const { return node; }
47     virtual const ClassInfo* classInfo() const { return &info; }
48     static const ClassInfo info;
49
50     virtual Value toPrimitive(ExecState *exec, Type preferred = UndefinedType) const;
51     virtual UString toString(ExecState *exec) const;
52     void setListener(ExecState *exec, int eventId, Value func) const;
53     Value getListener(int eventId) const;
54     virtual void pushEventHandlerScope(ExecState *exec, ScopeChain &scope) const;
55
56     enum { NodeName, NodeValue, NodeType, ParentNode, ParentElement,
57            ChildNodes, FirstChild, LastChild, PreviousSibling, NextSibling, Item,
58            Attributes, NamespaceURI, Prefix, LocalName, OwnerDocument, InsertBefore,
59            ReplaceChild, RemoveChild, AppendChild, HasAttributes, HasChildNodes,
60            CloneNode, Normalize, IsSupported, AddEventListener, RemoveEventListener,
61            DispatchEvent, Contains,
62            OnAbort, OnBlur, OnChange, OnClick, OnContextMenu, OnDblClick, OnDragDrop, OnError,
63            OnDragEnter, OnDragOver, OnDragLeave, OnDrop, OnDragStart, OnDrag, OnDragEnd,
64            OnBeforeCut, OnCut, OnBeforeCopy, OnCopy, OnBeforePaste, OnPaste, OnSelectStart,
65            OnFocus, OnInput, OnKeyDown, OnKeyPress, OnKeyUp, OnLoad, OnMouseDown,
66            OnMouseMove, OnMouseOut, OnMouseOver, OnMouseUp, OnMove, OnReset,
67            OnResize, OnScroll, OnSearch, OnSelect, OnSubmit, OnUnload,
68            OffsetLeft, OffsetTop, OffsetWidth, OffsetHeight, OffsetParent,
69            ClientWidth, ClientHeight, ScrollLeft, ScrollTop, ScrollWidth, ScrollHeight };
70
71   protected:
72     DOM::Node node;
73   };
74
75   class DOMNodeList : public DOMObject {
76   public:
77     DOMNodeList(ExecState *, const DOM::NodeList &l) : list(l) { }
78     ~DOMNodeList();
79     virtual bool hasProperty(ExecState *exec, const Identifier &p) const;
80     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
81     virtual Value call(ExecState *exec, Object &thisObj, const List&args);
82     virtual Value tryCall(ExecState *exec, Object &thisObj, const List&args);
83     virtual bool implementsCall() const { return true; }
84     // no put - all read-only
85     virtual const ClassInfo* classInfo() const { return &info; }
86     virtual bool toBoolean(ExecState *) const { return true; }
87     static const ClassInfo info;
88     DOM::NodeList nodeList() const { return list; }
89
90     virtual Value toPrimitive(ExecState *exec, Type preferred = UndefinedType) const;
91
92   private:
93     DOM::NodeList list;
94   };
95
96   class DOMNodeListFunc : public DOMFunction {
97     friend class DOMNodeList;
98   public:
99     DOMNodeListFunc(ExecState *exec, int id, int len);
100     virtual Value tryCall(ExecState *exec, Object &thisObj, const List &);
101     enum { Item };
102   private:
103     int id;
104   };
105
106   class DOMDocument : public DOMNode {
107   public:
108     // Build a DOMDocument
109     DOMDocument(ExecState *exec, const DOM::Document &d);
110     // Constructor for inherited classes
111     DOMDocument(const Object &proto, const DOM::Document &d);
112     ~DOMDocument();
113     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
114     Value getValueProperty(ExecState *exec, int token) const;
115     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
116     void putValue(ExecState *exec, int token, const Value& value, int attr);
117     virtual const ClassInfo* classInfo() const { return &info; }
118     static const ClassInfo info;
119     enum { DocType, Implementation, DocumentElement,
120            // Functions
121            CreateElement, CreateDocumentFragment, CreateTextNode, CreateComment,
122            CreateCDATASection, CreateProcessingInstruction, CreateAttribute,
123            CreateEntityReference, GetElementsByTagName, ImportNode, CreateElementNS,
124            CreateAttributeNS, GetElementsByTagNameNS, GetElementById,
125            CreateRange, CreateNodeIterator, CreateTreeWalker, DefaultView,
126            CreateEvent, StyleSheets, PreferredStylesheetSet, 
127            SelectedStylesheetSet, GetOverrideStyle, ReadyState, 
128            ExecCommand, QueryCommandEnabled, QueryCommandIndeterm, QueryCommandState, 
129            QueryCommandSupported, QueryCommandValue };
130   };
131
132   class DOMAttr : public DOMNode {
133   public:
134     DOMAttr(ExecState *exec, const DOM::Attr &a) : DOMNode(exec, a) { }
135     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
136     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
137     Value getValueProperty(ExecState *exec, int token) const;
138     void putValue(ExecState *exec, int token, const Value& value, int attr);
139     virtual const ClassInfo* classInfo() const { return &info; }
140     static const ClassInfo info;
141     enum { Name, Specified, ValueProperty, OwnerElement };
142   };
143
144   class DOMElement : public DOMNode {
145   public:
146     // Build a DOMElement
147     DOMElement(ExecState *exec, const DOM::Element &e);
148     // Constructor for inherited classes
149     DOMElement(const Object &proto, const DOM::Element &e);
150     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
151     // no put - all read-only
152     virtual const ClassInfo* classInfo() const { return &info; }
153     static const ClassInfo info;
154     enum { TagName, Style,
155            GetAttribute, SetAttribute, RemoveAttribute, GetAttributeNode,
156            SetAttributeNode, RemoveAttributeNode, GetElementsByTagName,
157            GetAttributeNS, SetAttributeNS, RemoveAttributeNS, GetAttributeNodeNS,
158            SetAttributeNodeNS, GetElementsByTagNameNS, HasAttribute, HasAttributeNS };
159   };
160
161   class DOMDOMImplementation : public DOMObject {
162   public:
163     // Build a DOMDOMImplementation
164     DOMDOMImplementation(ExecState *, const DOM::DOMImplementation &i);
165     ~DOMDOMImplementation();
166     // no put - all functions
167     virtual const ClassInfo* classInfo() const { return &info; }
168     virtual bool toBoolean(ExecState *) const { return true; }
169     static const ClassInfo info;
170     enum { HasFeature, CreateDocumentType, CreateDocument, CreateCSSStyleSheet, CreateHTMLDocument };
171     DOM::DOMImplementation toImplementation() const { return implementation; }
172   private:
173     DOM::DOMImplementation implementation;
174   };
175
176   class DOMDocumentType : public DOMNode {
177   public:
178     // Build a DOMDocumentType
179     DOMDocumentType(ExecState *exec, const DOM::DocumentType &dt);
180     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
181     Value getValueProperty(ExecState *exec, int token) const;
182     // no put - all read-only
183     virtual const ClassInfo* classInfo() const { return &info; }
184     static const ClassInfo info;
185     enum { Name, Entities, Notations, PublicId, SystemId, InternalSubset };
186   };
187
188   class DOMNamedNodeMap : public DOMObject {
189   public:
190     DOMNamedNodeMap(ExecState *, const DOM::NamedNodeMap &m);
191     ~DOMNamedNodeMap();
192     virtual bool hasProperty(ExecState *exec, const Identifier &p) const;
193     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
194     // no put - all read-only
195     virtual const ClassInfo* classInfo() const { return &info; }
196     virtual bool toBoolean(ExecState *) const { return true; }
197     static const ClassInfo info;
198     enum { GetNamedItem, SetNamedItem, RemoveNamedItem, Item,
199            GetNamedItemNS, SetNamedItemNS, RemoveNamedItemNS };
200     DOM::NamedNodeMap toMap() const { return map; }
201   private:
202     DOM::NamedNodeMap map;
203   };
204
205   class DOMProcessingInstruction : public DOMNode {
206   public:
207     DOMProcessingInstruction(ExecState *exec, const DOM::ProcessingInstruction &pi) : DOMNode(exec, pi) { }
208     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
209     Value getValueProperty(ExecState *exec, int token) const;
210     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
211     virtual const ClassInfo* classInfo() const { return &info; }
212     static const ClassInfo info;
213     enum { Target, Data, Sheet };
214   };
215
216   class DOMNotation : public DOMNode {
217   public:
218     DOMNotation(ExecState *exec, const DOM::Notation &n) : DOMNode(exec, n) { }
219     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
220     Value getValueProperty(ExecState *exec, int token) const;
221     // no put - all read-only
222     virtual const ClassInfo* classInfo() const { return &info; }
223     static const ClassInfo info;
224     enum { PublicId, SystemId };
225   };
226
227   class DOMEntity : public DOMNode {
228   public:
229     DOMEntity(ExecState *exec, const DOM::Entity &e) : DOMNode(exec, e) { }
230     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
231     Value getValueProperty(ExecState *exec, int token) const;
232     // no put - all read-only
233     virtual const ClassInfo* classInfo() const { return &info; }
234     static const ClassInfo info;
235     enum { PublicId, SystemId, NotationName };
236   };
237
238   // Constructor for Node - constructor stuff not implemented yet
239   class NodeConstructor : public DOMObject {
240   public:
241     NodeConstructor(ExecState *) : DOMObject() { }
242     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
243     Value getValueProperty(ExecState *exec, int token) const;
244     // no put - all read-only
245     virtual const ClassInfo* classInfo() const { return &info; }
246     static const ClassInfo info;
247   };
248
249   // Constructor for DOMException - constructor stuff not implemented yet
250   class DOMExceptionConstructor : public DOMObject {
251   public:
252     DOMExceptionConstructor(ExecState *) : DOMObject() { }
253     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
254     Value getValueProperty(ExecState *exec, int token) const;
255     // no put - all read-only
256     virtual const ClassInfo* classInfo() const { return &info; }
257     static const ClassInfo info;
258   };
259
260   Value getDOMDocumentNode(ExecState *exec, const DOM::Document &n);
261   bool checkNodeSecurity(ExecState *exec, const DOM::Node& n);
262 #if APPLE_CHANGES
263   Value getRuntimeObject(ExecState *exec, const DOM::Node &n);
264 #endif
265   Value getDOMNode(ExecState *exec, const DOM::Node &n);
266   Value getDOMNamedNodeMap(ExecState *exec, const DOM::NamedNodeMap &m);
267   Value getDOMNodeList(ExecState *exec, const DOM::NodeList &l);
268   Value getDOMDOMImplementation(ExecState *exec, const DOM::DOMImplementation &i);
269   Object getNodeConstructor(ExecState *exec);
270   Object getDOMExceptionConstructor(ExecState *exec);
271
272   // Internal class, used for the collection return by e.g. document.forms.myinput
273   // when multiple nodes have the same name.
274   class DOMNamedNodesCollection : public DOMObject {
275   public:
276     DOMNamedNodesCollection(ExecState *exec, const QValueList<DOM::Node>& nodes );
277     virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
278   private:
279     QValueList<DOM::Node> m_nodes;
280   };
281
282   class DOMCharacterData : public DOMNode {
283   public:
284     // Build a DOMCharacterData
285     DOMCharacterData(ExecState *exec, const DOM::CharacterData &d);
286     // Constructor for inherited classes
287     DOMCharacterData(const Object &proto, const DOM::CharacterData &d);
288     virtual Value tryGet(ExecState *exec,const Identifier &propertyName) const;
289     Value getValueProperty(ExecState *, int token) const;
290     virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
291     virtual const ClassInfo* classInfo() const { return &info; }
292     static const ClassInfo info;
293     DOM::CharacterData toData() const { return static_cast<DOM::CharacterData>(node); }
294     enum { Data, Length,
295            SubstringData, AppendData, InsertData, DeleteData, ReplaceData };
296   };
297
298   class DOMText : public DOMCharacterData {
299   public:
300     DOMText(ExecState *exec, const DOM::Text &t);
301     virtual Value tryGet(ExecState *exec,const Identifier &propertyName) const;
302     Value getValueProperty(ExecState *, int token) const;
303     virtual const ClassInfo* classInfo() const { return &info; }
304     static const ClassInfo info;
305     DOM::Text toText() const { return static_cast<DOM::Text>(node); }
306     enum { SplitText };
307   };
308
309 }; // namespace
310
311 #endif