1/*
2 * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#ifndef DOMCoreClasses_H
27#define DOMCoreClasses_H
28
29#include "WebKit.h"
30#include "WebScriptObject.h"
31
32namespace WebCore {
33    class Element;
34    class Document;
35    class Node;
36    class NodeList;
37}
38
39class DOMObject : public WebScriptObject, public IDOMObject
40{
41public:
42    // IUnknown
43    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
44    virtual ULONG STDMETHODCALLTYPE AddRef(void) { return WebScriptObject::AddRef(); }
45    virtual ULONG STDMETHODCALLTYPE Release(void) { return WebScriptObject::Release(); }
46
47    // IWebScriptObject
48    virtual HRESULT STDMETHODCALLTYPE throwException(
49        /* [in] */ BSTR exceptionMessage,
50        /* [retval][out] */ BOOL *result) { return WebScriptObject::throwException(exceptionMessage, result); }
51
52    virtual HRESULT STDMETHODCALLTYPE callWebScriptMethod(
53        /* [in] */ BSTR name,
54        /* [size_is][in] */ const VARIANT args[  ],
55        /* [in] */ int cArgs,
56        /* [retval][out] */ VARIANT *result) { return WebScriptObject::callWebScriptMethod(name, args, cArgs, result); }
57
58    virtual HRESULT STDMETHODCALLTYPE evaluateWebScript(
59        /* [in] */ BSTR script,
60        /* [retval][out] */ VARIANT *result) { return WebScriptObject::evaluateWebScript(script, result); }
61
62    virtual HRESULT STDMETHODCALLTYPE removeWebScriptKey(
63        /* [in] */ BSTR name) { return WebScriptObject::removeWebScriptKey(name); }
64
65    virtual HRESULT STDMETHODCALLTYPE stringRepresentation(
66        /* [retval][out] */ BSTR* stringRepresentation) { return WebScriptObject::stringRepresentation(stringRepresentation); }
67
68    virtual HRESULT STDMETHODCALLTYPE webScriptValueAtIndex(
69        /* [in] */ unsigned int index,
70        /* [retval][out] */ VARIANT *result) { return WebScriptObject::webScriptValueAtIndex(index, result); }
71
72    virtual HRESULT STDMETHODCALLTYPE setWebScriptValueAtIndex(
73        /* [in] */ unsigned int index,
74        /* [in] */ VARIANT val) { return WebScriptObject::setWebScriptValueAtIndex(index, val); }
75
76    virtual HRESULT STDMETHODCALLTYPE setException(
77        /* [in] */ BSTR description) { return WebScriptObject::setException(description); }
78};
79
80class DECLSPEC_UUID("062AEEE3-9E42-44DC-A8A9-236B216FE011") DOMNode : public DOMObject, public IDOMNode, public IDOMEventTarget
81{
82protected:
83    DOMNode(WebCore::Node* n);
84    ~DOMNode();
85
86public:
87    static IDOMNode* createInstance(WebCore::Node* n);
88
89public:
90    // IUnknown
91    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
92    virtual ULONG STDMETHODCALLTYPE AddRef(void) { return DOMObject::AddRef(); }
93    virtual ULONG STDMETHODCALLTYPE Release(void) { return DOMObject::Release(); }
94
95    // IWebScriptObject
96    virtual HRESULT STDMETHODCALLTYPE throwException(
97        /* [in] */ BSTR exceptionMessage,
98        /* [retval][out] */ BOOL *result) { return DOMObject::throwException(exceptionMessage, result); }
99
100    virtual HRESULT STDMETHODCALLTYPE callWebScriptMethod(
101        /* [in] */ BSTR name,
102        /* [size_is][in] */ const VARIANT args[  ],
103        /* [in] */ int cArgs,
104        /* [retval][out] */ VARIANT *result) { return DOMObject::callWebScriptMethod(name, args, cArgs, result); }
105
106    virtual HRESULT STDMETHODCALLTYPE evaluateWebScript(
107        /* [in] */ BSTR script,
108        /* [retval][out] */ VARIANT *result) { return DOMObject::evaluateWebScript(script, result); }
109
110    virtual HRESULT STDMETHODCALLTYPE removeWebScriptKey(
111        /* [in] */ BSTR name) { return DOMObject::removeWebScriptKey(name); }
112
113    virtual HRESULT STDMETHODCALLTYPE stringRepresentation(
114        /* [retval][out] */ BSTR* stringRepresentation) { return DOMObject::stringRepresentation(stringRepresentation); }
115
116    virtual HRESULT STDMETHODCALLTYPE webScriptValueAtIndex(
117        /* [in] */ unsigned int index,
118        /* [retval][out] */ VARIANT *result) { return DOMObject::webScriptValueAtIndex(index, result); }
119
120    virtual HRESULT STDMETHODCALLTYPE setWebScriptValueAtIndex(
121        /* [in] */ unsigned int index,
122        /* [in] */ VARIANT val) { return DOMObject::setWebScriptValueAtIndex(index, val); }
123
124    virtual HRESULT STDMETHODCALLTYPE setException(
125        /* [in] */ BSTR description) { return DOMObject::setException(description); }
126
127    // IDOMNode
128    virtual HRESULT STDMETHODCALLTYPE nodeName(
129        /* [retval][out] */ BSTR *result);
130
131    virtual HRESULT STDMETHODCALLTYPE nodeValue(
132        /* [retval][out] */ BSTR *result);
133
134    virtual HRESULT STDMETHODCALLTYPE setNodeValue(
135        /* [in] */ BSTR value);
136
137    virtual HRESULT STDMETHODCALLTYPE nodeType(
138        /* [retval][out] */ unsigned short *result);
139
140    virtual HRESULT STDMETHODCALLTYPE parentNode(
141        /* [retval][out] */ IDOMNode **result);
142
143    virtual HRESULT STDMETHODCALLTYPE childNodes(
144        /* [retval][out] */ IDOMNodeList **result);
145
146    virtual HRESULT STDMETHODCALLTYPE firstChild(
147        /* [retval][out] */ IDOMNode **result);
148
149    virtual HRESULT STDMETHODCALLTYPE lastChild(
150        /* [retval][out] */ IDOMNode **result);
151
152    virtual HRESULT STDMETHODCALLTYPE previousSibling(
153        /* [retval][out] */ IDOMNode **result);
154
155    virtual HRESULT STDMETHODCALLTYPE nextSibling(
156        /* [retval][out] */ IDOMNode **result);
157
158    virtual HRESULT STDMETHODCALLTYPE attributes(
159        /* [retval][out] */ IDOMNamedNodeMap **result);
160
161    virtual HRESULT STDMETHODCALLTYPE ownerDocument(
162        /* [retval][out] */ IDOMDocument **result);
163
164    virtual HRESULT STDMETHODCALLTYPE insertBefore(
165        /* [in] */ IDOMNode *newChild,
166        /* [in] */ IDOMNode *refChild,
167        /* [retval][out] */ IDOMNode **result);
168
169    virtual HRESULT STDMETHODCALLTYPE replaceChild(
170        /* [in] */ IDOMNode *newChild,
171        /* [in] */ IDOMNode *oldChild,
172        /* [retval][out] */ IDOMNode **result);
173
174    virtual HRESULT STDMETHODCALLTYPE removeChild(
175        /* [in] */ IDOMNode *oldChild,
176        /* [retval][out] */ IDOMNode **result);
177
178    virtual HRESULT STDMETHODCALLTYPE appendChild(
179        /* [in] */ IDOMNode *oldChild,
180        /* [retval][out] */ IDOMNode **result);
181
182    virtual HRESULT STDMETHODCALLTYPE hasChildNodes(
183        /* [retval][out] */ BOOL *result);
184
185    virtual HRESULT STDMETHODCALLTYPE cloneNode(
186        /* [in] */ BOOL deep,
187        /* [retval][out] */ IDOMNode **result);
188
189    virtual HRESULT STDMETHODCALLTYPE normalize( void);
190
191    virtual HRESULT STDMETHODCALLTYPE isSupported(
192        /* [in] */ BSTR feature,
193        /* [in] */ BSTR version,
194        /* [retval][out] */ BOOL *result);
195
196    virtual HRESULT STDMETHODCALLTYPE namespaceURI(
197        /* [retval][out] */ BSTR *result);
198
199    virtual HRESULT STDMETHODCALLTYPE prefix(
200        /* [retval][out] */ BSTR *result);
201
202    virtual HRESULT STDMETHODCALLTYPE setPrefix(
203        /* [in] */ BSTR prefix);
204
205    virtual HRESULT STDMETHODCALLTYPE localName(
206        /* [retval][out] */ BSTR *result);
207
208    virtual HRESULT STDMETHODCALLTYPE hasAttributes(
209        /* [retval][out] */ BOOL *result);
210
211    virtual HRESULT STDMETHODCALLTYPE isSameNode(
212        /* [in] */ IDOMNode* other,
213        /* [retval][out] */ BOOL* result);
214
215    virtual HRESULT STDMETHODCALLTYPE isEqualNode(
216        /* [in] */ IDOMNode* other,
217        /* [retval][out] */ BOOL* result);
218
219    virtual HRESULT STDMETHODCALLTYPE textContent(
220        /* [retval][out] */ BSTR* result);
221
222    virtual HRESULT STDMETHODCALLTYPE setTextContent(
223        /* [in] */ BSTR text);
224
225    // IDOMEventTarget
226    virtual HRESULT STDMETHODCALLTYPE addEventListener(
227        /* [in] */ BSTR type,
228        /* [in] */ IDOMEventListener *listener,
229        /* [in] */ BOOL useCapture);
230
231    virtual HRESULT STDMETHODCALLTYPE removeEventListener(
232        /* [in] */ BSTR type,
233        /* [in] */ IDOMEventListener *listener,
234        /* [in] */ BOOL useCapture);
235
236    virtual HRESULT STDMETHODCALLTYPE dispatchEvent(
237        /* [in] */ IDOMEvent *evt,
238        /* [retval][out] */ BOOL *result);
239
240    // DOMNode
241    WebCore::Node* node() const { return m_node; }
242
243protected:
244    WebCore::Node* m_node;
245};
246
247class DOMNodeList : public DOMObject, public IDOMNodeList
248{
249protected:
250    DOMNodeList(WebCore::NodeList* l);
251    ~DOMNodeList();
252
253public:
254    static IDOMNodeList* createInstance(WebCore::NodeList* l);
255
256public:
257    // IUnknown
258    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
259    virtual ULONG STDMETHODCALLTYPE AddRef(void) { return DOMObject::AddRef(); }
260    virtual ULONG STDMETHODCALLTYPE Release(void) { return DOMObject::Release(); }
261
262    // IWebScriptObject
263    virtual HRESULT STDMETHODCALLTYPE throwException(
264        /* [in] */ BSTR exceptionMessage,
265        /* [retval][out] */ BOOL *result) { return DOMObject::throwException(exceptionMessage, result); }
266
267    virtual HRESULT STDMETHODCALLTYPE callWebScriptMethod(
268        /* [in] */ BSTR name,
269        /* [size_is][in] */ const VARIANT args[  ],
270        /* [in] */ int cArgs,
271        /* [retval][out] */ VARIANT *result) { return DOMObject::callWebScriptMethod(name, args, cArgs, result); }
272
273    virtual HRESULT STDMETHODCALLTYPE evaluateWebScript(
274        /* [in] */ BSTR script,
275        /* [retval][out] */ VARIANT *result) { return DOMObject::evaluateWebScript(script, result); }
276
277    virtual HRESULT STDMETHODCALLTYPE removeWebScriptKey(
278        /* [in] */ BSTR name) { return DOMObject::removeWebScriptKey(name); }
279
280    virtual HRESULT STDMETHODCALLTYPE stringRepresentation(
281        /* [retval][out] */ BSTR* stringRepresentation) { return DOMObject::stringRepresentation(stringRepresentation); }
282
283    virtual HRESULT STDMETHODCALLTYPE webScriptValueAtIndex(
284        /* [in] */ unsigned int index,
285        /* [retval][out] */ VARIANT *result) { return DOMObject::webScriptValueAtIndex(index, result); }
286
287    virtual HRESULT STDMETHODCALLTYPE setWebScriptValueAtIndex(
288        /* [in] */ unsigned int index,
289        /* [in] */ VARIANT val) { return DOMObject::setWebScriptValueAtIndex(index, val); }
290
291    virtual HRESULT STDMETHODCALLTYPE setException(
292        /* [in] */ BSTR description) { return DOMObject::setException(description); }
293
294    // IDOMNodeList
295    virtual HRESULT STDMETHODCALLTYPE item(
296        /* [in] */ UINT index,
297        /* [retval][out] */ IDOMNode **result);
298
299    virtual HRESULT STDMETHODCALLTYPE length(
300        /* [retval][out] */ UINT *result);
301
302protected:
303    WebCore::NodeList* m_nodeList;
304};
305
306class DOMDocument : public DOMNode, public IDOMDocument, public IDOMViewCSS, public IDOMDocumentEvent
307{
308protected:
309    DOMDocument(WebCore::Document* d);
310    ~DOMDocument();
311
312public:
313    static IDOMDocument* createInstance(WebCore::Document* d);
314
315public:
316    // IUnknown
317    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
318    virtual ULONG STDMETHODCALLTYPE AddRef(void) { return DOMNode::AddRef(); }
319    virtual ULONG STDMETHODCALLTYPE Release(void) { return DOMNode::Release(); }
320
321    // IWebScriptObject
322    virtual HRESULT STDMETHODCALLTYPE throwException(
323        /* [in] */ BSTR exceptionMessage,
324        /* [retval][out] */ BOOL *result) { return DOMNode::throwException(exceptionMessage, result); }
325
326    virtual HRESULT STDMETHODCALLTYPE callWebScriptMethod(
327        /* [in] */ BSTR name,
328        /* [size_is][in] */ const VARIANT args[  ],
329        /* [in] */ int cArgs,
330        /* [retval][out] */ VARIANT *result) { return DOMNode::callWebScriptMethod(name, args, cArgs, result); }
331
332    virtual HRESULT STDMETHODCALLTYPE evaluateWebScript(
333        /* [in] */ BSTR script,
334        /* [retval][out] */ VARIANT *result) { return DOMNode::evaluateWebScript(script, result); }
335
336    virtual HRESULT STDMETHODCALLTYPE removeWebScriptKey(
337        /* [in] */ BSTR name) { return DOMNode::removeWebScriptKey(name); }
338
339    virtual HRESULT STDMETHODCALLTYPE stringRepresentation(
340        /* [retval][out] */ BSTR* stringRepresentation) { return DOMNode::stringRepresentation(stringRepresentation); }
341
342    virtual HRESULT STDMETHODCALLTYPE webScriptValueAtIndex(
343        /* [in] */ unsigned int index,
344        /* [retval][out] */ VARIANT *result) { return DOMNode::webScriptValueAtIndex(index, result); }
345
346    virtual HRESULT STDMETHODCALLTYPE setWebScriptValueAtIndex(
347        /* [in] */ unsigned int index,
348        /* [in] */ VARIANT val) { return DOMNode::setWebScriptValueAtIndex(index, val); }
349
350    virtual HRESULT STDMETHODCALLTYPE setException(
351        /* [in] */ BSTR description) { return DOMNode::setException(description); }
352
353    // IDOMNode
354    virtual HRESULT STDMETHODCALLTYPE nodeName(
355        /* [retval][out] */ BSTR *result) { return DOMNode::nodeName(result); }
356
357    virtual HRESULT STDMETHODCALLTYPE nodeValue(
358        /* [retval][out] */ BSTR *result) { return DOMNode::nodeValue(result); }
359
360    virtual HRESULT STDMETHODCALLTYPE setNodeValue(
361        /* [in] */ BSTR value) { return DOMNode::setNodeValue(value); }
362
363    virtual HRESULT STDMETHODCALLTYPE nodeType(
364        /* [retval][out] */ unsigned short *result) { return DOMNode::nodeType(result); }
365
366    virtual HRESULT STDMETHODCALLTYPE parentNode(
367        /* [retval][out] */ IDOMNode **result) { return DOMNode::parentNode(result); }
368
369    virtual HRESULT STDMETHODCALLTYPE childNodes(
370        /* [retval][out] */ IDOMNodeList **result) { return DOMNode::childNodes(result); }
371
372    virtual HRESULT STDMETHODCALLTYPE firstChild(
373        /* [retval][out] */ IDOMNode **result) { return DOMNode::firstChild(result); }
374
375    virtual HRESULT STDMETHODCALLTYPE lastChild(
376        /* [retval][out] */ IDOMNode **result) { return DOMNode::lastChild(result); }
377
378    virtual HRESULT STDMETHODCALLTYPE previousSibling(
379        /* [retval][out] */ IDOMNode **result) { return DOMNode::previousSibling(result); }
380
381    virtual HRESULT STDMETHODCALLTYPE nextSibling(
382        /* [retval][out] */ IDOMNode **result) { return DOMNode::nextSibling(result); }
383
384    virtual HRESULT STDMETHODCALLTYPE attributes(
385        /* [retval][out] */ IDOMNamedNodeMap **result) { return DOMNode::attributes(result); }
386
387    virtual HRESULT STDMETHODCALLTYPE ownerDocument(
388        /* [retval][out] */ IDOMDocument **result) { return DOMNode::ownerDocument(result); }
389
390    virtual HRESULT STDMETHODCALLTYPE insertBefore(
391        /* [in] */ IDOMNode *newChild,
392        /* [in] */ IDOMNode *refChild,
393        /* [retval][out] */ IDOMNode **result) { return DOMNode::insertBefore(newChild, refChild, result); }
394
395    virtual HRESULT STDMETHODCALLTYPE replaceChild(
396        /* [in] */ IDOMNode *newChild,
397        /* [in] */ IDOMNode *oldChild,
398        /* [retval][out] */ IDOMNode **result) { return DOMNode::replaceChild(newChild, oldChild, result); }
399
400    virtual HRESULT STDMETHODCALLTYPE removeChild(
401        /* [in] */ IDOMNode *oldChild,
402        /* [retval][out] */ IDOMNode **result) { return DOMNode::removeChild(oldChild, result); }
403
404    virtual HRESULT STDMETHODCALLTYPE appendChild(
405        /* [in] */ IDOMNode *oldChild,
406        /* [retval][out] */ IDOMNode **result) { return DOMNode::appendChild(oldChild, result); }
407
408    virtual HRESULT STDMETHODCALLTYPE hasChildNodes(
409        /* [retval][out] */ BOOL *result) { return DOMNode::hasChildNodes(result); }
410
411    virtual HRESULT STDMETHODCALLTYPE cloneNode(
412        /* [in] */ BOOL deep,
413        /* [retval][out] */ IDOMNode **result) { return DOMNode::cloneNode(deep, result); }
414
415    virtual HRESULT STDMETHODCALLTYPE normalize( void) { return DOMNode::normalize(); }
416
417    virtual HRESULT STDMETHODCALLTYPE isSupported(
418        /* [in] */ BSTR feature,
419        /* [in] */ BSTR version,
420        /* [retval][out] */ BOOL *result) { return DOMNode::isSupported(feature, version, result); }
421
422    virtual HRESULT STDMETHODCALLTYPE namespaceURI(
423        /* [retval][out] */ BSTR *result) { return DOMNode::namespaceURI(result); }
424
425    virtual HRESULT STDMETHODCALLTYPE prefix(
426        /* [retval][out] */ BSTR *result) { return DOMNode::prefix(result); }
427
428    virtual HRESULT STDMETHODCALLTYPE setPrefix(
429        /* [in] */ BSTR prefix) { return DOMNode::setPrefix(prefix); }
430
431    virtual HRESULT STDMETHODCALLTYPE localName(
432        /* [retval][out] */ BSTR *result) { return DOMNode::localName(result); }
433
434    virtual HRESULT STDMETHODCALLTYPE hasAttributes(
435        /* [retval][out] */ BOOL *result) { return DOMNode::hasAttributes(result); }
436
437    virtual HRESULT STDMETHODCALLTYPE isSameNode(
438        /* [in] */ IDOMNode* other,
439        /* [retval][out] */ BOOL* result) { return DOMNode::isSameNode(other, result); }
440
441    virtual HRESULT STDMETHODCALLTYPE isEqualNode(
442        /* [in] */ IDOMNode* other,
443        /* [retval][out] */ BOOL* result) { return DOMNode::isEqualNode(other, result); }
444
445    virtual HRESULT STDMETHODCALLTYPE textContent(
446        /* [retval][out] */ BSTR* result) { return DOMNode::textContent(result); }
447
448    virtual HRESULT STDMETHODCALLTYPE setTextContent(
449        /* [in] */ BSTR text) { return DOMNode::setTextContent(text); }
450
451    // IDOMDocument
452    virtual HRESULT STDMETHODCALLTYPE doctype(
453        /* [retval][out] */ IDOMDocumentType **result);
454
455    virtual HRESULT STDMETHODCALLTYPE implementation(
456        /* [retval][out] */ IDOMImplementation **result);
457
458    virtual HRESULT STDMETHODCALLTYPE documentElement(
459        /* [retval][out] */ IDOMElement **result);
460
461    virtual HRESULT STDMETHODCALLTYPE createElement(
462        /* [in] */ BSTR tagName,
463        /* [retval][out] */ IDOMElement **result);
464
465    virtual HRESULT STDMETHODCALLTYPE createDocumentFragment(
466        /* [retval][out] */ IDOMDocumentFragment **result);
467
468    virtual HRESULT STDMETHODCALLTYPE createTextNode(
469        /* [in] */ BSTR data,
470        /* [retval][out] */ IDOMText **result);
471
472    virtual HRESULT STDMETHODCALLTYPE createComment(
473        /* [in] */ BSTR data,
474        /* [retval][out] */ IDOMComment **result);
475
476    virtual HRESULT STDMETHODCALLTYPE createCDATASection(
477        /* [in] */ BSTR data,
478        /* [retval][out] */ IDOMCDATASection **result);
479
480    virtual HRESULT STDMETHODCALLTYPE createProcessingInstruction(
481        /* [in] */ BSTR target,
482        /* [in] */ BSTR data,
483        /* [retval][out] */ IDOMProcessingInstruction **result);
484
485    virtual HRESULT STDMETHODCALLTYPE createAttribute(
486        /* [in] */ BSTR name,
487        /* [retval][out] */ IDOMAttr **result);
488
489    virtual HRESULT STDMETHODCALLTYPE createEntityReference(
490        /* [in] */ BSTR name,
491        /* [retval][out] */ IDOMEntityReference **result);
492
493    virtual HRESULT STDMETHODCALLTYPE getElementsByTagName(
494        /* [in] */ BSTR tagName,
495        /* [retval][out] */ IDOMNodeList **result);
496
497    virtual HRESULT STDMETHODCALLTYPE importNode(
498        /* [in] */ IDOMNode *importedNode,
499        /* [in] */ BOOL deep,
500        /* [retval][out] */ IDOMNode **result);
501
502    virtual HRESULT STDMETHODCALLTYPE createElementNS(
503        /* [in] */ BSTR namespaceURI,
504        /* [in] */ BSTR qualifiedName,
505        /* [retval][out] */ IDOMElement **result);
506
507    virtual HRESULT STDMETHODCALLTYPE createAttributeNS(
508        /* [in] */ BSTR namespaceURI,
509        /* [in] */ BSTR qualifiedName,
510        /* [retval][out] */ IDOMAttr **result);
511
512    virtual HRESULT STDMETHODCALLTYPE getElementsByTagNameNS(
513        /* [in] */ BSTR namespaceURI,
514        /* [in] */ BSTR localName,
515        /* [retval][out] */ IDOMNodeList **result);
516
517    virtual HRESULT STDMETHODCALLTYPE getElementById(
518        /* [in] */ BSTR elementId,
519        /* [retval][out] */ IDOMElement **result);
520
521    // IDOMViewCSS
522    virtual HRESULT STDMETHODCALLTYPE getComputedStyle(
523        /* [in] */ IDOMElement *elt,
524        /* [in] */ BSTR pseudoElt,
525        /* [retval][out] */ IDOMCSSStyleDeclaration **result);
526
527    // IDOMDocumentEvent
528    virtual HRESULT STDMETHODCALLTYPE createEvent(
529        /* [in] */ BSTR eventType,
530        /* [retval][out] */ IDOMEvent **result);
531
532    // DOMDocument
533    WebCore::Document* document() { return m_document; }
534
535protected:
536    WebCore::Document* m_document;
537};
538
539class DOMElement : public DOMNode, public IDOMElement, public IDOMElementPrivate, public IDOMNodeExtensions, public IDOMElementCSSInlineStyle, public IDOMElementExtensions
540{
541protected:
542    DOMElement(WebCore::Element* e);
543    ~DOMElement();
544
545public:
546    static IDOMElement* createInstance(WebCore::Element* e);
547
548    // IUnknown
549    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
550    virtual ULONG STDMETHODCALLTYPE AddRef(void) { return DOMNode::AddRef(); }
551    virtual ULONG STDMETHODCALLTYPE Release(void) { return DOMNode::Release(); }
552
553    // IWebScriptObject
554    virtual HRESULT STDMETHODCALLTYPE throwException(
555        /* [in] */ BSTR exceptionMessage,
556        /* [retval][out] */ BOOL *result) { return DOMNode::throwException(exceptionMessage, result); }
557
558    virtual HRESULT STDMETHODCALLTYPE callWebScriptMethod(
559        /* [in] */ BSTR name,
560        /* [size_is][in] */ const VARIANT args[  ],
561        /* [in] */ int cArgs,
562        /* [retval][out] */ VARIANT *result) { return DOMNode::callWebScriptMethod(name, args, cArgs, result); }
563
564    virtual HRESULT STDMETHODCALLTYPE evaluateWebScript(
565        /* [in] */ BSTR script,
566        /* [retval][out] */ VARIANT *result) { return DOMNode::evaluateWebScript(script, result); }
567
568    virtual HRESULT STDMETHODCALLTYPE removeWebScriptKey(
569        /* [in] */ BSTR name) { return DOMNode::removeWebScriptKey(name); }
570
571    virtual HRESULT STDMETHODCALLTYPE stringRepresentation(
572        /* [retval][out] */ BSTR* stringRepresentation) { return DOMNode::stringRepresentation(stringRepresentation); }
573
574    virtual HRESULT STDMETHODCALLTYPE webScriptValueAtIndex(
575        /* [in] */ unsigned int index,
576        /* [retval][out] */ VARIANT *result) { return DOMNode::webScriptValueAtIndex(index, result); }
577
578    virtual HRESULT STDMETHODCALLTYPE setWebScriptValueAtIndex(
579        /* [in] */ unsigned int index,
580        /* [in] */ VARIANT val) { return DOMNode::setWebScriptValueAtIndex(index, val); }
581
582    virtual HRESULT STDMETHODCALLTYPE setException(
583        /* [in] */ BSTR description) { return DOMNode::setException(description); }
584
585    // IDOMNode
586    virtual HRESULT STDMETHODCALLTYPE nodeName(
587        /* [retval][out] */ BSTR *result) { return DOMNode::nodeName(result); }
588
589    virtual HRESULT STDMETHODCALLTYPE nodeValue(
590        /* [retval][out] */ BSTR *result) { return DOMNode::nodeValue(result); }
591
592    virtual HRESULT STDMETHODCALLTYPE setNodeValue(
593        /* [in] */ BSTR value) { return DOMNode::setNodeValue(value); }
594
595    virtual HRESULT STDMETHODCALLTYPE nodeType(
596        /* [retval][out] */ unsigned short *result) { return DOMNode::nodeType(result); }
597
598    virtual HRESULT STDMETHODCALLTYPE parentNode(
599        /* [retval][out] */ IDOMNode **result) { return DOMNode::parentNode(result); }
600
601    virtual HRESULT STDMETHODCALLTYPE childNodes(
602        /* [retval][out] */ IDOMNodeList **result) { return DOMNode::childNodes(result); }
603
604    virtual HRESULT STDMETHODCALLTYPE firstChild(
605        /* [retval][out] */ IDOMNode **result) { return DOMNode::firstChild(result); }
606
607    virtual HRESULT STDMETHODCALLTYPE lastChild(
608        /* [retval][out] */ IDOMNode **result) { return DOMNode::lastChild(result); }
609
610    virtual HRESULT STDMETHODCALLTYPE previousSibling(
611        /* [retval][out] */ IDOMNode **result) { return DOMNode::previousSibling(result); }
612
613    virtual HRESULT STDMETHODCALLTYPE nextSibling(
614        /* [retval][out] */ IDOMNode **result) { return DOMNode::nextSibling(result); }
615
616    virtual HRESULT STDMETHODCALLTYPE attributes(
617        /* [retval][out] */ IDOMNamedNodeMap **result) { return DOMNode::attributes(result); }
618
619    virtual HRESULT STDMETHODCALLTYPE ownerDocument(
620        /* [retval][out] */ IDOMDocument **result) { return DOMNode::ownerDocument(result); }
621
622    virtual HRESULT STDMETHODCALLTYPE insertBefore(
623        /* [in] */ IDOMNode *newChild,
624        /* [in] */ IDOMNode *refChild,
625        /* [retval][out] */ IDOMNode **result) { return DOMNode::insertBefore(newChild, refChild, result); }
626
627    virtual HRESULT STDMETHODCALLTYPE replaceChild(
628        /* [in] */ IDOMNode *newChild,
629        /* [in] */ IDOMNode *oldChild,
630        /* [retval][out] */ IDOMNode **result) { return DOMNode::replaceChild(newChild, oldChild, result); }
631
632    virtual HRESULT STDMETHODCALLTYPE removeChild(
633        /* [in] */ IDOMNode *oldChild,
634        /* [retval][out] */ IDOMNode **result) { return DOMNode::removeChild(oldChild, result); }
635
636    virtual HRESULT STDMETHODCALLTYPE appendChild(
637        /* [in] */ IDOMNode *oldChild,
638        /* [retval][out] */ IDOMNode **result) { return DOMNode::appendChild(oldChild, result); }
639
640    virtual HRESULT STDMETHODCALLTYPE hasChildNodes(
641        /* [retval][out] */ BOOL *result) { return DOMNode::hasChildNodes(result); }
642
643    virtual HRESULT STDMETHODCALLTYPE cloneNode(
644        /* [in] */ BOOL deep,
645        /* [retval][out] */ IDOMNode **result) { return DOMNode::cloneNode(deep, result); }
646
647    virtual HRESULT STDMETHODCALLTYPE normalize( void) { return DOMNode::normalize(); }
648
649    virtual HRESULT STDMETHODCALLTYPE isSupported(
650        /* [in] */ BSTR feature,
651        /* [in] */ BSTR version,
652        /* [retval][out] */ BOOL *result) { return DOMNode::isSupported(feature, version, result); }
653
654    virtual HRESULT STDMETHODCALLTYPE namespaceURI(
655        /* [retval][out] */ BSTR *result) { return DOMNode::namespaceURI(result); }
656
657    virtual HRESULT STDMETHODCALLTYPE prefix(
658        /* [retval][out] */ BSTR *result) { return DOMNode::prefix(result); }
659
660    virtual HRESULT STDMETHODCALLTYPE setPrefix(
661        /* [in] */ BSTR prefix) { return DOMNode::setPrefix(prefix); }
662
663    virtual HRESULT STDMETHODCALLTYPE localName(
664        /* [retval][out] */ BSTR *result) { return DOMNode::localName(result); }
665
666    virtual HRESULT STDMETHODCALLTYPE hasAttributes(
667        /* [retval][out] */ BOOL *result) { return DOMNode::hasAttributes(result); }
668
669    virtual HRESULT STDMETHODCALLTYPE isSameNode(
670        /* [in] */ IDOMNode* other,
671        /* [retval][out] */ BOOL* result) { return DOMNode::isSameNode(other, result); }
672
673    virtual HRESULT STDMETHODCALLTYPE isEqualNode(
674        /* [in] */ IDOMNode* other,
675        /* [retval][out] */ BOOL* result) { return DOMNode::isEqualNode(other, result); }
676
677    virtual HRESULT STDMETHODCALLTYPE textContent(
678        /* [retval][out] */ BSTR* result) { return DOMNode::textContent(result); }
679
680    virtual HRESULT STDMETHODCALLTYPE setTextContent(
681        /* [in] */ BSTR text) { return DOMNode::setTextContent(text); }
682
683    // IDOMElement
684    virtual HRESULT STDMETHODCALLTYPE tagName(
685        /* [retval][out] */ BSTR *result);
686
687    virtual HRESULT STDMETHODCALLTYPE getAttribute(
688        /* [in] */ BSTR name,
689        /* [retval][out] */ BSTR *result);
690
691    virtual HRESULT STDMETHODCALLTYPE setAttribute(
692        /* [in] */ BSTR name,
693        /* [in] */ BSTR value);
694
695    virtual HRESULT STDMETHODCALLTYPE removeAttribute(
696        /* [in] */ BSTR name);
697
698    virtual HRESULT STDMETHODCALLTYPE getAttributeNode(
699        /* [in] */ BSTR name,
700        /* [retval][out] */ IDOMAttr **result);
701
702    virtual HRESULT STDMETHODCALLTYPE setAttributeNode(
703        /* [in] */ IDOMAttr *newAttr,
704        /* [retval][out] */ IDOMAttr **result);
705
706    virtual HRESULT STDMETHODCALLTYPE removeAttributeNode(
707        /* [in] */ IDOMAttr *oldAttr,
708        /* [retval][out] */ IDOMAttr **result);
709
710    virtual HRESULT STDMETHODCALLTYPE getElementsByTagName(
711        /* [in] */ BSTR name,
712        /* [retval][out] */ IDOMNodeList **result);
713
714    virtual HRESULT STDMETHODCALLTYPE getAttributeNS(
715        /* [in] */ BSTR namespaceURI,
716        /* [in] */ BSTR localName,
717        /* [retval][out] */ BSTR *result);
718
719    virtual HRESULT STDMETHODCALLTYPE setAttributeNS(
720        /* [in] */ BSTR namespaceURI,
721        /* [in] */ BSTR qualifiedName,
722        /* [in] */ BSTR value);
723
724    virtual HRESULT STDMETHODCALLTYPE removeAttributeNS(
725        /* [in] */ BSTR namespaceURI,
726        /* [in] */ BSTR localName);
727
728    virtual HRESULT STDMETHODCALLTYPE getAttributeNodeNS(
729        /* [in] */ BSTR namespaceURI,
730        /* [in] */ BSTR localName,
731        /* [retval][out] */ IDOMAttr **result);
732
733    virtual HRESULT STDMETHODCALLTYPE setAttributeNodeNS(
734        /* [in] */ IDOMAttr *newAttr,
735        /* [retval][out] */ IDOMAttr **result);
736
737    virtual HRESULT STDMETHODCALLTYPE getElementsByTagNameNS(
738        /* [in] */ BSTR namespaceURI,
739        /* [in] */ BSTR localName,
740        /* [retval][out] */ IDOMNodeList **result);
741
742    virtual HRESULT STDMETHODCALLTYPE hasAttribute(
743        /* [in] */ BSTR name,
744        /* [retval][out] */ BOOL *result);
745
746    virtual HRESULT STDMETHODCALLTYPE hasAttributeNS(
747        /* [in] */ BSTR namespaceURI,
748        /* [in] */ BSTR localName,
749        /* [retval][out] */ BOOL *result);
750
751    virtual HRESULT STDMETHODCALLTYPE focus( void);
752
753    virtual HRESULT STDMETHODCALLTYPE blur( void);
754
755    // IDOMNodeExtensions
756    virtual HRESULT STDMETHODCALLTYPE boundingBox(
757        /* [retval][out] */ LPRECT rect);
758
759    virtual HRESULT STDMETHODCALLTYPE lineBoxRects(
760        /* [size_is][in] */ RECT* rects,
761        /* [in] */ int cRects);
762
763    // IDOMElementPrivate
764    virtual HRESULT STDMETHODCALLTYPE coreElement(
765        void** element);
766
767    virtual HRESULT STDMETHODCALLTYPE isEqual(
768        /* [in] */ IDOMElement *other,
769        /* [retval][out] */ BOOL *result);
770
771    virtual HRESULT STDMETHODCALLTYPE isFocused(
772        /* [retval][out] */ BOOL *result);
773
774    virtual HRESULT STDMETHODCALLTYPE innerText(
775        /* [retval][out] */ BSTR* result);
776
777    virtual HRESULT STDMETHODCALLTYPE font(
778        WebFontDescription* webFontDescription);
779
780    virtual HRESULT STDMETHODCALLTYPE renderedImage(
781        /* [retval][out] */ HBITMAP* image);
782
783    // IDOMElementCSSInlineStyle
784    virtual HRESULT STDMETHODCALLTYPE style(
785        /* [retval][out] */ IDOMCSSStyleDeclaration **result);
786
787    // IDOMElementExtensions
788    virtual HRESULT STDMETHODCALLTYPE offsetLeft(
789        /* [retval][out] */ int *result);
790
791    virtual HRESULT STDMETHODCALLTYPE offsetTop(
792        /* [retval][out] */ int *result);
793
794    virtual HRESULT STDMETHODCALLTYPE offsetWidth(
795        /* [retval][out] */ int *result);
796
797    virtual HRESULT STDMETHODCALLTYPE offsetHeight(
798        /* [retval][out] */ int *result);
799
800    virtual HRESULT STDMETHODCALLTYPE offsetParent(
801        /* [retval][out] */ IDOMElement **result);
802
803    virtual HRESULT STDMETHODCALLTYPE clientWidth(
804        /* [retval][out] */ int *result);
805
806    virtual HRESULT STDMETHODCALLTYPE clientHeight(
807        /* [retval][out] */ int *result);
808
809    virtual HRESULT STDMETHODCALLTYPE scrollLeft(
810        /* [retval][out] */ int *result);
811
812    virtual HRESULT STDMETHODCALLTYPE setScrollLeft(
813        /* [in] */ int newScrollLeft);
814
815    virtual HRESULT STDMETHODCALLTYPE scrollTop(
816        /* [retval][out] */ int *result);
817
818    virtual HRESULT STDMETHODCALLTYPE setScrollTop(
819        /* [in] */ int newScrollTop);
820
821    virtual HRESULT STDMETHODCALLTYPE scrollWidth(
822        /* [retval][out] */ int *result);
823
824    virtual HRESULT STDMETHODCALLTYPE scrollHeight(
825        /* [retval][out] */ int *result);
826
827    virtual HRESULT STDMETHODCALLTYPE scrollIntoView(
828        /* [in] */ BOOL alignWithTop);
829
830    virtual HRESULT STDMETHODCALLTYPE scrollIntoViewIfNeeded(
831        /* [in] */ BOOL centerIfNeeded);
832
833    // DOMElement
834    WebCore::Element* element() { return m_element; }
835
836protected:
837    WebCore::Element* m_element;
838};
839
840#endif
841