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