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