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