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