wininet: Fix behaviour of InternetTimeFromSystemTimeA/W when dealing with invalid...
[wine] / dlls / mshtml / htmldoc3.c
1 /*
2  * Copyright 2005 Jacek Caban for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #include "config.h"
20
21 #include <stdarg.h>
22 #include <stdio.h>
23
24 #define COBJMACROS
25
26 #include "windef.h"
27 #include "winbase.h"
28 #include "winuser.h"
29 #include "ole2.h"
30
31 #include "wine/debug.h"
32
33 #include "mshtml_private.h"
34
35 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
36
37 #define HTMLDOC3_THIS(iface) DEFINE_THIS(HTMLDocument, HTMLDocument3, iface)
38
39 static HRESULT WINAPI HTMLDocument3_QueryInterface(IHTMLDocument3 *iface,
40                                                   REFIID riid, void **ppv)
41 {
42     HTMLDocument *This = HTMLDOC3_THIS(iface);
43     return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppv);
44 }
45
46 static ULONG WINAPI HTMLDocument3_AddRef(IHTMLDocument3 *iface)
47 {
48     HTMLDocument *This = HTMLDOC3_THIS(iface);
49     return IHTMLDocument2_AddRef(HTMLDOC(This));
50 }
51
52 static ULONG WINAPI HTMLDocument3_Release(IHTMLDocument3 *iface)
53 {
54     HTMLDocument *This = HTMLDOC3_THIS(iface);
55     return IHTMLDocument2_Release(HTMLDOC(This));
56 }
57
58 static HRESULT WINAPI HTMLDocument3_GetTypeInfoCount(IHTMLDocument3 *iface, UINT *pctinfo)
59 {
60     HTMLDocument *This = HTMLDOC3_THIS(iface);
61     return IDispatchEx_GetTypeInfoCount(DISPATCHEX(This), pctinfo);
62 }
63
64 static HRESULT WINAPI HTMLDocument3_GetTypeInfo(IHTMLDocument3 *iface, UINT iTInfo,
65                                                 LCID lcid, ITypeInfo **ppTInfo)
66 {
67     HTMLDocument *This = HTMLDOC3_THIS(iface);
68     return IDispatchEx_GetTypeInfo(DISPATCHEX(This), iTInfo, lcid, ppTInfo);
69 }
70
71 static HRESULT WINAPI HTMLDocument3_GetIDsOfNames(IHTMLDocument3 *iface, REFIID riid,
72                                                 LPOLESTR *rgszNames, UINT cNames,
73                                                 LCID lcid, DISPID *rgDispId)
74 {
75     HTMLDocument *This = HTMLDOC3_THIS(iface);
76     return IDispatchEx_GetIDsOfNames(DISPATCHEX(This), riid, rgszNames, cNames, lcid, rgDispId);
77 }
78
79 static HRESULT WINAPI HTMLDocument3_Invoke(IHTMLDocument3 *iface, DISPID dispIdMember,
80                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
81                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
82 {
83     HTMLDocument *This = HTMLDOC3_THIS(iface);
84     return IDispatchEx_Invoke(DISPATCHEX(This), dispIdMember, riid, lcid, wFlags, pDispParams,
85             pVarResult, pExcepInfo, puArgErr);
86 }
87
88 static HRESULT WINAPI HTMLDocument3_releaseCapture(IHTMLDocument3 *iface)
89 {
90     HTMLDocument *This = HTMLDOC3_THIS(iface);
91     FIXME("(%p)\n", This);
92     return E_NOTIMPL;
93 }
94
95 static HRESULT WINAPI HTMLDocument3_recalc(IHTMLDocument3 *iface, VARIANT_BOOL fForce)
96 {
97     HTMLDocument *This = HTMLDOC3_THIS(iface);
98     FIXME("(%p)->(%x)\n", This, fForce);
99     return E_NOTIMPL;
100 }
101
102 static HRESULT WINAPI HTMLDocument3_createTextNode(IHTMLDocument3 *iface, BSTR text,
103                                                    IHTMLDOMNode **newTextNode)
104 {
105     HTMLDocument *This = HTMLDOC3_THIS(iface);
106     nsIDOMDocument *nsdoc;
107     nsIDOMText *nstext;
108     HTMLDOMNode *node;
109     nsAString text_str;
110     nsresult nsres;
111
112     TRACE("(%p)->(%s %p)\n", This, debugstr_w(text), newTextNode);
113
114     nsIWebNavigation_GetDocument(This->nscontainer->navigation, &nsdoc);
115
116     nsAString_Init(&text_str, text);
117     nsres = nsIDOMDocument_CreateTextNode(nsdoc, &text_str, &nstext);
118     nsAString_Finish(&text_str);
119     nsIDOMDocument_Release(nsdoc);
120     if(NS_FAILED(nsres)) {
121         ERR("CreateTextNode failed: %08x\n", nsres);
122         return E_FAIL;
123     }
124
125     node = HTMLDOMTextNode_Create(This, (nsIDOMNode*)nstext);
126     nsIDOMElement_Release(nstext);
127
128     *newTextNode = HTMLDOMNODE(node);
129     IHTMLDOMNode_AddRef(HTMLDOMNODE(node));
130     return S_OK;
131 }
132
133 static HRESULT WINAPI HTMLDocument3_get_documentElement(IHTMLDocument3 *iface, IHTMLElement **p)
134 {
135     HTMLDocument *This = HTMLDOC3_THIS(iface);
136     nsIDOMDocument *nsdoc;
137     HTMLDOMNode *node;
138     nsIDOMElement *nselem = NULL;
139     nsresult nsres;
140
141     TRACE("(%p)->(%p)\n", This, p);
142
143     if(!This->nscontainer) {
144         *p = NULL;
145         return S_OK;
146     }
147
148     nsres = nsIWebNavigation_GetDocument(This->nscontainer->navigation, &nsdoc);
149     if(NS_FAILED(nsres))
150         ERR("GetDocument failed: %08x\n", nsres);
151
152     if(nsdoc) {
153         nsres = nsIDOMHTMLDocument_GetDocumentElement(nsdoc, &nselem);
154         if(NS_FAILED(nsres))
155             ERR("GetDocumentElement failed: %08x\n", nsres);
156     }
157     if(nselem) {
158         node = get_node(This, (nsIDOMNode *)nselem, TRUE);
159         nsIDOMDocument_Release(nsdoc);
160
161         IHTMLDOMNode_QueryInterface(HTMLDOMNODE(node), &IID_IHTMLElement, (void**)p);
162     }else {
163         *p = NULL;
164     }
165
166     return S_OK;
167 }
168
169 static HRESULT WINAPI HTMLDocument3_uniqueID(IHTMLDocument3 *iface, BSTR *p)
170 {
171     HTMLDocument *This = HTMLDOC3_THIS(iface);
172     FIXME("(%p)->(%p)\n", This, p);
173     return E_NOTIMPL;
174 }
175
176 static HRESULT WINAPI HTMLDocument3_attachEvent(IHTMLDocument3 *iface, BSTR event,
177                                                 IDispatch* pDisp, VARIANT_BOOL *pfResult)
178 {
179     HTMLDocument *This = HTMLDOC3_THIS(iface);
180     FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(event), pDisp, pfResult);
181     return E_NOTIMPL;
182 }
183
184 static HRESULT WINAPI HTMLDocument3_detachEvent(IHTMLDocument3 *iface, BSTR event,
185                                                 IDispatch *pDisp)
186 {
187     HTMLDocument *This = HTMLDOC3_THIS(iface);
188     FIXME("(%p)->(%s %p)\n", This, debugstr_w(event), pDisp);
189     return E_NOTIMPL;
190 }
191
192 static HRESULT WINAPI HTMLDocument3_put_onrowsdelete(IHTMLDocument3 *iface, VARIANT v)
193 {
194     HTMLDocument *This = HTMLDOC3_THIS(iface);
195     FIXME("(%p)->()\n", This);
196     return E_NOTIMPL;
197 }
198
199 static HRESULT WINAPI HTMLDocument3_get_onrowsdelete(IHTMLDocument3 *iface, VARIANT *p)
200 {
201     HTMLDocument *This = HTMLDOC3_THIS(iface);
202     FIXME("(%p)->(%p)\n", This, p);
203     return E_NOTIMPL;
204 }
205
206 static HRESULT WINAPI HTMLDocument3_put_onrowsinserted(IHTMLDocument3 *iface, VARIANT v)
207 {
208     HTMLDocument *This = HTMLDOC3_THIS(iface);
209     FIXME("(%p)->()\n", This);
210     return E_NOTIMPL;
211 }
212
213 static HRESULT WINAPI HTMLDocument3_get_onrowsinserted(IHTMLDocument3 *iface, VARIANT *p)
214 {
215     HTMLDocument *This = HTMLDOC3_THIS(iface);
216     FIXME("(%p)->(%p)\n", This, p);
217     return E_NOTIMPL;
218 }
219
220 static HRESULT WINAPI HTMLDocument3_put_oncellchange(IHTMLDocument3 *iface, VARIANT v)
221 {
222     HTMLDocument *This = HTMLDOC3_THIS(iface);
223     FIXME("(%p)->()\n", This);
224     return E_NOTIMPL;
225 }
226
227 static HRESULT WINAPI HTMLDocument3_get_oncellchange(IHTMLDocument3 *iface, VARIANT *p)
228 {
229     HTMLDocument *This = HTMLDOC3_THIS(iface);
230     FIXME("(%p)->(%p)\n", This, p);
231     return E_NOTIMPL;
232 }
233
234 static HRESULT WINAPI HTMLDocument3_put_ondatasetchanged(IHTMLDocument3 *iface, VARIANT v)
235 {
236     HTMLDocument *This = HTMLDOC3_THIS(iface);
237     FIXME("(%p)->()\n", This);
238     return E_NOTIMPL;
239 }
240
241 static HRESULT WINAPI HTMLDocument3_get_ondatasetchanged(IHTMLDocument3 *iface, VARIANT *p)
242 {
243     HTMLDocument *This = HTMLDOC3_THIS(iface);
244     FIXME("(%p)->(%p)\n", This, p);
245     return E_NOTIMPL;
246 }
247
248 static HRESULT WINAPI HTMLDocument3_put_ondataavailable(IHTMLDocument3 *iface, VARIANT v)
249 {
250     HTMLDocument *This = HTMLDOC3_THIS(iface);
251     FIXME("(%p)->()\n", This);
252     return E_NOTIMPL;
253 }
254
255 static HRESULT WINAPI HTMLDocument3_get_ondataavailable(IHTMLDocument3 *iface, VARIANT *p)
256 {
257     HTMLDocument *This = HTMLDOC3_THIS(iface);
258     FIXME("(%p)->(%p)\n", This, p);
259     return E_NOTIMPL;
260 }
261
262 static HRESULT WINAPI HTMLDocument3_put_ondatasetcomplete(IHTMLDocument3 *iface, VARIANT v)
263 {
264     HTMLDocument *This = HTMLDOC3_THIS(iface);
265     FIXME("(%p)->()\n", This);
266     return E_NOTIMPL;
267 }
268
269 static HRESULT WINAPI HTMLDocument3_get_ondatasetcomplete(IHTMLDocument3 *iface, VARIANT *p)
270 {
271     HTMLDocument *This = HTMLDOC3_THIS(iface);
272     FIXME("(%p)->(%p)\n", This, p);
273     return E_NOTIMPL;
274 }
275
276 static HRESULT WINAPI HTMLDocument3_put_onpropertychange(IHTMLDocument3 *iface, VARIANT v)
277 {
278     HTMLDocument *This = HTMLDOC3_THIS(iface);
279     FIXME("(%p)->()\n", This);
280     return E_NOTIMPL;
281 }
282
283 static HRESULT WINAPI HTMLDocument3_get_onpropertychange(IHTMLDocument3 *iface, VARIANT *p)
284 {
285     HTMLDocument *This = HTMLDOC3_THIS(iface);
286     FIXME("(%p)->(%p)\n", This, p);
287     return E_NOTIMPL;
288 }
289
290 static HRESULT WINAPI HTMLDocument3_put_dir(IHTMLDocument3 *iface, BSTR v)
291 {
292     HTMLDocument *This = HTMLDOC3_THIS(iface);
293     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
294     return E_NOTIMPL;
295 }
296
297 static HRESULT WINAPI HTMLDocument3_get_dir(IHTMLDocument3 *iface, BSTR *p)
298 {
299     HTMLDocument *This = HTMLDOC3_THIS(iface);
300     FIXME("(%p)->(%p)\n", This, p);
301     return E_NOTIMPL;
302 }
303
304 static HRESULT WINAPI HTMLDocument3_put_oncontextmenu(IHTMLDocument3 *iface, VARIANT v)
305 {
306     HTMLDocument *This = HTMLDOC3_THIS(iface);
307     FIXME("(%p)->()\n", This);
308     return E_NOTIMPL;
309 }
310
311 static HRESULT WINAPI HTMLDocument3_get_oncontextmenu(IHTMLDocument3 *iface, VARIANT *p)
312 {
313     HTMLDocument *This = HTMLDOC3_THIS(iface);
314     FIXME("(%p)->(%p)\n", This, p);
315     return E_NOTIMPL;
316 }
317
318 static HRESULT WINAPI HTMLDocument3_put_onstop(IHTMLDocument3 *iface, VARIANT v)
319 {
320     HTMLDocument *This = HTMLDOC3_THIS(iface);
321     FIXME("(%p)->()\n", This);
322     return E_NOTIMPL;
323 }
324
325 static HRESULT WINAPI HTMLDocument3_get_onstop(IHTMLDocument3 *iface, VARIANT *p)
326 {
327     HTMLDocument *This = HTMLDOC3_THIS(iface);
328     FIXME("(%p)->(%p)\n", This, p);
329     return E_NOTIMPL;
330 }
331
332 static HRESULT WINAPI HTMLDocument3_createDocumentFragment(IHTMLDocument3 *iface,
333                                                            IHTMLDocument2 **ppNewDoc)
334 {
335     HTMLDocument *This = HTMLDOC3_THIS(iface);
336     FIXME("(%p)->(%p)\n", This, ppNewDoc);
337     return E_NOTIMPL;
338 }
339
340 static HRESULT WINAPI HTMLDocument3_get_parentDocument(IHTMLDocument3 *iface,
341                                                        IHTMLDocument2 **p)
342 {
343     HTMLDocument *This = HTMLDOC3_THIS(iface);
344     FIXME("(%p)->(%p)\n", This, p);
345     return E_NOTIMPL;
346 }
347
348 static HRESULT WINAPI HTMLDocument3_put_enableDownload(IHTMLDocument3 *iface,
349                                                        VARIANT_BOOL v)
350 {
351     HTMLDocument *This = HTMLDOC3_THIS(iface);
352     FIXME("(%p)->(%x)\n", This, v);
353     return E_NOTIMPL;
354 }
355
356 static HRESULT WINAPI HTMLDocument3_get_enableDownload(IHTMLDocument3 *iface,
357                                                        VARIANT_BOOL *p)
358 {
359     HTMLDocument *This = HTMLDOC3_THIS(iface);
360     FIXME("(%p)->(%p)\n", This, p);
361     return E_NOTIMPL;
362 }
363
364 static HRESULT WINAPI HTMLDocument3_put_baseUrl(IHTMLDocument3 *iface, BSTR v)
365 {
366     HTMLDocument *This = HTMLDOC3_THIS(iface);
367     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
368     return E_NOTIMPL;
369 }
370
371 static HRESULT WINAPI HTMLDocument3_get_baseUrl(IHTMLDocument3 *iface, BSTR *p)
372 {
373     HTMLDocument *This = HTMLDOC3_THIS(iface);
374     FIXME("(%p)->(%p)\n", This, p);
375     return E_NOTIMPL;
376 }
377
378 static HRESULT WINAPI HTMLDocument3_get_childNodes(IHTMLDocument3 *iface, IDispatch **p)
379 {
380     HTMLDocument *This = HTMLDOC3_THIS(iface);
381     FIXME("(%p)->(%p)\n", This, p);
382     return E_NOTIMPL;
383 }
384
385 static HRESULT WINAPI HTMLDocument3_put_inheritStyleSheets(IHTMLDocument3 *iface,
386                                                            VARIANT_BOOL v)
387 {
388     HTMLDocument *This = HTMLDOC3_THIS(iface);
389     FIXME("(%p)->()\n", This);
390     return E_NOTIMPL;
391 }
392
393 static HRESULT WINAPI HTMLDocument3_get_inheritStyleSheets(IHTMLDocument3 *iface,
394                                                            VARIANT_BOOL *p)
395 {
396     HTMLDocument *This = HTMLDOC3_THIS(iface);
397     FIXME("(%p)->(%p)\n", This, p);
398     return E_NOTIMPL;
399 }
400
401 static HRESULT WINAPI HTMLDocument3_put_onbeforeeditfocus(IHTMLDocument3 *iface, VARIANT v)
402 {
403     HTMLDocument *This = HTMLDOC3_THIS(iface);
404     FIXME("(%p)->()\n", This);
405     return E_NOTIMPL;
406 }
407
408 static HRESULT WINAPI HTMLDocument3_get_onbeforeeditfocus(IHTMLDocument3 *iface, VARIANT *p)
409 {
410     HTMLDocument *This = HTMLDOC3_THIS(iface);
411     FIXME("(%p)->(%p)\n", This, p);
412     return E_NOTIMPL;
413 }
414
415 static HRESULT WINAPI HTMLDocument3_getElementsByName(IHTMLDocument3 *iface, BSTR v,
416                                                       IHTMLElementCollection **ppelColl)
417 {
418     HTMLDocument *This = HTMLDOC3_THIS(iface);
419     FIXME("(%p)->(%s %p)\n", This, debugstr_w(v), ppelColl);
420     return E_NOTIMPL;
421 }
422
423
424 static HRESULT WINAPI HTMLDocument3_getElementById(IHTMLDocument3 *iface, BSTR v,
425                                                    IHTMLElement **pel)
426 {
427     HTMLDocument *This = HTMLDOC3_THIS(iface);
428     nsIDOMDocument *nsdoc = NULL;
429     nsIDOMElement *nselem = NULL;
430     HTMLDOMNode *node;
431     nsAString id_str;
432     nsresult nsres;
433
434     TRACE("(%p)->(%s %p)\n", This, debugstr_w(v), pel);
435
436     *pel = NULL;
437
438     if(!This->nscontainer)
439         return S_OK;
440
441     nsres = nsIWebNavigation_GetDocument(This->nscontainer->navigation, &nsdoc);
442     if(NS_FAILED(nsres) || !nsdoc)
443         return S_OK;
444
445     nsAString_Init(&id_str, v);
446     nsIDOMDocument_GetElementById(nsdoc, &id_str, &nselem);
447     nsIDOMDocument_Release(nsdoc);
448     nsAString_Finish(&id_str);
449
450     if(!nselem) {
451         *pel = NULL;
452         return S_OK;
453     }
454
455     node = get_node(This, (nsIDOMNode*)nselem, TRUE);
456     nsIDOMElement_Release(nselem);
457
458     return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(node), &IID_IHTMLElement, (void**)pel);
459 }
460
461
462 static HRESULT WINAPI HTMLDocument3_getElementsByTagName(IHTMLDocument3 *iface, BSTR v,
463                                                          IHTMLElementCollection **pelColl)
464 {
465     HTMLDocument *This = HTMLDOC3_THIS(iface);
466     FIXME("(%p)->(%s %p)\n", This, debugstr_w(v), pelColl);
467     return E_NOTIMPL;
468 }
469
470 #undef HTMLDOC3_THIS
471
472 static const IHTMLDocument3Vtbl HTMLDocument3Vtbl = {
473     HTMLDocument3_QueryInterface,
474     HTMLDocument3_AddRef,
475     HTMLDocument3_Release,
476     HTMLDocument3_GetTypeInfoCount,
477     HTMLDocument3_GetTypeInfo,
478     HTMLDocument3_GetIDsOfNames,
479     HTMLDocument3_Invoke,
480     HTMLDocument3_releaseCapture,
481     HTMLDocument3_recalc,
482     HTMLDocument3_createTextNode,
483     HTMLDocument3_get_documentElement,
484     HTMLDocument3_uniqueID,
485     HTMLDocument3_attachEvent,
486     HTMLDocument3_detachEvent,
487     HTMLDocument3_put_onrowsdelete,
488     HTMLDocument3_get_onrowsdelete,
489     HTMLDocument3_put_onrowsinserted,
490     HTMLDocument3_get_onrowsinserted,
491     HTMLDocument3_put_oncellchange,
492     HTMLDocument3_get_oncellchange,
493     HTMLDocument3_put_ondatasetchanged,
494     HTMLDocument3_get_ondatasetchanged,
495     HTMLDocument3_put_ondataavailable,
496     HTMLDocument3_get_ondataavailable,
497     HTMLDocument3_put_ondatasetcomplete,
498     HTMLDocument3_get_ondatasetcomplete,
499     HTMLDocument3_put_onpropertychange,
500     HTMLDocument3_get_onpropertychange,
501     HTMLDocument3_put_dir,
502     HTMLDocument3_get_dir,
503     HTMLDocument3_put_oncontextmenu,
504     HTMLDocument3_get_oncontextmenu,
505     HTMLDocument3_put_onstop,
506     HTMLDocument3_get_onstop,
507     HTMLDocument3_createDocumentFragment,
508     HTMLDocument3_get_parentDocument,
509     HTMLDocument3_put_enableDownload,
510     HTMLDocument3_get_enableDownload,
511     HTMLDocument3_put_baseUrl,
512     HTMLDocument3_get_baseUrl,
513     HTMLDocument3_get_childNodes,
514     HTMLDocument3_put_inheritStyleSheets,
515     HTMLDocument3_get_inheritStyleSheets,
516     HTMLDocument3_put_onbeforeeditfocus,
517     HTMLDocument3_get_onbeforeeditfocus,
518     HTMLDocument3_getElementsByName,
519     HTMLDocument3_getElementById,
520     HTMLDocument3_getElementsByTagName
521 };
522
523 #define HTMLDOC4_THIS(iface) DEFINE_THIS(HTMLDocument, HTMLDocument4, iface)
524
525 static HRESULT WINAPI HTMLDocument4_QueryInterface(IHTMLDocument4 *iface,
526                                                    REFIID riid, void **ppv)
527 {
528     HTMLDocument *This = HTMLDOC4_THIS(iface);
529     return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppv);
530 }
531
532 static ULONG WINAPI HTMLDocument4_AddRef(IHTMLDocument4 *iface)
533 {
534     HTMLDocument *This = HTMLDOC4_THIS(iface);
535     return IHTMLDocument2_AddRef(HTMLDOC(This));
536 }
537
538 static ULONG WINAPI HTMLDocument4_Release(IHTMLDocument4 *iface)
539 {
540     HTMLDocument *This = HTMLDOC4_THIS(iface);
541     return IHTMLDocument2_Release(HTMLDOC(This));
542 }
543
544 static HRESULT WINAPI HTMLDocument4_GetTypeInfoCount(IHTMLDocument4 *iface, UINT *pctinfo)
545 {
546     HTMLDocument *This = HTMLDOC4_THIS(iface);
547     return IDispatchEx_GetTypeInfoCount(DISPATCHEX(This), pctinfo);
548 }
549
550 static HRESULT WINAPI HTMLDocument4_GetTypeInfo(IHTMLDocument4 *iface, UINT iTInfo,
551                                                 LCID lcid, ITypeInfo **ppTInfo)
552 {
553     HTMLDocument *This = HTMLDOC4_THIS(iface);
554     return IDispatchEx_GetTypeInfo(DISPATCHEX(This), iTInfo, lcid, ppTInfo);
555 }
556
557 static HRESULT WINAPI HTMLDocument4_GetIDsOfNames(IHTMLDocument4 *iface, REFIID riid,
558                                                 LPOLESTR *rgszNames, UINT cNames,
559                                                 LCID lcid, DISPID *rgDispId)
560 {
561     HTMLDocument *This = HTMLDOC4_THIS(iface);
562     return IDispatchEx_GetIDsOfNames(DISPATCHEX(This), riid, rgszNames, cNames, lcid, rgDispId);
563 }
564
565 static HRESULT WINAPI HTMLDocument4_Invoke(IHTMLDocument4 *iface, DISPID dispIdMember,
566                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
567                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
568 {
569     HTMLDocument *This = HTMLDOC4_THIS(iface);
570     return IDispatchEx_Invoke(DISPATCHEX(This), dispIdMember, riid, lcid, wFlags, pDispParams,
571             pVarResult, pExcepInfo, puArgErr);
572 }
573
574 static HRESULT WINAPI HTMLDocument4_focus(IHTMLDocument4 *iface)
575 {
576     HTMLDocument *This = HTMLDOC4_THIS(iface);
577     FIXME("(%p)->()\n", This);
578     return E_NOTIMPL;
579 }
580
581 static HRESULT WINAPI HTMLDocument4_hasFocus(IHTMLDocument4 *iface, VARIANT_BOOL *pfFocus)
582 {
583     HTMLDocument *This = HTMLDOC4_THIS(iface);
584     FIXME("(%p)->(%p)\n", This, pfFocus);
585     return E_NOTIMPL;
586 }
587
588 static HRESULT WINAPI HTMLDocument4_put_onselectionchange(IHTMLDocument4 *iface, VARIANT v)
589 {
590     HTMLDocument *This = HTMLDOC4_THIS(iface);
591     FIXME("(%p)->(v)\n", This);
592     return E_NOTIMPL;
593 }
594
595 static HRESULT WINAPI HTMLDocument4_get_onselectionchange(IHTMLDocument4 *iface, VARIANT *p)
596 {
597     HTMLDocument *This = HTMLDOC4_THIS(iface);
598     FIXME("(%p)->(%p)\n", This, p);
599     return E_NOTIMPL;
600 }
601
602 static HRESULT WINAPI HTMLDocument4_get_namespace(IHTMLDocument4 *iface, IDispatch **p)
603 {
604     HTMLDocument *This = HTMLDOC4_THIS(iface);
605     FIXME("(%p)->(%p)\n", This, p);
606     return E_NOTIMPL;
607 }
608
609 static HRESULT WINAPI HTMLDocument4_createDocumentFromUrl(IHTMLDocument4 *iface, BSTR bstrUrl,
610         BSTR bstrOptions, IHTMLDocument2 **newDoc)
611 {
612     HTMLDocument *This = HTMLDOC4_THIS(iface);
613     FIXME("(%p)->(%s %s %p)\n", This, debugstr_w(bstrUrl), debugstr_w(bstrOptions), newDoc);
614     return E_NOTIMPL;
615 }
616
617 static HRESULT WINAPI HTMLDocument4_put_media(IHTMLDocument4 *iface, BSTR v)
618 {
619     HTMLDocument *This = HTMLDOC4_THIS(iface);
620     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
621     return E_NOTIMPL;
622 }
623
624 static HRESULT WINAPI HTMLDocument4_get_media(IHTMLDocument4 *iface, BSTR *p)
625 {
626     HTMLDocument *This = HTMLDOC4_THIS(iface);
627     FIXME("(%p)->(%p)\n", This, p);
628     return E_NOTIMPL;
629 }
630
631 static HRESULT WINAPI HTMLDocument4_createEventObject(IHTMLDocument4 *iface,
632         VARIANT *pvarEventObject, IHTMLEventObj **ppEventObj)
633 {
634     HTMLDocument *This = HTMLDOC4_THIS(iface);
635     FIXME("(%p)->(%p %p)\n", This, pvarEventObject, ppEventObj);
636     return E_NOTIMPL;
637 }
638
639 static HRESULT WINAPI HTMLDocument4_fireEvent(IHTMLDocument4 *iface, BSTR bstrEventName,
640         VARIANT *pvarEventObject, VARIANT_BOOL *pfCanceled)
641 {
642     HTMLDocument *This = HTMLDOC4_THIS(iface);
643     FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(bstrEventName), pvarEventObject, pfCanceled);
644     return E_NOTIMPL;
645 }
646
647 static HRESULT WINAPI HTMLDocument4_createRenderStyle(IHTMLDocument4 *iface, BSTR v,
648         IHTMLRenderStyle **ppIHTMLRenderStyle)
649 {
650     HTMLDocument *This = HTMLDOC4_THIS(iface);
651     FIXME("(%p)->(%s %p)\n", This, debugstr_w(v), ppIHTMLRenderStyle);
652     return E_NOTIMPL;
653 }
654
655 static HRESULT WINAPI HTMLDocument4_put_oncontrolselect(IHTMLDocument4 *iface, VARIANT v)
656 {
657     HTMLDocument *This = HTMLDOC4_THIS(iface);
658     FIXME("(%p)->(v)\n", This);
659     return E_NOTIMPL;
660 }
661
662 static HRESULT WINAPI HTMLDocument4_get_oncontrolselect(IHTMLDocument4 *iface, VARIANT *p)
663 {
664     HTMLDocument *This = HTMLDOC4_THIS(iface);
665     FIXME("(%p)->(%p)\n", This, p);
666     return E_NOTIMPL;
667 }
668
669 static HRESULT WINAPI HTMLDocument4_get_URLEncoded(IHTMLDocument4 *iface, BSTR *p)
670 {
671     HTMLDocument *This = HTMLDOC4_THIS(iface);
672     FIXME("(%p)->(%p)\n", This, p);
673     return E_NOTIMPL;
674 }
675
676 #undef HTMLDOC4_THIS
677
678 static const IHTMLDocument4Vtbl HTMLDocument4Vtbl = {
679     HTMLDocument4_QueryInterface,
680     HTMLDocument4_AddRef,
681     HTMLDocument4_Release,
682     HTMLDocument4_GetTypeInfoCount,
683     HTMLDocument4_GetTypeInfo,
684     HTMLDocument4_GetIDsOfNames,
685     HTMLDocument4_Invoke,
686     HTMLDocument4_focus,
687     HTMLDocument4_hasFocus,
688     HTMLDocument4_put_onselectionchange,
689     HTMLDocument4_get_onselectionchange,
690     HTMLDocument4_get_namespace,
691     HTMLDocument4_createDocumentFromUrl,
692     HTMLDocument4_put_media,
693     HTMLDocument4_get_media,
694     HTMLDocument4_createEventObject,
695     HTMLDocument4_fireEvent,
696     HTMLDocument4_createRenderStyle,
697     HTMLDocument4_put_oncontrolselect,
698     HTMLDocument4_get_oncontrolselect,
699     HTMLDocument4_get_URLEncoded
700 };
701
702 void HTMLDocument_HTMLDocument3_Init(HTMLDocument *This)
703 {
704     This->lpHTMLDocument3Vtbl = &HTMLDocument3Vtbl;
705     This->lpHTMLDocument4Vtbl = &HTMLDocument4Vtbl;
706 }