mshtml: Added get_styleSheets implementation.
[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
35 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
36
37 #define HTMLDOC_THIS(iface) DEFINE_THIS(HTMLDocument, HTMLDocument2, iface)
38
39 static HRESULT WINAPI HTMLDocument_QueryInterface(IHTMLDocument2 *iface, REFIID riid, void **ppvObject)
40 {
41     HTMLDocument *This = HTMLDOC_THIS(iface);
42
43     *ppvObject = NULL;
44     if(IsEqualGUID(&IID_IUnknown, riid)) {
45         TRACE("(%p)->(IID_IUnknown, %p)\n", This, ppvObject);
46         *ppvObject = HTMLDOC(This);
47     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
48         TRACE("(%p)->(IID_IDispatch, %p)\n", This, ppvObject);
49         *ppvObject = HTMLDOC(This);
50     }else if(IsEqualGUID(&IID_IHTMLDocument, riid)) {
51         TRACE("(%p)->(IID_IHTMLDocument, %p)\n", This, ppvObject);
52         *ppvObject = HTMLDOC(This);
53     }else if(IsEqualGUID(&IID_IHTMLDocument2, riid)) {
54         TRACE("(%p)->(IID_IHTMLDocument2, %p)\n", This, ppvObject);
55         *ppvObject = HTMLDOC(This);
56     }else if(IsEqualGUID(&IID_IHTMLDocument3, riid)) {
57         TRACE("(%p)->(IID_IHTMLDocument3, %p)\n", This, ppvObject);
58         *ppvObject = HTMLDOC3(This);
59     }else if(IsEqualGUID(&IID_IPersist, riid)) {
60         TRACE("(%p)->(IID_IPersist, %p)\n", This, ppvObject);
61         *ppvObject = PERSIST(This);
62     }else if(IsEqualGUID(&IID_IPersistMoniker, riid)) {
63         TRACE("(%p)->(IID_IPersistMoniker, %p)\n", This, ppvObject);
64         *ppvObject = PERSISTMON(This);
65     }else if(IsEqualGUID(&IID_IPersistFile, riid)) {
66         TRACE("(%p)->(IID_IPersistFile, %p)\n", This, ppvObject);
67         *ppvObject = PERSISTFILE(This);
68     }else if(IsEqualGUID(&IID_IMonikerProp, riid)) {
69         TRACE("(%p)->(IID_IMonikerProp, %p)\n", This, ppvObject);
70         *ppvObject = MONPROP(This);
71     }else if(IsEqualGUID(&IID_IOleObject, riid)) {
72         TRACE("(%p)->(IID_IOleObject, %p)\n", This, ppvObject);
73         *ppvObject = OLEOBJ(This);
74     }else if(IsEqualGUID(&IID_IOleDocument, riid)) {
75         TRACE("(%p)->(IID_IOleDocument, %p)\n", This, ppvObject);
76         *ppvObject = OLEDOC(This);
77     }else if(IsEqualGUID(&IID_IOleDocumentView, riid)) {
78         TRACE("(%p)->(IID_IOleDocumentView, %p)\n", This, ppvObject);
79         *ppvObject = DOCVIEW(This);
80     }else if(IsEqualGUID(&IID_IOleInPlaceActiveObject, riid)) {
81         TRACE("(%p)->(IID_IOleInPlaceActiveObject, %p)\n", This, ppvObject);
82         *ppvObject = ACTOBJ(This);
83     }else if(IsEqualGUID(&IID_IViewObject, riid)) {
84         TRACE("(%p)->(IID_IViewObject, %p)\n", This, ppvObject);
85         *ppvObject = VIEWOBJ(This);
86     }else if(IsEqualGUID(&IID_IViewObject2, riid)) {
87         TRACE("(%p)->(IID_IViewObject2, %p)\n", This, ppvObject);
88         *ppvObject = VIEWOBJ2(This);
89     }else if(IsEqualGUID(&IID_IOleWindow, riid)) {
90         TRACE("(%p)->(IID_IOleWindow, %p)\n", This, ppvObject);
91         *ppvObject = OLEWIN(This);
92     }else if(IsEqualGUID(&IID_IOleInPlaceObject, riid)) {
93         TRACE("(%p)->(IID_IOleInPlaceObject, %p)\n", This, ppvObject);
94         *ppvObject = INPLACEOBJ(This);
95     }else if(IsEqualGUID(&IID_IOleInPlaceObjectWindowless, riid)) {
96         TRACE("(%p)->(IID_IOleInPlaceObjectWindowless, %p)\n", This, ppvObject);
97         *ppvObject = INPLACEWIN(This);
98     }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
99         TRACE("(%p)->(IID_IServiceProvider, %p)\n", This, ppvObject);
100         *ppvObject = SERVPROV(This);
101     }else if(IsEqualGUID(&IID_IOleCommandTarget, riid)) {
102         TRACE("(%p)->(IID_IOleCommandTarget, %p)\n", This, ppvObject);
103         *ppvObject = CMDTARGET(This);
104     }else if(IsEqualGUID(&IID_IOleControl, riid)) {
105         TRACE("(%p)->(IID_IOleControl, %p)\n", This, ppvObject);
106         *ppvObject = CONTROL(This);
107     }else if(IsEqualGUID(&IID_IHlinkTarget, riid)) {
108         TRACE("(%p)->(IID_IHlinkTarget, %p)\n", This, ppvObject);
109         *ppvObject = HLNKTARGET(This);
110     }else if(IsEqualGUID(&IID_IConnectionPointContainer, riid)) {
111         TRACE("(%p)->(IID_IConnectionPointContainer %p)\n", This, ppvObject);
112         *ppvObject = CONPTCONT(&This->cp_container);
113     }else if(IsEqualGUID(&IID_IPersistStreamInit, riid)) {
114         TRACE("(%p)->(IID_IPersistStreamInit %p)\n", This, ppvObject);
115         *ppvObject = PERSTRINIT(This);
116     }else if(IsEqualGUID(&IID_ICustomDoc, riid)) {
117         TRACE("(%p)->(IID_ICustomDoc %p)\n", This, ppvObject);
118         *ppvObject = CUSTOMDOC(This);
119     }else if(IsEqualGUID(&DIID_DispHTMLDocument, riid)) {
120         TRACE("(%p)->(DIID_DispHTMLDocument %p)\n", This, ppvObject);
121         *ppvObject = HTMLDOC(This);
122     }else if(IsEqualGUID(&CLSID_CMarkup, riid)) {
123         FIXME("(%p)->(CLSID_CMarkup %p)\n", This, ppvObject);
124         return E_NOINTERFACE;
125     }else if(IsEqualGUID(&IID_IRunnableObject, riid)) {
126         TRACE("(%p)->(IID_IRunnableObject %p) returning NULL\n", This, ppvObject);
127         return E_NOINTERFACE;
128     }
129
130     if(*ppvObject) {
131         IHTMLDocument2_AddRef(iface);
132         return S_OK;
133     }
134
135     FIXME("(%p)->(%s %p) interface not supported\n", This, debugstr_guid(riid), ppvObject);
136     return E_NOINTERFACE;
137 }
138
139 static ULONG WINAPI HTMLDocument_AddRef(IHTMLDocument2 *iface)
140 {
141     HTMLDocument *This = HTMLDOC_THIS(iface);
142     ULONG ref = InterlockedIncrement(&This->ref);
143     TRACE("(%p) ref = %u\n", This, ref);
144     return ref;
145 }
146
147 static ULONG WINAPI HTMLDocument_Release(IHTMLDocument2 *iface)
148 {
149     HTMLDocument *This = HTMLDOC_THIS(iface);
150     ULONG ref = InterlockedDecrement(&This->ref);
151
152     TRACE("(%p) ref = %u\n", This, ref);
153
154     if(!ref) {
155         remove_doc_tasks(This);
156
157         if(This->client)
158             IOleObject_SetClientSite(OLEOBJ(This), NULL);
159         if(This->in_place_active)
160             IOleInPlaceObjectWindowless_InPlaceDeactivate(INPLACEWIN(This));
161         if(This->ipsite)
162             IOleDocumentView_SetInPlaceSite(DOCVIEW(This), NULL);
163         if(This->undomgr)
164             IOleUndoManager_Release(This->undomgr);
165
166         set_document_bscallback(This, NULL);
167         set_current_mon(This, NULL);
168
169         if(This->tooltips_hwnd)
170             DestroyWindow(This->tooltips_hwnd);
171         if(This->hwnd)
172             DestroyWindow(This->hwnd);
173
174         if(This->window)
175             IHTMLWindow2_Release(HTMLWINDOW2(This->window));
176
177         detach_selection(This);
178         detach_ranges(This);
179         release_nodes(This);
180
181         ConnectionPointContainer_Destroy(&This->cp_container);
182
183         if(This->nscontainer)
184             NSContainer_Release(This->nscontainer);
185
186         mshtml_free(This);
187
188         UNLOCK_MODULE();
189     }
190
191     return ref;
192 }
193
194 static HRESULT WINAPI HTMLDocument_GetTypeInfoCount(IHTMLDocument2 *iface, UINT *pctinfo)
195 {
196     FIXME("(%p)->(%p)\n", iface, pctinfo);
197     return E_NOTIMPL;
198 }
199
200 static HRESULT WINAPI HTMLDocument_GetTypeInfo(IHTMLDocument2 *iface, UINT iTInfo,
201                                                 LCID lcid, ITypeInfo **ppTInfo)
202 {
203     FIXME("(%p)->(%u %u %p)\n", iface, iTInfo, lcid, ppTInfo);
204     return E_NOTIMPL;
205 }
206
207 static HRESULT WINAPI HTMLDocument_GetIDsOfNames(IHTMLDocument2 *iface, REFIID riid,
208                                                 LPOLESTR *rgszNames, UINT cNames,
209                                                 LCID lcid, DISPID *rgDispId)
210 {
211     FIXME("(%p)->(%s %p %u %u %p)\n", iface, debugstr_guid(riid), rgszNames, cNames,
212                                         lcid, rgDispId);
213     return E_NOTIMPL;
214 }
215
216 static HRESULT WINAPI HTMLDocument_Invoke(IHTMLDocument2 *iface, DISPID dispIdMember,
217                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
218                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
219 {
220     FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", iface, dispIdMember, debugstr_guid(riid),
221             lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
222     return E_NOTIMPL;
223 }
224
225 static HRESULT WINAPI HTMLDocument_get_Script(IHTMLDocument2 *iface, IDispatch **p)
226 {
227     FIXME("(%p)->(%p)\n", iface, p);
228     return E_NOTIMPL;
229 }
230
231 static HRESULT WINAPI HTMLDocument_get_all(IHTMLDocument2 *iface, IHTMLElementCollection **p)
232 {
233     HTMLDocument *This = HTMLDOC_THIS(iface);
234     IHTMLElement *doc;
235     IDispatch *disp;
236     HRESULT hres;
237
238     TRACE("(%p)->(%p)\n", This, p);
239
240     hres = IHTMLDocument3_get_documentElement(HTMLDOC3(This), &doc);
241     if(FAILED(hres))
242         return hres;
243
244     hres = IHTMLElement_get_all(doc, &disp);
245     IHTMLElement_Release(doc);
246     if(FAILED(hres))
247         return hres;
248
249     hres = IDispatch_QueryInterface(disp, &IID_IHTMLElementCollection, (void**)p);
250     IDispatch_Release(disp);
251
252     return hres;
253 }
254
255 static HRESULT WINAPI HTMLDocument_get_body(IHTMLDocument2 *iface, IHTMLElement **p)
256 {
257     HTMLDocument *This = HTMLDOC_THIS(iface);
258     nsIDOMDocument *nsdoc;
259     nsIDOMHTMLDocument *nshtmldoc;
260     nsIDOMHTMLElement *nsbody = NULL;
261     HTMLDOMNode *node;
262     nsresult nsres;
263
264     TRACE("(%p)->(%p)\n", This, p);
265
266     *p = NULL;
267
268     if(!This->nscontainer)
269         return S_OK;
270
271     nsres = nsIWebNavigation_GetDocument(This->nscontainer->navigation, &nsdoc);
272     if(NS_FAILED(nsres)) {
273         ERR("GetDocument failed: %08x\n", nsres);
274         return S_OK;
275     }
276
277     if(NS_FAILED(nsres) || !nsdoc) 
278         return S_OK;
279
280     nsIDOMDocument_QueryInterface(nsdoc, &IID_nsIDOMHTMLDocument, (void**)&nshtmldoc);
281     nsIDOMDocument_Release(nsdoc);
282
283     nsres = nsIDOMHTMLDocument_GetBody(nshtmldoc, &nsbody);
284     nsIDOMHTMLDocument_Release(nshtmldoc);
285
286     if(NS_FAILED(nsres) || !nsbody) {
287         TRACE("Could not get body: %08x\n", nsres);
288         return S_OK;
289     }
290
291     node = get_node(This, (nsIDOMNode*)nsbody);
292     nsIDOMHTMLElement_Release(nsbody);
293
294     IHTMLDOMNode_QueryInterface(HTMLDOMNODE(node), &IID_IHTMLElement, (void**)p);
295
296     TRACE("*p = %p\n", *p);
297     return S_OK;
298 }
299
300 static HRESULT WINAPI HTMLDocument_get_activeElement(IHTMLDocument2 *iface, IHTMLElement **p)
301 {
302     FIXME("(%p)->(%p)\n", iface, p);
303     return E_NOTIMPL;
304 }
305
306 static HRESULT WINAPI HTMLDocument_get_images(IHTMLDocument2 *iface, IHTMLElementCollection **p)
307 {
308     FIXME("(%p)->(%p)\n", iface, p);
309     return E_NOTIMPL;
310 }
311
312 static HRESULT WINAPI HTMLDocument_get_applets(IHTMLDocument2 *iface, IHTMLElementCollection **p)
313 {
314     FIXME("(%p)->(%p)\n", iface, p);
315     return E_NOTIMPL;
316 }
317
318 static HRESULT WINAPI HTMLDocument_get_links(IHTMLDocument2 *iface, IHTMLElementCollection **p)
319 {
320     FIXME("(%p)->(%p)\n", iface, p);
321     return E_NOTIMPL;
322 }
323
324 static HRESULT WINAPI HTMLDocument_get_forms(IHTMLDocument2 *iface, IHTMLElementCollection **p)
325 {
326     FIXME("(%p)->(%p)\n", iface, p);
327     return E_NOTIMPL;
328 }
329
330 static HRESULT WINAPI HTMLDocument_get_anchors(IHTMLDocument2 *iface, IHTMLElementCollection **p)
331 {
332     FIXME("(%p)->(%p)\n", iface, p);
333     return E_NOTIMPL;
334 }
335
336 static HRESULT WINAPI HTMLDocument_put_title(IHTMLDocument2 *iface, BSTR v)
337 {
338     FIXME("(%p)->(%s)\n", iface, debugstr_w(v));
339     return E_NOTIMPL;
340 }
341
342 static HRESULT WINAPI HTMLDocument_get_title(IHTMLDocument2 *iface, BSTR *p)
343 {
344     FIXME("(%p)->(%p)\n", iface, p);
345     return E_NOTIMPL;
346 }
347
348 static HRESULT WINAPI HTMLDocument_get_scripts(IHTMLDocument2 *iface, IHTMLElementCollection **p)
349 {
350     FIXME("(%p)->(%p)\n", iface, p);
351     return E_NOTIMPL;
352 }
353
354 static HRESULT WINAPI HTMLDocument_put_designMode(IHTMLDocument2 *iface, BSTR v)
355 {
356     FIXME("(%p)->(%s)\n", iface, debugstr_w(v));
357     return E_NOTIMPL;
358 }
359
360 static HRESULT WINAPI HTMLDocument_get_designMode(IHTMLDocument2 *iface, BSTR *p)
361 {
362     FIXME("(%p)->(%p)\n", iface, p);
363     return E_NOTIMPL;
364 }
365
366 static HRESULT WINAPI HTMLDocument_get_selection(IHTMLDocument2 *iface, IHTMLSelectionObject **p)
367 {
368     HTMLDocument *This = HTMLDOC_THIS(iface);
369     nsISelection *nsselection = NULL;
370
371     TRACE("(%p)->(%p)\n", This, p);
372
373     if(This->nscontainer) {
374         nsIDOMWindow *dom_window = NULL;
375
376         nsIWebBrowser_GetContentDOMWindow(This->nscontainer->webbrowser, &dom_window);
377         if(dom_window) {
378             nsIDOMWindow_GetSelection(dom_window, &nsselection);
379             nsIDOMWindow_Release(dom_window);
380         }
381     }
382
383     *p = HTMLSelectionObject_Create(This, nsselection);
384     return S_OK;
385 }
386
387 static HRESULT WINAPI HTMLDocument_get_readyState(IHTMLDocument2 *iface, BSTR *p)
388 {
389     HTMLDocument *This = HTMLDOC_THIS(iface);
390
391     static const WCHAR wszUninitialized[] = {'u','n','i','n','i','t','i','a','l','i','z','e','d',0};
392     static const WCHAR wszLoading[] = {'l','o','a','d','i','n','g',0};
393     static const WCHAR wszLoaded[] = {'l','o','a','d','e','d',0};
394     static const WCHAR wszInteractive[] = {'i','n','t','e','r','a','c','t','i','v','e',0};
395     static const WCHAR wszComplete[] = {'c','o','m','p','l','e','t','e',0};
396
397     static const LPCWSTR readystate_str[] = {
398         wszUninitialized,
399         wszLoading,
400         wszLoaded,
401         wszInteractive,
402         wszComplete
403     };
404
405     TRACE("(%p)->(%p)\n", iface, p);
406
407     if(!p)
408         return E_POINTER;
409
410     *p = SysAllocString(readystate_str[This->readystate]);
411     return S_OK;
412 }
413
414 static HRESULT WINAPI HTMLDocument_get_frames(IHTMLDocument2 *iface, IHTMLFramesCollection2 **p)
415 {
416     FIXME("(%p)->(%p)\n", iface, p);
417     return E_NOTIMPL;
418 }
419
420 static HRESULT WINAPI HTMLDocument_get_embeds(IHTMLDocument2 *iface, IHTMLElementCollection **p)
421 {
422     FIXME("(%p)->(%p)\n", iface, p);
423     return E_NOTIMPL;
424 }
425
426 static HRESULT WINAPI HTMLDocument_get_plugins(IHTMLDocument2 *iface, IHTMLElementCollection **p)
427 {
428     FIXME("(%p)->(%p)\n", iface, p);
429     return E_NOTIMPL;
430 }
431
432 static HRESULT WINAPI HTMLDocument_put_alinkColor(IHTMLDocument2 *iface, VARIANT v)
433 {
434     FIXME("(%p)\n", iface);
435     return E_NOTIMPL;
436 }
437
438 static HRESULT WINAPI HTMLDocument_get_alinkColor(IHTMLDocument2 *iface, VARIANT *p)
439 {
440     FIXME("(%p)->(%p)\n", iface, p);
441     return E_NOTIMPL;
442 }
443
444 static HRESULT WINAPI HTMLDocument_put_bgColor(IHTMLDocument2 *iface, VARIANT v)
445 {
446     FIXME("(%p)\n", iface);
447     return E_NOTIMPL;
448 }
449
450 static HRESULT WINAPI HTMLDocument_get_bgColor(IHTMLDocument2 *iface, VARIANT *p)
451 {
452     FIXME("(%p)->(%p)\n", iface, p);
453     return E_NOTIMPL;
454 }
455
456 static HRESULT WINAPI HTMLDocument_put_fgColor(IHTMLDocument2 *iface, VARIANT v)
457 {
458     FIXME("(%p)\n", iface);
459     return E_NOTIMPL;
460 }
461
462 static HRESULT WINAPI HTMLDocument_get_fgColor(IHTMLDocument2 *iface, VARIANT *p)
463 {
464     FIXME("(%p)->(%p)\n", iface, p);
465     return E_NOTIMPL;
466 }
467
468 static HRESULT WINAPI HTMLDocument_put_linkColor(IHTMLDocument2 *iface, VARIANT v)
469 {
470     FIXME("(%p)->()\n", iface);
471     return E_NOTIMPL;
472 }
473
474 static HRESULT WINAPI HTMLDocument_get_linkColor(IHTMLDocument2 *iface, VARIANT *p)
475 {
476     FIXME("(%p)->(%p)\n", iface, p);
477     return E_NOTIMPL;
478 }
479
480 static HRESULT WINAPI HTMLDocument_put_vlinkColor(IHTMLDocument2 *iface, VARIANT v)
481 {
482     FIXME("(%p)\n", iface);
483     return E_NOTIMPL;
484 }
485
486 static HRESULT WINAPI HTMLDocument_get_vlinkColor(IHTMLDocument2 *iface, VARIANT *p)
487 {
488     FIXME("(%p)->(%p)\n", iface, p);
489     return E_NOTIMPL;
490 }
491
492 static HRESULT WINAPI HTMLDocument_get_referrer(IHTMLDocument2 *iface, BSTR *p)
493 {
494     FIXME("(%p)->(%p)\n", iface, p);
495     return E_NOTIMPL;
496 }
497
498 static HRESULT WINAPI HTMLDocument_get_location(IHTMLDocument2 *iface, IHTMLLocation **p)
499 {
500     FIXME("(%p)->(%p)\n", iface, p);
501     return E_NOTIMPL;
502 }
503
504 static HRESULT WINAPI HTMLDocument_get_lastModified(IHTMLDocument2 *iface, BSTR *p)
505 {
506     FIXME("(%p)->(%p)\n", iface, p);
507     return E_NOTIMPL;
508 }
509
510 static HRESULT WINAPI HTMLDocument_put_URL(IHTMLDocument2 *iface, BSTR v)
511 {
512     FIXME("(%p)->(%s)\n", iface, debugstr_w(v));
513     return E_NOTIMPL;
514 }
515
516 static HRESULT WINAPI HTMLDocument_get_URL(IHTMLDocument2 *iface, BSTR *p)
517 {
518     HTMLDocument *This = HTMLDOC_THIS(iface);
519
520     static const WCHAR about_blank_url[] =
521         {'a','b','o','u','t',':','b','l','a','n','k',0};
522
523     TRACE("(%p)->(%p)\n", iface, p);
524
525     *p = SysAllocString(This->url ? This->url : about_blank_url);
526     return S_OK;
527 }
528
529 static HRESULT WINAPI HTMLDocument_put_domain(IHTMLDocument2 *iface, BSTR v)
530 {
531     FIXME("(%p)->(%s)\n", iface, debugstr_w(v));
532     return E_NOTIMPL;
533 }
534
535 static HRESULT WINAPI HTMLDocument_get_domain(IHTMLDocument2 *iface, BSTR *p)
536 {
537     FIXME("(%p)->(%p)\n", iface, p);
538     return E_NOTIMPL;
539 }
540
541 static HRESULT WINAPI HTMLDocument_put_cookie(IHTMLDocument2 *iface, BSTR v)
542 {
543     FIXME("(%p)->(%s)\n", iface, debugstr_w(v));
544     return E_NOTIMPL;
545 }
546
547 static HRESULT WINAPI HTMLDocument_get_cookie(IHTMLDocument2 *iface, BSTR *p)
548 {
549     FIXME("(%p)->(%p)\n", iface, p);
550     return E_NOTIMPL;
551 }
552
553 static HRESULT WINAPI HTMLDocument_put_expando(IHTMLDocument2 *iface, VARIANT_BOOL v)
554 {
555     FIXME("(%p)->(%x)\n", iface, v);
556     return E_NOTIMPL;
557 }
558
559 static HRESULT WINAPI HTMLDocument_get_expando(IHTMLDocument2 *iface, VARIANT_BOOL *p)
560 {
561     FIXME("(%p)->(%p)\n", iface, p);
562     return E_NOTIMPL;
563 }
564
565 static HRESULT WINAPI HTMLDocument_put_charset(IHTMLDocument2 *iface, BSTR v)
566 {
567     FIXME("(%p)->(%s)\n", iface, debugstr_w(v));
568     return E_NOTIMPL;
569 }
570
571 static HRESULT WINAPI HTMLDocument_get_charset(IHTMLDocument2 *iface, BSTR *p)
572 {
573     FIXME("(%p)->(%p)\n", iface, p);
574     return E_NOTIMPL;
575 }
576
577 static HRESULT WINAPI HTMLDocument_put_defaultCharset(IHTMLDocument2 *iface, BSTR v)
578 {
579     FIXME("(%p)->(%s)\n", iface, debugstr_w(v));
580     return E_NOTIMPL;
581 }
582
583 static HRESULT WINAPI HTMLDocument_get_defaultCharset(IHTMLDocument2 *iface, BSTR *p)
584 {
585     FIXME("(%p)->(%p)\n", iface, p);
586     return E_NOTIMPL;
587 }
588
589 static HRESULT WINAPI HTMLDocument_get_mimeType(IHTMLDocument2 *iface, BSTR *p)
590 {
591     FIXME("(%p)->(%p)\n", iface, p);
592     return E_NOTIMPL;
593 }
594
595 static HRESULT WINAPI HTMLDocument_get_fileSize(IHTMLDocument2 *iface, BSTR *p)
596 {
597     FIXME("(%p)->(%p)\n", iface, p);
598     return E_NOTIMPL;
599 }
600
601 static HRESULT WINAPI HTMLDocument_get_fileCreatedDate(IHTMLDocument2 *iface, BSTR *p)
602 {
603     FIXME("(%p)->(%p)\n", iface, p);
604     return E_NOTIMPL;
605 }
606
607 static HRESULT WINAPI HTMLDocument_get_fileModifiedDate(IHTMLDocument2 *iface, BSTR *p)
608 {
609     FIXME("(%p)->(%p)\n", iface, p);
610     return E_NOTIMPL;
611 }
612
613 static HRESULT WINAPI HTMLDocument_get_fileUpdatedDate(IHTMLDocument2 *iface, BSTR *p)
614 {
615     FIXME("(%p)->(%p)\n", iface, p);
616     return E_NOTIMPL;
617 }
618
619 static HRESULT WINAPI HTMLDocument_get_security(IHTMLDocument2 *iface, BSTR *p)
620 {
621     FIXME("(%p)->(%p)\n", iface, p);
622     return E_NOTIMPL;
623 }
624
625 static HRESULT WINAPI HTMLDocument_get_protocol(IHTMLDocument2 *iface, BSTR *p)
626 {
627     FIXME("(%p)->(%p)\n", iface, p);
628     return E_NOTIMPL;
629 }
630
631 static HRESULT WINAPI HTMLDocument_get_nameProp(IHTMLDocument2 *iface, BSTR *p)
632 {
633     FIXME("(%p)->(%p)\n", iface, p);
634     return E_NOTIMPL;
635 }
636
637 static HRESULT WINAPI HTMLDocument_write(IHTMLDocument2 *iface, SAFEARRAY *psarray)
638 {
639     FIXME("(%p)->(%p)\n", iface, psarray);
640     return E_NOTIMPL;
641 }
642
643 static HRESULT WINAPI HTMLDocument_writeln(IHTMLDocument2 *iface, SAFEARRAY *psarray)
644 {
645     FIXME("(%p)->(%p)\n", iface, psarray);
646     return E_NOTIMPL;
647 }
648
649 static HRESULT WINAPI HTMLDocument_open(IHTMLDocument2 *iface, BSTR url, VARIANT name,
650                         VARIANT features, VARIANT replace, IDispatch **pomWindowResult)
651 {
652     FIXME("(%p)->(%s %p)\n", iface, debugstr_w(url), pomWindowResult);
653     return E_NOTIMPL;
654 }
655
656 static HRESULT WINAPI HTMLDocument_close(IHTMLDocument2 *iface)
657 {
658     FIXME("(%p)\n", iface);
659     return E_NOTIMPL;
660 }
661
662 static HRESULT WINAPI HTMLDocument_clear(IHTMLDocument2 *iface)
663 {
664     FIXME("(%p)\n", iface);
665     return E_NOTIMPL;
666 }
667
668 static HRESULT WINAPI HTMLDocument_queryCommandSupported(IHTMLDocument2 *iface, BSTR cmdID,
669                                                         VARIANT_BOOL *pfRet)
670 {
671     FIXME("(%p)->(%s %p)\n", iface, debugstr_w(cmdID), pfRet);
672     return E_NOTIMPL;
673 }
674
675 static HRESULT WINAPI HTMLDocument_queryCommandEnabled(IHTMLDocument2 *iface, BSTR cmdID,
676                                                         VARIANT_BOOL *pfRet)
677 {
678     FIXME("(%p)->(%s %p)\n", iface, debugstr_w(cmdID), pfRet);
679     return E_NOTIMPL;
680 }
681
682 static HRESULT WINAPI HTMLDocument_queryCommandState(IHTMLDocument2 *iface, BSTR cmdID,
683                                                         VARIANT_BOOL *pfRet)
684 {
685     FIXME("(%p)->(%s %p)\n", iface, debugstr_w(cmdID), pfRet);
686     return E_NOTIMPL;
687 }
688
689 static HRESULT WINAPI HTMLDocument_queryCommandIndeterm(IHTMLDocument2 *iface, BSTR cmdID,
690                                                         VARIANT_BOOL *pfRet)
691 {
692     FIXME("(%p)->(%s %p)\n", iface, debugstr_w(cmdID), pfRet);
693     return E_NOTIMPL;
694 }
695
696 static HRESULT WINAPI HTMLDocument_queryCommandText(IHTMLDocument2 *iface, BSTR cmdID,
697                                                         BSTR *pfRet)
698 {
699     FIXME("(%p)->(%s %p)\n", iface, debugstr_w(cmdID), pfRet);
700     return E_NOTIMPL;
701 }
702
703 static HRESULT WINAPI HTMLDocument_queryCommandValue(IHTMLDocument2 *iface, BSTR cmdID,
704                                                         VARIANT *pfRet)
705 {
706     FIXME("(%p)->(%s %p)\n", iface, debugstr_w(cmdID), pfRet);
707     return E_NOTIMPL;
708 }
709
710 static HRESULT WINAPI HTMLDocument_execCommand(IHTMLDocument2 *iface, BSTR cmdID,
711                                 VARIANT_BOOL showUI, VARIANT value, VARIANT_BOOL *pfRet)
712 {
713     FIXME("(%p)->(%s %x %p)\n", iface, debugstr_w(cmdID), showUI, pfRet);
714     return E_NOTIMPL;
715 }
716
717 static HRESULT WINAPI HTMLDocument_execCommandShowHelp(IHTMLDocument2 *iface, BSTR cmdID,
718                                                         VARIANT_BOOL *pfRet)
719 {
720     FIXME("(%p)->(%s %p)\n", iface, debugstr_w(cmdID), pfRet);
721     return E_NOTIMPL;
722 }
723
724 static HRESULT WINAPI HTMLDocument_createElement(IHTMLDocument2 *iface, BSTR eTag,
725                                                     IHTMLElement **newElem)
726 {
727     FIXME("(%p)->(%s %p)\n", iface, debugstr_w(eTag), newElem);
728     return E_NOTIMPL;
729 }
730
731 static HRESULT WINAPI HTMLDocument_put_onhelp(IHTMLDocument2 *iface, VARIANT v)
732 {
733     FIXME("(%p)\n", iface);
734     return E_NOTIMPL;
735 }
736
737 static HRESULT WINAPI HTMLDocument_get_onhelp(IHTMLDocument2 *iface, VARIANT *p)
738 {
739     FIXME("(%p)->(%p)\n", iface, p);
740     return E_NOTIMPL;
741 }
742
743 static HRESULT WINAPI HTMLDocument_put_onclick(IHTMLDocument2 *iface, VARIANT v)
744 {
745     FIXME("(%p)\n", iface);
746     return E_NOTIMPL;
747 }
748
749 static HRESULT WINAPI HTMLDocument_get_onclick(IHTMLDocument2 *iface, VARIANT *p)
750 {
751     FIXME("(%p)->(%p)\n", iface, p);
752     return E_NOTIMPL;
753 }
754
755 static HRESULT WINAPI HTMLDocument_put_ondblclick(IHTMLDocument2 *iface, VARIANT v)
756 {
757     FIXME("(%p)\n", iface);
758     return E_NOTIMPL;
759 }
760
761 static HRESULT WINAPI HTMLDocument_get_ondblclick(IHTMLDocument2 *iface, VARIANT *p)
762 {
763     FIXME("(%p)->(%p)\n", iface, p);
764     return E_NOTIMPL;
765 }
766
767 static HRESULT WINAPI HTMLDocument_put_onkeyup(IHTMLDocument2 *iface, VARIANT v)
768 {
769     FIXME("(%p)\n", iface);
770     return E_NOTIMPL;
771 }
772
773 static HRESULT WINAPI HTMLDocument_get_onkeyup(IHTMLDocument2 *iface, VARIANT *p)
774 {
775     FIXME("(%p)->(%p)\n", iface, p);
776     return E_NOTIMPL;
777 }
778
779 static HRESULT WINAPI HTMLDocument_put_onkeydown(IHTMLDocument2 *iface, VARIANT v)
780 {
781     FIXME("(%p)\n", iface);
782     return E_NOTIMPL;
783 }
784
785 static HRESULT WINAPI HTMLDocument_get_onkeydown(IHTMLDocument2 *iface, VARIANT *p)
786 {
787     FIXME("(%p)->(%p)\n", iface, p);
788     return E_NOTIMPL;
789 }
790
791 static HRESULT WINAPI HTMLDocument_put_onkeypress(IHTMLDocument2 *iface, VARIANT v)
792 {
793     FIXME("(%p)\n", iface);
794     return E_NOTIMPL;
795 }
796
797 static HRESULT WINAPI HTMLDocument_get_onkeypress(IHTMLDocument2 *iface, VARIANT *p)
798 {
799     FIXME("(%p)->(%p)\n", iface, p);
800     return E_NOTIMPL;
801 }
802
803 static HRESULT WINAPI HTMLDocument_put_onmouseup(IHTMLDocument2 *iface, VARIANT v)
804 {
805     FIXME("(%p)\n", iface);
806     return E_NOTIMPL;
807 }
808
809 static HRESULT WINAPI HTMLDocument_get_onmouseup(IHTMLDocument2 *iface, VARIANT *p)
810 {
811     FIXME("(%p)->(%p)\n", iface, p);
812     return E_NOTIMPL;
813 }
814
815 static HRESULT WINAPI HTMLDocument_put_onmousedown(IHTMLDocument2 *iface, VARIANT v)
816 {
817     FIXME("(%p)\n", iface);
818     return E_NOTIMPL;
819 }
820
821 static HRESULT WINAPI HTMLDocument_get_onmousedown(IHTMLDocument2 *iface, VARIANT *p)
822 {
823     FIXME("(%p)->(%p)\n", iface, p);
824     return E_NOTIMPL;
825 }
826
827 static HRESULT WINAPI HTMLDocument_put_onmousemove(IHTMLDocument2 *iface, VARIANT v)
828 {
829     FIXME("(%p)\n", iface);
830     return E_NOTIMPL;
831 }
832
833 static HRESULT WINAPI HTMLDocument_get_onmousemove(IHTMLDocument2 *iface, VARIANT *p)
834 {
835     FIXME("(%p)->(%p)\n", iface, p);
836     return E_NOTIMPL;
837 }
838
839 static HRESULT WINAPI HTMLDocument_put_onmouseout(IHTMLDocument2 *iface, VARIANT v)
840 {
841     FIXME("(%p)\n", iface);
842     return E_NOTIMPL;
843 }
844
845 static HRESULT WINAPI HTMLDocument_get_onmouseout(IHTMLDocument2 *iface, VARIANT *p)
846 {
847     FIXME("(%p)->(%p)\n", iface, p);
848     return E_NOTIMPL;
849 }
850
851 static HRESULT WINAPI HTMLDocument_put_onmouseover(IHTMLDocument2 *iface, VARIANT v)
852 {
853     FIXME("(%p)\n", iface);
854     return E_NOTIMPL;
855 }
856
857 static HRESULT WINAPI HTMLDocument_get_onmouseover(IHTMLDocument2 *iface, VARIANT *p)
858 {
859     FIXME("(%p)->(%p)\n", iface, p);
860     return E_NOTIMPL;
861 }
862
863 static HRESULT WINAPI HTMLDocument_put_onreadystatechange(IHTMLDocument2 *iface, VARIANT v)
864 {
865     FIXME("(%p)\n", iface);
866     return E_NOTIMPL;
867 }
868
869 static HRESULT WINAPI HTMLDocument_get_onreadystatechange(IHTMLDocument2 *iface, VARIANT *p)
870 {
871     FIXME("(%p)->(%p)\n", iface, p);
872     return E_NOTIMPL;
873 }
874
875 static HRESULT WINAPI HTMLDocument_put_onafterupdate(IHTMLDocument2 *iface, VARIANT v)
876 {
877     FIXME("(%p)\n", iface);
878     return E_NOTIMPL;
879 }
880
881 static HRESULT WINAPI HTMLDocument_get_onafterupdate(IHTMLDocument2 *iface, VARIANT *p)
882 {
883     FIXME("(%p)->(%p)\n", iface, p);
884     return E_NOTIMPL;
885 }
886
887 static HRESULT WINAPI HTMLDocument_put_onrowexit(IHTMLDocument2 *iface, VARIANT v)
888 {
889     FIXME("(%p)\n", iface);
890     return E_NOTIMPL;
891 }
892
893 static HRESULT WINAPI HTMLDocument_get_onrowexit(IHTMLDocument2 *iface, VARIANT *p)
894 {
895     FIXME("(%p)->(%p)\n", iface, p);
896     return E_NOTIMPL;
897 }
898
899 static HRESULT WINAPI HTMLDocument_put_onrowenter(IHTMLDocument2 *iface, VARIANT v)
900 {
901     FIXME("(%p)\n", iface);
902     return E_NOTIMPL;
903 }
904
905 static HRESULT WINAPI HTMLDocument_get_onrowenter(IHTMLDocument2 *iface, VARIANT *p)
906 {
907     FIXME("(%p)->(%p)\n", iface, p);
908     return E_NOTIMPL;
909 }
910
911 static HRESULT WINAPI HTMLDocument_put_ondragstart(IHTMLDocument2 *iface, VARIANT v)
912 {
913     FIXME("(%p)\n", iface);
914     return E_NOTIMPL;
915 }
916
917 static HRESULT WINAPI HTMLDocument_get_ondragstart(IHTMLDocument2 *iface, VARIANT *p)
918 {
919     FIXME("(%p)->(%p)\n", iface, p);
920     return E_NOTIMPL;
921 }
922
923 static HRESULT WINAPI HTMLDocument_put_onselectstart(IHTMLDocument2 *iface, VARIANT v)
924 {
925     FIXME("(%p)\n", iface);
926     return E_NOTIMPL;
927 }
928
929 static HRESULT WINAPI HTMLDocument_get_onselectstart(IHTMLDocument2 *iface, VARIANT *p)
930 {
931     FIXME("(%p)->(%p)\n", iface, p);
932     return E_NOTIMPL;
933 }
934
935 static HRESULT WINAPI HTMLDocument_elementFromPoint(IHTMLDocument2 *iface, long x, long y,
936                                                         IHTMLElement **elementHit)
937 {
938     FIXME("(%p)->(%ld %ld %p)\n", iface, x, y, elementHit);
939     return E_NOTIMPL;
940 }
941
942 static HRESULT WINAPI HTMLDocument_get_parentWindow(IHTMLDocument2 *iface, IHTMLWindow2 **p)
943 {
944     HTMLDocument *This = HTMLDOC_THIS(iface);
945
946     TRACE("(%p)->(%p)\n", This, p);
947
948     *p = HTMLWINDOW2(This->window);
949     IHTMLWindow2_AddRef(*p);
950     return S_OK;
951 }
952
953 static HRESULT WINAPI HTMLDocument_get_styleSheets(IHTMLDocument2 *iface,
954                                                    IHTMLStyleSheetsCollection **p)
955 {
956     HTMLDocument *This = HTMLDOC_THIS(iface);
957     nsIDOMStyleSheetList *nsstylelist;
958     nsIDOMDocumentStyle *nsdocstyle;
959     nsIDOMDocument *nsdoc;
960     nsresult nsres;
961
962     TRACE("(%p)->(%p)\n", This, p);
963
964     *p = NULL;
965
966     if(!This->nscontainer)
967         return S_OK;
968
969     nsres = nsIWebNavigation_GetDocument(This->nscontainer->navigation, &nsdoc);
970     if(NS_FAILED(nsres)) {
971         ERR("GetDocument failed: %08x\n", nsres);
972         return S_OK;
973     }
974
975     if(NS_FAILED(nsres) || !nsdoc)
976         return S_OK;
977
978     nsIDOMDocument_QueryInterface(nsdoc, &IID_nsIDOMDocumentStyle, (void**)&nsdocstyle);
979     nsIDOMDocument_Release(nsdoc);
980
981     nsIDOMDocumentStyle_GetStyleSheets(nsdocstyle, &nsstylelist);
982     nsIDOMDocumentStyle_Release(nsdocstyle);
983
984     *p = HTMLStyleSheetsCollection_Create(nsstylelist);
985     nsIDOMDocumentStyle_Release(nsstylelist);
986
987     return S_OK;
988 }
989
990 static HRESULT WINAPI HTMLDocument_put_onbeforeupdate(IHTMLDocument2 *iface, VARIANT v)
991 {
992     FIXME("(%p)\n", iface);
993     return E_NOTIMPL;
994 }
995
996 static HRESULT WINAPI HTMLDocument_get_onbeforeupdate(IHTMLDocument2 *iface, VARIANT *p)
997 {
998     FIXME("(%p)->(%p)\n", iface, p);
999     return E_NOTIMPL;
1000 }
1001
1002 static HRESULT WINAPI HTMLDocument_put_onerrorupdate(IHTMLDocument2 *iface, VARIANT v)
1003 {
1004     FIXME("(%p)\n", iface);
1005     return E_NOTIMPL;
1006 }
1007
1008 static HRESULT WINAPI HTMLDocument_get_onerrorupdate(IHTMLDocument2 *iface, VARIANT *p)
1009 {
1010     FIXME("(%p)->(%p)\n", iface, p);
1011     return E_NOTIMPL;
1012 }
1013
1014 static HRESULT WINAPI HTMLDocument_toString(IHTMLDocument2 *iface, BSTR *String)
1015 {
1016     FIXME("(%p)->(%p)\n", iface, String);
1017     return E_NOTIMPL;
1018 }
1019
1020 static HRESULT WINAPI HTMLDocument_createStyleSheet(IHTMLDocument2 *iface, BSTR bstrHref,
1021                                             long lIndex, IHTMLStyleSheet **ppnewStyleSheet)
1022 {
1023     HTMLDocument *This = HTMLDOC_THIS(iface);
1024
1025     FIXME("(%p)->(%s %ld %p) semi-stub\n", This, debugstr_w(bstrHref), lIndex, ppnewStyleSheet);
1026
1027     *ppnewStyleSheet = HTMLStyleSheet_Create();
1028     return S_OK;
1029 }
1030
1031 static const IHTMLDocument2Vtbl HTMLDocumentVtbl = {
1032     HTMLDocument_QueryInterface,
1033     HTMLDocument_AddRef,
1034     HTMLDocument_Release,
1035     HTMLDocument_GetTypeInfoCount,
1036     HTMLDocument_GetTypeInfo,
1037     HTMLDocument_GetIDsOfNames,
1038     HTMLDocument_Invoke,
1039     HTMLDocument_get_Script,
1040     HTMLDocument_get_all,
1041     HTMLDocument_get_body,
1042     HTMLDocument_get_activeElement,
1043     HTMLDocument_get_images,
1044     HTMLDocument_get_applets,
1045     HTMLDocument_get_links,
1046     HTMLDocument_get_forms,
1047     HTMLDocument_get_anchors,
1048     HTMLDocument_put_title,
1049     HTMLDocument_get_title,
1050     HTMLDocument_get_scripts,
1051     HTMLDocument_put_designMode,
1052     HTMLDocument_get_designMode,
1053     HTMLDocument_get_selection,
1054     HTMLDocument_get_readyState,
1055     HTMLDocument_get_frames,
1056     HTMLDocument_get_embeds,
1057     HTMLDocument_get_plugins,
1058     HTMLDocument_put_alinkColor,
1059     HTMLDocument_get_alinkColor,
1060     HTMLDocument_put_bgColor,
1061     HTMLDocument_get_bgColor,
1062     HTMLDocument_put_fgColor,
1063     HTMLDocument_get_fgColor,
1064     HTMLDocument_put_linkColor,
1065     HTMLDocument_get_linkColor,
1066     HTMLDocument_put_vlinkColor,
1067     HTMLDocument_get_vlinkColor,
1068     HTMLDocument_get_referrer,
1069     HTMLDocument_get_location,
1070     HTMLDocument_get_lastModified,
1071     HTMLDocument_put_URL,
1072     HTMLDocument_get_URL,
1073     HTMLDocument_put_domain,
1074     HTMLDocument_get_domain,
1075     HTMLDocument_put_cookie,
1076     HTMLDocument_get_cookie,
1077     HTMLDocument_put_expando,
1078     HTMLDocument_get_expando,
1079     HTMLDocument_put_charset,
1080     HTMLDocument_get_charset,
1081     HTMLDocument_put_defaultCharset,
1082     HTMLDocument_get_defaultCharset,
1083     HTMLDocument_get_mimeType,
1084     HTMLDocument_get_fileSize,
1085     HTMLDocument_get_fileCreatedDate,
1086     HTMLDocument_get_fileModifiedDate,
1087     HTMLDocument_get_fileUpdatedDate,
1088     HTMLDocument_get_security,
1089     HTMLDocument_get_protocol,
1090     HTMLDocument_get_nameProp,
1091     HTMLDocument_write,
1092     HTMLDocument_writeln,
1093     HTMLDocument_open,
1094     HTMLDocument_close,
1095     HTMLDocument_clear,
1096     HTMLDocument_queryCommandSupported,
1097     HTMLDocument_queryCommandEnabled,
1098     HTMLDocument_queryCommandState,
1099     HTMLDocument_queryCommandIndeterm,
1100     HTMLDocument_queryCommandText,
1101     HTMLDocument_queryCommandValue,
1102     HTMLDocument_execCommand,
1103     HTMLDocument_execCommandShowHelp,
1104     HTMLDocument_createElement,
1105     HTMLDocument_put_onhelp,
1106     HTMLDocument_get_onhelp,
1107     HTMLDocument_put_onclick,
1108     HTMLDocument_get_onclick,
1109     HTMLDocument_put_ondblclick,
1110     HTMLDocument_get_ondblclick,
1111     HTMLDocument_put_onkeyup,
1112     HTMLDocument_get_onkeyup,
1113     HTMLDocument_put_onkeydown,
1114     HTMLDocument_get_onkeydown,
1115     HTMLDocument_put_onkeypress,
1116     HTMLDocument_get_onkeypress,
1117     HTMLDocument_put_onmouseup,
1118     HTMLDocument_get_onmouseup,
1119     HTMLDocument_put_onmousedown,
1120     HTMLDocument_get_onmousedown,
1121     HTMLDocument_put_onmousemove,
1122     HTMLDocument_get_onmousemove,
1123     HTMLDocument_put_onmouseout,
1124     HTMLDocument_get_onmouseout,
1125     HTMLDocument_put_onmouseover,
1126     HTMLDocument_get_onmouseover,
1127     HTMLDocument_put_onreadystatechange,
1128     HTMLDocument_get_onreadystatechange,
1129     HTMLDocument_put_onafterupdate,
1130     HTMLDocument_get_onafterupdate,
1131     HTMLDocument_put_onrowexit,
1132     HTMLDocument_get_onrowexit,
1133     HTMLDocument_put_onrowenter,
1134     HTMLDocument_get_onrowenter,
1135     HTMLDocument_put_ondragstart,
1136     HTMLDocument_get_ondragstart,
1137     HTMLDocument_put_onselectstart,
1138     HTMLDocument_get_onselectstart,
1139     HTMLDocument_elementFromPoint,
1140     HTMLDocument_get_parentWindow,
1141     HTMLDocument_get_styleSheets,
1142     HTMLDocument_put_onbeforeupdate,
1143     HTMLDocument_get_onbeforeupdate,
1144     HTMLDocument_put_onerrorupdate,
1145     HTMLDocument_get_onerrorupdate,
1146     HTMLDocument_toString,
1147     HTMLDocument_createStyleSheet
1148 };
1149
1150 HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject)
1151 {
1152     HTMLDocument *ret;
1153     HRESULT hres;
1154
1155     TRACE("(%p %s %p)\n", pUnkOuter, debugstr_guid(riid), ppvObject);
1156
1157     ret = mshtml_alloc(sizeof(HTMLDocument));
1158     ret->lpHTMLDocument2Vtbl = &HTMLDocumentVtbl;
1159     ret->ref = 0;
1160     ret->nscontainer = NULL;
1161     ret->nodes = NULL;
1162     ret->readystate = READYSTATE_UNINITIALIZED;
1163     ret->window = NULL;
1164
1165     list_init(&ret->selection_list);
1166     list_init(&ret->range_list);
1167
1168     hres = IHTMLDocument_QueryInterface(HTMLDOC(ret), riid, ppvObject);
1169     if(FAILED(hres)) {
1170         mshtml_free(ret);
1171         return hres;
1172     }
1173
1174     LOCK_MODULE();
1175
1176     HTMLDocument_HTMLDocument3_Init(ret);
1177     HTMLDocument_Persist_Init(ret);
1178     HTMLDocument_OleCmd_Init(ret);
1179     HTMLDocument_OleObj_Init(ret);
1180     HTMLDocument_View_Init(ret);
1181     HTMLDocument_Window_Init(ret);
1182     HTMLDocument_Service_Init(ret);
1183     HTMLDocument_Hlink_Init(ret);
1184
1185     ConnectionPoint_Init(&ret->cp_propnotif, CONPTCONT(&ret->cp_container),
1186             &IID_IPropertyNotifySink, NULL);
1187     ConnectionPoint_Init(&ret->cp_htmldocevents, CONPTCONT(&ret->cp_container),
1188             &DIID_HTMLDocumentEvents, &ret->cp_propnotif);
1189     ConnectionPoint_Init(&ret->cp_htmldocevents2, CONPTCONT(&ret->cp_container),
1190             &DIID_HTMLDocumentEvents2, &ret->cp_htmldocevents);
1191     ConnectionPointContainer_Init(&ret->cp_container, &ret->cp_propnotif, (IUnknown*)HTMLDOC(ret));
1192
1193     ret->nscontainer = NSContainer_Create(ret, NULL);
1194     ret->window = HTMLWindow_Create(ret);
1195
1196     get_thread_hwnd();
1197
1198     return hres;
1199 }