jscript: Don't use DISPPARAMS for internal arguments.
[wine] / dlls / mshtml / htmlwindow.c
1 /*
2  * Copyright 2006-2012 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 #include <assert.h>
21
22 #define COBJMACROS
23
24 #include "windef.h"
25 #include "winbase.h"
26 #include "winuser.h"
27 #include "ole2.h"
28 #include "mshtmdid.h"
29 #include "shlguid.h"
30 #include "shobjidl.h"
31
32 #define NO_SHLWAPI_REG
33 #include "shlwapi.h"
34
35 #include "wine/debug.h"
36
37 #include "mshtml_private.h"
38 #include "htmlevent.h"
39 #include "binding.h"
40 #include "resource.h"
41
42 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
43
44 static struct list window_list = LIST_INIT(window_list);
45
46 static HRESULT window_set_docnode(HTMLOuterWindow*,HTMLDocumentNode*);
47
48 static inline BOOL is_outer_window(HTMLWindow *window)
49 {
50     return &window->outer_window->base == window;
51 }
52
53 static void release_children(HTMLOuterWindow *This)
54 {
55     HTMLOuterWindow *child;
56
57     while(!list_empty(&This->children)) {
58         child = LIST_ENTRY(list_tail(&This->children), HTMLOuterWindow, sibling_entry);
59
60         list_remove(&child->sibling_entry);
61         child->parent = NULL;
62         IHTMLWindow2_Release(&child->base.IHTMLWindow2_iface);
63     }
64 }
65
66 static HRESULT get_location(HTMLOuterWindow *This, HTMLLocation **ret)
67 {
68     if(This->location) {
69         IHTMLLocation_AddRef(&This->location->IHTMLLocation_iface);
70     }else {
71         HRESULT hres;
72
73         hres = HTMLLocation_Create(This, &This->location);
74         if(FAILED(hres))
75             return hres;
76     }
77
78     *ret = This->location;
79     return S_OK;
80 }
81
82 void get_top_window(HTMLOuterWindow *window, HTMLOuterWindow **ret)
83 {
84     HTMLOuterWindow *iter;
85
86     for(iter = window; iter->parent; iter = iter->parent);
87     *ret = iter;
88 }
89
90 static inline HRESULT set_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var)
91 {
92     if(!window->inner_window->doc) {
93         FIXME("No document\n");
94         return E_FAIL;
95     }
96
97     return set_event_handler(&window->inner_window->doc->body_event_target, NULL, window->inner_window->doc, eid, var);
98 }
99
100 static inline HRESULT get_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var)
101 {
102     if(!window->inner_window->doc) {
103         FIXME("No document\n");
104         return E_FAIL;
105     }
106
107     return get_event_handler(&window->inner_window->doc->body_event_target, eid, var);
108 }
109
110 static inline HTMLWindow *impl_from_IHTMLWindow2(IHTMLWindow2 *iface)
111 {
112     return CONTAINING_RECORD(iface, HTMLWindow, IHTMLWindow2_iface);
113 }
114
115 static HRESULT WINAPI HTMLWindow2_QueryInterface(IHTMLWindow2 *iface, REFIID riid, void **ppv)
116 {
117     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
118
119     *ppv = NULL;
120
121     if(IsEqualGUID(&IID_IUnknown, riid)) {
122         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
123         *ppv = &This->IHTMLWindow2_iface;
124     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
125         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
126         *ppv = &This->IHTMLWindow2_iface;
127     }else if(IsEqualGUID(&IID_IDispatchEx, riid)) {
128         TRACE("(%p)->(IID_IDispatchEx %p)\n", This, ppv);
129         *ppv = &This->IDispatchEx_iface;
130     }else if(IsEqualGUID(&IID_IHTMLFramesCollection2, riid)) {
131         TRACE("(%p)->(IID_IHTMLFramesCollection2 %p)\n", This, ppv);
132         *ppv = &This->IHTMLWindow2_iface;
133     }else if(IsEqualGUID(&IID_IHTMLWindow2, riid)) {
134         TRACE("(%p)->(IID_IHTMLWindow2 %p)\n", This, ppv);
135         *ppv = &This->IHTMLWindow2_iface;
136     }else if(IsEqualGUID(&IID_IHTMLWindow3, riid)) {
137         TRACE("(%p)->(IID_IHTMLWindow3 %p)\n", This, ppv);
138         *ppv = &This->IHTMLWindow3_iface;
139     }else if(IsEqualGUID(&IID_IHTMLWindow4, riid)) {
140         TRACE("(%p)->(IID_IHTMLWindow4 %p)\n", This, ppv);
141         *ppv = &This->IHTMLWindow4_iface;
142     }else if(IsEqualGUID(&IID_IHTMLWindow5, riid)) {
143         TRACE("(%p)->(IID_IHTMLWindow5 %p)\n", This, ppv);
144         *ppv = &This->IHTMLWindow5_iface;
145     }else if(IsEqualGUID(&IID_IHTMLWindow6, riid)) {
146         TRACE("(%p)->(IID_IHTMLWindow6 %p)\n", This, ppv);
147         *ppv = &This->IHTMLWindow6_iface;
148     }else if(IsEqualGUID(&IID_IHTMLPrivateWindow, riid)) {
149         TRACE("(%p)->(IID_IHTMLPrivateWindow %p)\n", This, ppv);
150         *ppv = &This->IHTMLPrivateWindow_iface;
151     }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
152         TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
153         *ppv = &This->IServiceProvider_iface;
154     }else if(IsEqualGUID(&IID_ITravelLogClient, riid)) {
155         TRACE("(%p)->(IID_ITravelLogClient %p)\n", This, ppv);
156         *ppv = &This->ITravelLogClient_iface;
157     }else if(dispex_query_interface(&This->inner_window->dispex, riid, ppv)) {
158         assert(!*ppv);
159         return E_NOINTERFACE;
160     }
161
162     if(*ppv) {
163         IUnknown_AddRef((IUnknown*)*ppv);
164         return S_OK;
165     }
166
167     WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
168     return E_NOINTERFACE;
169 }
170
171 static ULONG WINAPI HTMLWindow2_AddRef(IHTMLWindow2 *iface)
172 {
173     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
174     LONG ref = InterlockedIncrement(&This->ref);
175
176     TRACE("(%p) ref=%d\n", This, ref);
177
178     return ref;
179 }
180
181 static void release_outer_window(HTMLOuterWindow *This)
182 {
183     remove_target_tasks(This->task_magic);
184     set_window_bscallback(This, NULL);
185     set_current_mon(This, NULL);
186     window_set_docnode(This, NULL);
187     release_children(This);
188
189     if(This->secmgr)
190         IInternetSecurityManager_Release(This->secmgr);
191
192     if(This->frame_element)
193         This->frame_element->content_window = NULL;
194
195     if(This->image_factory) {
196         This->image_factory->window = NULL;
197         IHTMLImageElementFactory_Release(&This->image_factory->IHTMLImageElementFactory_iface);
198     }
199
200     if(This->location) {
201         This->location->window = NULL;
202         IHTMLLocation_Release(&This->location->IHTMLLocation_iface);
203     }
204
205     if(This->screen)
206         IHTMLScreen_Release(This->screen);
207
208     This->window_ref->window = NULL;
209     windowref_release(This->window_ref);
210
211     if(This->nswindow)
212         nsIDOMWindow_Release(This->nswindow);
213
214     list_remove(&This->entry);
215     heap_free(This);
216 }
217
218 static void release_inner_window(HTMLInnerWindow *This)
219 {
220     unsigned i;
221
222     release_script_hosts(This);
223
224     htmldoc_release(&This->doc->basedoc);
225     release_dispex(&This->dispex);
226
227     for(i=0; i < This->global_prop_cnt; i++)
228         heap_free(This->global_props[i].name);
229     heap_free(This->global_props);
230
231     if(This->option_factory) {
232         This->option_factory->window = NULL;
233         IHTMLOptionElementFactory_Release(&This->option_factory->IHTMLOptionElementFactory_iface);
234     }
235
236     heap_free(This);
237 }
238
239 static ULONG WINAPI HTMLWindow2_Release(IHTMLWindow2 *iface)
240 {
241     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
242     LONG ref = InterlockedDecrement(&This->ref);
243
244     TRACE("(%p) ref=%d\n", This, ref);
245
246     if(!ref) {
247         if(is_outer_window(This))
248             release_outer_window(This->outer_window);
249         else
250             release_inner_window(This->inner_window);
251     }
252
253     return ref;
254 }
255
256 static HRESULT WINAPI HTMLWindow2_GetTypeInfoCount(IHTMLWindow2 *iface, UINT *pctinfo)
257 {
258     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
259
260     return IDispatchEx_GetTypeInfoCount(&This->IDispatchEx_iface, pctinfo);
261 }
262
263 static HRESULT WINAPI HTMLWindow2_GetTypeInfo(IHTMLWindow2 *iface, UINT iTInfo,
264                                               LCID lcid, ITypeInfo **ppTInfo)
265 {
266     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
267
268     return IDispatchEx_GetTypeInfo(&This->IDispatchEx_iface, iTInfo, lcid, ppTInfo);
269 }
270
271 static HRESULT WINAPI HTMLWindow2_GetIDsOfNames(IHTMLWindow2 *iface, REFIID riid,
272                                                 LPOLESTR *rgszNames, UINT cNames,
273                                                 LCID lcid, DISPID *rgDispId)
274 {
275     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
276
277     return IDispatchEx_GetIDsOfNames(&This->IDispatchEx_iface, riid, rgszNames, cNames, lcid,
278             rgDispId);
279 }
280
281 static HRESULT WINAPI HTMLWindow2_Invoke(IHTMLWindow2 *iface, DISPID dispIdMember,
282                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
283                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
284 {
285     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
286
287     return IDispatchEx_Invoke(&This->IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
288             pDispParams, pVarResult, pExcepInfo, puArgErr);
289 }
290
291 static HRESULT get_frame_by_index(nsIDOMWindowCollection *nsFrames, PRUint32 index, HTMLOuterWindow **ret)
292 {
293     PRUint32 length;
294     nsIDOMWindow *nsWindow;
295     nsresult nsres;
296
297     nsres = nsIDOMWindowCollection_GetLength(nsFrames, &length);
298     if(NS_FAILED(nsres)) {
299         FIXME("nsIDOMWindowCollection_GetLength failed: 0x%08x\n", nsres);
300         return E_FAIL;
301     }
302
303     if(index >= length)
304         return DISP_E_MEMBERNOTFOUND;
305
306     nsres = nsIDOMWindowCollection_Item(nsFrames, index, &nsWindow);
307     if(NS_FAILED(nsres)) {
308         FIXME("nsIDOMWindowCollection_Item failed: 0x%08x\n", nsres);
309         return E_FAIL;
310     }
311
312     *ret = nswindow_to_window(nsWindow);
313
314     nsIDOMWindow_Release(nsWindow);
315
316     return S_OK;
317 }
318
319 static HRESULT WINAPI HTMLWindow2_item(IHTMLWindow2 *iface, VARIANT *pvarIndex, VARIANT *pvarResult)
320 {
321     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
322     nsIDOMWindowCollection *nsFrames;
323     HTMLOuterWindow *window = NULL;
324     HRESULT hres = S_OK;
325     nsresult nsres;
326
327     TRACE("(%p)->(%p %p)\n", This, pvarIndex, pvarResult);
328
329     nsres = nsIDOMWindow_GetFrames(This->outer_window->nswindow, &nsFrames);
330     if(NS_FAILED(nsres)) {
331         FIXME("nsIDOMWindow_GetFrames failed: 0x%08x\n", nsres);
332         return E_FAIL;
333     }
334
335     switch(V_VT(pvarIndex)) {
336     case VT_I4: {
337         int index = V_I4(pvarIndex);
338         TRACE("Getting index %d\n", index);
339         if(index < 0)
340             break;
341         hres = get_frame_by_index(nsFrames, index, &window);
342         break;
343     }
344     case VT_UINT: {
345         unsigned int index = V_UINT(pvarIndex);
346         TRACE("Getting index %u\n", index);
347         hres = get_frame_by_index(nsFrames, index, &window);
348         break;
349     }
350     case VT_BSTR: {
351         BSTR str = V_BSTR(pvarIndex);
352         PRUint32 length, i;
353
354         TRACE("Getting name %s\n", wine_dbgstr_w(str));
355
356         nsIDOMWindowCollection_GetLength(nsFrames, &length);
357
358         window = NULL;
359         for(i = 0; i < length && !window; ++i) {
360             HTMLOuterWindow *cur_window;
361             nsIDOMWindow *nsWindow;
362             BSTR id;
363
364             nsres = nsIDOMWindowCollection_Item(nsFrames, i, &nsWindow);
365             if(NS_FAILED(nsres)) {
366                 FIXME("nsIDOMWindowCollection_Item failed: 0x%08x\n", nsres);
367                 hres = E_FAIL;
368                 break;
369             }
370
371             cur_window = nswindow_to_window(nsWindow);
372
373             nsIDOMWindow_Release(nsWindow);
374
375             hres = IHTMLElement_get_id(&cur_window->frame_element->element.IHTMLElement_iface, &id);
376             if(FAILED(hres)) {
377                 FIXME("IHTMLElement_get_id failed: 0x%08x\n", hres);
378                 break;
379             }
380
381             if(!strcmpW(id, str))
382                 window = cur_window;
383
384             SysFreeString(id);
385         }
386         break;
387     }
388     default:
389         hres = E_INVALIDARG;
390     }
391
392     nsIDOMWindowCollection_Release(nsFrames);
393     if(FAILED(hres))
394         return hres;
395     if(!window)
396         return DISP_E_MEMBERNOTFOUND;
397
398     IHTMLWindow2_AddRef(&window->base.IHTMLWindow2_iface);
399     V_VT(pvarResult) = VT_DISPATCH;
400     V_DISPATCH(pvarResult) = (IDispatch*)window;
401     return S_OK;
402 }
403
404 static HRESULT WINAPI HTMLWindow2_get_length(IHTMLWindow2 *iface, LONG *p)
405 {
406     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
407     nsIDOMWindowCollection *nscollection;
408     PRUint32 length;
409     nsresult nsres;
410
411     TRACE("(%p)->(%p)\n", This, p);
412
413     nsres = nsIDOMWindow_GetFrames(This->outer_window->nswindow, &nscollection);
414     if(NS_FAILED(nsres)) {
415         ERR("GetFrames failed: %08x\n", nsres);
416         return E_FAIL;
417     }
418
419     nsres = nsIDOMWindowCollection_GetLength(nscollection, &length);
420     nsIDOMWindowCollection_Release(nscollection);
421     if(NS_FAILED(nsres)) {
422         ERR("GetLength failed: %08x\n", nsres);
423         return E_FAIL;
424     }
425
426     *p = length;
427     return S_OK;
428 }
429
430 static HRESULT WINAPI HTMLWindow2_get_frames(IHTMLWindow2 *iface, IHTMLFramesCollection2 **p)
431 {
432     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
433     FIXME("(%p)->(%p): semi-stub\n", This, p);
434
435     /* FIXME: Should return a separate Window object */
436     *p = (IHTMLFramesCollection2*)&This->IHTMLWindow2_iface;
437     HTMLWindow2_AddRef(iface);
438     return S_OK;
439 }
440
441 static HRESULT WINAPI HTMLWindow2_put_defaultStatus(IHTMLWindow2 *iface, BSTR v)
442 {
443     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
444     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
445     return E_NOTIMPL;
446 }
447
448 static HRESULT WINAPI HTMLWindow2_get_defaultStatus(IHTMLWindow2 *iface, BSTR *p)
449 {
450     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
451     FIXME("(%p)->(%p)\n", This, p);
452     return E_NOTIMPL;
453 }
454
455 static HRESULT WINAPI HTMLWindow2_put_status(IHTMLWindow2 *iface, BSTR v)
456 {
457     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
458
459     WARN("(%p)->(%s)\n", This, debugstr_w(v));
460
461     /*
462      * FIXME: Since IE7, setting status is blocked, but still possible in certain circumstances.
463      * Ignoring the call should be enough for us.
464      */
465     return S_OK;
466 }
467
468 static HRESULT WINAPI HTMLWindow2_get_status(IHTMLWindow2 *iface, BSTR *p)
469 {
470     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
471
472     TRACE("(%p)->(%p)\n", This, p);
473
474     /* See put_status */
475     *p = NULL;
476     return S_OK;
477 }
478
479 static HRESULT WINAPI HTMLWindow2_setTimeout(IHTMLWindow2 *iface, BSTR expression,
480         LONG msec, VARIANT *language, LONG *timerID)
481 {
482     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
483     VARIANT expr_var;
484
485     TRACE("(%p)->(%s %d %p %p)\n", This, debugstr_w(expression), msec, language, timerID);
486
487     V_VT(&expr_var) = VT_BSTR;
488     V_BSTR(&expr_var) = expression;
489
490     return IHTMLWindow3_setTimeout(&This->IHTMLWindow3_iface, &expr_var, msec, language, timerID);
491 }
492
493 static HRESULT WINAPI HTMLWindow2_clearTimeout(IHTMLWindow2 *iface, LONG timerID)
494 {
495     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
496
497     TRACE("(%p)->(%d)\n", This, timerID);
498
499     return clear_task_timer(&This->inner_window->doc->basedoc, FALSE, timerID);
500 }
501
502 #define MAX_MESSAGE_LEN 2000
503
504 static HRESULT WINAPI HTMLWindow2_alert(IHTMLWindow2 *iface, BSTR message)
505 {
506     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
507     WCHAR title[100], *msg = message;
508     DWORD len;
509
510     TRACE("(%p)->(%s)\n", This, debugstr_w(message));
511
512     if(!LoadStringW(get_shdoclc(), IDS_MESSAGE_BOX_TITLE, title,
513                     sizeof(title)/sizeof(WCHAR))) {
514         WARN("Could not load message box title: %d\n", GetLastError());
515         return S_OK;
516     }
517
518     len = SysStringLen(message);
519     if(len > MAX_MESSAGE_LEN) {
520         msg = heap_alloc((MAX_MESSAGE_LEN+1)*sizeof(WCHAR));
521         if(!msg)
522             return E_OUTOFMEMORY;
523         memcpy(msg, message, MAX_MESSAGE_LEN*sizeof(WCHAR));
524         msg[MAX_MESSAGE_LEN] = 0;
525     }
526
527     MessageBoxW(This->outer_window->doc_obj->hwnd, msg, title, MB_ICONWARNING);
528     if(msg != message)
529         heap_free(msg);
530     return S_OK;
531 }
532
533 static HRESULT WINAPI HTMLWindow2_confirm(IHTMLWindow2 *iface, BSTR message,
534         VARIANT_BOOL *confirmed)
535 {
536     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
537     WCHAR wszTitle[100];
538
539     TRACE("(%p)->(%s %p)\n", This, debugstr_w(message), confirmed);
540
541     if(!confirmed) return E_INVALIDARG;
542
543     if(!LoadStringW(get_shdoclc(), IDS_MESSAGE_BOX_TITLE, wszTitle,
544                 sizeof(wszTitle)/sizeof(WCHAR))) {
545         WARN("Could not load message box title: %d\n", GetLastError());
546         *confirmed = VARIANT_TRUE;
547         return S_OK;
548     }
549
550     if(MessageBoxW(This->outer_window->doc_obj->hwnd, message, wszTitle,
551                 MB_OKCANCEL|MB_ICONQUESTION)==IDOK)
552         *confirmed = VARIANT_TRUE;
553     else *confirmed = VARIANT_FALSE;
554
555     return S_OK;
556 }
557
558 typedef struct
559 {
560     BSTR message;
561     BSTR dststr;
562     VARIANT *textdata;
563 }prompt_arg;
564
565 static INT_PTR CALLBACK prompt_dlgproc(HWND hwnd, UINT msg,
566         WPARAM wparam, LPARAM lparam)
567 {
568     switch(msg)
569     {
570         case WM_INITDIALOG:
571         {
572             prompt_arg *arg = (prompt_arg*)lparam;
573             WCHAR wszTitle[100];
574
575             if(!LoadStringW(get_shdoclc(), IDS_MESSAGE_BOX_TITLE, wszTitle,
576                         sizeof(wszTitle)/sizeof(WCHAR))) {
577                 WARN("Could not load message box title: %d\n", GetLastError());
578                 EndDialog(hwnd, wparam);
579                 return FALSE;
580             }
581
582             SetWindowLongPtrW(hwnd, DWLP_USER, lparam);
583             SetWindowTextW(hwnd, wszTitle);
584             SetWindowTextW(GetDlgItem(hwnd, ID_PROMPT_PROMPT), arg->message);
585             SetWindowTextW(GetDlgItem(hwnd, ID_PROMPT_EDIT), arg->dststr);
586             return FALSE;
587         }
588         case WM_COMMAND:
589             switch(wparam)
590             {
591                 case MAKEWPARAM(IDCANCEL, BN_CLICKED):
592                     EndDialog(hwnd, wparam);
593                     return TRUE;
594                 case MAKEWPARAM(IDOK, BN_CLICKED):
595                 {
596                     prompt_arg *arg =
597                         (prompt_arg*)GetWindowLongPtrW(hwnd, DWLP_USER);
598                     HWND hwndPrompt = GetDlgItem(hwnd, ID_PROMPT_EDIT);
599                     INT len = GetWindowTextLengthW(hwndPrompt);
600
601                     if(!arg->textdata)
602                     {
603                         EndDialog(hwnd, wparam);
604                         return TRUE;
605                     }
606
607                     V_VT(arg->textdata) = VT_BSTR;
608                     if(!len && !arg->dststr)
609                         V_BSTR(arg->textdata) = NULL;
610                     else
611                     {
612                         V_BSTR(arg->textdata) = SysAllocStringLen(NULL, len);
613                         GetWindowTextW(hwndPrompt, V_BSTR(arg->textdata), len+1);
614                     }
615                     EndDialog(hwnd, wparam);
616                     return TRUE;
617                 }
618             }
619             return FALSE;
620         case WM_CLOSE:
621             EndDialog(hwnd, IDCANCEL);
622             return TRUE;
623         default:
624             return FALSE;
625     }
626 }
627
628 static HRESULT WINAPI HTMLWindow2_prompt(IHTMLWindow2 *iface, BSTR message,
629         BSTR dststr, VARIANT *textdata)
630 {
631     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
632     prompt_arg arg;
633
634     TRACE("(%p)->(%s %s %p)\n", This, debugstr_w(message), debugstr_w(dststr), textdata);
635
636     if(textdata) V_VT(textdata) = VT_NULL;
637
638     arg.message = message;
639     arg.dststr = dststr;
640     arg.textdata = textdata;
641
642     DialogBoxParamW(hInst, MAKEINTRESOURCEW(ID_PROMPT_DIALOG),
643             This->outer_window->doc_obj->hwnd, prompt_dlgproc, (LPARAM)&arg);
644     return S_OK;
645 }
646
647 static HRESULT WINAPI HTMLWindow2_get_Image(IHTMLWindow2 *iface, IHTMLImageElementFactory **p)
648 {
649     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
650     HTMLOuterWindow *window = This->outer_window;
651
652     TRACE("(%p)->(%p)\n", This, p);
653
654     if(!window->image_factory)
655         window->image_factory = HTMLImageElementFactory_Create(window);
656
657     *p = &window->image_factory->IHTMLImageElementFactory_iface;
658     IHTMLImageElementFactory_AddRef(*p);
659
660     return S_OK;
661 }
662
663 static HRESULT WINAPI HTMLWindow2_get_location(IHTMLWindow2 *iface, IHTMLLocation **p)
664 {
665     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
666     HTMLLocation *location;
667     HRESULT hres;
668
669     TRACE("(%p)->(%p)\n", This, p);
670
671     hres = get_location(This->outer_window, &location);
672     if(FAILED(hres))
673         return hres;
674
675     *p = &location->IHTMLLocation_iface;
676     return S_OK;
677 }
678
679 static HRESULT WINAPI HTMLWindow2_get_history(IHTMLWindow2 *iface, IOmHistory **p)
680 {
681     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
682     HTMLOuterWindow *window = This->outer_window;
683
684     TRACE("(%p)->(%p)\n", This, p);
685
686     if(!window->history) {
687         HRESULT hres;
688
689         hres = create_history(&window->history);
690         if(FAILED(hres))
691             return hres;
692     }
693
694     IOmHistory_AddRef(window->history);
695     *p = window->history;
696     return S_OK;
697 }
698
699 static HRESULT WINAPI HTMLWindow2_close(IHTMLWindow2 *iface)
700 {
701     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
702     FIXME("(%p)->()\n", This);
703     return E_NOTIMPL;
704 }
705
706 static HRESULT WINAPI HTMLWindow2_put_opener(IHTMLWindow2 *iface, VARIANT v)
707 {
708     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
709     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
710     return E_NOTIMPL;
711 }
712
713 static HRESULT WINAPI HTMLWindow2_get_opener(IHTMLWindow2 *iface, VARIANT *p)
714 {
715     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
716
717     FIXME("(%p)->(%p) returning empty\n", This, p);
718
719     V_VT(p) = VT_EMPTY;
720     return S_OK;
721 }
722
723 static HRESULT WINAPI HTMLWindow2_get_navigator(IHTMLWindow2 *iface, IOmNavigator **p)
724 {
725     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
726
727     TRACE("(%p)->(%p)\n", This, p);
728
729     *p = OmNavigator_Create();
730     return S_OK;
731 }
732
733 static HRESULT WINAPI HTMLWindow2_put_name(IHTMLWindow2 *iface, BSTR v)
734 {
735     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
736     nsAString name_str;
737     nsresult nsres;
738
739     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
740
741     nsAString_InitDepend(&name_str, v);
742     nsres = nsIDOMWindow_SetName(This->outer_window->nswindow, &name_str);
743     nsAString_Finish(&name_str);
744     if(NS_FAILED(nsres))
745         ERR("SetName failed: %08x\n", nsres);
746
747     return S_OK;
748 }
749
750 static HRESULT WINAPI HTMLWindow2_get_name(IHTMLWindow2 *iface, BSTR *p)
751 {
752     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
753     nsAString name_str;
754     nsresult nsres;
755
756     TRACE("(%p)->(%p)\n", This, p);
757
758     nsAString_Init(&name_str, NULL);
759     nsres = nsIDOMWindow_GetName(This->outer_window->nswindow, &name_str);
760     return return_nsstr(nsres, &name_str, p);
761 }
762
763 static HRESULT WINAPI HTMLWindow2_get_parent(IHTMLWindow2 *iface, IHTMLWindow2 **p)
764 {
765     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
766     HTMLOuterWindow *window = This->outer_window;
767
768     TRACE("(%p)->(%p)\n", This, p);
769
770     if(!window->parent)
771         return IHTMLWindow2_get_self(&This->IHTMLWindow2_iface, p);
772
773     *p = &window->parent->base.IHTMLWindow2_iface;
774     IHTMLWindow2_AddRef(*p);
775     return S_OK;
776 }
777
778 static HRESULT WINAPI HTMLWindow2_open(IHTMLWindow2 *iface, BSTR url, BSTR name,
779          BSTR features, VARIANT_BOOL replace, IHTMLWindow2 **pomWindowResult)
780 {
781     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
782     HTMLOuterWindow *window = This->outer_window;
783     INewWindowManager *new_window_mgr;
784     IUri *uri;
785     HRESULT hres;
786
787     TRACE("(%p)->(%s %s %s %x %p)\n", This, debugstr_w(url), debugstr_w(name),
788           debugstr_w(features), replace, pomWindowResult);
789
790     if(!window->doc_obj)
791         return E_UNEXPECTED;
792
793     if(name && *name == '_') {
794         FIXME("Unsupported name %s\n", debugstr_w(name));
795         return E_NOTIMPL;
796     }
797
798     hres = do_query_service((IUnknown*)window->doc_obj->client, &SID_SNewWindowManager, &IID_INewWindowManager,
799             (void**)&new_window_mgr);
800     if(FAILED(hres)) {
801         FIXME("No INewWindowManager\n");
802         return E_NOTIMPL;
803     }
804
805     hres = INewWindowManager_EvaluateNewWindow(new_window_mgr, url, name, window->url,
806             features, !!replace, window->doc_obj->has_popup ? 0 : NWMF_FIRST, 0);
807     INewWindowManager_Release(new_window_mgr);
808     window->doc_obj->has_popup = TRUE;
809     if(FAILED(hres)) {
810         *pomWindowResult = NULL;
811         return S_OK;
812     }
813
814     hres = create_relative_uri(window, url, &uri);
815     if(FAILED(hres))
816         return hres;
817
818     hres = navigate_new_window(window, uri, name, pomWindowResult);
819     IUri_Release(uri);
820     return hres;
821 }
822
823 static HRESULT WINAPI HTMLWindow2_get_self(IHTMLWindow2 *iface, IHTMLWindow2 **p)
824 {
825     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
826
827     TRACE("(%p)->(%p)\n", This, p);
828
829     /* FIXME: We should return kind of proxy window here. */
830     IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
831     *p = &This->IHTMLWindow2_iface;
832     return S_OK;
833 }
834
835 static HRESULT WINAPI HTMLWindow2_get_top(IHTMLWindow2 *iface, IHTMLWindow2 **p)
836 {
837     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
838     HTMLOuterWindow *top;
839
840     TRACE("(%p)->(%p)\n", This, p);
841
842     get_top_window(This->outer_window, &top);
843     *p = &top->base.IHTMLWindow2_iface;
844     IHTMLWindow2_AddRef(*p);
845
846     return S_OK;
847 }
848
849 static HRESULT WINAPI HTMLWindow2_get_window(IHTMLWindow2 *iface, IHTMLWindow2 **p)
850 {
851     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
852
853     TRACE("(%p)->(%p)\n", This, p);
854
855     /* FIXME: We should return kind of proxy window here. */
856     IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
857     *p = &This->IHTMLWindow2_iface;
858     return S_OK;
859 }
860
861 static HRESULT WINAPI HTMLWindow2_navigate(IHTMLWindow2 *iface, BSTR url)
862 {
863     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
864     FIXME("(%p)->(%s)\n", This, debugstr_w(url));
865     return E_NOTIMPL;
866 }
867
868 static HRESULT WINAPI HTMLWindow2_put_onfocus(IHTMLWindow2 *iface, VARIANT v)
869 {
870     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
871     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
872     return E_NOTIMPL;
873 }
874
875 static HRESULT WINAPI HTMLWindow2_get_onfocus(IHTMLWindow2 *iface, VARIANT *p)
876 {
877     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
878     FIXME("(%p)->(%p)\n", This, p);
879     return E_NOTIMPL;
880 }
881
882 static HRESULT WINAPI HTMLWindow2_put_onblur(IHTMLWindow2 *iface, VARIANT v)
883 {
884     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
885     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
886     return E_NOTIMPL;
887 }
888
889 static HRESULT WINAPI HTMLWindow2_get_onblur(IHTMLWindow2 *iface, VARIANT *p)
890 {
891     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
892     FIXME("(%p)->(%p)\n", This, p);
893     return E_NOTIMPL;
894 }
895
896 static HRESULT WINAPI HTMLWindow2_put_onload(IHTMLWindow2 *iface, VARIANT v)
897 {
898     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
899
900     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
901
902     return set_window_event(This, EVENTID_LOAD, &v);
903 }
904
905 static HRESULT WINAPI HTMLWindow2_get_onload(IHTMLWindow2 *iface, VARIANT *p)
906 {
907     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
908
909     TRACE("(%p)->(%p)\n", This, p);
910
911     return get_window_event(This, EVENTID_LOAD, p);
912 }
913
914 static HRESULT WINAPI HTMLWindow2_put_onbeforeunload(IHTMLWindow2 *iface, VARIANT v)
915 {
916     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
917
918     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
919
920     return set_window_event(This, EVENTID_BEFOREUNLOAD, &v);
921 }
922
923 static HRESULT WINAPI HTMLWindow2_get_onbeforeunload(IHTMLWindow2 *iface, VARIANT *p)
924 {
925     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
926
927     TRACE("(%p)->(%p)\n", This, p);
928
929     return get_window_event(This, EVENTID_BEFOREUNLOAD, p);
930 }
931
932 static HRESULT WINAPI HTMLWindow2_put_onunload(IHTMLWindow2 *iface, VARIANT v)
933 {
934     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
935     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
936     return E_NOTIMPL;
937 }
938
939 static HRESULT WINAPI HTMLWindow2_get_onunload(IHTMLWindow2 *iface, VARIANT *p)
940 {
941     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
942     FIXME("(%p)->(%p)\n", This, p);
943     return E_NOTIMPL;
944 }
945
946 static HRESULT WINAPI HTMLWindow2_put_onhelp(IHTMLWindow2 *iface, VARIANT v)
947 {
948     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
949     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
950     return E_NOTIMPL;
951 }
952
953 static HRESULT WINAPI HTMLWindow2_get_onhelp(IHTMLWindow2 *iface, VARIANT *p)
954 {
955     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
956     FIXME("(%p)->(%p)\n", This, p);
957     return E_NOTIMPL;
958 }
959
960 static HRESULT WINAPI HTMLWindow2_put_onerror(IHTMLWindow2 *iface, VARIANT v)
961 {
962     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
963
964     FIXME("(%p)->(%s) semi-stub\n", This, debugstr_variant(&v));
965
966     return set_window_event(This, EVENTID_ERROR, &v);
967 }
968
969 static HRESULT WINAPI HTMLWindow2_get_onerror(IHTMLWindow2 *iface, VARIANT *p)
970 {
971     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
972
973     TRACE("(%p)->(%p)\n", This, p);
974
975     return get_window_event(This, EVENTID_ERROR, p);
976 }
977
978 static HRESULT WINAPI HTMLWindow2_put_onresize(IHTMLWindow2 *iface, VARIANT v)
979 {
980     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
981
982     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
983
984     return set_window_event(This, EVENTID_RESIZE, &v);
985 }
986
987 static HRESULT WINAPI HTMLWindow2_get_onresize(IHTMLWindow2 *iface, VARIANT *p)
988 {
989     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
990
991     TRACE("(%p)->(%p)\n", This, p);
992
993     return get_window_event(This, EVENTID_RESIZE, p);
994 }
995
996 static HRESULT WINAPI HTMLWindow2_put_onscroll(IHTMLWindow2 *iface, VARIANT v)
997 {
998     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
999     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
1000     return E_NOTIMPL;
1001 }
1002
1003 static HRESULT WINAPI HTMLWindow2_get_onscroll(IHTMLWindow2 *iface, VARIANT *p)
1004 {
1005     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1006     FIXME("(%p)->(%p)\n", This, p);
1007     return E_NOTIMPL;
1008 }
1009
1010 static HRESULT WINAPI HTMLWindow2_get_document(IHTMLWindow2 *iface, IHTMLDocument2 **p)
1011 {
1012     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1013
1014     TRACE("(%p)->(%p)\n", This, p);
1015
1016     if(This->inner_window->doc) {
1017         /* FIXME: We should return a wrapper object here */
1018         *p = &This->inner_window->doc->basedoc.IHTMLDocument2_iface;
1019         IHTMLDocument2_AddRef(*p);
1020     }else {
1021         *p = NULL;
1022     }
1023
1024     return S_OK;
1025 }
1026
1027 static HRESULT WINAPI HTMLWindow2_get_event(IHTMLWindow2 *iface, IHTMLEventObj **p)
1028 {
1029     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1030     HTMLInnerWindow *window = This->inner_window;
1031
1032     TRACE("(%p)->(%p)\n", This, p);
1033
1034     if(window->event)
1035         IHTMLEventObj_AddRef(window->event);
1036     *p = window->event;
1037     return S_OK;
1038 }
1039
1040 static HRESULT WINAPI HTMLWindow2_get__newEnum(IHTMLWindow2 *iface, IUnknown **p)
1041 {
1042     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1043     FIXME("(%p)->(%p)\n", This, p);
1044     return E_NOTIMPL;
1045 }
1046
1047 static HRESULT WINAPI HTMLWindow2_showModalDialog(IHTMLWindow2 *iface, BSTR dialog,
1048         VARIANT *varArgIn, VARIANT *varOptions, VARIANT *varArgOut)
1049 {
1050     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1051     FIXME("(%p)->(%s %p %p %p)\n", This, debugstr_w(dialog), varArgIn, varOptions, varArgOut);
1052     return E_NOTIMPL;
1053 }
1054
1055 static HRESULT WINAPI HTMLWindow2_showHelp(IHTMLWindow2 *iface, BSTR helpURL, VARIANT helpArg,
1056         BSTR features)
1057 {
1058     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1059     FIXME("(%p)->(%s %s %s)\n", This, debugstr_w(helpURL), debugstr_variant(&helpArg), debugstr_w(features));
1060     return E_NOTIMPL;
1061 }
1062
1063 static HRESULT WINAPI HTMLWindow2_get_screen(IHTMLWindow2 *iface, IHTMLScreen **p)
1064 {
1065     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1066     HTMLOuterWindow *window = This->outer_window;
1067
1068     TRACE("(%p)->(%p)\n", This, p);
1069
1070     if(!window->screen) {
1071         HRESULT hres;
1072
1073         hres = HTMLScreen_Create(&window->screen);
1074         if(FAILED(hres))
1075             return hres;
1076     }
1077
1078     *p = window->screen;
1079     IHTMLScreen_AddRef(window->screen);
1080     return S_OK;
1081 }
1082
1083 static HRESULT WINAPI HTMLWindow2_get_Option(IHTMLWindow2 *iface, IHTMLOptionElementFactory **p)
1084 {
1085     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1086     HTMLInnerWindow *window = This->inner_window;
1087
1088     TRACE("(%p)->(%p)\n", This, p);
1089
1090     if(!window->option_factory) {
1091         HRESULT hres;
1092
1093         hres = HTMLOptionElementFactory_Create(window, &window->option_factory);
1094         if(FAILED(hres))
1095             return hres;
1096     }
1097
1098     *p = &window->option_factory->IHTMLOptionElementFactory_iface;
1099     IHTMLOptionElementFactory_AddRef(*p);
1100
1101     return S_OK;
1102 }
1103
1104 static HRESULT WINAPI HTMLWindow2_focus(IHTMLWindow2 *iface)
1105 {
1106     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1107
1108     TRACE("(%p)->()\n", This);
1109
1110     if(This->outer_window->doc_obj)
1111         SetFocus(This->outer_window->doc_obj->hwnd);
1112     return S_OK;
1113 }
1114
1115 static HRESULT WINAPI HTMLWindow2_get_closed(IHTMLWindow2 *iface, VARIANT_BOOL *p)
1116 {
1117     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1118     FIXME("(%p)->(%p)\n", This, p);
1119     return E_NOTIMPL;
1120 }
1121
1122 static HRESULT WINAPI HTMLWindow2_blur(IHTMLWindow2 *iface)
1123 {
1124     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1125     FIXME("(%p)->()\n", This);
1126     return E_NOTIMPL;
1127 }
1128
1129 static HRESULT WINAPI HTMLWindow2_scroll(IHTMLWindow2 *iface, LONG x, LONG y)
1130 {
1131     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1132     FIXME("(%p)->(%d %d)\n", This, x, y);
1133     return E_NOTIMPL;
1134 }
1135
1136 static HRESULT WINAPI HTMLWindow2_get_clientInformation(IHTMLWindow2 *iface, IOmNavigator **p)
1137 {
1138     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1139     FIXME("(%p)->(%p)\n", This, p);
1140     return E_NOTIMPL;
1141 }
1142
1143 static HRESULT WINAPI HTMLWindow2_setInterval(IHTMLWindow2 *iface, BSTR expression,
1144         LONG msec, VARIANT *language, LONG *timerID)
1145 {
1146     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1147     VARIANT expr;
1148
1149     TRACE("(%p)->(%s %d %p %p)\n", This, debugstr_w(expression), msec, language, timerID);
1150
1151     V_VT(&expr) = VT_BSTR;
1152     V_BSTR(&expr) = expression;
1153     return IHTMLWindow3_setInterval(&This->IHTMLWindow3_iface, &expr, msec, language, timerID);
1154 }
1155
1156 static HRESULT WINAPI HTMLWindow2_clearInterval(IHTMLWindow2 *iface, LONG timerID)
1157 {
1158     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1159
1160     TRACE("(%p)->(%d)\n", This, timerID);
1161
1162     return clear_task_timer(&This->inner_window->doc->basedoc, TRUE, timerID);
1163 }
1164
1165 static HRESULT WINAPI HTMLWindow2_put_offscreenBuffering(IHTMLWindow2 *iface, VARIANT v)
1166 {
1167     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1168     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
1169     return E_NOTIMPL;
1170 }
1171
1172 static HRESULT WINAPI HTMLWindow2_get_offscreenBuffering(IHTMLWindow2 *iface, VARIANT *p)
1173 {
1174     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1175     FIXME("(%p)->(%p)\n", This, p);
1176     return E_NOTIMPL;
1177 }
1178
1179 static HRESULT WINAPI HTMLWindow2_execScript(IHTMLWindow2 *iface, BSTR scode, BSTR language,
1180         VARIANT *pvarRet)
1181 {
1182     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1183
1184     TRACE("(%p)->(%s %s %p)\n", This, debugstr_w(scode), debugstr_w(language), pvarRet);
1185
1186     return exec_script(This->inner_window, scode, language, pvarRet);
1187 }
1188
1189 static HRESULT WINAPI HTMLWindow2_toString(IHTMLWindow2 *iface, BSTR *String)
1190 {
1191     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1192
1193     static const WCHAR objectW[] = {'[','o','b','j','e','c','t',']',0};
1194
1195     TRACE("(%p)->(%p)\n", This, String);
1196
1197     if(!String)
1198         return E_INVALIDARG;
1199
1200     *String = SysAllocString(objectW);
1201     return *String ? S_OK : E_OUTOFMEMORY;
1202 }
1203
1204 static HRESULT WINAPI HTMLWindow2_scrollBy(IHTMLWindow2 *iface, LONG x, LONG y)
1205 {
1206     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1207     nsresult nsres;
1208
1209     TRACE("(%p)->(%d %d)\n", This, x, y);
1210
1211     nsres = nsIDOMWindow_ScrollBy(This->outer_window->nswindow, x, y);
1212     if(NS_FAILED(nsres))
1213         ERR("ScrollBy failed: %08x\n", nsres);
1214
1215     return S_OK;
1216 }
1217
1218 static HRESULT WINAPI HTMLWindow2_scrollTo(IHTMLWindow2 *iface, LONG x, LONG y)
1219 {
1220     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1221     nsresult nsres;
1222
1223     TRACE("(%p)->(%d %d)\n", This, x, y);
1224
1225     nsres = nsIDOMWindow_ScrollTo(This->outer_window->nswindow, x, y);
1226     if(NS_FAILED(nsres))
1227         ERR("ScrollTo failed: %08x\n", nsres);
1228
1229     return S_OK;
1230 }
1231
1232 static HRESULT WINAPI HTMLWindow2_moveTo(IHTMLWindow2 *iface, LONG x, LONG y)
1233 {
1234     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1235     FIXME("(%p)->(%d %d)\n", This, x, y);
1236     return E_NOTIMPL;
1237 }
1238
1239 static HRESULT WINAPI HTMLWindow2_moveBy(IHTMLWindow2 *iface, LONG x, LONG y)
1240 {
1241     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1242     FIXME("(%p)->(%d %d)\n", This, x, y);
1243     return E_NOTIMPL;
1244 }
1245
1246 static HRESULT WINAPI HTMLWindow2_resizeTo(IHTMLWindow2 *iface, LONG x, LONG y)
1247 {
1248     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1249     FIXME("(%p)->(%d %d)\n", This, x, y);
1250     return E_NOTIMPL;
1251 }
1252
1253 static HRESULT WINAPI HTMLWindow2_resizeBy(IHTMLWindow2 *iface, LONG x, LONG y)
1254 {
1255     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1256     FIXME("(%p)->(%d %d)\n", This, x, y);
1257     return E_NOTIMPL;
1258 }
1259
1260 static HRESULT WINAPI HTMLWindow2_get_external(IHTMLWindow2 *iface, IDispatch **p)
1261 {
1262     HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1263
1264     TRACE("(%p)->(%p)\n", This, p);
1265
1266     *p = NULL;
1267
1268     if(!This->outer_window->doc_obj->hostui)
1269         return S_OK;
1270
1271     return IDocHostUIHandler_GetExternal(This->outer_window->doc_obj->hostui, p);
1272 }
1273
1274 static const IHTMLWindow2Vtbl HTMLWindow2Vtbl = {
1275     HTMLWindow2_QueryInterface,
1276     HTMLWindow2_AddRef,
1277     HTMLWindow2_Release,
1278     HTMLWindow2_GetTypeInfoCount,
1279     HTMLWindow2_GetTypeInfo,
1280     HTMLWindow2_GetIDsOfNames,
1281     HTMLWindow2_Invoke,
1282     HTMLWindow2_item,
1283     HTMLWindow2_get_length,
1284     HTMLWindow2_get_frames,
1285     HTMLWindow2_put_defaultStatus,
1286     HTMLWindow2_get_defaultStatus,
1287     HTMLWindow2_put_status,
1288     HTMLWindow2_get_status,
1289     HTMLWindow2_setTimeout,
1290     HTMLWindow2_clearTimeout,
1291     HTMLWindow2_alert,
1292     HTMLWindow2_confirm,
1293     HTMLWindow2_prompt,
1294     HTMLWindow2_get_Image,
1295     HTMLWindow2_get_location,
1296     HTMLWindow2_get_history,
1297     HTMLWindow2_close,
1298     HTMLWindow2_put_opener,
1299     HTMLWindow2_get_opener,
1300     HTMLWindow2_get_navigator,
1301     HTMLWindow2_put_name,
1302     HTMLWindow2_get_name,
1303     HTMLWindow2_get_parent,
1304     HTMLWindow2_open,
1305     HTMLWindow2_get_self,
1306     HTMLWindow2_get_top,
1307     HTMLWindow2_get_window,
1308     HTMLWindow2_navigate,
1309     HTMLWindow2_put_onfocus,
1310     HTMLWindow2_get_onfocus,
1311     HTMLWindow2_put_onblur,
1312     HTMLWindow2_get_onblur,
1313     HTMLWindow2_put_onload,
1314     HTMLWindow2_get_onload,
1315     HTMLWindow2_put_onbeforeunload,
1316     HTMLWindow2_get_onbeforeunload,
1317     HTMLWindow2_put_onunload,
1318     HTMLWindow2_get_onunload,
1319     HTMLWindow2_put_onhelp,
1320     HTMLWindow2_get_onhelp,
1321     HTMLWindow2_put_onerror,
1322     HTMLWindow2_get_onerror,
1323     HTMLWindow2_put_onresize,
1324     HTMLWindow2_get_onresize,
1325     HTMLWindow2_put_onscroll,
1326     HTMLWindow2_get_onscroll,
1327     HTMLWindow2_get_document,
1328     HTMLWindow2_get_event,
1329     HTMLWindow2_get__newEnum,
1330     HTMLWindow2_showModalDialog,
1331     HTMLWindow2_showHelp,
1332     HTMLWindow2_get_screen,
1333     HTMLWindow2_get_Option,
1334     HTMLWindow2_focus,
1335     HTMLWindow2_get_closed,
1336     HTMLWindow2_blur,
1337     HTMLWindow2_scroll,
1338     HTMLWindow2_get_clientInformation,
1339     HTMLWindow2_setInterval,
1340     HTMLWindow2_clearInterval,
1341     HTMLWindow2_put_offscreenBuffering,
1342     HTMLWindow2_get_offscreenBuffering,
1343     HTMLWindow2_execScript,
1344     HTMLWindow2_toString,
1345     HTMLWindow2_scrollBy,
1346     HTMLWindow2_scrollTo,
1347     HTMLWindow2_moveTo,
1348     HTMLWindow2_moveBy,
1349     HTMLWindow2_resizeTo,
1350     HTMLWindow2_resizeBy,
1351     HTMLWindow2_get_external
1352 };
1353
1354 static inline HTMLWindow *impl_from_IHTMLWindow3(IHTMLWindow3 *iface)
1355 {
1356     return CONTAINING_RECORD(iface, HTMLWindow, IHTMLWindow3_iface);
1357 }
1358
1359 static HRESULT WINAPI HTMLWindow3_QueryInterface(IHTMLWindow3 *iface, REFIID riid, void **ppv)
1360 {
1361     HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1362
1363     return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
1364 }
1365
1366 static ULONG WINAPI HTMLWindow3_AddRef(IHTMLWindow3 *iface)
1367 {
1368     HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1369
1370     return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
1371 }
1372
1373 static ULONG WINAPI HTMLWindow3_Release(IHTMLWindow3 *iface)
1374 {
1375     HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1376
1377     return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
1378 }
1379
1380 static HRESULT WINAPI HTMLWindow3_GetTypeInfoCount(IHTMLWindow3 *iface, UINT *pctinfo)
1381 {
1382     HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1383
1384     return IDispatchEx_GetTypeInfoCount(&This->IDispatchEx_iface, pctinfo);
1385 }
1386
1387 static HRESULT WINAPI HTMLWindow3_GetTypeInfo(IHTMLWindow3 *iface, UINT iTInfo,
1388                                               LCID lcid, ITypeInfo **ppTInfo)
1389 {
1390     HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1391
1392     return IDispatchEx_GetTypeInfo(&This->IDispatchEx_iface, iTInfo, lcid, ppTInfo);
1393 }
1394
1395 static HRESULT WINAPI HTMLWindow3_GetIDsOfNames(IHTMLWindow3 *iface, REFIID riid,
1396                                                 LPOLESTR *rgszNames, UINT cNames,
1397                                                 LCID lcid, DISPID *rgDispId)
1398 {
1399     HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1400
1401     return IDispatchEx_GetIDsOfNames(&This->IDispatchEx_iface, riid, rgszNames, cNames, lcid,
1402             rgDispId);
1403 }
1404
1405 static HRESULT WINAPI HTMLWindow3_Invoke(IHTMLWindow3 *iface, DISPID dispIdMember,
1406                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1407                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1408 {
1409     HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1410
1411     return IDispatchEx_Invoke(&This->IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
1412             pDispParams, pVarResult, pExcepInfo, puArgErr);
1413 }
1414
1415 static HRESULT WINAPI HTMLWindow3_get_screenLeft(IHTMLWindow3 *iface, LONG *p)
1416 {
1417     HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1418     FIXME("(%p)->(%p)\n", This, p);
1419     return E_NOTIMPL;
1420 }
1421
1422 static HRESULT WINAPI HTMLWindow3_get_screenTop(IHTMLWindow3 *iface, LONG *p)
1423 {
1424     HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1425     FIXME("(%p)->(%p)\n", This, p);
1426     return E_NOTIMPL;
1427 }
1428
1429 static HRESULT WINAPI HTMLWindow3_attachEvent(IHTMLWindow3 *iface, BSTR event, IDispatch *pDisp, VARIANT_BOOL *pfResult)
1430 {
1431     HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1432     HTMLInnerWindow *window = This->inner_window;
1433
1434     TRACE("(%p)->(%s %p %p)\n", This, debugstr_w(event), pDisp, pfResult);
1435
1436     if(!window->doc) {
1437         FIXME("No document\n");
1438         return E_FAIL;
1439     }
1440
1441     return attach_event(&window->doc->body_event_target, NULL, &window->doc->basedoc, event, pDisp, pfResult);
1442 }
1443
1444 static HRESULT WINAPI HTMLWindow3_detachEvent(IHTMLWindow3 *iface, BSTR event, IDispatch *pDisp)
1445 {
1446     HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1447     HTMLInnerWindow *window = This->inner_window;
1448
1449     TRACE("(%p)->()\n", This);
1450
1451     if(!window->doc) {
1452         FIXME("No document\n");
1453         return E_FAIL;
1454     }
1455
1456     return detach_event(window->doc->body_event_target, &window->doc->basedoc, event, pDisp);
1457 }
1458
1459 static HRESULT window_set_timer(HTMLInnerWindow *This, VARIANT *expr, LONG msec, VARIANT *language,
1460         BOOL interval, LONG *timer_id)
1461 {
1462     IDispatch *disp = NULL;
1463
1464     switch(V_VT(expr)) {
1465     case VT_DISPATCH:
1466         disp = V_DISPATCH(expr);
1467         IDispatch_AddRef(disp);
1468         break;
1469
1470     case VT_BSTR:
1471         disp = script_parse_event(This->base.inner_window, V_BSTR(expr));
1472         break;
1473
1474     default:
1475         FIXME("unimplemented expr %s\n", debugstr_variant(expr));
1476         return E_NOTIMPL;
1477     }
1478
1479     if(!disp)
1480         return E_FAIL;
1481
1482     *timer_id = set_task_timer(&This->doc->basedoc, msec, interval, disp);
1483     IDispatch_Release(disp);
1484
1485     return S_OK;
1486 }
1487
1488 static HRESULT WINAPI HTMLWindow3_setTimeout(IHTMLWindow3 *iface, VARIANT *expression, LONG msec,
1489         VARIANT *language, LONG *timerID)
1490 {
1491     HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1492
1493     TRACE("(%p)->(%s %d %s %p)\n", This, debugstr_variant(expression), msec, debugstr_variant(language), timerID);
1494
1495     return window_set_timer(This->inner_window, expression, msec, language, FALSE, timerID);
1496 }
1497
1498 static HRESULT WINAPI HTMLWindow3_setInterval(IHTMLWindow3 *iface, VARIANT *expression, LONG msec,
1499         VARIANT *language, LONG *timerID)
1500 {
1501     HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1502
1503     TRACE("(%p)->(%p %d %p %p)\n", This, expression, msec, language, timerID);
1504
1505     return window_set_timer(This->inner_window, expression, msec, language, TRUE, timerID);
1506 }
1507
1508 static HRESULT WINAPI HTMLWindow3_print(IHTMLWindow3 *iface)
1509 {
1510     HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1511     FIXME("(%p)\n", This);
1512     return E_NOTIMPL;
1513 }
1514
1515 static HRESULT WINAPI HTMLWindow3_put_onbeforeprint(IHTMLWindow3 *iface, VARIANT v)
1516 {
1517     HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1518     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
1519     return E_NOTIMPL;
1520 }
1521
1522 static HRESULT WINAPI HTMLWindow3_get_onbeforeprint(IHTMLWindow3 *iface, VARIANT *p)
1523 {
1524     HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1525     FIXME("(%p)->(%p)\n", This, p);
1526     return E_NOTIMPL;
1527 }
1528
1529 static HRESULT WINAPI HTMLWindow3_put_onafterprint(IHTMLWindow3 *iface, VARIANT v)
1530 {
1531     HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1532     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
1533     return E_NOTIMPL;
1534 }
1535
1536 static HRESULT WINAPI HTMLWindow3_get_onafterprint(IHTMLWindow3 *iface, VARIANT *p)
1537 {
1538     HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1539     FIXME("(%p)->(%p)\n", This, p);
1540     return E_NOTIMPL;
1541 }
1542
1543 static HRESULT WINAPI HTMLWindow3_get_clipboardData(IHTMLWindow3 *iface, IHTMLDataTransfer **p)
1544 {
1545     HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1546     FIXME("(%p)->(%p)\n", This, p);
1547     return E_NOTIMPL;
1548 }
1549
1550 static HRESULT WINAPI HTMLWindow3_showModelessDialog(IHTMLWindow3 *iface, BSTR url,
1551         VARIANT *varArgIn, VARIANT *options, IHTMLWindow2 **pDialog)
1552 {
1553     HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1554     FIXME("(%p)->(%s %p %p %p)\n", This, debugstr_w(url), varArgIn, options, pDialog);
1555     return E_NOTIMPL;
1556 }
1557
1558 static const IHTMLWindow3Vtbl HTMLWindow3Vtbl = {
1559     HTMLWindow3_QueryInterface,
1560     HTMLWindow3_AddRef,
1561     HTMLWindow3_Release,
1562     HTMLWindow3_GetTypeInfoCount,
1563     HTMLWindow3_GetTypeInfo,
1564     HTMLWindow3_GetIDsOfNames,
1565     HTMLWindow3_Invoke,
1566     HTMLWindow3_get_screenLeft,
1567     HTMLWindow3_get_screenTop,
1568     HTMLWindow3_attachEvent,
1569     HTMLWindow3_detachEvent,
1570     HTMLWindow3_setTimeout,
1571     HTMLWindow3_setInterval,
1572     HTMLWindow3_print,
1573     HTMLWindow3_put_onbeforeprint,
1574     HTMLWindow3_get_onbeforeprint,
1575     HTMLWindow3_put_onafterprint,
1576     HTMLWindow3_get_onafterprint,
1577     HTMLWindow3_get_clipboardData,
1578     HTMLWindow3_showModelessDialog
1579 };
1580
1581 static inline HTMLWindow *impl_from_IHTMLWindow4(IHTMLWindow4 *iface)
1582 {
1583     return CONTAINING_RECORD(iface, HTMLWindow, IHTMLWindow4_iface);
1584 }
1585
1586 static HRESULT WINAPI HTMLWindow4_QueryInterface(IHTMLWindow4 *iface, REFIID riid, void **ppv)
1587 {
1588     HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1589
1590     return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
1591 }
1592
1593 static ULONG WINAPI HTMLWindow4_AddRef(IHTMLWindow4 *iface)
1594 {
1595     HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1596
1597     return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
1598 }
1599
1600 static ULONG WINAPI HTMLWindow4_Release(IHTMLWindow4 *iface)
1601 {
1602     HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1603
1604     return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
1605 }
1606
1607 static HRESULT WINAPI HTMLWindow4_GetTypeInfoCount(IHTMLWindow4 *iface, UINT *pctinfo)
1608 {
1609     HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1610
1611     return IDispatchEx_GetTypeInfoCount(&This->IDispatchEx_iface, pctinfo);
1612 }
1613
1614 static HRESULT WINAPI HTMLWindow4_GetTypeInfo(IHTMLWindow4 *iface, UINT iTInfo,
1615                                               LCID lcid, ITypeInfo **ppTInfo)
1616 {
1617     HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1618
1619     return IDispatchEx_GetTypeInfo(&This->IDispatchEx_iface, iTInfo, lcid, ppTInfo);
1620 }
1621
1622 static HRESULT WINAPI HTMLWindow4_GetIDsOfNames(IHTMLWindow4 *iface, REFIID riid,
1623                                                 LPOLESTR *rgszNames, UINT cNames,
1624                                                 LCID lcid, DISPID *rgDispId)
1625 {
1626     HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1627
1628     return IDispatchEx_GetIDsOfNames(&This->IDispatchEx_iface, riid, rgszNames, cNames, lcid,
1629             rgDispId);
1630 }
1631
1632 static HRESULT WINAPI HTMLWindow4_Invoke(IHTMLWindow4 *iface, DISPID dispIdMember,
1633                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1634                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1635 {
1636     HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1637
1638     return IDispatchEx_Invoke(&This->IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
1639             pDispParams, pVarResult, pExcepInfo, puArgErr);
1640 }
1641
1642 static HRESULT WINAPI HTMLWindow4_createPopup(IHTMLWindow4 *iface, VARIANT *varArgIn,
1643                             IDispatch **ppPopup)
1644 {
1645     HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1646     FIXME("(%p)->(%p %p)\n", This, varArgIn, ppPopup);
1647     return E_NOTIMPL;
1648 }
1649
1650 static HRESULT WINAPI HTMLWindow4_get_frameElement(IHTMLWindow4 *iface, IHTMLFrameBase **p)
1651 {
1652     HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1653     TRACE("(%p)->(%p)\n", This, p);
1654
1655     if(This->outer_window->frame_element) {
1656         *p = &This->outer_window->frame_element->IHTMLFrameBase_iface;
1657         IHTMLFrameBase_AddRef(*p);
1658     }else
1659         *p = NULL;
1660
1661     return S_OK;
1662 }
1663
1664 static const IHTMLWindow4Vtbl HTMLWindow4Vtbl = {
1665     HTMLWindow4_QueryInterface,
1666     HTMLWindow4_AddRef,
1667     HTMLWindow4_Release,
1668     HTMLWindow4_GetTypeInfoCount,
1669     HTMLWindow4_GetTypeInfo,
1670     HTMLWindow4_GetIDsOfNames,
1671     HTMLWindow4_Invoke,
1672     HTMLWindow4_createPopup,
1673     HTMLWindow4_get_frameElement
1674 };
1675
1676 static inline HTMLWindow *impl_from_IHTMLWindow5(IHTMLWindow5 *iface)
1677 {
1678     return CONTAINING_RECORD(iface, HTMLWindow, IHTMLWindow5_iface);
1679 }
1680
1681 static HRESULT WINAPI HTMLWindow5_QueryInterface(IHTMLWindow5 *iface, REFIID riid, void **ppv)
1682 {
1683     HTMLWindow *This = impl_from_IHTMLWindow5(iface);
1684
1685     return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
1686 }
1687
1688 static ULONG WINAPI HTMLWindow5_AddRef(IHTMLWindow5 *iface)
1689 {
1690     HTMLWindow *This = impl_from_IHTMLWindow5(iface);
1691
1692     return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
1693 }
1694
1695 static ULONG WINAPI HTMLWindow5_Release(IHTMLWindow5 *iface)
1696 {
1697     HTMLWindow *This = impl_from_IHTMLWindow5(iface);
1698
1699     return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
1700 }
1701
1702 static HRESULT WINAPI HTMLWindow5_GetTypeInfoCount(IHTMLWindow5 *iface, UINT *pctinfo)
1703 {
1704     HTMLWindow *This = impl_from_IHTMLWindow5(iface);
1705
1706     return IDispatchEx_GetTypeInfoCount(&This->IDispatchEx_iface, pctinfo);
1707 }
1708
1709 static HRESULT WINAPI HTMLWindow5_GetTypeInfo(IHTMLWindow5 *iface, UINT iTInfo,
1710         LCID lcid, ITypeInfo **ppTInfo)
1711 {
1712     HTMLWindow *This = impl_from_IHTMLWindow5(iface);
1713
1714     return IDispatchEx_GetTypeInfo(&This->IDispatchEx_iface, iTInfo, lcid, ppTInfo);
1715 }
1716
1717 static HRESULT WINAPI HTMLWindow5_GetIDsOfNames(IHTMLWindow5 *iface, REFIID riid,
1718         LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
1719 {
1720     HTMLWindow *This = impl_from_IHTMLWindow5(iface);
1721
1722     return IDispatchEx_GetIDsOfNames(&This->IDispatchEx_iface, riid, rgszNames, cNames, lcid,
1723             rgDispId);
1724 }
1725
1726 static HRESULT WINAPI HTMLWindow5_Invoke(IHTMLWindow5 *iface, DISPID dispIdMember,
1727         REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1728         VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1729 {
1730     HTMLWindow *This = impl_from_IHTMLWindow5(iface);
1731
1732     return IDispatchEx_Invoke(&This->IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
1733             pDispParams, pVarResult, pExcepInfo, puArgErr);
1734 }
1735
1736 static HRESULT WINAPI HTMLWindow5_put_XMLHttpRequest(IHTMLWindow5 *iface, VARIANT v)
1737 {
1738     HTMLWindow *This = impl_from_IHTMLWindow5(iface);
1739     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
1740     return E_NOTIMPL;
1741 }
1742
1743 static HRESULT WINAPI HTMLWindow5_get_XMLHttpRequest(IHTMLWindow5 *iface, VARIANT *p)
1744 {
1745     HTMLWindow *This = impl_from_IHTMLWindow5(iface);
1746     FIXME("(%p)->(%p)\n", This, p);
1747     return E_NOTIMPL;
1748 }
1749
1750 static const IHTMLWindow5Vtbl HTMLWindow5Vtbl = {
1751     HTMLWindow5_QueryInterface,
1752     HTMLWindow5_AddRef,
1753     HTMLWindow5_Release,
1754     HTMLWindow5_GetTypeInfoCount,
1755     HTMLWindow5_GetTypeInfo,
1756     HTMLWindow5_GetIDsOfNames,
1757     HTMLWindow5_Invoke,
1758     HTMLWindow5_put_XMLHttpRequest,
1759     HTMLWindow5_get_XMLHttpRequest
1760 };
1761
1762 static inline HTMLWindow *impl_from_IHTMLWindow6(IHTMLWindow6 *iface)
1763 {
1764     return CONTAINING_RECORD(iface, HTMLWindow, IHTMLWindow6_iface);
1765 }
1766
1767 static HRESULT WINAPI HTMLWindow6_QueryInterface(IHTMLWindow6 *iface, REFIID riid, void **ppv)
1768 {
1769     HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1770
1771     return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
1772 }
1773
1774 static ULONG WINAPI HTMLWindow6_AddRef(IHTMLWindow6 *iface)
1775 {
1776     HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1777
1778     return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
1779 }
1780
1781 static ULONG WINAPI HTMLWindow6_Release(IHTMLWindow6 *iface)
1782 {
1783     HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1784
1785     return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
1786 }
1787
1788 static HRESULT WINAPI HTMLWindow6_GetTypeInfoCount(IHTMLWindow6 *iface, UINT *pctinfo)
1789 {
1790     HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1791
1792     return IDispatchEx_GetTypeInfoCount(&This->IDispatchEx_iface, pctinfo);
1793 }
1794
1795 static HRESULT WINAPI HTMLWindow6_GetTypeInfo(IHTMLWindow6 *iface, UINT iTInfo,
1796                                               LCID lcid, ITypeInfo **ppTInfo)
1797 {
1798     HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1799
1800     return IDispatchEx_GetTypeInfo(&This->IDispatchEx_iface, iTInfo, lcid, ppTInfo);
1801 }
1802
1803 static HRESULT WINAPI HTMLWindow6_GetIDsOfNames(IHTMLWindow6 *iface, REFIID riid,
1804                                                 LPOLESTR *rgszNames, UINT cNames,
1805                                                 LCID lcid, DISPID *rgDispId)
1806 {
1807     HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1808
1809     return IDispatchEx_GetIDsOfNames(&This->IDispatchEx_iface, riid, rgszNames, cNames, lcid,
1810             rgDispId);
1811 }
1812
1813 static HRESULT WINAPI HTMLWindow6_Invoke(IHTMLWindow6 *iface, DISPID dispIdMember,
1814                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1815                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1816 {
1817     HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1818
1819     return IDispatchEx_Invoke(&This->IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
1820             pDispParams, pVarResult, pExcepInfo, puArgErr);
1821 }
1822
1823 static HRESULT WINAPI HTMLWindow6_put_XDomainRequest(IHTMLWindow6 *iface, VARIANT v)
1824 {
1825     HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1826     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
1827     return E_NOTIMPL;
1828 }
1829
1830 static HRESULT WINAPI HTMLWindow6_get_XDomainRequest(IHTMLWindow6 *iface, VARIANT *p)
1831 {
1832     HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1833     FIXME("(%p)->(%p)\n", This, p);
1834     return E_NOTIMPL;
1835 }
1836
1837 static HRESULT WINAPI HTMLWindow6_get_sessionStorage(IHTMLWindow6 *iface, IHTMLStorage **p)
1838 {
1839     HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1840     FIXME("(%p)->(%p)\n", This, p);
1841     return E_NOTIMPL;
1842 }
1843
1844 static HRESULT WINAPI HTMLWindow6_get_localStorage(IHTMLWindow6 *iface, IHTMLStorage **p)
1845 {
1846     HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1847     FIXME("(%p)->(%p)\n", This, p);
1848     return E_NOTIMPL;
1849 }
1850
1851 static HRESULT WINAPI HTMLWindow6_put_onhashchange(IHTMLWindow6 *iface, VARIANT v)
1852 {
1853     HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1854     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
1855     return E_NOTIMPL;
1856 }
1857
1858 static HRESULT WINAPI HTMLWindow6_get_onhashchange(IHTMLWindow6 *iface, VARIANT *p)
1859 {
1860     HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1861     FIXME("(%p)->(%p)\n", This, p);
1862     return E_NOTIMPL;
1863 }
1864
1865 static HRESULT WINAPI HTMLWindow6_get_maxConnectionsPerServer(IHTMLWindow6 *iface, LONG *p)
1866 {
1867     HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1868     FIXME("(%p)->(%p)\n", This, p);
1869     return E_NOTIMPL;
1870 }
1871
1872 static HRESULT WINAPI HTMLWindow6_postMessage(IHTMLWindow6 *iface, BSTR msg, VARIANT targetOrigin)
1873 {
1874     HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1875     FIXME("(%p)->(%s %s)\n", This, debugstr_w(msg), debugstr_variant(&targetOrigin));
1876     return E_NOTIMPL;
1877 }
1878
1879 static HRESULT WINAPI HTMLWindow6_toStaticHTML(IHTMLWindow6 *iface, BSTR bstrHTML, BSTR *pbstrStaticHTML)
1880 {
1881     HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1882     FIXME("(%p)->(%s %p)\n", This, debugstr_w(bstrHTML), pbstrStaticHTML);
1883     return E_NOTIMPL;
1884 }
1885
1886 static HRESULT WINAPI HTMLWindow6_put_onmessage(IHTMLWindow6 *iface, VARIANT v)
1887 {
1888     HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1889     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
1890     return E_NOTIMPL;
1891 }
1892
1893 static HRESULT WINAPI HTMLWindow6_get_onmessage(IHTMLWindow6 *iface, VARIANT *p)
1894 {
1895     HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1896     FIXME("(%p)->(%p)\n", This, p);
1897     return E_NOTIMPL;
1898 }
1899
1900 static HRESULT WINAPI HTMLWindow6_msWriteProfilerMark(IHTMLWindow6 *iface, BSTR bstrProfilerMark)
1901 {
1902     HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1903     FIXME("(%p)->(%s)\n", This, debugstr_w(bstrProfilerMark));
1904     return E_NOTIMPL;
1905 }
1906
1907 static const IHTMLWindow6Vtbl HTMLWindow6Vtbl = {
1908     HTMLWindow6_QueryInterface,
1909     HTMLWindow6_AddRef,
1910     HTMLWindow6_Release,
1911     HTMLWindow6_GetTypeInfoCount,
1912     HTMLWindow6_GetTypeInfo,
1913     HTMLWindow6_GetIDsOfNames,
1914     HTMLWindow6_Invoke,
1915     HTMLWindow6_put_XDomainRequest,
1916     HTMLWindow6_get_XDomainRequest,
1917     HTMLWindow6_get_sessionStorage,
1918     HTMLWindow6_get_localStorage,
1919     HTMLWindow6_put_onhashchange,
1920     HTMLWindow6_get_onhashchange,
1921     HTMLWindow6_get_maxConnectionsPerServer,
1922     HTMLWindow6_postMessage,
1923     HTMLWindow6_toStaticHTML,
1924     HTMLWindow6_put_onmessage,
1925     HTMLWindow6_get_onmessage,
1926     HTMLWindow6_msWriteProfilerMark
1927 };
1928
1929 static inline HTMLWindow *impl_from_IHTMLPrivateWindow(IHTMLPrivateWindow *iface)
1930 {
1931     return CONTAINING_RECORD(iface, HTMLWindow, IHTMLPrivateWindow_iface);
1932 }
1933
1934 static HRESULT WINAPI HTMLPrivateWindow_QueryInterface(IHTMLPrivateWindow *iface, REFIID riid, void **ppv)
1935 {
1936     HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
1937
1938     return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
1939 }
1940
1941 static ULONG WINAPI HTMLPrivateWindow_AddRef(IHTMLPrivateWindow *iface)
1942 {
1943     HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
1944
1945     return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
1946 }
1947
1948 static ULONG WINAPI HTMLPrivateWindow_Release(IHTMLPrivateWindow *iface)
1949 {
1950     HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
1951
1952     return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
1953 }
1954
1955 static HRESULT WINAPI HTMLPrivateWindow_SuperNavigate(IHTMLPrivateWindow *iface, BSTR url, BSTR arg2, BSTR arg3,
1956         BSTR arg4, VARIANT *post_data_var, VARIANT *headers_var, ULONG flags)
1957 {
1958     HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
1959     HTMLOuterWindow *window = This->outer_window;
1960     OLECHAR *translated_url = NULL;
1961     DWORD post_data_size = 0;
1962     BYTE *post_data = NULL;
1963     WCHAR *headers = NULL;
1964     IUri *uri;
1965     HRESULT hres;
1966
1967     TRACE("(%p)->(%s %s %s %s %s %s %x)\n", This, debugstr_w(url), debugstr_w(arg2), debugstr_w(arg3), debugstr_w(arg4),
1968           debugstr_variant(post_data_var), debugstr_variant(headers_var), flags);
1969
1970     if(window->doc_obj->hostui) {
1971         hres = IDocHostUIHandler_TranslateUrl(window->doc_obj->hostui, 0, url, &translated_url);
1972         if(hres != S_OK)
1973             translated_url = NULL;
1974     }
1975
1976     hres = CreateUri(translated_url ? translated_url : url, 0, 0, &uri);
1977     CoTaskMemFree(translated_url);
1978     if(FAILED(hres))
1979         return hres;
1980
1981     if(post_data_var) {
1982         if(V_VT(post_data_var) == (VT_ARRAY|VT_UI1)) {
1983             SafeArrayAccessData(V_ARRAY(post_data_var), (void**)&post_data);
1984             post_data_size = V_ARRAY(post_data_var)->rgsabound[0].cElements;
1985         }
1986     }
1987
1988     if(headers_var && V_VT(headers_var) != VT_EMPTY && V_VT(headers_var) != VT_ERROR) {
1989         if(V_VT(headers_var) != VT_BSTR)
1990             return E_INVALIDARG;
1991
1992         headers = V_BSTR(headers_var);
1993     }
1994
1995     hres = super_navigate(window, uri, headers, post_data, post_data_size);
1996     IUri_Release(uri);
1997     if(post_data)
1998         SafeArrayUnaccessData(V_ARRAY(post_data_var));
1999
2000     return hres;
2001 }
2002
2003 static HRESULT WINAPI HTMLPrivateWindow_GetPendingUrl(IHTMLPrivateWindow *iface, BSTR *url)
2004 {
2005     HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
2006     FIXME("(%p)->(%p)\n", This, url);
2007     return E_NOTIMPL;
2008 }
2009
2010 static HRESULT WINAPI HTMLPrivateWindow_SetPICSTarget(IHTMLPrivateWindow *iface, IOleCommandTarget *cmdtrg)
2011 {
2012     HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
2013     FIXME("(%p)->(%p)\n", This, cmdtrg);
2014     return E_NOTIMPL;
2015 }
2016
2017 static HRESULT WINAPI HTMLPrivateWindow_PICSComplete(IHTMLPrivateWindow *iface, int arg)
2018 {
2019     HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
2020     FIXME("(%p)->(%x)\n", This, arg);
2021     return E_NOTIMPL;
2022 }
2023
2024 static HRESULT WINAPI HTMLPrivateWindow_FindWindowByName(IHTMLPrivateWindow *iface, LPCWSTR name, IHTMLWindow2 **ret)
2025 {
2026     HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
2027     FIXME("(%p)->(%s %p)\n", This, debugstr_w(name), ret);
2028     return E_NOTIMPL;
2029 }
2030
2031 static HRESULT WINAPI HTMLPrivateWindow_GetAddressBarUrl(IHTMLPrivateWindow *iface, BSTR *url)
2032 {
2033     HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
2034     TRACE("(%p)->(%p)\n", This, url);
2035
2036     if(!url)
2037         return E_INVALIDARG;
2038
2039     *url = SysAllocString(This->outer_window->url);
2040     return S_OK;
2041 }
2042
2043 static const IHTMLPrivateWindowVtbl HTMLPrivateWindowVtbl = {
2044     HTMLPrivateWindow_QueryInterface,
2045     HTMLPrivateWindow_AddRef,
2046     HTMLPrivateWindow_Release,
2047     HTMLPrivateWindow_SuperNavigate,
2048     HTMLPrivateWindow_GetPendingUrl,
2049     HTMLPrivateWindow_SetPICSTarget,
2050     HTMLPrivateWindow_PICSComplete,
2051     HTMLPrivateWindow_FindWindowByName,
2052     HTMLPrivateWindow_GetAddressBarUrl
2053 };
2054
2055 static inline HTMLWindow *impl_from_ITravelLogClient(ITravelLogClient *iface)
2056 {
2057     return CONTAINING_RECORD(iface, HTMLWindow, ITravelLogClient_iface);
2058 }
2059
2060 static HRESULT WINAPI TravelLogClient_QueryInterface(ITravelLogClient *iface, REFIID riid, void **ppv)
2061 {
2062     HTMLWindow *This = impl_from_ITravelLogClient(iface);
2063
2064     return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
2065 }
2066
2067 static ULONG WINAPI TravelLogClient_AddRef(ITravelLogClient *iface)
2068 {
2069     HTMLWindow *This = impl_from_ITravelLogClient(iface);
2070
2071     return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
2072 }
2073
2074 static ULONG WINAPI TravelLogClient_Release(ITravelLogClient *iface)
2075 {
2076     HTMLWindow *This = impl_from_ITravelLogClient(iface);
2077
2078     return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
2079 }
2080
2081 static HRESULT WINAPI TravelLogClient_FindWindowByIndex(ITravelLogClient *iface, DWORD dwID, IUnknown **ppunk)
2082 {
2083     HTMLWindow *This = impl_from_ITravelLogClient(iface);
2084
2085     FIXME("(%p)->(%d %p) semi-stub\n", This, dwID, ppunk);
2086
2087     *ppunk = NULL;
2088     return E_FAIL;
2089 }
2090
2091 static HRESULT WINAPI TravelLogClient_GetWindowData(ITravelLogClient *iface, IStream *pStream, LPWINDOWDATA pWinData)
2092 {
2093     HTMLWindow *This = impl_from_ITravelLogClient(iface);
2094     FIXME("(%p)->(%p %p)\n", This, pStream, pWinData);
2095     return E_NOTIMPL;
2096 }
2097
2098 static HRESULT WINAPI TravelLogClient_LoadHistoryPosition(ITravelLogClient *iface, LPWSTR pszUrlLocation, DWORD dwPosition)
2099 {
2100     HTMLWindow *This = impl_from_ITravelLogClient(iface);
2101     FIXME("(%p)->(%s %d)\n", This, debugstr_w(pszUrlLocation), dwPosition);
2102     return E_NOTIMPL;
2103 }
2104
2105 static const ITravelLogClientVtbl TravelLogClientVtbl = {
2106     TravelLogClient_QueryInterface,
2107     TravelLogClient_AddRef,
2108     TravelLogClient_Release,
2109     TravelLogClient_FindWindowByIndex,
2110     TravelLogClient_GetWindowData,
2111     TravelLogClient_LoadHistoryPosition
2112 };
2113
2114 static inline HTMLWindow *impl_from_IDispatchEx(IDispatchEx *iface)
2115 {
2116     return CONTAINING_RECORD(iface, HTMLWindow, IDispatchEx_iface);
2117 }
2118
2119 static HRESULT WINAPI WindowDispEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
2120 {
2121     HTMLWindow *This = impl_from_IDispatchEx(iface);
2122
2123     return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
2124 }
2125
2126 static ULONG WINAPI WindowDispEx_AddRef(IDispatchEx *iface)
2127 {
2128     HTMLWindow *This = impl_from_IDispatchEx(iface);
2129
2130     return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
2131 }
2132
2133 static ULONG WINAPI WindowDispEx_Release(IDispatchEx *iface)
2134 {
2135     HTMLWindow *This = impl_from_IDispatchEx(iface);
2136
2137     return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
2138 }
2139
2140 static HRESULT WINAPI WindowDispEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
2141 {
2142     HTMLWindow *This = impl_from_IDispatchEx(iface);
2143
2144     TRACE("(%p)->(%p)\n", This, pctinfo);
2145
2146     return IDispatchEx_GetTypeInfoCount(&This->inner_window->dispex.IDispatchEx_iface, pctinfo);
2147 }
2148
2149 static HRESULT WINAPI WindowDispEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
2150                                                LCID lcid, ITypeInfo **ppTInfo)
2151 {
2152     HTMLWindow *This = impl_from_IDispatchEx(iface);
2153
2154     TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
2155
2156     return IDispatchEx_GetTypeInfo(&This->inner_window->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
2157 }
2158
2159 static HRESULT WINAPI WindowDispEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
2160                                                  LPOLESTR *rgszNames, UINT cNames,
2161                                                  LCID lcid, DISPID *rgDispId)
2162 {
2163     HTMLWindow *This = impl_from_IDispatchEx(iface);
2164     UINT i;
2165     HRESULT hres;
2166
2167     WARN("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
2168           lcid, rgDispId);
2169
2170     for(i=0; i < cNames; i++) {
2171         /* We shouldn't use script's IDispatchEx here, so we shouldn't use GetDispID */
2172         hres = IDispatchEx_GetDispID(&This->IDispatchEx_iface, rgszNames[i], 0, rgDispId+i);
2173         if(FAILED(hres))
2174             return hres;
2175     }
2176
2177     return S_OK;
2178 }
2179
2180 static HRESULT WINAPI WindowDispEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
2181                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
2182                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
2183 {
2184     HTMLWindow *This = impl_from_IDispatchEx(iface);
2185
2186     TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
2187           lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
2188
2189     /* FIXME: Use script dispatch */
2190
2191     return IDispatchEx_Invoke(&This->inner_window->dispex.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
2192             pDispParams, pVarResult, pExcepInfo, puArgErr);
2193 }
2194
2195 static global_prop_t *alloc_global_prop(HTMLInnerWindow *This, global_prop_type_t type, BSTR name)
2196 {
2197     if(This->global_prop_cnt == This->global_prop_size) {
2198         global_prop_t *new_props;
2199         DWORD new_size;
2200
2201         if(This->global_props) {
2202             new_size = This->global_prop_size*2;
2203             new_props = heap_realloc(This->global_props, new_size*sizeof(global_prop_t));
2204         }else {
2205             new_size = 16;
2206             new_props = heap_alloc(new_size*sizeof(global_prop_t));
2207         }
2208         if(!new_props)
2209             return NULL;
2210         This->global_props = new_props;
2211         This->global_prop_size = new_size;
2212     }
2213
2214     This->global_props[This->global_prop_cnt].name = heap_strdupW(name);
2215     if(!This->global_props[This->global_prop_cnt].name)
2216         return NULL;
2217
2218     This->global_props[This->global_prop_cnt].type = type;
2219     return This->global_props + This->global_prop_cnt++;
2220 }
2221
2222 static inline DWORD prop_to_dispid(HTMLInnerWindow *This, global_prop_t *prop)
2223 {
2224     return MSHTML_DISPID_CUSTOM_MIN + (prop-This->global_props);
2225 }
2226
2227 HRESULT search_window_props(HTMLInnerWindow *This, BSTR bstrName, DWORD grfdex, DISPID *pid)
2228 {
2229     DWORD i;
2230     ScriptHost *script_host;
2231     DISPID id;
2232
2233     for(i=0; i < This->global_prop_cnt; i++) {
2234         /* FIXME: case sensitivity */
2235         if(!strcmpW(This->global_props[i].name, bstrName)) {
2236             *pid = MSHTML_DISPID_CUSTOM_MIN+i;
2237             return S_OK;
2238         }
2239     }
2240
2241     if(find_global_prop(This->base.inner_window, bstrName, grfdex, &script_host, &id)) {
2242         global_prop_t *prop;
2243
2244         prop = alloc_global_prop(This, GLOBAL_SCRIPTVAR, bstrName);
2245         if(!prop)
2246             return E_OUTOFMEMORY;
2247
2248         prop->script_host = script_host;
2249         prop->id = id;
2250
2251         *pid = prop_to_dispid(This, prop);
2252         return S_OK;
2253     }
2254
2255     return DISP_E_UNKNOWNNAME;
2256 }
2257
2258 static HRESULT WINAPI WindowDispEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
2259 {
2260     HTMLWindow *This = impl_from_IDispatchEx(iface);
2261     HTMLInnerWindow *window = This->inner_window;
2262     HRESULT hres;
2263
2264     TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid);
2265
2266     hres = search_window_props(window, bstrName, grfdex, pid);
2267     if(hres != DISP_E_UNKNOWNNAME)
2268         return hres;
2269
2270     hres = IDispatchEx_GetDispID(&window->base.inner_window->dispex.IDispatchEx_iface, bstrName, grfdex, pid);
2271     if(hres != DISP_E_UNKNOWNNAME)
2272         return hres;
2273
2274     if(window->base.inner_window->doc) {
2275         global_prop_t *prop;
2276         IHTMLElement *elem;
2277
2278         hres = IHTMLDocument3_getElementById(&window->base.inner_window->doc->basedoc.IHTMLDocument3_iface,
2279                                              bstrName, &elem);
2280         if(SUCCEEDED(hres) && elem) {
2281             IHTMLElement_Release(elem);
2282
2283             prop = alloc_global_prop(window, GLOBAL_ELEMENTVAR, bstrName);
2284             if(!prop)
2285                 return E_OUTOFMEMORY;
2286
2287             *pid = prop_to_dispid(window, prop);
2288             return S_OK;
2289         }
2290     }
2291
2292     return DISP_E_UNKNOWNNAME;
2293 }
2294
2295 static HRESULT WINAPI WindowDispEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
2296         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
2297 {
2298     HTMLWindow *This = impl_from_IDispatchEx(iface);
2299     HTMLOuterWindow *window = This->outer_window;
2300
2301     TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
2302
2303     if(id == DISPID_IHTMLWINDOW2_LOCATION && (wFlags & DISPATCH_PROPERTYPUT)) {
2304         HTMLLocation *location;
2305         HRESULT hres;
2306
2307         TRACE("forwarding to location.href\n");
2308
2309         hres = get_location(window, &location);
2310         if(FAILED(hres))
2311             return hres;
2312
2313         hres = IDispatchEx_InvokeEx(&location->dispex.IDispatchEx_iface, DISPID_VALUE, lcid,
2314                 wFlags, pdp, pvarRes, pei, pspCaller);
2315         IHTMLLocation_Release(&location->IHTMLLocation_iface);
2316         return hres;
2317     }
2318
2319     return IDispatchEx_InvokeEx(&window->base.inner_window->dispex.IDispatchEx_iface, id, lcid, wFlags, pdp, pvarRes,
2320             pei, pspCaller);
2321 }
2322
2323 static HRESULT WINAPI WindowDispEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
2324 {
2325     HTMLWindow *This = impl_from_IDispatchEx(iface);
2326
2327     TRACE("(%p)->(%s %x)\n", This, debugstr_w(bstrName), grfdex);
2328
2329     return IDispatchEx_DeleteMemberByName(&This->inner_window->dispex.IDispatchEx_iface, bstrName, grfdex);
2330 }
2331
2332 static HRESULT WINAPI WindowDispEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
2333 {
2334     HTMLWindow *This = impl_from_IDispatchEx(iface);
2335
2336     TRACE("(%p)->(%x)\n", This, id);
2337
2338     return IDispatchEx_DeleteMemberByDispID(&This->inner_window->dispex.IDispatchEx_iface, id);
2339 }
2340
2341 static HRESULT WINAPI WindowDispEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
2342 {
2343     HTMLWindow *This = impl_from_IDispatchEx(iface);
2344
2345     TRACE("(%p)->(%x %x %p)\n", This, id, grfdexFetch, pgrfdex);
2346
2347     return IDispatchEx_GetMemberProperties(&This->inner_window->dispex.IDispatchEx_iface, id, grfdexFetch,
2348             pgrfdex);
2349 }
2350
2351 static HRESULT WINAPI WindowDispEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
2352 {
2353     HTMLWindow *This = impl_from_IDispatchEx(iface);
2354
2355     TRACE("(%p)->(%x %p)\n", This, id, pbstrName);
2356
2357     return IDispatchEx_GetMemberName(&This->inner_window->dispex.IDispatchEx_iface, id, pbstrName);
2358 }
2359
2360 static HRESULT WINAPI WindowDispEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
2361 {
2362     HTMLWindow *This = impl_from_IDispatchEx(iface);
2363
2364     TRACE("(%p)->(%x %x %p)\n", This, grfdex, id, pid);
2365
2366     return IDispatchEx_GetNextDispID(&This->inner_window->dispex.IDispatchEx_iface, grfdex, id, pid);
2367 }
2368
2369 static HRESULT WINAPI WindowDispEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
2370 {
2371     HTMLWindow *This = impl_from_IDispatchEx(iface);
2372
2373     TRACE("(%p)->(%p)\n", This, ppunk);
2374
2375     *ppunk = NULL;
2376     return S_OK;
2377 }
2378
2379 static const IDispatchExVtbl WindowDispExVtbl = {
2380     WindowDispEx_QueryInterface,
2381     WindowDispEx_AddRef,
2382     WindowDispEx_Release,
2383     WindowDispEx_GetTypeInfoCount,
2384     WindowDispEx_GetTypeInfo,
2385     WindowDispEx_GetIDsOfNames,
2386     WindowDispEx_Invoke,
2387     WindowDispEx_GetDispID,
2388     WindowDispEx_InvokeEx,
2389     WindowDispEx_DeleteMemberByName,
2390     WindowDispEx_DeleteMemberByDispID,
2391     WindowDispEx_GetMemberProperties,
2392     WindowDispEx_GetMemberName,
2393     WindowDispEx_GetNextDispID,
2394     WindowDispEx_GetNameSpaceParent
2395 };
2396
2397 static inline HTMLWindow *impl_from_IServiceProvider(IServiceProvider *iface)
2398 {
2399     return CONTAINING_RECORD(iface, HTMLWindow, IServiceProvider_iface);
2400 }
2401
2402 static HRESULT WINAPI HTMLWindowSP_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
2403 {
2404     HTMLWindow *This = impl_from_IServiceProvider(iface);
2405     return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
2406 }
2407
2408 static ULONG WINAPI HTMLWindowSP_AddRef(IServiceProvider *iface)
2409 {
2410     HTMLWindow *This = impl_from_IServiceProvider(iface);
2411     return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
2412 }
2413
2414 static ULONG WINAPI HTMLWindowSP_Release(IServiceProvider *iface)
2415 {
2416     HTMLWindow *This = impl_from_IServiceProvider(iface);
2417     return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
2418 }
2419
2420 static HRESULT WINAPI HTMLWindowSP_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
2421 {
2422     HTMLWindow *This = impl_from_IServiceProvider(iface);
2423
2424     if(IsEqualGUID(guidService, &IID_IHTMLWindow2)) {
2425         TRACE("IID_IHTMLWindow2\n");
2426         return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
2427     }
2428
2429     TRACE("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
2430
2431     if(!This->outer_window->doc_obj)
2432         return E_NOINTERFACE;
2433
2434     return IServiceProvider_QueryService(&This->outer_window->doc_obj->basedoc.IServiceProvider_iface,
2435             guidService, riid, ppv);
2436 }
2437
2438 static const IServiceProviderVtbl ServiceProviderVtbl = {
2439     HTMLWindowSP_QueryInterface,
2440     HTMLWindowSP_AddRef,
2441     HTMLWindowSP_Release,
2442     HTMLWindowSP_QueryService
2443 };
2444
2445 static inline HTMLInnerWindow *impl_from_DispatchEx(DispatchEx *iface)
2446 {
2447     return CONTAINING_RECORD(iface, HTMLInnerWindow, dispex);
2448 }
2449
2450 static HRESULT HTMLWindow_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params,
2451         VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
2452 {
2453     HTMLInnerWindow *This = impl_from_DispatchEx(dispex);
2454     global_prop_t *prop;
2455     DWORD idx;
2456     HRESULT hres;
2457
2458     idx = id - MSHTML_DISPID_CUSTOM_MIN;
2459     if(idx >= This->global_prop_cnt)
2460         return DISP_E_MEMBERNOTFOUND;
2461
2462     prop = This->global_props+idx;
2463
2464     switch(prop->type) {
2465     case GLOBAL_SCRIPTVAR: {
2466         IDispatchEx *iface;
2467         IDispatch *disp;
2468
2469         disp = get_script_disp(prop->script_host);
2470         if(!disp)
2471             return E_UNEXPECTED;
2472
2473         hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&iface);
2474         if(SUCCEEDED(hres)) {
2475             TRACE("%s >>>\n", debugstr_w(prop->name));
2476             hres = IDispatchEx_InvokeEx(iface, prop->id, lcid, flags, params, res, ei, caller);
2477             if(hres == S_OK)
2478                 TRACE("%s <<<\n", debugstr_w(prop->name));
2479             else
2480                 WARN("%s <<< %08x\n", debugstr_w(prop->name), hres);
2481             IDispatchEx_Release(iface);
2482         }else {
2483             FIXME("No IDispatchEx\n");
2484         }
2485         IDispatch_Release(disp);
2486         break;
2487     }
2488     case GLOBAL_ELEMENTVAR:
2489         switch(flags) {
2490         case DISPATCH_PROPERTYGET: {
2491             IHTMLElement *elem;
2492
2493             hres = IHTMLDocument3_getElementById(&This->base.inner_window->doc->basedoc.IHTMLDocument3_iface,
2494                     prop->name, &elem);
2495             if(FAILED(hres))
2496                 return hres;
2497
2498             if(!elem)
2499                 return DISP_E_MEMBERNOTFOUND;
2500
2501             V_VT(res) = VT_DISPATCH;
2502             V_DISPATCH(res) = (IDispatch*)elem;
2503             return S_OK;
2504         }
2505         case DISPATCH_PROPERTYPUT: {
2506             DISPID dispex_id;
2507
2508             hres = dispex_get_dynid(&This->dispex, prop->name, &dispex_id);
2509             if(FAILED(hres))
2510                 return hres;
2511
2512             prop->type = GLOBAL_DISPEXVAR;
2513             prop->id = dispex_id;
2514             return IDispatchEx_InvokeEx(&This->dispex.IDispatchEx_iface, dispex_id, 0, flags, params, res, ei, caller);
2515         }
2516         default:
2517             FIXME("Not supported flags: %x\n", flags);
2518             return E_NOTIMPL;
2519         }
2520     case GLOBAL_DISPEXVAR:
2521         return IDispatchEx_InvokeEx(&This->dispex.IDispatchEx_iface, prop->id, 0, flags, params, res, ei, caller);
2522     default:
2523         ERR("invalid type %d\n", prop->type);
2524         hres = DISP_E_MEMBERNOTFOUND;
2525     }
2526
2527     return hres;
2528 }
2529
2530
2531 static const dispex_static_data_vtbl_t HTMLWindow_dispex_vtbl = {
2532     NULL,
2533     NULL,
2534     HTMLWindow_invoke,
2535     NULL
2536 };
2537
2538 static const tid_t HTMLWindow_iface_tids[] = {
2539     IHTMLWindow2_tid,
2540     IHTMLWindow3_tid,
2541     IHTMLWindow4_tid,
2542     IHTMLWindow6_tid,
2543     0
2544 };
2545
2546 static dispex_static_data_t HTMLWindow_dispex = {
2547     &HTMLWindow_dispex_vtbl,
2548     DispHTMLWindow2_tid,
2549     NULL,
2550     HTMLWindow_iface_tids
2551 };
2552
2553 static void *alloc_window(size_t size)
2554 {
2555     HTMLWindow *window;
2556
2557     window = heap_alloc_zero(size);
2558     if(!window)
2559         return NULL;
2560
2561     window->IHTMLWindow2_iface.lpVtbl = &HTMLWindow2Vtbl;
2562     window->IHTMLWindow3_iface.lpVtbl = &HTMLWindow3Vtbl;
2563     window->IHTMLWindow4_iface.lpVtbl = &HTMLWindow4Vtbl;
2564     window->IHTMLWindow5_iface.lpVtbl = &HTMLWindow5Vtbl;
2565     window->IHTMLWindow6_iface.lpVtbl = &HTMLWindow6Vtbl;
2566     window->IHTMLPrivateWindow_iface.lpVtbl = &HTMLPrivateWindowVtbl;
2567     window->IDispatchEx_iface.lpVtbl = &WindowDispExVtbl;
2568     window->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl;
2569     window->ITravelLogClient_iface.lpVtbl = &TravelLogClientVtbl;
2570     window->ref = 1;
2571
2572     return window;
2573 }
2574
2575 static HRESULT create_inner_window(HTMLOuterWindow *outer_window, HTMLDocumentNode *doc_node, HTMLInnerWindow **ret)
2576 {
2577     HTMLInnerWindow *window;
2578
2579     window = alloc_window(sizeof(HTMLInnerWindow));
2580     if(!window)
2581         return E_OUTOFMEMORY;
2582
2583     list_init(&window->script_hosts);
2584
2585     window->base.outer_window = outer_window;
2586     window->base.inner_window = window;
2587
2588     htmldoc_addref(&doc_node->basedoc);
2589     window->doc = doc_node;
2590
2591     init_dispex(&window->dispex, (IUnknown*)&window->base.IHTMLWindow2_iface, &HTMLWindow_dispex);
2592
2593     *ret = window;
2594     return S_OK;
2595 }
2596
2597 HRESULT HTMLOuterWindow_Create(HTMLDocumentObj *doc_obj, nsIDOMWindow *nswindow,
2598         HTMLOuterWindow *parent, HTMLOuterWindow **ret)
2599 {
2600     HTMLOuterWindow *window;
2601     HRESULT hres;
2602
2603     window = alloc_window(sizeof(HTMLOuterWindow));
2604     if(!window)
2605         return E_OUTOFMEMORY;
2606
2607     window->base.outer_window = window;
2608     window->base.inner_window = NULL;
2609
2610     window->window_ref = heap_alloc(sizeof(windowref_t));
2611     if(!window->window_ref) {
2612         heap_free(window);
2613         return E_OUTOFMEMORY;
2614     }
2615
2616     window->doc_obj = doc_obj;
2617
2618     window->window_ref->window = window;
2619     window->window_ref->ref = 1;
2620
2621     if(nswindow) {
2622         nsIDOMWindow_AddRef(nswindow);
2623         window->nswindow = nswindow;
2624     }
2625
2626     window->scriptmode = parent ? parent->scriptmode : SCRIPTMODE_GECKO;
2627     window->readystate = READYSTATE_UNINITIALIZED;
2628
2629     hres = update_window_doc(window);
2630     if(FAILED(hres)) {
2631         IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface);
2632         return hres;
2633     }
2634
2635     hres = CoInternetCreateSecurityManager(NULL, &window->secmgr, 0);
2636     if(FAILED(hres)) {
2637         IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface);
2638         return hres;
2639     }
2640
2641     window->task_magic = get_task_target_magic();
2642
2643     list_init(&window->children);
2644     list_add_head(&window_list, &window->entry);
2645
2646     if(parent) {
2647         IHTMLWindow2_AddRef(&window->base.IHTMLWindow2_iface);
2648
2649         window->parent = parent;
2650         list_add_tail(&parent->children, &window->sibling_entry);
2651     }
2652
2653     *ret = window;
2654     return S_OK;
2655 }
2656
2657 static HRESULT window_set_docnode(HTMLOuterWindow *window, HTMLDocumentNode *doc_node)
2658 {
2659     HTMLInnerWindow *inner_window;
2660     HRESULT hres;
2661
2662     if(window->base.inner_window) {
2663         if(window->doc_obj && window == window->doc_obj->basedoc.window)
2664             window->base.inner_window->doc->basedoc.cp_container.forward_container = NULL;
2665         detach_events(window->base.inner_window->doc);
2666         abort_document_bindings(window->base.inner_window->doc);
2667         release_script_hosts(window->base.inner_window);
2668     }
2669
2670     if(doc_node) {
2671         hres = create_inner_window(window, doc_node, &inner_window);
2672         if(FAILED(hres))
2673             return hres;
2674     }else {
2675         inner_window = NULL;
2676     }
2677
2678     if(window->base.inner_window) {
2679         window->base.inner_window->doc->basedoc.window = NULL;
2680         window->base.inner_window->base.outer_window = NULL;
2681         IHTMLWindow2_Release(&window->base.inner_window->base.IHTMLWindow2_iface);
2682     }
2683     window->base.inner_window = inner_window;
2684
2685     if(!doc_node)
2686         return S_OK;
2687
2688     if(window->doc_obj && window->doc_obj->basedoc.window == window) {
2689         if(window->doc_obj->basedoc.doc_node)
2690             htmldoc_release(&window->doc_obj->basedoc.doc_node->basedoc);
2691         window->doc_obj->basedoc.doc_node = doc_node;
2692         if(doc_node)
2693             htmldoc_addref(&doc_node->basedoc);
2694     }
2695
2696     if(doc_node && window->doc_obj && window->doc_obj->usermode == EDITMODE) {
2697         nsAString mode_str;
2698         nsresult nsres;
2699
2700         static const PRUnichar onW[] = {'o','n',0};
2701
2702         nsAString_Init(&mode_str, onW);
2703         nsres = nsIDOMHTMLDocument_SetDesignMode(doc_node->nsdoc, &mode_str);
2704         nsAString_Finish(&mode_str);
2705         if(NS_FAILED(nsres))
2706             ERR("SetDesignMode failed: %08x\n", nsres);
2707     }
2708
2709     return S_OK;
2710 }
2711
2712 HRESULT update_window_doc(HTMLOuterWindow *window)
2713 {
2714     nsIDOMHTMLDocument *nshtmldoc;
2715     nsIDOMDocument *nsdoc;
2716     nsresult nsres;
2717     HRESULT hres;
2718
2719     nsres = nsIDOMWindow_GetDocument(window->nswindow, &nsdoc);
2720     if(NS_FAILED(nsres) || !nsdoc) {
2721         ERR("GetDocument failed: %08x\n", nsres);
2722         return E_FAIL;
2723     }
2724
2725     nsres = nsIDOMDocument_QueryInterface(nsdoc, &IID_nsIDOMHTMLDocument, (void**)&nshtmldoc);
2726     nsIDOMDocument_Release(nsdoc);
2727     if(NS_FAILED(nsres)) {
2728         ERR("Could not get nsIDOMHTMLDocument iface: %08x\n", nsres);
2729         return E_FAIL;
2730     }
2731
2732     if(!window->base.inner_window || window->base.inner_window->doc->nsdoc != nshtmldoc) {
2733         HTMLDocumentNode *doc;
2734
2735         hres = create_doc_from_nsdoc(nshtmldoc, window->doc_obj, window, &doc);
2736         if(SUCCEEDED(hres)) {
2737             hres = window_set_docnode(window, doc);
2738             htmldoc_release(&doc->basedoc);
2739         }else {
2740             ERR("create_doc_from_nsdoc failed: %08x\n", hres);
2741         }
2742     }else {
2743         hres = S_OK;
2744     }
2745
2746     nsIDOMHTMLDocument_Release(nshtmldoc);
2747     return hres;
2748 }
2749
2750 HTMLOuterWindow *nswindow_to_window(const nsIDOMWindow *nswindow)
2751 {
2752     HTMLOuterWindow *iter;
2753
2754     LIST_FOR_EACH_ENTRY(iter, &window_list, HTMLOuterWindow, entry) {
2755         if(iter->nswindow == nswindow)
2756             return iter;
2757     }
2758
2759     return NULL;
2760 }