dwmapi: Add a stub for DwmGetTransportAttributes.
[wine] / dlls / mshtml / htmldoc.c
1 /*
2  * Copyright 2005-2009 Jacek Caban for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #include "config.h"
20
21 #include <stdarg.h>
22 #include <stdio.h>
23
24 #define COBJMACROS
25
26 #include "windef.h"
27 #include "winbase.h"
28 #include "winuser.h"
29 #include "ole2.h"
30 #include "perhist.h"
31 #include "mshtmdid.h"
32
33 #include "wine/debug.h"
34
35 #include "mshtml_private.h"
36 #include "htmlevent.h"
37
38 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
39
40 #define HTMLDOC_THIS(iface) DEFINE_THIS(HTMLDocument, HTMLDocument2, iface)
41
42 static HRESULT WINAPI HTMLDocument_QueryInterface(IHTMLDocument2 *iface, REFIID riid, void **ppv)
43 {
44     HTMLDocument *This = HTMLDOC_THIS(iface);
45
46     return htmldoc_query_interface(This, riid, ppv);
47 }
48
49 static ULONG WINAPI HTMLDocument_AddRef(IHTMLDocument2 *iface)
50 {
51     HTMLDocument *This = HTMLDOC_THIS(iface);
52
53     return htmldoc_addref(This);
54 }
55
56 static ULONG WINAPI HTMLDocument_Release(IHTMLDocument2 *iface)
57 {
58     HTMLDocument *This = HTMLDOC_THIS(iface);
59
60     return htmldoc_release(This);
61 }
62
63 static HRESULT WINAPI HTMLDocument_GetTypeInfoCount(IHTMLDocument2 *iface, UINT *pctinfo)
64 {
65     HTMLDocument *This = HTMLDOC_THIS(iface);
66
67     return IDispatchEx_GetTypeInfoCount(DISPATCHEX(This), pctinfo);
68 }
69
70 static HRESULT WINAPI HTMLDocument_GetTypeInfo(IHTMLDocument2 *iface, UINT iTInfo,
71                                                 LCID lcid, ITypeInfo **ppTInfo)
72 {
73     HTMLDocument *This = HTMLDOC_THIS(iface);
74
75     return IDispatchEx_GetTypeInfo(DISPATCHEX(This), iTInfo, lcid, ppTInfo);
76 }
77
78 static HRESULT WINAPI HTMLDocument_GetIDsOfNames(IHTMLDocument2 *iface, REFIID riid,
79                                                 LPOLESTR *rgszNames, UINT cNames,
80                                                 LCID lcid, DISPID *rgDispId)
81 {
82     HTMLDocument *This = HTMLDOC_THIS(iface);
83
84     return IDispatchEx_GetIDsOfNames(DISPATCHEX(This), riid, rgszNames, cNames, lcid, rgDispId);
85 }
86
87 static HRESULT WINAPI HTMLDocument_Invoke(IHTMLDocument2 *iface, DISPID dispIdMember,
88                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
89                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
90 {
91     HTMLDocument *This = HTMLDOC_THIS(iface);
92
93     return IDispatchEx_Invoke(DISPATCHEX(This), dispIdMember, riid, lcid, wFlags, pDispParams,
94             pVarResult, pExcepInfo, puArgErr);
95 }
96
97 static HRESULT WINAPI HTMLDocument_get_Script(IHTMLDocument2 *iface, IDispatch **p)
98 {
99     HTMLDocument *This = HTMLDOC_THIS(iface);
100
101     TRACE("(%p)->(%p)\n", This, p);
102
103     *p = (IDispatch*)HTMLWINDOW2(This->window);
104     IDispatch_AddRef(*p);
105     return S_OK;
106 }
107
108 static HRESULT WINAPI HTMLDocument_get_all(IHTMLDocument2 *iface, IHTMLElementCollection **p)
109 {
110     HTMLDocument *This = HTMLDOC_THIS(iface);
111     nsIDOMElement *nselem = NULL;
112     nsresult nsres;
113
114     TRACE("(%p)->(%p)\n", This, p);
115
116     if(!This->nsdoc) {
117         WARN("NULL nsdoc\n");
118         return E_UNEXPECTED;
119     }
120
121     nsres = nsIDOMHTMLDocument_GetDocumentElement(This->nsdoc, &nselem);
122     if(NS_FAILED(nsres)) {
123         ERR("GetDocumentElement failed: %08x\n", nsres);
124         return E_FAIL;
125     }
126
127     if(nselem) {
128         *p = create_all_collection(get_node(This->doc_node, (nsIDOMNode*)nselem, TRUE), TRUE);
129         nsIDOMElement_Release(nselem);
130     }else {
131         *p = NULL;
132     }
133
134     return S_OK;
135 }
136
137 static HRESULT WINAPI HTMLDocument_get_body(IHTMLDocument2 *iface, IHTMLElement **p)
138 {
139     HTMLDocument *This = HTMLDOC_THIS(iface);
140     nsIDOMHTMLElement *nsbody = NULL;
141     HTMLDOMNode *node;
142     nsresult nsres;
143
144     TRACE("(%p)->(%p)\n", This, p);
145
146     if(!This->nsdoc) {
147         WARN("NULL nsdoc\n");
148         return E_UNEXPECTED;
149     }
150
151     nsres = nsIDOMHTMLDocument_GetBody(This->nsdoc, &nsbody);
152     if(NS_FAILED(nsres)) {
153         TRACE("Could not get body: %08x\n", nsres);
154         return E_UNEXPECTED;
155     }
156
157     if(nsbody) {
158         node = get_node(This->doc_node, (nsIDOMNode*)nsbody, TRUE);
159         nsIDOMHTMLElement_Release(nsbody);
160
161         IHTMLDOMNode_QueryInterface(HTMLDOMNODE(node), &IID_IHTMLElement, (void**)p);
162     }else {
163         *p = NULL;
164     }
165
166     TRACE("*p = %p\n", *p);
167     return S_OK;
168 }
169
170 static HRESULT WINAPI HTMLDocument_get_activeElement(IHTMLDocument2 *iface, IHTMLElement **p)
171 {
172     HTMLDocument *This = HTMLDOC_THIS(iface);
173     FIXME("(%p)->(%p)\n", This, p);
174     return E_NOTIMPL;
175 }
176
177 static HRESULT WINAPI HTMLDocument_get_images(IHTMLDocument2 *iface, IHTMLElementCollection **p)
178 {
179     HTMLDocument *This = HTMLDOC_THIS(iface);
180     nsIDOMHTMLCollection *nscoll = NULL;
181     nsresult nsres;
182
183     TRACE("(%p)->(%p)\n", This, p);
184
185     if(!p)
186         return E_INVALIDARG;
187
188     *p = NULL;
189
190     if(!This->nsdoc) {
191         WARN("NULL nsdoc\n");
192         return E_UNEXPECTED;
193     }
194
195     nsres = nsIDOMHTMLDocument_GetImages(This->nsdoc, &nscoll);
196     if(NS_FAILED(nsres)) {
197         ERR("GetImages failed: %08x\n", nsres);
198         return E_FAIL;
199     }
200
201     if(nscoll) {
202         *p = create_collection_from_htmlcol(This->doc_node, (IUnknown*)HTMLDOC(This), nscoll);
203         nsIDOMElement_Release(nscoll);
204     }
205
206     return S_OK;
207 }
208
209 static HRESULT WINAPI HTMLDocument_get_applets(IHTMLDocument2 *iface, IHTMLElementCollection **p)
210 {
211     HTMLDocument *This = HTMLDOC_THIS(iface);
212     nsIDOMHTMLCollection *nscoll = NULL;
213     nsresult nsres;
214
215     TRACE("(%p)->(%p)\n", This, p);
216
217     if(!p)
218         return E_INVALIDARG;
219
220     *p = NULL;
221
222     if(!This->nsdoc) {
223         WARN("NULL nsdoc\n");
224         return E_UNEXPECTED;
225     }
226
227     nsres = nsIDOMHTMLDocument_GetApplets(This->nsdoc, &nscoll);
228     if(NS_FAILED(nsres)) {
229         ERR("GetApplets failed: %08x\n", nsres);
230         return E_FAIL;
231     }
232
233     if(nscoll) {
234         *p = create_collection_from_htmlcol(This->doc_node, (IUnknown*)HTMLDOC(This), nscoll);
235         nsIDOMElement_Release(nscoll);
236     }
237
238     return S_OK;
239 }
240
241 static HRESULT WINAPI HTMLDocument_get_links(IHTMLDocument2 *iface, IHTMLElementCollection **p)
242 {
243     HTMLDocument *This = HTMLDOC_THIS(iface);
244     nsIDOMHTMLCollection *nscoll = NULL;
245     nsresult nsres;
246
247     TRACE("(%p)->(%p)\n", This, p);
248
249     if(!p)
250         return E_INVALIDARG;
251
252     *p = NULL;
253
254     if(!This->nsdoc) {
255         WARN("NULL nsdoc\n");
256         return E_UNEXPECTED;
257     }
258
259     nsres = nsIDOMHTMLDocument_GetLinks(This->nsdoc, &nscoll);
260     if(NS_FAILED(nsres)) {
261         ERR("GetLinks failed: %08x\n", nsres);
262         return E_FAIL;
263     }
264
265     if(nscoll) {
266         *p = create_collection_from_htmlcol(This->doc_node, (IUnknown*)HTMLDOC(This), nscoll);
267         nsIDOMElement_Release(nscoll);
268     }
269
270     return S_OK;
271 }
272
273 static HRESULT WINAPI HTMLDocument_get_forms(IHTMLDocument2 *iface, IHTMLElementCollection **p)
274 {
275     HTMLDocument *This = HTMLDOC_THIS(iface);
276     nsIDOMHTMLCollection *nscoll = NULL;
277     nsresult nsres;
278
279     TRACE("(%p)->(%p)\n", This, p);
280
281     if(!p)
282         return E_INVALIDARG;
283
284     *p = NULL;
285
286     if(!This->nsdoc) {
287         WARN("NULL nsdoc\n");
288         return E_UNEXPECTED;
289     }
290
291     nsres = nsIDOMHTMLDocument_GetForms(This->nsdoc, &nscoll);
292     if(NS_FAILED(nsres)) {
293         ERR("GetForms failed: %08x\n", nsres);
294         return E_FAIL;
295     }
296
297     if(nscoll) {
298         *p = create_collection_from_htmlcol(This->doc_node, (IUnknown*)HTMLDOC(This), nscoll);
299         nsIDOMElement_Release(nscoll);
300     }
301
302     return S_OK;
303 }
304
305 static HRESULT WINAPI HTMLDocument_get_anchors(IHTMLDocument2 *iface, IHTMLElementCollection **p)
306 {
307     HTMLDocument *This = HTMLDOC_THIS(iface);
308     nsIDOMHTMLCollection *nscoll = NULL;
309     nsresult nsres;
310
311     TRACE("(%p)->(%p)\n", This, p);
312
313     if(!p)
314         return E_INVALIDARG;
315
316     *p = NULL;
317
318     if(!This->nsdoc) {
319         WARN("NULL nsdoc\n");
320         return E_UNEXPECTED;
321     }
322
323     nsres = nsIDOMHTMLDocument_GetAnchors(This->nsdoc, &nscoll);
324     if(NS_FAILED(nsres)) {
325         ERR("GetAnchors failed: %08x\n", nsres);
326         return E_FAIL;
327     }
328
329     if(nscoll) {
330         *p = create_collection_from_htmlcol(This->doc_node, (IUnknown*)HTMLDOC(This), nscoll);
331         nsIDOMElement_Release(nscoll);
332     }
333
334     return S_OK;
335 }
336
337 static HRESULT WINAPI HTMLDocument_put_title(IHTMLDocument2 *iface, BSTR v)
338 {
339     HTMLDocument *This = HTMLDOC_THIS(iface);
340     nsAString nsstr;
341     nsresult nsres;
342
343     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
344
345     if(!This->nsdoc) {
346         WARN("NULL nsdoc\n");
347         return E_UNEXPECTED;
348     }
349
350     nsAString_Init(&nsstr, v);
351     nsres = nsIDOMHTMLDocument_SetTitle(This->nsdoc, &nsstr);
352     nsAString_Finish(&nsstr);
353     if(NS_FAILED(nsres))
354         ERR("SetTitle failed: %08x\n", nsres);
355
356     return S_OK;
357 }
358
359 static HRESULT WINAPI HTMLDocument_get_title(IHTMLDocument2 *iface, BSTR *p)
360 {
361     HTMLDocument *This = HTMLDOC_THIS(iface);
362     const PRUnichar *ret;
363     nsAString nsstr;
364     nsresult nsres;
365
366     TRACE("(%p)->(%p)\n", This, p);
367
368     if(!This->nsdoc) {
369         WARN("NULL nsdoc\n");
370         return E_UNEXPECTED;
371     }
372
373
374     nsAString_Init(&nsstr, NULL);
375     nsres = nsIDOMHTMLDocument_GetTitle(This->nsdoc, &nsstr);
376     if (NS_SUCCEEDED(nsres)) {
377         nsAString_GetData(&nsstr, &ret);
378         *p = SysAllocString(ret);
379     }
380     nsAString_Finish(&nsstr);
381
382     if(NS_FAILED(nsres)) {
383         ERR("GetTitle failed: %08x\n", nsres);
384         return E_FAIL;
385     }
386
387     return S_OK;
388 }
389
390 static HRESULT WINAPI HTMLDocument_get_scripts(IHTMLDocument2 *iface, IHTMLElementCollection **p)
391 {
392     HTMLDocument *This = HTMLDOC_THIS(iface);
393     FIXME("(%p)->(%p)\n", This, p);
394     return E_NOTIMPL;
395 }
396
397 static HRESULT WINAPI HTMLDocument_put_designMode(IHTMLDocument2 *iface, BSTR v)
398 {
399     HTMLDocument *This = HTMLDOC_THIS(iface);
400     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
401     return E_NOTIMPL;
402 }
403
404 static HRESULT WINAPI HTMLDocument_get_designMode(IHTMLDocument2 *iface, BSTR *p)
405 {
406     HTMLDocument *This = HTMLDOC_THIS(iface);
407     static WCHAR szOff[] = {'O','f','f',0};
408     FIXME("(%p)->(%p) always returning Off\n", This, p);
409
410     if(!p)
411         return E_INVALIDARG;
412
413     *p = SysAllocString(szOff);
414
415     return S_OK;
416 }
417
418 static HRESULT WINAPI HTMLDocument_get_selection(IHTMLDocument2 *iface, IHTMLSelectionObject **p)
419 {
420     HTMLDocument *This = HTMLDOC_THIS(iface);
421     nsISelection *nsselection;
422     nsresult nsres;
423
424     TRACE("(%p)->(%p)\n", This, p);
425
426     nsres = nsIDOMWindow_GetSelection(This->window->nswindow, &nsselection);
427     if(NS_FAILED(nsres)) {
428         ERR("GetSelection failed: %08x\n", nsres);
429         return E_FAIL;
430     }
431
432     return HTMLSelectionObject_Create(This->doc_node, nsselection, p);
433 }
434
435 static HRESULT WINAPI HTMLDocument_get_readyState(IHTMLDocument2 *iface, BSTR *p)
436 {
437     HTMLDocument *This = HTMLDOC_THIS(iface);
438
439     static const WCHAR wszUninitialized[] = {'u','n','i','n','i','t','i','a','l','i','z','e','d',0};
440     static const WCHAR wszLoading[] = {'l','o','a','d','i','n','g',0};
441     static const WCHAR wszLoaded[] = {'l','o','a','d','e','d',0};
442     static const WCHAR wszInteractive[] = {'i','n','t','e','r','a','c','t','i','v','e',0};
443     static const WCHAR wszComplete[] = {'c','o','m','p','l','e','t','e',0};
444
445     static const LPCWSTR readystate_str[] = {
446         wszUninitialized,
447         wszLoading,
448         wszLoaded,
449         wszInteractive,
450         wszComplete
451     };
452
453     TRACE("(%p)->(%p)\n", iface, p);
454
455     if(!p)
456         return E_POINTER;
457
458     *p = SysAllocString(readystate_str[This->doc_obj->readystate]);
459     return S_OK;
460 }
461
462 static HRESULT WINAPI HTMLDocument_get_frames(IHTMLDocument2 *iface, IHTMLFramesCollection2 **p)
463 {
464     HTMLDocument *This = HTMLDOC_THIS(iface);
465     FIXME("(%p)->(%p)\n", This, p);
466     return E_NOTIMPL;
467 }
468
469 static HRESULT WINAPI HTMLDocument_get_embeds(IHTMLDocument2 *iface, IHTMLElementCollection **p)
470 {
471     HTMLDocument *This = HTMLDOC_THIS(iface);
472     FIXME("(%p)->(%p)\n", This, p);
473     return E_NOTIMPL;
474 }
475
476 static HRESULT WINAPI HTMLDocument_get_plugins(IHTMLDocument2 *iface, IHTMLElementCollection **p)
477 {
478     HTMLDocument *This = HTMLDOC_THIS(iface);
479     FIXME("(%p)->(%p)\n", This, p);
480     return E_NOTIMPL;
481 }
482
483 static HRESULT WINAPI HTMLDocument_put_alinkColor(IHTMLDocument2 *iface, VARIANT v)
484 {
485     HTMLDocument *This = HTMLDOC_THIS(iface);
486     FIXME("(%p)\n", This);
487     return E_NOTIMPL;
488 }
489
490 static HRESULT WINAPI HTMLDocument_get_alinkColor(IHTMLDocument2 *iface, VARIANT *p)
491 {
492     HTMLDocument *This = HTMLDOC_THIS(iface);
493     FIXME("(%p)->(%p)\n", This, p);
494     return E_NOTIMPL;
495 }
496
497 static HRESULT WINAPI HTMLDocument_put_bgColor(IHTMLDocument2 *iface, VARIANT v)
498 {
499     HTMLDocument *This = HTMLDOC_THIS(iface);
500     FIXME("(%p)\n", This);
501     return E_NOTIMPL;
502 }
503
504 static HRESULT WINAPI HTMLDocument_get_bgColor(IHTMLDocument2 *iface, VARIANT *p)
505 {
506     HTMLDocument *This = HTMLDOC_THIS(iface);
507     FIXME("(%p)->(%p)\n", This, p);
508     return E_NOTIMPL;
509 }
510
511 static HRESULT WINAPI HTMLDocument_put_fgColor(IHTMLDocument2 *iface, VARIANT v)
512 {
513     HTMLDocument *This = HTMLDOC_THIS(iface);
514     FIXME("(%p)\n", This);
515     return E_NOTIMPL;
516 }
517
518 static HRESULT WINAPI HTMLDocument_get_fgColor(IHTMLDocument2 *iface, VARIANT *p)
519 {
520     HTMLDocument *This = HTMLDOC_THIS(iface);
521     FIXME("(%p)->(%p)\n", This, p);
522     return E_NOTIMPL;
523 }
524
525 static HRESULT WINAPI HTMLDocument_put_linkColor(IHTMLDocument2 *iface, VARIANT v)
526 {
527     HTMLDocument *This = HTMLDOC_THIS(iface);
528     FIXME("(%p)->()\n", This);
529     return E_NOTIMPL;
530 }
531
532 static HRESULT WINAPI HTMLDocument_get_linkColor(IHTMLDocument2 *iface, VARIANT *p)
533 {
534     HTMLDocument *This = HTMLDOC_THIS(iface);
535     FIXME("(%p)->(%p)\n", This, p);
536     return E_NOTIMPL;
537 }
538
539 static HRESULT WINAPI HTMLDocument_put_vlinkColor(IHTMLDocument2 *iface, VARIANT v)
540 {
541     HTMLDocument *This = HTMLDOC_THIS(iface);
542     FIXME("(%p)\n", This);
543     return E_NOTIMPL;
544 }
545
546 static HRESULT WINAPI HTMLDocument_get_vlinkColor(IHTMLDocument2 *iface, VARIANT *p)
547 {
548     HTMLDocument *This = HTMLDOC_THIS(iface);
549     FIXME("(%p)->(%p)\n", This, p);
550     return E_NOTIMPL;
551 }
552
553 static HRESULT WINAPI HTMLDocument_get_referrer(IHTMLDocument2 *iface, BSTR *p)
554 {
555     HTMLDocument *This = HTMLDOC_THIS(iface);
556     FIXME("(%p)->(%p)\n", This, p);
557     return E_NOTIMPL;
558 }
559
560 static HRESULT WINAPI HTMLDocument_get_location(IHTMLDocument2 *iface, IHTMLLocation **p)
561 {
562     HTMLDocument *This = HTMLDOC_THIS(iface);
563
564     TRACE("(%p)->(%p)\n", This, p);
565
566     return IHTMLWindow2_get_location(HTMLWINDOW2(This->window), p);
567 }
568
569 static HRESULT WINAPI HTMLDocument_get_lastModified(IHTMLDocument2 *iface, BSTR *p)
570 {
571     HTMLDocument *This = HTMLDOC_THIS(iface);
572     FIXME("(%p)->(%p)\n", This, p);
573     return E_NOTIMPL;
574 }
575
576 static HRESULT WINAPI HTMLDocument_put_URL(IHTMLDocument2 *iface, BSTR v)
577 {
578     HTMLDocument *This = HTMLDOC_THIS(iface);
579     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
580     return E_NOTIMPL;
581 }
582
583 static HRESULT WINAPI HTMLDocument_get_URL(IHTMLDocument2 *iface, BSTR *p)
584 {
585     HTMLDocument *This = HTMLDOC_THIS(iface);
586
587     static const WCHAR about_blank_url[] =
588         {'a','b','o','u','t',':','b','l','a','n','k',0};
589
590     TRACE("(%p)->(%p)\n", iface, p);
591
592     *p = SysAllocString(This->doc_obj->url ? This->doc_obj->url : about_blank_url);
593     return *p ? S_OK : E_OUTOFMEMORY;
594 }
595
596 static HRESULT WINAPI HTMLDocument_put_domain(IHTMLDocument2 *iface, BSTR v)
597 {
598     HTMLDocument *This = HTMLDOC_THIS(iface);
599     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
600     return E_NOTIMPL;
601 }
602
603 static HRESULT WINAPI HTMLDocument_get_domain(IHTMLDocument2 *iface, BSTR *p)
604 {
605     HTMLDocument *This = HTMLDOC_THIS(iface);
606     FIXME("(%p)->(%p)\n", This, p);
607     return E_NOTIMPL;
608 }
609
610 static HRESULT WINAPI HTMLDocument_put_cookie(IHTMLDocument2 *iface, BSTR v)
611 {
612     HTMLDocument *This = HTMLDOC_THIS(iface);
613     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
614     return E_NOTIMPL;
615 }
616
617 static HRESULT WINAPI HTMLDocument_get_cookie(IHTMLDocument2 *iface, BSTR *p)
618 {
619     HTMLDocument *This = HTMLDOC_THIS(iface);
620     FIXME("(%p)->(%p)\n", This, p);
621     return E_NOTIMPL;
622 }
623
624 static HRESULT WINAPI HTMLDocument_put_expando(IHTMLDocument2 *iface, VARIANT_BOOL v)
625 {
626     HTMLDocument *This = HTMLDOC_THIS(iface);
627     FIXME("(%p)->(%x)\n", This, v);
628     return E_NOTIMPL;
629 }
630
631 static HRESULT WINAPI HTMLDocument_get_expando(IHTMLDocument2 *iface, VARIANT_BOOL *p)
632 {
633     HTMLDocument *This = HTMLDOC_THIS(iface);
634     FIXME("(%p)->(%p)\n", This, p);
635     return E_NOTIMPL;
636 }
637
638 static HRESULT WINAPI HTMLDocument_put_charset(IHTMLDocument2 *iface, BSTR v)
639 {
640     HTMLDocument *This = HTMLDOC_THIS(iface);
641     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
642     return E_NOTIMPL;
643 }
644
645 static HRESULT WINAPI HTMLDocument_get_charset(IHTMLDocument2 *iface, BSTR *p)
646 {
647     HTMLDocument *This = HTMLDOC_THIS(iface);
648     FIXME("(%p)->(%p)\n", This, p);
649     return E_NOTIMPL;
650 }
651
652 static HRESULT WINAPI HTMLDocument_put_defaultCharset(IHTMLDocument2 *iface, BSTR v)
653 {
654     HTMLDocument *This = HTMLDOC_THIS(iface);
655     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
656     return E_NOTIMPL;
657 }
658
659 static HRESULT WINAPI HTMLDocument_get_defaultCharset(IHTMLDocument2 *iface, BSTR *p)
660 {
661     HTMLDocument *This = HTMLDOC_THIS(iface);
662     FIXME("(%p)->(%p)\n", This, p);
663     return E_NOTIMPL;
664 }
665
666 static HRESULT WINAPI HTMLDocument_get_mimeType(IHTMLDocument2 *iface, BSTR *p)
667 {
668     HTMLDocument *This = HTMLDOC_THIS(iface);
669     FIXME("(%p)->(%p)\n", This, p);
670     return E_NOTIMPL;
671 }
672
673 static HRESULT WINAPI HTMLDocument_get_fileSize(IHTMLDocument2 *iface, BSTR *p)
674 {
675     HTMLDocument *This = HTMLDOC_THIS(iface);
676     FIXME("(%p)->(%p)\n", This, p);
677     return E_NOTIMPL;
678 }
679
680 static HRESULT WINAPI HTMLDocument_get_fileCreatedDate(IHTMLDocument2 *iface, BSTR *p)
681 {
682     HTMLDocument *This = HTMLDOC_THIS(iface);
683     FIXME("(%p)->(%p)\n", This, p);
684     return E_NOTIMPL;
685 }
686
687 static HRESULT WINAPI HTMLDocument_get_fileModifiedDate(IHTMLDocument2 *iface, BSTR *p)
688 {
689     HTMLDocument *This = HTMLDOC_THIS(iface);
690     FIXME("(%p)->(%p)\n", This, p);
691     return E_NOTIMPL;
692 }
693
694 static HRESULT WINAPI HTMLDocument_get_fileUpdatedDate(IHTMLDocument2 *iface, BSTR *p)
695 {
696     HTMLDocument *This = HTMLDOC_THIS(iface);
697     FIXME("(%p)->(%p)\n", This, p);
698     return E_NOTIMPL;
699 }
700
701 static HRESULT WINAPI HTMLDocument_get_security(IHTMLDocument2 *iface, BSTR *p)
702 {
703     HTMLDocument *This = HTMLDOC_THIS(iface);
704     FIXME("(%p)->(%p)\n", This, p);
705     return E_NOTIMPL;
706 }
707
708 static HRESULT WINAPI HTMLDocument_get_protocol(IHTMLDocument2 *iface, BSTR *p)
709 {
710     HTMLDocument *This = HTMLDOC_THIS(iface);
711     FIXME("(%p)->(%p)\n", This, p);
712     return E_NOTIMPL;
713 }
714
715 static HRESULT WINAPI HTMLDocument_get_nameProp(IHTMLDocument2 *iface, BSTR *p)
716 {
717     HTMLDocument *This = HTMLDOC_THIS(iface);
718     FIXME("(%p)->(%p)\n", This, p);
719     return E_NOTIMPL;
720 }
721
722 static HRESULT document_write(HTMLDocument *This, SAFEARRAY *psarray, BOOL ln)
723 {
724     nsAString nsstr;
725     VARIANT *var;
726     ULONG i, argc;
727     nsresult nsres;
728     HRESULT hres;
729
730     if(!This->nsdoc) {
731         WARN("NULL nsdoc\n");
732         return E_UNEXPECTED;
733     }
734
735     if(psarray->cDims != 1) {
736         FIXME("cDims=%d\n", psarray->cDims);
737         return E_INVALIDARG;
738     }
739
740     hres = SafeArrayAccessData(psarray, (void**)&var);
741     if(FAILED(hres)) {
742         WARN("SafeArrayAccessData failed: %08x\n", hres);
743         return hres;
744     }
745
746     nsAString_Init(&nsstr, NULL);
747
748     argc = psarray->rgsabound[0].cElements;
749     for(i=0; i < argc; i++) {
750         if(V_VT(var+i) == VT_BSTR) {
751             nsAString_SetData(&nsstr, V_BSTR(var+i));
752             if(!ln || i != argc-1)
753                 nsres = nsIDOMHTMLDocument_Write(This->nsdoc, &nsstr);
754             else
755                 nsres = nsIDOMHTMLDocument_Writeln(This->nsdoc, &nsstr);
756             if(NS_FAILED(nsres))
757                 ERR("Write failed: %08x\n", nsres);
758         }else {
759             FIXME("vt=%d\n", V_VT(var+i));
760         }
761     }
762
763     nsAString_Finish(&nsstr);
764     SafeArrayUnaccessData(psarray);
765
766     return S_OK;
767 }
768
769 static HRESULT WINAPI HTMLDocument_write(IHTMLDocument2 *iface, SAFEARRAY *psarray)
770 {
771     HTMLDocument *This = HTMLDOC_THIS(iface);
772
773     TRACE("(%p)->(%p)\n", iface, psarray);
774
775     return document_write(This, psarray, FALSE);
776 }
777
778 static HRESULT WINAPI HTMLDocument_writeln(IHTMLDocument2 *iface, SAFEARRAY *psarray)
779 {
780     HTMLDocument *This = HTMLDOC_THIS(iface);
781
782     TRACE("(%p)->(%p)\n", This, psarray);
783
784     return document_write(This, psarray, TRUE);
785 }
786
787 static HRESULT WINAPI HTMLDocument_open(IHTMLDocument2 *iface, BSTR url, VARIANT name,
788                         VARIANT features, VARIANT replace, IDispatch **pomWindowResult)
789 {
790     HTMLDocument *This = HTMLDOC_THIS(iface);
791     nsresult nsres;
792
793     static const WCHAR text_htmlW[] = {'t','e','x','t','/','h','t','m','l',0};
794
795     TRACE("(%p)->(%s %s %s %s %p)\n", This, debugstr_w(url), debugstr_variant(&name),
796           debugstr_variant(&features), debugstr_variant(&replace), pomWindowResult);
797
798     if(!This->nsdoc) {
799         ERR("!nsdoc\n");
800         return E_NOTIMPL;
801     }
802
803     if(!url || strcmpW(url, text_htmlW) || V_VT(&name) != VT_ERROR
804        || V_VT(&features) != VT_ERROR || V_VT(&replace) != VT_ERROR)
805         FIXME("unsupported args\n");
806
807     nsres = nsIDOMHTMLDocument_Open(This->nsdoc);
808     if(NS_FAILED(nsres)) {
809         ERR("Open failed: %08x\n", nsres);
810         return E_FAIL;
811     }
812
813     *pomWindowResult = (IDispatch*)HTMLWINDOW2(This->window);
814     IHTMLWindow2_AddRef(HTMLWINDOW2(This->window));
815     return S_OK;
816 }
817
818 static HRESULT WINAPI HTMLDocument_close(IHTMLDocument2 *iface)
819 {
820     HTMLDocument *This = HTMLDOC_THIS(iface);
821     nsresult nsres;
822
823     TRACE("(%p)\n", This);
824
825     if(!This->nsdoc) {
826         ERR("!nsdoc\n");
827         return E_NOTIMPL;
828     }
829
830     nsres = nsIDOMHTMLDocument_Close(This->nsdoc);
831     if(NS_FAILED(nsres)) {
832         ERR("Close failed: %08x\n", nsres);
833         return E_FAIL;
834     }
835
836     return S_OK;
837 }
838
839 static HRESULT WINAPI HTMLDocument_clear(IHTMLDocument2 *iface)
840 {
841     HTMLDocument *This = HTMLDOC_THIS(iface);
842     FIXME("(%p)\n", This);
843     return E_NOTIMPL;
844 }
845
846 static HRESULT WINAPI HTMLDocument_queryCommandSupported(IHTMLDocument2 *iface, BSTR cmdID,
847                                                         VARIANT_BOOL *pfRet)
848 {
849     HTMLDocument *This = HTMLDOC_THIS(iface);
850     FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pfRet);
851     return E_NOTIMPL;
852 }
853
854 static HRESULT WINAPI HTMLDocument_queryCommandEnabled(IHTMLDocument2 *iface, BSTR cmdID,
855                                                         VARIANT_BOOL *pfRet)
856 {
857     HTMLDocument *This = HTMLDOC_THIS(iface);
858     FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pfRet);
859     return E_NOTIMPL;
860 }
861
862 static HRESULT WINAPI HTMLDocument_queryCommandState(IHTMLDocument2 *iface, BSTR cmdID,
863                                                         VARIANT_BOOL *pfRet)
864 {
865     HTMLDocument *This = HTMLDOC_THIS(iface);
866     FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pfRet);
867     return E_NOTIMPL;
868 }
869
870 static HRESULT WINAPI HTMLDocument_queryCommandIndeterm(IHTMLDocument2 *iface, BSTR cmdID,
871                                                         VARIANT_BOOL *pfRet)
872 {
873     HTMLDocument *This = HTMLDOC_THIS(iface);
874     FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pfRet);
875     return E_NOTIMPL;
876 }
877
878 static HRESULT WINAPI HTMLDocument_queryCommandText(IHTMLDocument2 *iface, BSTR cmdID,
879                                                         BSTR *pfRet)
880 {
881     HTMLDocument *This = HTMLDOC_THIS(iface);
882     FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pfRet);
883     return E_NOTIMPL;
884 }
885
886 static HRESULT WINAPI HTMLDocument_queryCommandValue(IHTMLDocument2 *iface, BSTR cmdID,
887                                                         VARIANT *pfRet)
888 {
889     HTMLDocument *This = HTMLDOC_THIS(iface);
890     FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pfRet);
891     return E_NOTIMPL;
892 }
893
894 static HRESULT WINAPI HTMLDocument_execCommand(IHTMLDocument2 *iface, BSTR cmdID,
895                                 VARIANT_BOOL showUI, VARIANT value, VARIANT_BOOL *pfRet)
896 {
897     HTMLDocument *This = HTMLDOC_THIS(iface);
898     FIXME("(%p)->(%s %x %p)\n", This, debugstr_w(cmdID), showUI, pfRet);
899     return E_NOTIMPL;
900 }
901
902 static HRESULT WINAPI HTMLDocument_execCommandShowHelp(IHTMLDocument2 *iface, BSTR cmdID,
903                                                         VARIANT_BOOL *pfRet)
904 {
905     HTMLDocument *This = HTMLDOC_THIS(iface);
906     FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pfRet);
907     return E_NOTIMPL;
908 }
909
910 static HRESULT WINAPI HTMLDocument_createElement(IHTMLDocument2 *iface, BSTR eTag,
911                                                  IHTMLElement **newElem)
912 {
913     HTMLDocument *This = HTMLDOC_THIS(iface);
914     nsIDOMElement *nselem;
915     HTMLElement *elem;
916     nsAString tag_str;
917     nsresult nsres;
918
919     TRACE("(%p)->(%s %p)\n", This, debugstr_w(eTag), newElem);
920
921     if(!This->nsdoc) {
922         WARN("NULL nsdoc\n");
923         return E_UNEXPECTED;
924     }
925
926     nsAString_Init(&tag_str, eTag);
927     nsres = nsIDOMDocument_CreateElement(This->nsdoc, &tag_str, &nselem);
928     nsAString_Finish(&tag_str);
929     if(NS_FAILED(nsres)) {
930         ERR("CreateElement failed: %08x\n", nsres);
931         return E_FAIL;
932     }
933
934     elem = HTMLElement_Create(This->doc_node, (nsIDOMNode*)nselem, TRUE);
935     nsIDOMElement_Release(nselem);
936
937     *newElem = HTMLELEM(elem);
938     IHTMLElement_AddRef(HTMLELEM(elem));
939     return S_OK;
940 }
941
942 static HRESULT WINAPI HTMLDocument_put_onhelp(IHTMLDocument2 *iface, VARIANT v)
943 {
944     HTMLDocument *This = HTMLDOC_THIS(iface);
945     FIXME("(%p)\n", This);
946     return E_NOTIMPL;
947 }
948
949 static HRESULT WINAPI HTMLDocument_get_onhelp(IHTMLDocument2 *iface, VARIANT *p)
950 {
951     HTMLDocument *This = HTMLDOC_THIS(iface);
952     FIXME("(%p)->(%p)\n", This, p);
953     return E_NOTIMPL;
954 }
955
956 static HRESULT WINAPI HTMLDocument_put_onclick(IHTMLDocument2 *iface, VARIANT v)
957 {
958     HTMLDocument *This = HTMLDOC_THIS(iface);
959
960     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
961
962     return set_doc_event(This, EVENTID_CLICK, &v);
963 }
964
965 static HRESULT WINAPI HTMLDocument_get_onclick(IHTMLDocument2 *iface, VARIANT *p)
966 {
967     HTMLDocument *This = HTMLDOC_THIS(iface);
968
969     TRACE("(%p)->(%p)\n", This, p);
970
971     return get_doc_event(This, EVENTID_CLICK, p);
972 }
973
974 static HRESULT WINAPI HTMLDocument_put_ondblclick(IHTMLDocument2 *iface, VARIANT v)
975 {
976     HTMLDocument *This = HTMLDOC_THIS(iface);
977     FIXME("(%p)\n", This);
978     return E_NOTIMPL;
979 }
980
981 static HRESULT WINAPI HTMLDocument_get_ondblclick(IHTMLDocument2 *iface, VARIANT *p)
982 {
983     HTMLDocument *This = HTMLDOC_THIS(iface);
984     FIXME("(%p)->(%p)\n", This, p);
985     return E_NOTIMPL;
986 }
987
988 static HRESULT WINAPI HTMLDocument_put_onkeyup(IHTMLDocument2 *iface, VARIANT v)
989 {
990     HTMLDocument *This = HTMLDOC_THIS(iface);
991
992     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
993
994     return set_doc_event(This, EVENTID_KEYUP, &v);
995 }
996
997 static HRESULT WINAPI HTMLDocument_get_onkeyup(IHTMLDocument2 *iface, VARIANT *p)
998 {
999     HTMLDocument *This = HTMLDOC_THIS(iface);
1000
1001     TRACE("(%p)->(%p)\n", This, p);
1002
1003     return get_doc_event(This, EVENTID_KEYUP, p);
1004 }
1005
1006 static HRESULT WINAPI HTMLDocument_put_onkeydown(IHTMLDocument2 *iface, VARIANT v)
1007 {
1008     HTMLDocument *This = HTMLDOC_THIS(iface);
1009
1010     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1011
1012     return set_doc_event(This, EVENTID_KEYDOWN, &v);
1013 }
1014
1015 static HRESULT WINAPI HTMLDocument_get_onkeydown(IHTMLDocument2 *iface, VARIANT *p)
1016 {
1017     HTMLDocument *This = HTMLDOC_THIS(iface);
1018
1019     TRACE("(%p)->(%p)\n", This, p);
1020
1021     return get_doc_event(This, EVENTID_KEYDOWN, p);
1022 }
1023
1024 static HRESULT WINAPI HTMLDocument_put_onkeypress(IHTMLDocument2 *iface, VARIANT v)
1025 {
1026     HTMLDocument *This = HTMLDOC_THIS(iface);
1027     FIXME("(%p)\n", This);
1028     return E_NOTIMPL;
1029 }
1030
1031 static HRESULT WINAPI HTMLDocument_get_onkeypress(IHTMLDocument2 *iface, VARIANT *p)
1032 {
1033     HTMLDocument *This = HTMLDOC_THIS(iface);
1034     FIXME("(%p)->(%p)\n", This, p);
1035     return E_NOTIMPL;
1036 }
1037
1038 static HRESULT WINAPI HTMLDocument_put_onmouseup(IHTMLDocument2 *iface, VARIANT v)
1039 {
1040     HTMLDocument *This = HTMLDOC_THIS(iface);
1041     FIXME("(%p)\n", This);
1042     return E_NOTIMPL;
1043 }
1044
1045 static HRESULT WINAPI HTMLDocument_get_onmouseup(IHTMLDocument2 *iface, VARIANT *p)
1046 {
1047     HTMLDocument *This = HTMLDOC_THIS(iface);
1048     FIXME("(%p)->(%p)\n", This, p);
1049     return E_NOTIMPL;
1050 }
1051
1052 static HRESULT WINAPI HTMLDocument_put_onmousedown(IHTMLDocument2 *iface, VARIANT v)
1053 {
1054     HTMLDocument *This = HTMLDOC_THIS(iface);
1055     FIXME("(%p)\n", This);
1056     return E_NOTIMPL;
1057 }
1058
1059 static HRESULT WINAPI HTMLDocument_get_onmousedown(IHTMLDocument2 *iface, VARIANT *p)
1060 {
1061     HTMLDocument *This = HTMLDOC_THIS(iface);
1062     FIXME("(%p)->(%p)\n", This, p);
1063     return E_NOTIMPL;
1064 }
1065
1066 static HRESULT WINAPI HTMLDocument_put_onmousemove(IHTMLDocument2 *iface, VARIANT v)
1067 {
1068     HTMLDocument *This = HTMLDOC_THIS(iface);
1069     FIXME("(%p)\n", This);
1070     return E_NOTIMPL;
1071 }
1072
1073 static HRESULT WINAPI HTMLDocument_get_onmousemove(IHTMLDocument2 *iface, VARIANT *p)
1074 {
1075     HTMLDocument *This = HTMLDOC_THIS(iface);
1076     FIXME("(%p)->(%p)\n", This, p);
1077     return E_NOTIMPL;
1078 }
1079
1080 static HRESULT WINAPI HTMLDocument_put_onmouseout(IHTMLDocument2 *iface, VARIANT v)
1081 {
1082     HTMLDocument *This = HTMLDOC_THIS(iface);
1083     FIXME("(%p)\n", This);
1084     return E_NOTIMPL;
1085 }
1086
1087 static HRESULT WINAPI HTMLDocument_get_onmouseout(IHTMLDocument2 *iface, VARIANT *p)
1088 {
1089     HTMLDocument *This = HTMLDOC_THIS(iface);
1090     FIXME("(%p)->(%p)\n", This, p);
1091     return E_NOTIMPL;
1092 }
1093
1094 static HRESULT WINAPI HTMLDocument_put_onmouseover(IHTMLDocument2 *iface, VARIANT v)
1095 {
1096     HTMLDocument *This = HTMLDOC_THIS(iface);
1097
1098     TRACE("(%p)\n", This);
1099
1100     return set_doc_event(This, EVENTID_MOUSEOVER, &v);
1101 }
1102
1103 static HRESULT WINAPI HTMLDocument_get_onmouseover(IHTMLDocument2 *iface, VARIANT *p)
1104 {
1105     HTMLDocument *This = HTMLDOC_THIS(iface);
1106
1107     TRACE("(%p)->(%p)\n", This, p);
1108
1109     return get_doc_event(This, EVENTID_MOUSEOVER, p);
1110 }
1111
1112 static HRESULT WINAPI HTMLDocument_put_onreadystatechange(IHTMLDocument2 *iface, VARIANT v)
1113 {
1114     HTMLDocument *This = HTMLDOC_THIS(iface);
1115     FIXME("(%p)\n", This);
1116     return E_NOTIMPL;
1117 }
1118
1119 static HRESULT WINAPI HTMLDocument_get_onreadystatechange(IHTMLDocument2 *iface, VARIANT *p)
1120 {
1121     HTMLDocument *This = HTMLDOC_THIS(iface);
1122     FIXME("(%p)->(%p)\n", This, p);
1123     return E_NOTIMPL;
1124 }
1125
1126 static HRESULT WINAPI HTMLDocument_put_onafterupdate(IHTMLDocument2 *iface, VARIANT v)
1127 {
1128     HTMLDocument *This = HTMLDOC_THIS(iface);
1129     FIXME("(%p)\n", This);
1130     return E_NOTIMPL;
1131 }
1132
1133 static HRESULT WINAPI HTMLDocument_get_onafterupdate(IHTMLDocument2 *iface, VARIANT *p)
1134 {
1135     HTMLDocument *This = HTMLDOC_THIS(iface);
1136     FIXME("(%p)->(%p)\n", This, p);
1137     return E_NOTIMPL;
1138 }
1139
1140 static HRESULT WINAPI HTMLDocument_put_onrowexit(IHTMLDocument2 *iface, VARIANT v)
1141 {
1142     HTMLDocument *This = HTMLDOC_THIS(iface);
1143     FIXME("(%p)\n", This);
1144     return E_NOTIMPL;
1145 }
1146
1147 static HRESULT WINAPI HTMLDocument_get_onrowexit(IHTMLDocument2 *iface, VARIANT *p)
1148 {
1149     HTMLDocument *This = HTMLDOC_THIS(iface);
1150     FIXME("(%p)->(%p)\n", This, p);
1151     return E_NOTIMPL;
1152 }
1153
1154 static HRESULT WINAPI HTMLDocument_put_onrowenter(IHTMLDocument2 *iface, VARIANT v)
1155 {
1156     HTMLDocument *This = HTMLDOC_THIS(iface);
1157     FIXME("(%p)\n", This);
1158     return E_NOTIMPL;
1159 }
1160
1161 static HRESULT WINAPI HTMLDocument_get_onrowenter(IHTMLDocument2 *iface, VARIANT *p)
1162 {
1163     HTMLDocument *This = HTMLDOC_THIS(iface);
1164     FIXME("(%p)->(%p)\n", This, p);
1165     return E_NOTIMPL;
1166 }
1167
1168 static HRESULT WINAPI HTMLDocument_put_ondragstart(IHTMLDocument2 *iface, VARIANT v)
1169 {
1170     HTMLDocument *This = HTMLDOC_THIS(iface);
1171
1172     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1173
1174     return set_doc_event(This, EVENTID_DRAGSTART, &v);
1175 }
1176
1177 static HRESULT WINAPI HTMLDocument_get_ondragstart(IHTMLDocument2 *iface, VARIANT *p)
1178 {
1179     HTMLDocument *This = HTMLDOC_THIS(iface);
1180
1181     TRACE("(%p)->(%p)\n", This, p);
1182
1183     return get_doc_event(This, EVENTID_DRAGSTART, p);
1184 }
1185
1186 static HRESULT WINAPI HTMLDocument_put_onselectstart(IHTMLDocument2 *iface, VARIANT v)
1187 {
1188     HTMLDocument *This = HTMLDOC_THIS(iface);
1189
1190     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1191
1192     return set_doc_event(This, EVENTID_SELECTSTART, &v);
1193 }
1194
1195 static HRESULT WINAPI HTMLDocument_get_onselectstart(IHTMLDocument2 *iface, VARIANT *p)
1196 {
1197     HTMLDocument *This = HTMLDOC_THIS(iface);
1198
1199     TRACE("(%p)->(%p)\n", This, p);
1200
1201     return get_doc_event(This, EVENTID_SELECTSTART, p);
1202 }
1203
1204 static HRESULT WINAPI HTMLDocument_elementFromPoint(IHTMLDocument2 *iface, LONG x, LONG y,
1205                                                         IHTMLElement **elementHit)
1206 {
1207     HTMLDocument *This = HTMLDOC_THIS(iface);
1208     FIXME("(%p)->(%d %d %p)\n", This, x, y, elementHit);
1209     return E_NOTIMPL;
1210 }
1211
1212 static HRESULT WINAPI HTMLDocument_get_parentWindow(IHTMLDocument2 *iface, IHTMLWindow2 **p)
1213 {
1214     HTMLDocument *This = HTMLDOC_THIS(iface);
1215
1216     TRACE("(%p)->(%p)\n", This, p);
1217
1218     *p = HTMLWINDOW2(This->window);
1219     IHTMLWindow2_AddRef(*p);
1220     return S_OK;
1221 }
1222
1223 static HRESULT WINAPI HTMLDocument_get_styleSheets(IHTMLDocument2 *iface,
1224                                                    IHTMLStyleSheetsCollection **p)
1225 {
1226     HTMLDocument *This = HTMLDOC_THIS(iface);
1227     nsIDOMStyleSheetList *nsstylelist;
1228     nsIDOMDocumentStyle *nsdocstyle;
1229     nsresult nsres;
1230
1231     TRACE("(%p)->(%p)\n", This, p);
1232
1233     *p = NULL;
1234
1235     if(!This->nsdoc) {
1236         WARN("NULL nsdoc\n");
1237         return E_UNEXPECTED;
1238     }
1239
1240     nsIDOMHTMLDocument_QueryInterface(This->nsdoc, &IID_nsIDOMDocumentStyle, (void**)&nsdocstyle);
1241     nsres = nsIDOMDocumentStyle_GetStyleSheets(nsdocstyle, &nsstylelist);
1242     nsIDOMDocumentStyle_Release(nsdocstyle);
1243     if(NS_FAILED(nsres)) {
1244         ERR("GetStyleSheets failed: %08x\n", nsres);
1245         return E_FAIL;
1246     }
1247
1248     *p = HTMLStyleSheetsCollection_Create(nsstylelist);
1249     nsIDOMDocumentStyle_Release(nsstylelist);
1250
1251     return S_OK;
1252 }
1253
1254 static HRESULT WINAPI HTMLDocument_put_onbeforeupdate(IHTMLDocument2 *iface, VARIANT v)
1255 {
1256     HTMLDocument *This = HTMLDOC_THIS(iface);
1257     FIXME("(%p)\n", This);
1258     return E_NOTIMPL;
1259 }
1260
1261 static HRESULT WINAPI HTMLDocument_get_onbeforeupdate(IHTMLDocument2 *iface, VARIANT *p)
1262 {
1263     HTMLDocument *This = HTMLDOC_THIS(iface);
1264     FIXME("(%p)->(%p)\n", This, p);
1265     return E_NOTIMPL;
1266 }
1267
1268 static HRESULT WINAPI HTMLDocument_put_onerrorupdate(IHTMLDocument2 *iface, VARIANT v)
1269 {
1270     HTMLDocument *This = HTMLDOC_THIS(iface);
1271     FIXME("(%p)\n", This);
1272     return E_NOTIMPL;
1273 }
1274
1275 static HRESULT WINAPI HTMLDocument_get_onerrorupdate(IHTMLDocument2 *iface, VARIANT *p)
1276 {
1277     HTMLDocument *This = HTMLDOC_THIS(iface);
1278     FIXME("(%p)->(%p)\n", This, p);
1279     return E_NOTIMPL;
1280 }
1281
1282 static HRESULT WINAPI HTMLDocument_toString(IHTMLDocument2 *iface, BSTR *String)
1283 {
1284     HTMLDocument *This = HTMLDOC_THIS(iface);
1285     FIXME("(%p)->(%p)\n", This, String);
1286     return E_NOTIMPL;
1287 }
1288
1289 static HRESULT WINAPI HTMLDocument_createStyleSheet(IHTMLDocument2 *iface, BSTR bstrHref,
1290                                             LONG lIndex, IHTMLStyleSheet **ppnewStyleSheet)
1291 {
1292     HTMLDocument *This = HTMLDOC_THIS(iface);
1293
1294     FIXME("(%p)->(%s %d %p) semi-stub\n", This, debugstr_w(bstrHref), lIndex, ppnewStyleSheet);
1295
1296     *ppnewStyleSheet = HTMLStyleSheet_Create(NULL);
1297     return S_OK;
1298 }
1299
1300 static const IHTMLDocument2Vtbl HTMLDocumentVtbl = {
1301     HTMLDocument_QueryInterface,
1302     HTMLDocument_AddRef,
1303     HTMLDocument_Release,
1304     HTMLDocument_GetTypeInfoCount,
1305     HTMLDocument_GetTypeInfo,
1306     HTMLDocument_GetIDsOfNames,
1307     HTMLDocument_Invoke,
1308     HTMLDocument_get_Script,
1309     HTMLDocument_get_all,
1310     HTMLDocument_get_body,
1311     HTMLDocument_get_activeElement,
1312     HTMLDocument_get_images,
1313     HTMLDocument_get_applets,
1314     HTMLDocument_get_links,
1315     HTMLDocument_get_forms,
1316     HTMLDocument_get_anchors,
1317     HTMLDocument_put_title,
1318     HTMLDocument_get_title,
1319     HTMLDocument_get_scripts,
1320     HTMLDocument_put_designMode,
1321     HTMLDocument_get_designMode,
1322     HTMLDocument_get_selection,
1323     HTMLDocument_get_readyState,
1324     HTMLDocument_get_frames,
1325     HTMLDocument_get_embeds,
1326     HTMLDocument_get_plugins,
1327     HTMLDocument_put_alinkColor,
1328     HTMLDocument_get_alinkColor,
1329     HTMLDocument_put_bgColor,
1330     HTMLDocument_get_bgColor,
1331     HTMLDocument_put_fgColor,
1332     HTMLDocument_get_fgColor,
1333     HTMLDocument_put_linkColor,
1334     HTMLDocument_get_linkColor,
1335     HTMLDocument_put_vlinkColor,
1336     HTMLDocument_get_vlinkColor,
1337     HTMLDocument_get_referrer,
1338     HTMLDocument_get_location,
1339     HTMLDocument_get_lastModified,
1340     HTMLDocument_put_URL,
1341     HTMLDocument_get_URL,
1342     HTMLDocument_put_domain,
1343     HTMLDocument_get_domain,
1344     HTMLDocument_put_cookie,
1345     HTMLDocument_get_cookie,
1346     HTMLDocument_put_expando,
1347     HTMLDocument_get_expando,
1348     HTMLDocument_put_charset,
1349     HTMLDocument_get_charset,
1350     HTMLDocument_put_defaultCharset,
1351     HTMLDocument_get_defaultCharset,
1352     HTMLDocument_get_mimeType,
1353     HTMLDocument_get_fileSize,
1354     HTMLDocument_get_fileCreatedDate,
1355     HTMLDocument_get_fileModifiedDate,
1356     HTMLDocument_get_fileUpdatedDate,
1357     HTMLDocument_get_security,
1358     HTMLDocument_get_protocol,
1359     HTMLDocument_get_nameProp,
1360     HTMLDocument_write,
1361     HTMLDocument_writeln,
1362     HTMLDocument_open,
1363     HTMLDocument_close,
1364     HTMLDocument_clear,
1365     HTMLDocument_queryCommandSupported,
1366     HTMLDocument_queryCommandEnabled,
1367     HTMLDocument_queryCommandState,
1368     HTMLDocument_queryCommandIndeterm,
1369     HTMLDocument_queryCommandText,
1370     HTMLDocument_queryCommandValue,
1371     HTMLDocument_execCommand,
1372     HTMLDocument_execCommandShowHelp,
1373     HTMLDocument_createElement,
1374     HTMLDocument_put_onhelp,
1375     HTMLDocument_get_onhelp,
1376     HTMLDocument_put_onclick,
1377     HTMLDocument_get_onclick,
1378     HTMLDocument_put_ondblclick,
1379     HTMLDocument_get_ondblclick,
1380     HTMLDocument_put_onkeyup,
1381     HTMLDocument_get_onkeyup,
1382     HTMLDocument_put_onkeydown,
1383     HTMLDocument_get_onkeydown,
1384     HTMLDocument_put_onkeypress,
1385     HTMLDocument_get_onkeypress,
1386     HTMLDocument_put_onmouseup,
1387     HTMLDocument_get_onmouseup,
1388     HTMLDocument_put_onmousedown,
1389     HTMLDocument_get_onmousedown,
1390     HTMLDocument_put_onmousemove,
1391     HTMLDocument_get_onmousemove,
1392     HTMLDocument_put_onmouseout,
1393     HTMLDocument_get_onmouseout,
1394     HTMLDocument_put_onmouseover,
1395     HTMLDocument_get_onmouseover,
1396     HTMLDocument_put_onreadystatechange,
1397     HTMLDocument_get_onreadystatechange,
1398     HTMLDocument_put_onafterupdate,
1399     HTMLDocument_get_onafterupdate,
1400     HTMLDocument_put_onrowexit,
1401     HTMLDocument_get_onrowexit,
1402     HTMLDocument_put_onrowenter,
1403     HTMLDocument_get_onrowenter,
1404     HTMLDocument_put_ondragstart,
1405     HTMLDocument_get_ondragstart,
1406     HTMLDocument_put_onselectstart,
1407     HTMLDocument_get_onselectstart,
1408     HTMLDocument_elementFromPoint,
1409     HTMLDocument_get_parentWindow,
1410     HTMLDocument_get_styleSheets,
1411     HTMLDocument_put_onbeforeupdate,
1412     HTMLDocument_get_onbeforeupdate,
1413     HTMLDocument_put_onerrorupdate,
1414     HTMLDocument_get_onerrorupdate,
1415     HTMLDocument_toString,
1416     HTMLDocument_createStyleSheet
1417 };
1418
1419 #define SUPPINFO_THIS(iface) DEFINE_THIS(HTMLDocument, SupportErrorInfo, iface)
1420
1421 static HRESULT WINAPI SupportErrorInfo_QueryInterface(ISupportErrorInfo *iface, REFIID riid, void **ppv)
1422 {
1423     HTMLDocument *This = SUPPINFO_THIS(iface);
1424     return IHTMLDocument_QueryInterface(HTMLDOC(This), riid, ppv);
1425 }
1426
1427 static ULONG WINAPI SupportErrorInfo_AddRef(ISupportErrorInfo *iface)
1428 {
1429     HTMLDocument *This = SUPPINFO_THIS(iface);
1430     return IHTMLDocument_AddRef(HTMLDOC(This));
1431 }
1432
1433 static ULONG WINAPI SupportErrorInfo_Release(ISupportErrorInfo *iface)
1434 {
1435     HTMLDocument *This = SUPPINFO_THIS(iface);
1436     return IHTMLDocument_Release(HTMLDOC(This));
1437 }
1438
1439 static HRESULT WINAPI SupportErrorInfo_InterfaceSupportsErrorInfo(ISupportErrorInfo *iface, REFIID riid)
1440 {
1441     FIXME("(%p)->(%s)\n", iface, debugstr_guid(riid));
1442     return S_FALSE;
1443 }
1444
1445 static const ISupportErrorInfoVtbl SupportErrorInfoVtbl = {
1446     SupportErrorInfo_QueryInterface,
1447     SupportErrorInfo_AddRef,
1448     SupportErrorInfo_Release,
1449     SupportErrorInfo_InterfaceSupportsErrorInfo
1450 };
1451
1452 #define DISPEX_THIS(iface) DEFINE_THIS(HTMLDocument, IDispatchEx, iface)
1453
1454 static HRESULT WINAPI DocDispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
1455 {
1456     HTMLDocument *This = DISPEX_THIS(iface);
1457
1458     return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppv);
1459 }
1460
1461 static ULONG WINAPI DocDispatchEx_AddRef(IDispatchEx *iface)
1462 {
1463     HTMLDocument *This = DISPEX_THIS(iface);
1464
1465     return IHTMLDocument2_AddRef(HTMLDOC(This));
1466 }
1467
1468 static ULONG WINAPI DocDispatchEx_Release(IDispatchEx *iface)
1469 {
1470     HTMLDocument *This = DISPEX_THIS(iface);
1471
1472     return IHTMLDocument2_Release(HTMLDOC(This));
1473 }
1474
1475 static HRESULT WINAPI DocDispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
1476 {
1477     HTMLDocument *This = DISPEX_THIS(iface);
1478
1479     return IDispatchEx_GetTypeInfoCount(This->dispex, pctinfo);
1480 }
1481
1482 static HRESULT WINAPI DocDispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
1483                                                LCID lcid, ITypeInfo **ppTInfo)
1484 {
1485     HTMLDocument *This = DISPEX_THIS(iface);
1486
1487     return IDispatchEx_GetTypeInfo(This->dispex, iTInfo, lcid, ppTInfo);
1488 }
1489
1490 static HRESULT WINAPI DocDispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
1491                                                  LPOLESTR *rgszNames, UINT cNames,
1492                                                  LCID lcid, DISPID *rgDispId)
1493 {
1494     HTMLDocument *This = DISPEX_THIS(iface);
1495
1496     return IDispatchEx_GetIDsOfNames(This->dispex, riid, rgszNames, cNames, lcid, rgDispId);
1497 }
1498
1499 static HRESULT WINAPI DocDispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
1500                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1501                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1502 {
1503     HTMLDocument *This = DISPEX_THIS(iface);
1504
1505     TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
1506           lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
1507
1508     switch(dispIdMember) {
1509     case DISPID_READYSTATE:
1510         TRACE("DISPID_READYSTATE\n");
1511
1512         if(!(wFlags & DISPATCH_PROPERTYGET))
1513             return E_INVALIDARG;
1514
1515         V_VT(pVarResult) = VT_I4;
1516         V_I4(pVarResult) = This->doc_obj->readystate;
1517         return S_OK;
1518     }
1519
1520     return IDispatchEx_Invoke(This->dispex, dispIdMember, riid, lcid, wFlags, pDispParams,
1521                               pVarResult, pExcepInfo, puArgErr);
1522 }
1523
1524 static HRESULT WINAPI DocDispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
1525 {
1526     HTMLDocument *This = DISPEX_THIS(iface);
1527
1528     return IDispatchEx_GetDispID(This->dispex, bstrName, grfdex, pid);
1529 }
1530
1531 static HRESULT WINAPI DocDispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1532         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1533 {
1534     HTMLDocument *This = DISPEX_THIS(iface);
1535
1536     return IDispatchEx_InvokeEx(This->dispex, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
1537 }
1538
1539 static HRESULT WINAPI DocDispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
1540 {
1541     HTMLDocument *This = DISPEX_THIS(iface);
1542
1543     return IDispatchEx_DeleteMemberByName(This->dispex, bstrName, grfdex);
1544 }
1545
1546 static HRESULT WINAPI DocDispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
1547 {
1548     HTMLDocument *This = DISPEX_THIS(iface);
1549
1550     return IDispatchEx_DeleteMemberByDispID(This->dispex, id);
1551 }
1552
1553 static HRESULT WINAPI DocDispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
1554 {
1555     HTMLDocument *This = DISPEX_THIS(iface);
1556
1557     return IDispatchEx_GetMemberProperties(This->dispex, id, grfdexFetch, pgrfdex);
1558 }
1559
1560 static HRESULT WINAPI DocDispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
1561 {
1562     HTMLDocument *This = DISPEX_THIS(iface);
1563
1564     return IDispatchEx_GetMemberName(This->dispex, id, pbstrName);
1565 }
1566
1567 static HRESULT WINAPI DocDispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
1568 {
1569     HTMLDocument *This = DISPEX_THIS(iface);
1570
1571     return IDispatchEx_GetNextDispID(This->dispex, grfdex, id, pid);
1572 }
1573
1574 static HRESULT WINAPI DocDispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
1575 {
1576     HTMLDocument *This = DISPEX_THIS(iface);
1577
1578     return IDispatchEx_GetNameSpaceParent(This->dispex, ppunk);
1579 }
1580
1581 #undef DISPEX_THIS
1582
1583 static const IDispatchExVtbl DocDispatchExVtbl = {
1584     DocDispatchEx_QueryInterface,
1585     DocDispatchEx_AddRef,
1586     DocDispatchEx_Release,
1587     DocDispatchEx_GetTypeInfoCount,
1588     DocDispatchEx_GetTypeInfo,
1589     DocDispatchEx_GetIDsOfNames,
1590     DocDispatchEx_Invoke,
1591     DocDispatchEx_GetDispID,
1592     DocDispatchEx_InvokeEx,
1593     DocDispatchEx_DeleteMemberByName,
1594     DocDispatchEx_DeleteMemberByDispID,
1595     DocDispatchEx_GetMemberProperties,
1596     DocDispatchEx_GetMemberName,
1597     DocDispatchEx_GetNextDispID,
1598     DocDispatchEx_GetNameSpaceParent
1599 };
1600
1601 static BOOL htmldoc_qi(HTMLDocument *This, REFIID riid, void **ppv)
1602 {
1603     *ppv = NULL;
1604
1605     if(IsEqualGUID(&IID_IUnknown, riid)) {
1606         TRACE("(%p)->(IID_IUnknown, %p)\n", This, ppv);
1607         *ppv = HTMLDOC(This);
1608     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
1609         TRACE("(%p)->(IID_IDispatch, %p)\n", This, ppv);
1610         *ppv = DISPATCHEX(This);
1611     }else if(IsEqualGUID(&IID_IDispatchEx, riid)) {
1612         TRACE("(%p)->(IID_IDispatchEx, %p)\n", This, ppv);
1613         *ppv = DISPATCHEX(This);
1614     }else if(IsEqualGUID(&IID_IHTMLDocument, riid)) {
1615         TRACE("(%p)->(IID_IHTMLDocument, %p)\n", This, ppv);
1616         *ppv = HTMLDOC(This);
1617     }else if(IsEqualGUID(&IID_IHTMLDocument2, riid)) {
1618         TRACE("(%p)->(IID_IHTMLDocument2, %p)\n", This, ppv);
1619         *ppv = HTMLDOC(This);
1620     }else if(IsEqualGUID(&IID_IHTMLDocument3, riid)) {
1621         TRACE("(%p)->(IID_IHTMLDocument3, %p)\n", This, ppv);
1622         *ppv = HTMLDOC3(This);
1623     }else if(IsEqualGUID(&IID_IHTMLDocument4, riid)) {
1624         TRACE("(%p)->(IID_IHTMLDocument4, %p)\n", This, ppv);
1625         *ppv = HTMLDOC4(This);
1626     }else if(IsEqualGUID(&IID_IHTMLDocument5, riid)) {
1627         TRACE("(%p)->(IID_IHTMLDocument5, %p)\n", This, ppv);
1628         *ppv = HTMLDOC5(This);
1629     }else if(IsEqualGUID(&IID_IPersist, riid)) {
1630         TRACE("(%p)->(IID_IPersist, %p)\n", This, ppv);
1631         *ppv = PERSIST(This);
1632     }else if(IsEqualGUID(&IID_IPersistMoniker, riid)) {
1633         TRACE("(%p)->(IID_IPersistMoniker, %p)\n", This, ppv);
1634         *ppv = PERSISTMON(This);
1635     }else if(IsEqualGUID(&IID_IPersistFile, riid)) {
1636         TRACE("(%p)->(IID_IPersistFile, %p)\n", This, ppv);
1637         *ppv = PERSISTFILE(This);
1638     }else if(IsEqualGUID(&IID_IMonikerProp, riid)) {
1639         TRACE("(%p)->(IID_IMonikerProp, %p)\n", This, ppv);
1640         *ppv = MONPROP(This);
1641     }else if(IsEqualGUID(&IID_IOleObject, riid)) {
1642         TRACE("(%p)->(IID_IOleObject, %p)\n", This, ppv);
1643         *ppv = OLEOBJ(This);
1644     }else if(IsEqualGUID(&IID_IOleDocument, riid)) {
1645         TRACE("(%p)->(IID_IOleDocument, %p)\n", This, ppv);
1646         *ppv = OLEDOC(This);
1647     }else if(IsEqualGUID(&IID_IOleDocumentView, riid)) {
1648         TRACE("(%p)->(IID_IOleDocumentView, %p)\n", This, ppv);
1649         *ppv = DOCVIEW(This);
1650     }else if(IsEqualGUID(&IID_IOleInPlaceActiveObject, riid)) {
1651         TRACE("(%p)->(IID_IOleInPlaceActiveObject, %p)\n", This, ppv);
1652         *ppv = ACTOBJ(This);
1653     }else if(IsEqualGUID(&IID_IViewObject, riid)) {
1654         TRACE("(%p)->(IID_IViewObject, %p)\n", This, ppv);
1655         *ppv = VIEWOBJ(This);
1656     }else if(IsEqualGUID(&IID_IViewObject2, riid)) {
1657         TRACE("(%p)->(IID_IViewObject2, %p)\n", This, ppv);
1658         *ppv = VIEWOBJ2(This);
1659     }else if(IsEqualGUID(&IID_IOleWindow, riid)) {
1660         TRACE("(%p)->(IID_IOleWindow, %p)\n", This, ppv);
1661         *ppv = OLEWIN(This);
1662     }else if(IsEqualGUID(&IID_IOleInPlaceObject, riid)) {
1663         TRACE("(%p)->(IID_IOleInPlaceObject, %p)\n", This, ppv);
1664         *ppv = INPLACEOBJ(This);
1665     }else if(IsEqualGUID(&IID_IOleInPlaceObjectWindowless, riid)) {
1666         TRACE("(%p)->(IID_IOleInPlaceObjectWindowless, %p)\n", This, ppv);
1667         *ppv = INPLACEWIN(This);
1668     }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
1669         TRACE("(%p)->(IID_IServiceProvider, %p)\n", This, ppv);
1670         *ppv = SERVPROV(This);
1671     }else if(IsEqualGUID(&IID_IOleCommandTarget, riid)) {
1672         TRACE("(%p)->(IID_IOleCommandTarget, %p)\n", This, ppv);
1673         *ppv = CMDTARGET(This);
1674     }else if(IsEqualGUID(&IID_IOleControl, riid)) {
1675         TRACE("(%p)->(IID_IOleControl, %p)\n", This, ppv);
1676         *ppv = CONTROL(This);
1677     }else if(IsEqualGUID(&IID_IHlinkTarget, riid)) {
1678         TRACE("(%p)->(IID_IHlinkTarget, %p)\n", This, ppv);
1679         *ppv = HLNKTARGET(This);
1680     }else if(IsEqualGUID(&IID_IConnectionPointContainer, riid)) {
1681         TRACE("(%p)->(IID_IConnectionPointContainer %p)\n", This, ppv);
1682         *ppv = CONPTCONT(&This->cp_container);
1683     }else if(IsEqualGUID(&IID_IPersistStreamInit, riid)) {
1684         TRACE("(%p)->(IID_IPersistStreamInit %p)\n", This, ppv);
1685         *ppv = PERSTRINIT(This);
1686     }else if(IsEqualGUID(&DIID_DispHTMLDocument, riid)) {
1687         TRACE("(%p)->(DIID_DispHTMLDocument %p)\n", This, ppv);
1688         *ppv = HTMLDOC(This);
1689     }else if(IsEqualGUID(&IID_ISupportErrorInfo, riid)) {
1690         TRACE("(%p)->(IID_ISupportErrorInfo %p)\n", This, ppv);
1691         *ppv = SUPPERRINFO(This);
1692     }else if(IsEqualGUID(&IID_IPersistHistory, riid)) {
1693         TRACE("(%p)->(IID_IPersistHistory %p)\n", This, ppv);
1694         *ppv = PERSISTHIST(This);
1695     }else if(IsEqualGUID(&CLSID_CMarkup, riid)) {
1696         FIXME("(%p)->(CLSID_CMarkup %p)\n", This, ppv);
1697         *ppv = NULL;
1698     }else if(IsEqualGUID(&IID_IRunnableObject, riid)) {
1699         TRACE("(%p)->(IID_IRunnableObject %p) returning NULL\n", This, ppv);
1700         *ppv = NULL;
1701     }else if(IsEqualGUID(&IID_IPersistPropertyBag, riid)) {
1702         TRACE("(%p)->(IID_IPersistPropertyBag %p) returning NULL\n", This, ppv);
1703         *ppv = NULL;
1704     }else if(IsEqualGUID(&IID_IMarshal, riid)) {
1705         TRACE("(%p)->(IID_IMarshal %p) returning NULL\n", This, ppv);
1706         *ppv = NULL;
1707     }else {
1708         return FALSE;
1709     }
1710
1711     if(*ppv)
1712         IUnknown_AddRef((IUnknown*)*ppv);
1713     return TRUE;
1714 }
1715
1716 static void init_doc(HTMLDocument *doc, IUnknown *unk_impl, IDispatchEx *dispex)
1717 {
1718     doc->lpHTMLDocument2Vtbl = &HTMLDocumentVtbl;
1719     doc->lpIDispatchExVtbl = &DocDispatchExVtbl;
1720     doc->lpSupportErrorInfoVtbl = &SupportErrorInfoVtbl;
1721
1722     doc->unk_impl = unk_impl;
1723     doc->dispex = dispex;
1724
1725     HTMLDocument_HTMLDocument3_Init(doc);
1726     HTMLDocument_HTMLDocument5_Init(doc);
1727     HTMLDocument_Persist_Init(doc);
1728     HTMLDocument_OleCmd_Init(doc);
1729     HTMLDocument_OleObj_Init(doc);
1730     HTMLDocument_View_Init(doc);
1731     HTMLDocument_Window_Init(doc);
1732     HTMLDocument_Service_Init(doc);
1733     HTMLDocument_Hlink_Init(doc);
1734
1735     ConnectionPointContainer_Init(&doc->cp_container, (IUnknown*)HTMLDOC(doc));
1736     ConnectionPoint_Init(&doc->cp_propnotif, &doc->cp_container, &IID_IPropertyNotifySink);
1737     ConnectionPoint_Init(&doc->cp_htmldocevents, &doc->cp_container, &DIID_HTMLDocumentEvents);
1738     ConnectionPoint_Init(&doc->cp_htmldocevents2, &doc->cp_container, &DIID_HTMLDocumentEvents2);
1739 }
1740
1741 static void destroy_htmldoc(HTMLDocument *This)
1742 {
1743     remove_doc_tasks(This);
1744
1745     ConnectionPointContainer_Destroy(&This->cp_container);
1746
1747     if(This->nsdoc)
1748         nsIDOMHTMLDocument_Release(This->nsdoc);
1749 }
1750
1751 #define HTMLDOCNODE_NODE_THIS(iface) DEFINE_THIS2(HTMLDocumentNode, node, iface)
1752
1753 static HRESULT HTMLDocumentNode_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
1754 {
1755     HTMLDocumentNode *This = HTMLDOCNODE_NODE_THIS(iface);
1756
1757     if(htmldoc_qi(&This->basedoc, riid, ppv))
1758         return *ppv ? S_OK : E_NOINTERFACE;
1759
1760     if(IsEqualGUID(&IID_IInternetHostSecurityManager, riid)) {
1761         TRACE("(%p)->(IID_IInternetHostSecurityManager %p)\n", This, ppv);
1762         *ppv = HOSTSECMGR(This);
1763     }else {
1764         return HTMLDOMNode_QI(&This->node, riid, ppv);
1765     }
1766
1767     IUnknown_AddRef((IUnknown*)*ppv);
1768     return S_OK;
1769 }
1770
1771 void HTMLDocumentNode_destructor(HTMLDOMNode *iface)
1772 {
1773     HTMLDocumentNode *This = HTMLDOCNODE_NODE_THIS(iface);
1774
1775     detach_selection(This);
1776     detach_ranges(This);
1777     release_nodes(This);
1778     destroy_htmldoc(&This->basedoc);
1779 }
1780
1781 #undef HTMLDOCNODE_NODE_THIS
1782
1783 static const NodeImplVtbl HTMLDocumentNodeImplVtbl = {
1784     HTMLDocumentNode_QI,
1785     HTMLDocumentNode_destructor
1786 };
1787
1788 static const tid_t HTMLDocumentNode_iface_tids[] = {
1789     IHTMLDOMNode_tid,
1790     IHTMLDOMNode2_tid,
1791     IHTMLDocument2_tid,
1792     IHTMLDocument3_tid,
1793     IHTMLDocument4_tid,
1794     IHTMLDocument5_tid,
1795     0
1796 };
1797
1798 static dispex_static_data_t HTMLDocumentNode_dispex = {
1799     NULL,
1800     DispHTMLDocument_tid,
1801     NULL,
1802     HTMLDocumentNode_iface_tids
1803 };
1804
1805 HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_obj, HTMLWindow *window, HTMLDocumentNode **ret)
1806 {
1807     HTMLDocumentNode *doc;
1808
1809     doc = heap_alloc_zero(sizeof(HTMLDocumentNode));
1810     if(!doc)
1811         return E_OUTOFMEMORY;
1812
1813     doc->basedoc.doc_node = doc;
1814     doc->basedoc.doc_obj = doc_obj;
1815
1816     init_dispex(&doc->node.dispex, (IUnknown*)HTMLDOMNODE(&doc->node), &HTMLDocumentNode_dispex);
1817     init_doc(&doc->basedoc, (IUnknown*)HTMLDOMNODE(&doc->node), DISPATCHEX(&doc->node.dispex));
1818     HTMLDocumentNode_SecMgr_Init(doc);
1819     doc->ref = 1;
1820
1821     nsIDOMHTMLDocument_AddRef(nsdoc);
1822     doc->basedoc.nsdoc = nsdoc;
1823
1824     doc->basedoc.window = window;
1825
1826     list_init(&doc->selection_list);
1827     list_init(&doc->range_list);
1828
1829     HTMLDOMNode_Init(doc, &doc->node, (nsIDOMNode*)nsdoc);
1830     doc->node.vtbl = &HTMLDocumentNodeImplVtbl;
1831
1832     *ret = doc;
1833     return S_OK;
1834 }
1835
1836 /**********************************************************
1837  * ICustomDoc implementation
1838  */
1839
1840 #define CUSTOMDOC_THIS(iface) DEFINE_THIS(HTMLDocumentObj, CustomDoc, iface)
1841
1842 static HRESULT WINAPI CustomDoc_QueryInterface(ICustomDoc *iface, REFIID riid, void **ppv)
1843 {
1844     HTMLDocumentObj *This = CUSTOMDOC_THIS(iface);
1845
1846     if(htmldoc_qi(&This->basedoc, riid, ppv))
1847         return *ppv ? S_OK : E_NOINTERFACE;
1848
1849     if(IsEqualGUID(&IID_ICustomDoc, riid)) {
1850         TRACE("(%p)->(IID_ICustomDoc %p)\n", This, ppv);
1851         *ppv = CUSTOMDOC(This);
1852     }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
1853         return *ppv ? S_OK : E_NOINTERFACE;
1854     }else {
1855         FIXME("Unimplemented interface %s\n", debugstr_guid(riid));
1856         *ppv = NULL;
1857         return E_NOINTERFACE;
1858     }
1859
1860     IUnknown_AddRef((IUnknown*)*ppv);
1861     return S_OK;
1862 }
1863
1864 static ULONG WINAPI CustomDoc_AddRef(ICustomDoc *iface)
1865 {
1866     HTMLDocumentObj *This = CUSTOMDOC_THIS(iface);
1867     ULONG ref = InterlockedIncrement(&This->ref);
1868
1869     TRACE("(%p) ref = %u\n", This, ref);
1870
1871     return ref;
1872 }
1873
1874 static ULONG WINAPI CustomDoc_Release(ICustomDoc *iface)
1875 {
1876     HTMLDocumentObj *This = CUSTOMDOC_THIS(iface);
1877     ULONG ref = InterlockedDecrement(&This->ref);
1878
1879     TRACE("(%p) ref = %u\n", This, ref);
1880
1881     if(!ref) {
1882         set_document_bscallback(&This->basedoc, NULL);
1883         set_current_mon(&This->basedoc, NULL);
1884         if(This->basedoc.doc_node) {
1885             This->basedoc.doc_node->basedoc.doc_obj = NULL;
1886             IHTMLDocument2_Release(HTMLDOC(&This->basedoc.doc_node->basedoc));
1887         }
1888         if(This->basedoc.window) {
1889             This->basedoc.window->doc_obj = NULL;
1890             IHTMLWindow2_Release(HTMLWINDOW2(This->basedoc.window));
1891         }
1892
1893         if(This->client)
1894             IOleObject_SetClientSite(OLEOBJ(&This->basedoc), NULL);
1895         if(This->in_place_active)
1896             IOleInPlaceObjectWindowless_InPlaceDeactivate(INPLACEWIN(&This->basedoc));
1897         if(This->ipsite)
1898             IOleDocumentView_SetInPlaceSite(DOCVIEW(&This->basedoc), NULL);
1899         if(This->undomgr)
1900             IOleUndoManager_Release(This->undomgr);
1901         if(This->tooltips_hwnd)
1902             DestroyWindow(This->tooltips_hwnd);
1903
1904         if(This->hwnd)
1905             DestroyWindow(This->hwnd);
1906         heap_free(This->mime);
1907
1908         destroy_htmldoc(&This->basedoc);
1909         release_dispex(&This->dispex);
1910
1911         if(This->basedoc.nsdoc)
1912             remove_mutation_observer(This->nscontainer, This->basedoc.nsdoc);
1913         if(This->nscontainer)
1914             NSContainer_Release(This->nscontainer);
1915         heap_free(This);
1916     }
1917
1918     return ref;
1919 }
1920
1921 static HRESULT WINAPI CustomDoc_SetUIHandler(ICustomDoc *iface, IDocHostUIHandler *pUIHandler)
1922 {
1923     HTMLDocumentObj *This = CUSTOMDOC_THIS(iface);
1924     FIXME("(%p)->(%p)\n", This, pUIHandler);
1925     return E_NOTIMPL;
1926 }
1927
1928 #undef CUSTOMDOC_THIS
1929
1930 static const ICustomDocVtbl CustomDocVtbl = {
1931     CustomDoc_QueryInterface,
1932     CustomDoc_AddRef,
1933     CustomDoc_Release,
1934     CustomDoc_SetUIHandler
1935 };
1936
1937 static const tid_t HTMLDocumentObj_iface_tids[] = {
1938     IHTMLDocument2_tid,
1939     IHTMLDocument3_tid,
1940     IHTMLDocument4_tid,
1941     IHTMLDocument5_tid,
1942     0
1943 };
1944 static dispex_static_data_t HTMLDocumentObj_dispex = {
1945     NULL,
1946     DispHTMLDocument_tid,
1947     NULL,
1948     HTMLDocumentObj_iface_tids
1949 };
1950
1951 HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject)
1952 {
1953     HTMLDocumentObj *doc;
1954     nsIDOMWindow *nswindow = NULL;
1955     HRESULT hres;
1956
1957     TRACE("(%p %s %p)\n", pUnkOuter, debugstr_guid(riid), ppvObject);
1958
1959     doc = heap_alloc_zero(sizeof(HTMLDocumentObj));
1960     if(!doc)
1961         return E_OUTOFMEMORY;
1962
1963     init_dispex(&doc->dispex, (IUnknown*)CUSTOMDOC(doc), &HTMLDocumentObj_dispex);
1964     init_doc(&doc->basedoc, (IUnknown*)CUSTOMDOC(doc), DISPATCHEX(&doc->dispex));
1965
1966     doc->lpCustomDocVtbl = &CustomDocVtbl;
1967     doc->ref = 1;
1968     doc->basedoc.doc_obj = doc;
1969
1970     hres = htmldoc_query_interface(&doc->basedoc, riid, ppvObject);
1971     htmldoc_release(&doc->basedoc);
1972     if(FAILED(hres))
1973         return hres;
1974
1975     doc->nscontainer = NSContainer_Create(doc, NULL);
1976     list_init(&doc->bindings);
1977     doc->usermode = UNKNOWN_USERMODE;
1978     doc->readystate = READYSTATE_UNINITIALIZED;
1979
1980     if(doc->nscontainer) {
1981         nsresult nsres;
1982
1983         nsres = nsIWebBrowser_GetContentDOMWindow(doc->nscontainer->webbrowser, &nswindow);
1984         if(NS_FAILED(nsres))
1985             ERR("GetContentDOMWindow failed: %08x\n", nsres);
1986     }
1987
1988     hres = HTMLWindow_Create(doc, nswindow, &doc->basedoc.window);
1989     if(nswindow)
1990         nsIDOMWindow_Release(nswindow);
1991     if(FAILED(hres)) {
1992         IHTMLDocument_Release(HTMLDOC(&doc->basedoc));
1993         return hres;
1994     }
1995
1996     update_nsdocument(doc);
1997     get_thread_hwnd();
1998
1999     return S_OK;
2000 }