shell32/tests: Fix a test failure on Vista and higher.
[wine] / dlls / mshtml / htmlwindow.c
1 /*
2  * Copyright 2006 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 <stdarg.h>
20
21 #define COBJMACROS
22
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winuser.h"
26 #include "ole2.h"
27
28 #include "wine/debug.h"
29 #include "wine/unicode.h"
30
31 #include "mshtml_private.h"
32 #include "resource.h"
33
34 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
35
36 static struct list window_list = LIST_INIT(window_list);
37
38 #define HTMLWINDOW2_THIS(iface) DEFINE_THIS(HTMLWindow, HTMLWindow2, iface)
39
40 static HRESULT WINAPI HTMLWindow2_QueryInterface(IHTMLWindow2 *iface, REFIID riid, void **ppv)
41 {
42     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
43
44     *ppv = NULL;
45
46     if(IsEqualGUID(&IID_IUnknown, riid)) {
47         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
48         *ppv = HTMLWINDOW2(This);
49     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
50         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
51         *ppv = HTMLWINDOW2(This);
52     }else if(IsEqualGUID(&IID_IDispatchEx, riid)) {
53         TRACE("(%p)->(IID_IDispatchEx %p)\n", This, ppv);
54         *ppv = DISPATCHEX(This);
55     }else if(IsEqualGUID(&IID_IHTMLFramesCollection2, riid)) {
56         TRACE("(%p)->(IID_IHTMLFramesCollection2 %p)\n", This, ppv);
57         *ppv = HTMLWINDOW2(This);
58     }else if(IsEqualGUID(&IID_IHTMLWindow2, riid)) {
59         TRACE("(%p)->(IID_IHTMLWindow2 %p)\n", This, ppv);
60         *ppv = HTMLWINDOW2(This);
61     }else if(IsEqualGUID(&IID_IHTMLWindow3, riid)) {
62         TRACE("(%p)->(IID_IHTMLWindow2 %p)\n", This, ppv);
63         *ppv = HTMLWINDOW3(This);
64     }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
65         return *ppv ? S_OK : E_NOINTERFACE;
66     }
67
68     if(*ppv) {
69         IUnknown_AddRef((IUnknown*)*ppv);
70         return S_OK;
71     }
72
73     WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
74     return E_NOINTERFACE;
75 }
76
77 static ULONG WINAPI HTMLWindow2_AddRef(IHTMLWindow2 *iface)
78 {
79     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
80     LONG ref = InterlockedIncrement(&This->ref);
81
82     TRACE("(%p) ref=%d\n", This, ref);
83
84     return ref;
85 }
86
87 static ULONG WINAPI HTMLWindow2_Release(IHTMLWindow2 *iface)
88 {
89     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
90     LONG ref = InterlockedDecrement(&This->ref);
91
92     TRACE("(%p) ref=%d\n", This, ref);
93
94     if(!ref) {
95         list_remove(&This->entry);
96         heap_free(This);
97     }
98
99     return ref;
100 }
101
102 static HRESULT WINAPI HTMLWindow2_GetTypeInfoCount(IHTMLWindow2 *iface, UINT *pctinfo)
103 {
104     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
105
106     return IDispatchEx_GetTypeInfoCount(DISPATCHEX(This), pctinfo);
107 }
108
109 static HRESULT WINAPI HTMLWindow2_GetTypeInfo(IHTMLWindow2 *iface, UINT iTInfo,
110                                               LCID lcid, ITypeInfo **ppTInfo)
111 {
112     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
113
114     return IDispatchEx_GetTypeInfo(DISPATCHEX(This), iTInfo, lcid, ppTInfo);
115 }
116
117 static HRESULT WINAPI HTMLWindow2_GetIDsOfNames(IHTMLWindow2 *iface, REFIID riid,
118                                                 LPOLESTR *rgszNames, UINT cNames,
119                                                 LCID lcid, DISPID *rgDispId)
120 {
121     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
122
123     return IDispatchEx_GetIDsOfNames(DISPATCHEX(This), riid, rgszNames, cNames, lcid, rgDispId);
124 }
125
126 static HRESULT WINAPI HTMLWindow2_Invoke(IHTMLWindow2 *iface, DISPID dispIdMember,
127                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
128                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
129 {
130     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
131
132     return IDispatchEx_Invoke(DISPATCHEX(This), dispIdMember, riid, lcid, wFlags, pDispParams,
133             pVarResult, pExcepInfo, puArgErr);
134 }
135
136 static HRESULT WINAPI HTMLWindow2_item(IHTMLWindow2 *iface, VARIANT *pvarIndex, VARIANT *pvarResult)
137 {
138     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
139     FIXME("(%p)->(%p %p)\n", This, pvarIndex, pvarResult);
140     return E_NOTIMPL;
141 }
142
143 static HRESULT WINAPI HTMLWindow2_get_length(IHTMLWindow2 *iface, LONG *p)
144 {
145     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
146     FIXME("(%p)->(%p)\n", This, p);
147     return E_NOTIMPL;
148 }
149
150 static HRESULT WINAPI HTMLWindow2_get_frames(IHTMLWindow2 *iface, IHTMLFramesCollection2 **p)
151 {
152     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
153     FIXME("(%p)->(%p)\n", This, p);
154     return E_NOTIMPL;
155 }
156
157 static HRESULT WINAPI HTMLWindow2_put_defaultStatus(IHTMLWindow2 *iface, BSTR v)
158 {
159     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
160     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
161     return E_NOTIMPL;
162 }
163
164 static HRESULT WINAPI HTMLWindow2_get_defaultStatus(IHTMLWindow2 *iface, BSTR *p)
165 {
166     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
167     FIXME("(%p)->(%p)\n", This, p);
168     return E_NOTIMPL;
169 }
170
171 static HRESULT WINAPI HTMLWindow2_put_status(IHTMLWindow2 *iface, BSTR v)
172 {
173     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
174     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
175     return E_NOTIMPL;
176 }
177
178 static HRESULT WINAPI HTMLWindow2_get_status(IHTMLWindow2 *iface, BSTR *p)
179 {
180     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
181     FIXME("(%p)->(%p)\n", This, p);
182     return E_NOTIMPL;
183 }
184
185 static HRESULT WINAPI HTMLWindow2_setTimeout(IHTMLWindow2 *iface, BSTR expression,
186         LONG msec, VARIANT *language, LONG *timerID)
187 {
188     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
189     VARIANT expr_var;
190
191     TRACE("(%p)->(%s %d %p %p)\n", This, debugstr_w(expression), msec, language, timerID);
192
193     V_VT(&expr_var) = VT_BSTR;
194     V_BSTR(&expr_var) = expression;
195
196     return IHTMLWindow3_setTimeout(HTMLWINDOW3(This), &expr_var, msec, language, timerID);
197 }
198
199 static HRESULT WINAPI HTMLWindow2_clearTimeout(IHTMLWindow2 *iface, LONG timerID)
200 {
201     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
202
203     TRACE("(%p)->(%d)\n", This, timerID);
204
205     return clear_task_timer(This->doc, FALSE, timerID);
206 }
207
208 static HRESULT WINAPI HTMLWindow2_alert(IHTMLWindow2 *iface, BSTR message)
209 {
210     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
211     WCHAR wszTitle[100];
212
213     TRACE("(%p)->(%s)\n", This, debugstr_w(message));
214
215     if(!LoadStringW(get_shdoclc(), IDS_MESSAGE_BOX_TITLE, wszTitle,
216                     sizeof(wszTitle)/sizeof(WCHAR))) {
217         WARN("Could not load message box title: %d\n", GetLastError());
218         return S_OK;
219     }
220
221     MessageBoxW(This->doc->hwnd, message, wszTitle, MB_ICONWARNING);
222     return S_OK;
223 }
224
225 static HRESULT WINAPI HTMLWindow2_confirm(IHTMLWindow2 *iface, BSTR message,
226         VARIANT_BOOL *confirmed)
227 {
228     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
229     WCHAR wszTitle[100];
230
231     TRACE("(%p)->(%s %p)\n", This, debugstr_w(message), confirmed);
232
233     if(!confirmed) return E_INVALIDARG;
234
235     if(!LoadStringW(get_shdoclc(), IDS_MESSAGE_BOX_TITLE, wszTitle,
236                 sizeof(wszTitle)/sizeof(WCHAR))) {
237         WARN("Could not load message box title: %d\n", GetLastError());
238         *confirmed = VARIANT_TRUE;
239         return S_OK;
240     }
241
242     if(MessageBoxW(This->doc->hwnd, message, wszTitle,
243                 MB_OKCANCEL|MB_ICONQUESTION)==IDOK)
244         *confirmed = VARIANT_TRUE;
245     else *confirmed = VARIANT_FALSE;
246
247     return S_OK;
248 }
249
250 typedef struct
251 {
252     BSTR message;
253     BSTR dststr;
254     VARIANT *textdata;
255 }prompt_arg;
256
257 static INT_PTR CALLBACK prompt_dlgproc(HWND hwnd, UINT msg,
258         WPARAM wparam, LPARAM lparam)
259 {
260     switch(msg)
261     {
262         case WM_INITDIALOG:
263         {
264             prompt_arg *arg = (prompt_arg*)lparam;
265             WCHAR wszTitle[100];
266
267             if(!LoadStringW(get_shdoclc(), IDS_MESSAGE_BOX_TITLE, wszTitle,
268                         sizeof(wszTitle)/sizeof(WCHAR))) {
269                 WARN("Could not load message box title: %d\n", GetLastError());
270                 EndDialog(hwnd, wparam);
271                 return FALSE;
272             }
273
274             SetWindowLongPtrW(hwnd, DWLP_USER, lparam);
275             SetWindowTextW(hwnd, wszTitle);
276             SetWindowTextW(GetDlgItem(hwnd, ID_PROMPT_PROMPT), arg->message);
277             SetWindowTextW(GetDlgItem(hwnd, ID_PROMPT_EDIT), arg->dststr);
278             return FALSE;
279         }
280         case WM_COMMAND:
281             switch(wparam)
282             {
283                 case MAKEWPARAM(IDCANCEL, BN_CLICKED):
284                     EndDialog(hwnd, wparam);
285                     return TRUE;
286                 case MAKEWPARAM(IDOK, BN_CLICKED):
287                 {
288                     prompt_arg *arg =
289                         (prompt_arg*)GetWindowLongPtrW(hwnd, DWLP_USER);
290                     HWND hwndPrompt = GetDlgItem(hwnd, ID_PROMPT_EDIT);
291                     INT len = GetWindowTextLengthW(hwndPrompt);
292
293                     if(!arg->textdata)
294                     {
295                         EndDialog(hwnd, wparam);
296                         return TRUE;
297                     }
298
299                     V_VT(arg->textdata) = VT_BSTR;
300                     if(!len && !arg->dststr)
301                         V_BSTR(arg->textdata) = NULL;
302                     else
303                     {
304                         V_BSTR(arg->textdata) = SysAllocStringLen(NULL, len);
305                         GetWindowTextW(hwndPrompt, V_BSTR(arg->textdata), len+1);
306                     }
307                     EndDialog(hwnd, wparam);
308                     return TRUE;
309                 }
310             }
311             return FALSE;
312         case WM_CLOSE:
313             EndDialog(hwnd, IDCANCEL);
314             return TRUE;
315         default:
316             return FALSE;
317     }
318 }
319
320 static HRESULT WINAPI HTMLWindow2_prompt(IHTMLWindow2 *iface, BSTR message,
321         BSTR dststr, VARIANT *textdata)
322 {
323     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
324     prompt_arg arg;
325
326     TRACE("(%p)->(%s %s %p)\n", This, debugstr_w(message), debugstr_w(dststr), textdata);
327
328     if(textdata) V_VT(textdata) = VT_NULL;
329
330     arg.message = message;
331     arg.dststr = dststr;
332     arg.textdata = textdata;
333
334     DialogBoxParamW(hInst, MAKEINTRESOURCEW(ID_PROMPT_DIALOG),
335             This->doc->hwnd, prompt_dlgproc, (LPARAM)&arg);
336     return S_OK;
337 }
338
339 static HRESULT WINAPI HTMLWindow2_get_Image(IHTMLWindow2 *iface, IHTMLImageElementFactory **p)
340 {
341     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
342     FIXME("(%p)->(%p)\n", This, p);
343     return E_NOTIMPL;
344 }
345
346 static HRESULT WINAPI HTMLWindow2_get_location(IHTMLWindow2 *iface, IHTMLLocation **p)
347 {
348     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
349
350     TRACE("(%p)->(%p)\n", This, p);
351
352     if(!This->doc) {
353         FIXME("This->doc is NULL\n");
354         return E_FAIL;
355     }
356
357     return IHTMLDocument2_get_location(HTMLDOC(This->doc), p);
358 }
359
360 static HRESULT WINAPI HTMLWindow2_get_history(IHTMLWindow2 *iface, IOmHistory **p)
361 {
362     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
363     FIXME("(%p)->(%p)\n", This, p);
364     return E_NOTIMPL;
365 }
366
367 static HRESULT WINAPI HTMLWindow2_close(IHTMLWindow2 *iface)
368 {
369     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
370     FIXME("(%p)->()\n", This);
371     return E_NOTIMPL;
372 }
373
374 static HRESULT WINAPI HTMLWindow2_put_opener(IHTMLWindow2 *iface, VARIANT v)
375 {
376     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
377     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
378     return E_NOTIMPL;
379 }
380
381 static HRESULT WINAPI HTMLWindow2_get_opener(IHTMLWindow2 *iface, VARIANT *p)
382 {
383     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
384     FIXME("(%p)->(%p)\n", This, p);
385     return E_NOTIMPL;
386 }
387
388 static HRESULT WINAPI HTMLWindow2_get_navigator(IHTMLWindow2 *iface, IOmNavigator **p)
389 {
390     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
391
392     TRACE("(%p)->(%p)\n", This, p);
393
394     *p = OmNavigator_Create();
395     return S_OK;
396 }
397
398 static HRESULT WINAPI HTMLWindow2_put_name(IHTMLWindow2 *iface, BSTR v)
399 {
400     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
401     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
402     return E_NOTIMPL;
403 }
404
405 static HRESULT WINAPI HTMLWindow2_get_name(IHTMLWindow2 *iface, BSTR *p)
406 {
407     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
408     FIXME("(%p)->(%p)\n", This, p);
409     return E_NOTIMPL;
410 }
411
412 static HRESULT WINAPI HTMLWindow2_get_parent(IHTMLWindow2 *iface, IHTMLWindow2 **p)
413 {
414     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
415     FIXME("(%p)->(%p)\n", This, p);
416     return E_NOTIMPL;
417 }
418
419 static HRESULT WINAPI HTMLWindow2_open(IHTMLWindow2 *iface, BSTR url, BSTR name,
420          BSTR features, VARIANT_BOOL replace, IHTMLWindow2 **pomWindowResult)
421 {
422     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
423     FIXME("(%p)->(%s %s %s %x %p)\n", This, debugstr_w(url), debugstr_w(name),
424           debugstr_w(features), replace, pomWindowResult);
425     return E_NOTIMPL;
426 }
427
428 static HRESULT WINAPI HTMLWindow2_get_self(IHTMLWindow2 *iface, IHTMLWindow2 **p)
429 {
430     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
431
432     TRACE("(%p)->(%p)\n", This, p);
433
434     /* FIXME: We should return kind of proxy window here. */
435     IHTMLWindow2_AddRef(HTMLWINDOW2(This));
436     *p = HTMLWINDOW2(This);
437     return S_OK;
438 }
439
440 static HRESULT WINAPI HTMLWindow2_get_top(IHTMLWindow2 *iface, IHTMLWindow2 **p)
441 {
442     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
443     FIXME("(%p)->(%p)\n", This, p);
444     return E_NOTIMPL;
445 }
446
447 static HRESULT WINAPI HTMLWindow2_get_window(IHTMLWindow2 *iface, IHTMLWindow2 **p)
448 {
449     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
450
451     TRACE("(%p)->(%p)\n", This, p);
452
453     /* FIXME: We should return kind of proxy window here. */
454     IHTMLWindow2_AddRef(HTMLWINDOW2(This));
455     *p = HTMLWINDOW2(This);
456     return S_OK;
457 }
458
459 static HRESULT WINAPI HTMLWindow2_navigate(IHTMLWindow2 *iface, BSTR url)
460 {
461     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
462     FIXME("(%p)->(%s)\n", This, debugstr_w(url));
463     return E_NOTIMPL;
464 }
465
466 static HRESULT WINAPI HTMLWindow2_put_onfocus(IHTMLWindow2 *iface, VARIANT v)
467 {
468     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
469     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
470     return E_NOTIMPL;
471 }
472
473 static HRESULT WINAPI HTMLWindow2_get_onfocus(IHTMLWindow2 *iface, VARIANT *p)
474 {
475     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
476     FIXME("(%p)->(%p)\n", This, p);
477     return E_NOTIMPL;
478 }
479
480 static HRESULT WINAPI HTMLWindow2_put_onblur(IHTMLWindow2 *iface, VARIANT v)
481 {
482     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
483     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
484     return E_NOTIMPL;
485 }
486
487 static HRESULT WINAPI HTMLWindow2_get_onblur(IHTMLWindow2 *iface, VARIANT *p)
488 {
489     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
490     FIXME("(%p)->(%p)\n", This, p);
491     return E_NOTIMPL;
492 }
493
494 static HRESULT WINAPI HTMLWindow2_put_onload(IHTMLWindow2 *iface, VARIANT v)
495 {
496     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
497     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
498     return E_NOTIMPL;
499 }
500
501 static HRESULT WINAPI HTMLWindow2_get_onload(IHTMLWindow2 *iface, VARIANT *p)
502 {
503     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
504     FIXME("(%p)->(%p)\n", This, p);
505     return E_NOTIMPL;
506 }
507
508 static HRESULT WINAPI HTMLWindow2_put_onbeforeunload(IHTMLWindow2 *iface, VARIANT v)
509 {
510     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
511     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
512     return E_NOTIMPL;
513 }
514
515 static HRESULT WINAPI HTMLWindow2_get_onbeforeunload(IHTMLWindow2 *iface, VARIANT *p)
516 {
517     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
518     FIXME("(%p)->(%p)\n", This, p);
519     return E_NOTIMPL;
520 }
521
522 static HRESULT WINAPI HTMLWindow2_put_onunload(IHTMLWindow2 *iface, VARIANT v)
523 {
524     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
525     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
526     return E_NOTIMPL;
527 }
528
529 static HRESULT WINAPI HTMLWindow2_get_onunload(IHTMLWindow2 *iface, VARIANT *p)
530 {
531     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
532     FIXME("(%p)->(%p)\n", This, p);
533     return E_NOTIMPL;
534 }
535
536 static HRESULT WINAPI HTMLWindow2_put_onhelp(IHTMLWindow2 *iface, VARIANT v)
537 {
538     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
539     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
540     return E_NOTIMPL;
541 }
542
543 static HRESULT WINAPI HTMLWindow2_get_onhelp(IHTMLWindow2 *iface, VARIANT *p)
544 {
545     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
546     FIXME("(%p)->(%p)\n", This, p);
547     return E_NOTIMPL;
548 }
549
550 static HRESULT WINAPI HTMLWindow2_put_onerror(IHTMLWindow2 *iface, VARIANT v)
551 {
552     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
553     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
554     return E_NOTIMPL;
555 }
556
557 static HRESULT WINAPI HTMLWindow2_get_onerror(IHTMLWindow2 *iface, VARIANT *p)
558 {
559     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
560     FIXME("(%p)->(%p)\n", This, p);
561     return E_NOTIMPL;
562 }
563
564 static HRESULT WINAPI HTMLWindow2_put_onresize(IHTMLWindow2 *iface, VARIANT v)
565 {
566     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
567     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
568     return E_NOTIMPL;
569 }
570
571 static HRESULT WINAPI HTMLWindow2_get_onresize(IHTMLWindow2 *iface, VARIANT *p)
572 {
573     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
574     FIXME("(%p)->(%p)\n", This, p);
575     return E_NOTIMPL;
576 }
577
578 static HRESULT WINAPI HTMLWindow2_put_onscroll(IHTMLWindow2 *iface, VARIANT v)
579 {
580     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
581     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
582     return E_NOTIMPL;
583 }
584
585 static HRESULT WINAPI HTMLWindow2_get_onscroll(IHTMLWindow2 *iface, VARIANT *p)
586 {
587     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
588     FIXME("(%p)->(%p)\n", This, p);
589     return E_NOTIMPL;
590 }
591
592 static HRESULT WINAPI HTMLWindow2_get_document(IHTMLWindow2 *iface, IHTMLDocument2 **p)
593 {
594     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
595
596     TRACE("(%p)->(%p)\n", This, p);
597
598     if(This->doc) {
599         /* FIXME: We should return a wrapper object here */
600         *p = HTMLDOC(This->doc);
601         IHTMLDocument2_AddRef(*p);
602     }else {
603         *p = NULL;
604     }
605
606     return S_OK;
607 }
608
609 static HRESULT WINAPI HTMLWindow2_get_event(IHTMLWindow2 *iface, IHTMLEventObj **p)
610 {
611     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
612
613     TRACE("(%p)->(%p)\n", This, p);
614
615     if(This->event)
616         IHTMLEventObj_AddRef(This->event);
617     *p = This->event;
618     return S_OK;
619 }
620
621 static HRESULT WINAPI HTMLWindow2_get__newEnum(IHTMLWindow2 *iface, IUnknown **p)
622 {
623     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
624     FIXME("(%p)->(%p)\n", This, p);
625     return E_NOTIMPL;
626 }
627
628 static HRESULT WINAPI HTMLWindow2_showModalDialog(IHTMLWindow2 *iface, BSTR dialog,
629         VARIANT *varArgIn, VARIANT *varOptions, VARIANT *varArgOut)
630 {
631     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
632     FIXME("(%p)->(%s %p %p %p)\n", This, debugstr_w(dialog), varArgIn, varOptions, varArgOut);
633     return E_NOTIMPL;
634 }
635
636 static HRESULT WINAPI HTMLWindow2_showHelp(IHTMLWindow2 *iface, BSTR helpURL, VARIANT helpArg,
637         BSTR features)
638 {
639     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
640     FIXME("(%p)->(%s v(%d) %s)\n", This, debugstr_w(helpURL), V_VT(&helpArg), debugstr_w(features));
641     return E_NOTIMPL;
642 }
643
644 static HRESULT WINAPI HTMLWindow2_get_screen(IHTMLWindow2 *iface, IHTMLScreen **p)
645 {
646     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
647     FIXME("(%p)->(%p)\n", This, p);
648     return E_NOTIMPL;
649 }
650
651 static HRESULT WINAPI HTMLWindow2_get_Option(IHTMLWindow2 *iface, IHTMLOptionElementFactory **p)
652 {
653     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
654
655     TRACE("(%p)->(%p)\n", This, p);
656
657     if(!This->doc->option_factory)
658         This->doc->option_factory = HTMLOptionElementFactory_Create(This->doc);
659
660     *p = HTMLOPTFACTORY(This->doc->option_factory);
661     IHTMLOptionElementFactory_AddRef(*p);
662
663     return S_OK;
664 }
665
666 static HRESULT WINAPI HTMLWindow2_focus(IHTMLWindow2 *iface)
667 {
668     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
669     FIXME("(%p)->()\n", This);
670     return E_NOTIMPL;
671 }
672
673 static HRESULT WINAPI HTMLWindow2_get_closed(IHTMLWindow2 *iface, VARIANT_BOOL *p)
674 {
675     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
676     FIXME("(%p)->(%p)\n", This, p);
677     return E_NOTIMPL;
678 }
679
680 static HRESULT WINAPI HTMLWindow2_blur(IHTMLWindow2 *iface)
681 {
682     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
683     FIXME("(%p)->()\n", This);
684     return E_NOTIMPL;
685 }
686
687 static HRESULT WINAPI HTMLWindow2_scroll(IHTMLWindow2 *iface, LONG x, LONG y)
688 {
689     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
690     FIXME("(%p)->(%d %d)\n", This, x, y);
691     return E_NOTIMPL;
692 }
693
694 static HRESULT WINAPI HTMLWindow2_get_clientInformation(IHTMLWindow2 *iface, IOmNavigator **p)
695 {
696     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
697     FIXME("(%p)->(%p)\n", This, p);
698     return E_NOTIMPL;
699 }
700
701 static HRESULT WINAPI HTMLWindow2_setInterval(IHTMLWindow2 *iface, BSTR expression,
702         LONG msec, VARIANT *language, LONG *timerID)
703 {
704     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
705     VARIANT expr;
706
707     TRACE("(%p)->(%s %d %p %p)\n", This, debugstr_w(expression), msec, language, timerID);
708
709     V_VT(&expr) = VT_BSTR;
710     V_BSTR(&expr) = expression;
711     return IHTMLWindow3_setInterval(HTMLWINDOW3(This), &expr, msec, language, timerID);
712 }
713
714 static HRESULT WINAPI HTMLWindow2_clearInterval(IHTMLWindow2 *iface, LONG timerID)
715 {
716     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
717
718     TRACE("(%p)->(%d)\n", This, timerID);
719
720     return clear_task_timer(This->doc, TRUE, timerID);
721 }
722
723 static HRESULT WINAPI HTMLWindow2_put_offscreenBuffering(IHTMLWindow2 *iface, VARIANT v)
724 {
725     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
726     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
727     return E_NOTIMPL;
728 }
729
730 static HRESULT WINAPI HTMLWindow2_get_offscreenBuffering(IHTMLWindow2 *iface, VARIANT *p)
731 {
732     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
733     FIXME("(%p)->(%p)\n", This, p);
734     return E_NOTIMPL;
735 }
736
737 static HRESULT WINAPI HTMLWindow2_execScript(IHTMLWindow2 *iface, BSTR scode, BSTR language,
738         VARIANT *pvarRet)
739 {
740     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
741     FIXME("(%p)->(%s %s %p)\n", This, debugstr_w(scode), debugstr_w(language), pvarRet);
742     return E_NOTIMPL;
743 }
744
745 static HRESULT WINAPI HTMLWindow2_toString(IHTMLWindow2 *iface, BSTR *String)
746 {
747     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
748     FIXME("(%p)->(%p)\n", This, String);
749     return E_NOTIMPL;
750 }
751
752 static HRESULT WINAPI HTMLWindow2_scrollBy(IHTMLWindow2 *iface, LONG x, LONG y)
753 {
754     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
755     nsresult nsres;
756
757     TRACE("(%p)->(%d %d)\n", This, x, y);
758
759     nsres = nsIDOMWindow_ScrollBy(This->nswindow, x, y);
760     if(NS_FAILED(nsres))
761         ERR("ScrollBy failed: %08x\n", nsres);
762
763     return S_OK;
764 }
765
766 static HRESULT WINAPI HTMLWindow2_scrollTo(IHTMLWindow2 *iface, LONG x, LONG y)
767 {
768     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
769     nsresult nsres;
770
771     TRACE("(%p)->(%d %d)\n", This, x, y);
772
773     nsres = nsIDOMWindow_ScrollTo(This->nswindow, x, y);
774     if(NS_FAILED(nsres))
775         ERR("ScrollTo failed: %08x\n", nsres);
776
777     return S_OK;
778 }
779
780 static HRESULT WINAPI HTMLWindow2_moveTo(IHTMLWindow2 *iface, LONG x, LONG y)
781 {
782     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
783     FIXME("(%p)->(%d %d)\n", This, x, y);
784     return E_NOTIMPL;
785 }
786
787 static HRESULT WINAPI HTMLWindow2_moveBy(IHTMLWindow2 *iface, LONG x, LONG y)
788 {
789     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
790     FIXME("(%p)->(%d %d)\n", This, x, y);
791     return E_NOTIMPL;
792 }
793
794 static HRESULT WINAPI HTMLWindow2_resizeTo(IHTMLWindow2 *iface, LONG x, LONG y)
795 {
796     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
797     FIXME("(%p)->(%d %d)\n", This, x, y);
798     return E_NOTIMPL;
799 }
800
801 static HRESULT WINAPI HTMLWindow2_resizeBy(IHTMLWindow2 *iface, LONG x, LONG y)
802 {
803     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
804     FIXME("(%p)->(%d %d)\n", This, x, y);
805     return E_NOTIMPL;
806 }
807
808 static HRESULT WINAPI HTMLWindow2_get_external(IHTMLWindow2 *iface, IDispatch **p)
809 {
810     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
811
812     TRACE("(%p)->(%p)\n", This, p);
813
814     *p = NULL;
815
816     if(!This->doc->hostui)
817         return S_OK;
818
819     return IDocHostUIHandler_GetExternal(This->doc->hostui, p);
820 }
821
822 #undef HTMLWINDOW2_THIS
823
824 static const IHTMLWindow2Vtbl HTMLWindow2Vtbl = {
825     HTMLWindow2_QueryInterface,
826     HTMLWindow2_AddRef,
827     HTMLWindow2_Release,
828     HTMLWindow2_GetTypeInfoCount,
829     HTMLWindow2_GetTypeInfo,
830     HTMLWindow2_GetIDsOfNames,
831     HTMLWindow2_Invoke,
832     HTMLWindow2_item,
833     HTMLWindow2_get_length,
834     HTMLWindow2_get_frames,
835     HTMLWindow2_put_defaultStatus,
836     HTMLWindow2_get_defaultStatus,
837     HTMLWindow2_put_status,
838     HTMLWindow2_get_status,
839     HTMLWindow2_setTimeout,
840     HTMLWindow2_clearTimeout,
841     HTMLWindow2_alert,
842     HTMLWindow2_confirm,
843     HTMLWindow2_prompt,
844     HTMLWindow2_get_Image,
845     HTMLWindow2_get_location,
846     HTMLWindow2_get_history,
847     HTMLWindow2_close,
848     HTMLWindow2_put_opener,
849     HTMLWindow2_get_opener,
850     HTMLWindow2_get_navigator,
851     HTMLWindow2_put_name,
852     HTMLWindow2_get_name,
853     HTMLWindow2_get_parent,
854     HTMLWindow2_open,
855     HTMLWindow2_get_self,
856     HTMLWindow2_get_top,
857     HTMLWindow2_get_window,
858     HTMLWindow2_navigate,
859     HTMLWindow2_put_onfocus,
860     HTMLWindow2_get_onfocus,
861     HTMLWindow2_put_onblur,
862     HTMLWindow2_get_onblur,
863     HTMLWindow2_put_onload,
864     HTMLWindow2_get_onload,
865     HTMLWindow2_put_onbeforeunload,
866     HTMLWindow2_get_onbeforeunload,
867     HTMLWindow2_put_onunload,
868     HTMLWindow2_get_onunload,
869     HTMLWindow2_put_onhelp,
870     HTMLWindow2_get_onhelp,
871     HTMLWindow2_put_onerror,
872     HTMLWindow2_get_onerror,
873     HTMLWindow2_put_onresize,
874     HTMLWindow2_get_onresize,
875     HTMLWindow2_put_onscroll,
876     HTMLWindow2_get_onscroll,
877     HTMLWindow2_get_document,
878     HTMLWindow2_get_event,
879     HTMLWindow2_get__newEnum,
880     HTMLWindow2_showModalDialog,
881     HTMLWindow2_showHelp,
882     HTMLWindow2_get_screen,
883     HTMLWindow2_get_Option,
884     HTMLWindow2_focus,
885     HTMLWindow2_get_closed,
886     HTMLWindow2_blur,
887     HTMLWindow2_scroll,
888     HTMLWindow2_get_clientInformation,
889     HTMLWindow2_setInterval,
890     HTMLWindow2_clearInterval,
891     HTMLWindow2_put_offscreenBuffering,
892     HTMLWindow2_get_offscreenBuffering,
893     HTMLWindow2_execScript,
894     HTMLWindow2_toString,
895     HTMLWindow2_scrollBy,
896     HTMLWindow2_scrollTo,
897     HTMLWindow2_moveTo,
898     HTMLWindow2_moveBy,
899     HTMLWindow2_resizeTo,
900     HTMLWindow2_resizeBy,
901     HTMLWindow2_get_external
902 };
903
904 #define HTMLWINDOW3_THIS(iface) DEFINE_THIS(HTMLWindow, HTMLWindow3, iface)
905
906 static HRESULT WINAPI HTMLWindow3_QueryInterface(IHTMLWindow3 *iface, REFIID riid, void **ppv)
907 {
908     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
909
910     return IHTMLWindow2_QueryInterface(HTMLWINDOW2(This), riid, ppv);
911 }
912
913 static ULONG WINAPI HTMLWindow3_AddRef(IHTMLWindow3 *iface)
914 {
915     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
916
917     return IHTMLWindow2_AddRef(HTMLWINDOW2(This));
918 }
919
920 static ULONG WINAPI HTMLWindow3_Release(IHTMLWindow3 *iface)
921 {
922     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
923
924     return IHTMLWindow2_Release(HTMLWINDOW2(This));
925 }
926
927 static HRESULT WINAPI HTMLWindow3_GetTypeInfoCount(IHTMLWindow3 *iface, UINT *pctinfo)
928 {
929     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
930
931     return IDispatchEx_GetTypeInfoCount(DISPATCHEX(This), pctinfo);
932 }
933
934 static HRESULT WINAPI HTMLWindow3_GetTypeInfo(IHTMLWindow3 *iface, UINT iTInfo,
935                                               LCID lcid, ITypeInfo **ppTInfo)
936 {
937     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
938
939     return IDispatchEx_GetTypeInfo(DISPATCHEX(This), iTInfo, lcid, ppTInfo);
940 }
941
942 static HRESULT WINAPI HTMLWindow3_GetIDsOfNames(IHTMLWindow3 *iface, REFIID riid,
943                                                 LPOLESTR *rgszNames, UINT cNames,
944                                                 LCID lcid, DISPID *rgDispId)
945 {
946     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
947
948     return IDispatchEx_GetIDsOfNames(DISPATCHEX(This), riid, rgszNames, cNames, lcid, rgDispId);
949 }
950
951 static HRESULT WINAPI HTMLWindow3_Invoke(IHTMLWindow3 *iface, DISPID dispIdMember,
952                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
953                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
954 {
955     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
956
957     return IDispatchEx_Invoke(DISPATCHEX(This), dispIdMember, riid, lcid, wFlags, pDispParams,
958             pVarResult, pExcepInfo, puArgErr);
959 }
960
961 static HRESULT WINAPI HTMLWindow3_get_screenLeft(IHTMLWindow3 *iface, LONG *p)
962 {
963     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
964     FIXME("(%p)->(%p)\n", This, p);
965     return E_NOTIMPL;
966 }
967
968 static HRESULT WINAPI HTMLWindow3_get_screenTop(IHTMLWindow3 *iface, LONG *p)
969 {
970     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
971     FIXME("(%p)->(%p)\n", This, p);
972     return E_NOTIMPL;
973 }
974
975 static HRESULT WINAPI HTMLWindow3_attachEvent(IHTMLWindow3 *iface, BSTR event, IDispatch *pDisp, VARIANT_BOOL *pfResult)
976 {
977     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
978     FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(event), pDisp, pfResult);
979     return E_NOTIMPL;
980 }
981
982 static HRESULT WINAPI HTMLWindow3_detachEvent(IHTMLWindow3 *iface, BSTR event, IDispatch *pDisp)
983 {
984     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
985     FIXME("(%p)->()\n", This);
986     return E_NOTIMPL;
987 }
988
989 static HRESULT window_set_timer(HTMLWindow *This, VARIANT *expr, LONG msec, VARIANT *language,
990         BOOL interval, LONG *timer_id)
991 {
992     IDispatch *disp = NULL;
993
994     switch(V_VT(expr)) {
995     case VT_DISPATCH:
996         disp = V_DISPATCH(expr);
997         IDispatch_AddRef(disp);
998         break;
999
1000     case VT_BSTR:
1001         disp = script_parse_event(This->doc, V_BSTR(expr));
1002         break;
1003
1004     default:
1005         FIXME("unimplemented vt=%d\n", V_VT(expr));
1006         return E_NOTIMPL;
1007     }
1008
1009     if(!disp)
1010         return E_FAIL;
1011
1012     *timer_id = set_task_timer(This->doc, msec, interval, disp);
1013     IDispatch_Release(disp);
1014
1015     return S_OK;
1016 }
1017
1018 static HRESULT WINAPI HTMLWindow3_setTimeout(IHTMLWindow3 *iface, VARIANT *expression, LONG msec,
1019         VARIANT *language, LONG *timerID)
1020 {
1021     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
1022
1023     TRACE("(%p)->(%p(%d) %d %p %p)\n", This, expression, V_VT(expression), msec, language, timerID);
1024
1025     return window_set_timer(This, expression, msec, language, FALSE, timerID);
1026 }
1027
1028 static HRESULT WINAPI HTMLWindow3_setInterval(IHTMLWindow3 *iface, VARIANT *expression, LONG msec,
1029         VARIANT *language, LONG *timerID)
1030 {
1031     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
1032
1033     TRACE("(%p)->(%p %d %p %p)\n", This, expression, msec, language, timerID);
1034
1035     return window_set_timer(This, expression, msec, language, TRUE, timerID);
1036 }
1037
1038 static HRESULT WINAPI HTMLWindow3_print(IHTMLWindow3 *iface)
1039 {
1040     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
1041     FIXME("(%p)\n", This);
1042     return E_NOTIMPL;
1043 }
1044
1045 static HRESULT WINAPI HTMLWindow3_put_onbeforeprint(IHTMLWindow3 *iface, VARIANT v)
1046 {
1047     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
1048     FIXME("(%p)->()\n", This);
1049     return E_NOTIMPL;
1050 }
1051
1052 static HRESULT WINAPI HTMLWindow3_get_onbeforeprint(IHTMLWindow3 *iface, VARIANT *p)
1053 {
1054     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
1055     FIXME("(%p)->(%p)\n", This, p);
1056     return E_NOTIMPL;
1057 }
1058
1059 static HRESULT WINAPI HTMLWindow3_put_onafterprint(IHTMLWindow3 *iface, VARIANT v)
1060 {
1061     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
1062     FIXME("(%p)->()\n", This);
1063     return E_NOTIMPL;
1064 }
1065
1066 static HRESULT WINAPI HTMLWindow3_get_onafterprint(IHTMLWindow3 *iface, VARIANT *p)
1067 {
1068     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
1069     FIXME("(%p)->(%p)\n", This, p);
1070     return E_NOTIMPL;
1071 }
1072
1073 static HRESULT WINAPI HTMLWindow3_get_clipboardData(IHTMLWindow3 *iface, IHTMLDataTransfer **p)
1074 {
1075     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
1076     FIXME("(%p)->(%p)\n", This, p);
1077     return E_NOTIMPL;
1078 }
1079
1080 static HRESULT WINAPI HTMLWindow3_showModelessDialog(IHTMLWindow3 *iface, BSTR url,
1081         VARIANT *varArgIn, VARIANT *options, IHTMLWindow2 **pDialog)
1082 {
1083     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
1084     FIXME("(%p)->(%s %p %p %p)\n", This, debugstr_w(url), varArgIn, options, pDialog);
1085     return E_NOTIMPL;
1086 }
1087
1088 #undef HTMLWINDOW3_THIS
1089
1090 static const IHTMLWindow3Vtbl HTMLWindow3Vtbl = {
1091     HTMLWindow3_QueryInterface,
1092     HTMLWindow3_AddRef,
1093     HTMLWindow3_Release,
1094     HTMLWindow3_GetTypeInfoCount,
1095     HTMLWindow3_GetTypeInfo,
1096     HTMLWindow3_GetIDsOfNames,
1097     HTMLWindow3_Invoke,
1098     HTMLWindow3_get_screenLeft,
1099     HTMLWindow3_get_screenTop,
1100     HTMLWindow3_attachEvent,
1101     HTMLWindow3_detachEvent,
1102     HTMLWindow3_setTimeout,
1103     HTMLWindow3_setInterval,
1104     HTMLWindow3_print,
1105     HTMLWindow3_put_onbeforeprint,
1106     HTMLWindow3_get_onbeforeprint,
1107     HTMLWindow3_put_onafterprint,
1108     HTMLWindow3_get_onafterprint,
1109     HTMLWindow3_get_clipboardData,
1110     HTMLWindow3_showModelessDialog
1111 };
1112
1113 #define DISPEX_THIS(iface) DEFINE_THIS(HTMLWindow, IDispatchEx, iface)
1114
1115 static HRESULT WINAPI WindowDispEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
1116 {
1117     HTMLWindow *This = DISPEX_THIS(iface);
1118
1119     return IHTMLWindow2_QueryInterface(HTMLWINDOW2(This), riid, ppv);
1120 }
1121
1122 static ULONG WINAPI WindowDispEx_AddRef(IDispatchEx *iface)
1123 {
1124     HTMLWindow *This = DISPEX_THIS(iface);
1125
1126     return IHTMLWindow2_AddRef(HTMLWINDOW2(This));
1127 }
1128
1129 static ULONG WINAPI WindowDispEx_Release(IDispatchEx *iface)
1130 {
1131     HTMLWindow *This = DISPEX_THIS(iface);
1132
1133     return IHTMLWindow2_Release(HTMLWINDOW2(This));
1134 }
1135
1136 static HRESULT WINAPI WindowDispEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
1137 {
1138     HTMLWindow *This = DISPEX_THIS(iface);
1139
1140     TRACE("(%p)->(%p)\n", This, pctinfo);
1141
1142     return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->dispex), pctinfo);
1143 }
1144
1145 static HRESULT WINAPI WindowDispEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
1146                                                LCID lcid, ITypeInfo **ppTInfo)
1147 {
1148     HTMLWindow *This = DISPEX_THIS(iface);
1149
1150     TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
1151
1152     return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->dispex), iTInfo, lcid, ppTInfo);
1153 }
1154
1155 static HRESULT WINAPI WindowDispEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
1156                                                  LPOLESTR *rgszNames, UINT cNames,
1157                                                  LCID lcid, DISPID *rgDispId)
1158 {
1159     HTMLWindow *This = DISPEX_THIS(iface);
1160
1161     TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
1162           lcid, rgDispId);
1163
1164     /* FIXME: Use script dispatch */
1165
1166     return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->dispex), riid, rgszNames, cNames, lcid, rgDispId);
1167 }
1168
1169 static HRESULT WINAPI WindowDispEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
1170                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1171                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1172 {
1173     HTMLWindow *This = DISPEX_THIS(iface);
1174
1175     TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
1176           lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
1177
1178     /* FIXME: Use script dispatch */
1179
1180     return IDispatchEx_Invoke(DISPATCHEX(&This->dispex), dispIdMember, riid, lcid, wFlags, pDispParams,
1181                               pVarResult, pExcepInfo, puArgErr);
1182 }
1183
1184 static HRESULT WINAPI WindowDispEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
1185 {
1186     HTMLWindow *This = DISPEX_THIS(iface);
1187
1188     TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid);
1189
1190     return IDispatchEx_GetDispID(DISPATCHEX(&This->dispex), bstrName, grfdex, pid);
1191 }
1192
1193 static HRESULT WINAPI WindowDispEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1194         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1195 {
1196     HTMLWindow *This = DISPEX_THIS(iface);
1197
1198     TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
1199
1200     return IDispatchEx_InvokeEx(DISPATCHEX(&This->dispex), id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
1201 }
1202
1203 static HRESULT WINAPI WindowDispEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
1204 {
1205     HTMLWindow *This = DISPEX_THIS(iface);
1206
1207     TRACE("(%p)->(%s %x)\n", This, debugstr_w(bstrName), grfdex);
1208
1209     return IDispatchEx_DeleteMemberByName(DISPATCHEX(&This->dispex), bstrName, grfdex);
1210 }
1211
1212 static HRESULT WINAPI WindowDispEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
1213 {
1214     HTMLWindow *This = DISPEX_THIS(iface);
1215
1216     TRACE("(%p)->(%x)\n", This, id);
1217
1218     return IDispatchEx_DeleteMemberByDispID(DISPATCHEX(&This->dispex), id);
1219 }
1220
1221 static HRESULT WINAPI WindowDispEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
1222 {
1223     HTMLWindow *This = DISPEX_THIS(iface);
1224
1225     TRACE("(%p)->(%x %x %p)\n", This, id, grfdexFetch, pgrfdex);
1226
1227     return IDispatchEx_GetMemberProperties(DISPATCHEX(&This->dispex), id, grfdexFetch, pgrfdex);
1228 }
1229
1230 static HRESULT WINAPI WindowDispEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
1231 {
1232     HTMLWindow *This = DISPEX_THIS(iface);
1233
1234     TRACE("(%p)->(%x %p)\n", This, id, pbstrName);
1235
1236     return IDispatchEx_GetMemberName(DISPATCHEX(&This->dispex), id, pbstrName);
1237 }
1238
1239 static HRESULT WINAPI WindowDispEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
1240 {
1241     HTMLWindow *This = DISPEX_THIS(iface);
1242
1243     TRACE("(%p)->(%x %x %p)\n", This, grfdex, id, pid);
1244
1245     return IDispatchEx_GetNextDispID(DISPATCHEX(&This->dispex), grfdex, id, pid);
1246 }
1247
1248 static HRESULT WINAPI WindowDispEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
1249 {
1250     HTMLWindow *This = DISPEX_THIS(iface);
1251
1252     TRACE("(%p)->(%p)\n", This, ppunk);
1253
1254     *ppunk = NULL;
1255     return S_OK;
1256 }
1257
1258 #undef DISPEX_THIS
1259
1260 static const IDispatchExVtbl WindowDispExVtbl = {
1261     WindowDispEx_QueryInterface,
1262     WindowDispEx_AddRef,
1263     WindowDispEx_Release,
1264     WindowDispEx_GetTypeInfoCount,
1265     WindowDispEx_GetTypeInfo,
1266     WindowDispEx_GetIDsOfNames,
1267     WindowDispEx_Invoke,
1268     WindowDispEx_GetDispID,
1269     WindowDispEx_InvokeEx,
1270     WindowDispEx_DeleteMemberByName,
1271     WindowDispEx_DeleteMemberByDispID,
1272     WindowDispEx_GetMemberProperties,
1273     WindowDispEx_GetMemberName,
1274     WindowDispEx_GetNextDispID,
1275     WindowDispEx_GetNameSpaceParent
1276 };
1277
1278 static const tid_t HTMLWindow_iface_tids[] = {
1279     IHTMLWindow2_tid,
1280     IHTMLWindow3_tid,
1281     0
1282 };
1283 static dispex_static_data_t HTMLWindow_dispex = {
1284     NULL,
1285     DispHTMLWindow2_tid,
1286     NULL,
1287     HTMLWindow_iface_tids
1288 };
1289
1290 HRESULT HTMLWindow_Create(HTMLDocument *doc, nsIDOMWindow *nswindow, HTMLWindow **ret)
1291 {
1292     HTMLWindow *window;
1293
1294     window = heap_alloc_zero(sizeof(HTMLWindow));
1295     if(!window)
1296         return E_OUTOFMEMORY;
1297
1298     window->lpHTMLWindow2Vtbl = &HTMLWindow2Vtbl;
1299     window->lpHTMLWindow3Vtbl = &HTMLWindow3Vtbl;
1300     window->lpIDispatchExVtbl = &WindowDispExVtbl;
1301     window->ref = 1;
1302     window->doc = doc;
1303
1304     init_dispex(&window->dispex, (IUnknown*)HTMLWINDOW2(window), &HTMLWindow_dispex);
1305
1306     if(nswindow) {
1307         nsIDOMWindow_AddRef(nswindow);
1308         window->nswindow = nswindow;
1309     }
1310
1311     list_add_head(&window_list, &window->entry);
1312
1313     *ret = window;
1314     return S_OK;
1315 }
1316
1317 HTMLWindow *nswindow_to_window(const nsIDOMWindow *nswindow)
1318 {
1319     HTMLWindow *iter;
1320
1321     LIST_FOR_EACH_ENTRY(iter, &window_list, HTMLWindow, entry) {
1322         if(iter->nswindow == nswindow)
1323             return iter;
1324     }
1325
1326     return NULL;
1327 }