ole32: Don't use real synchronous locks for storage synchronization.
[wine.git] / dlls / mshtml / htmlwindow.c
blob3a31301aa25dbe0f1d2fc5d31531563f816608f8
1 /*
2 * Copyright 2006-2012 Jacek Caban for CodeWeavers
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.
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.
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
19 #include <stdarg.h>
20 #include <assert.h>
22 #define COBJMACROS
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 #include "exdispid.h"
33 #define NO_SHLWAPI_REG
34 #include "shlwapi.h"
36 #include "wine/debug.h"
38 #include "mshtml_private.h"
39 #include "htmlevent.h"
40 #include "htmlscript.h"
41 #include "pluginhost.h"
42 #include "binding.h"
43 #include "resource.h"
45 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
47 static struct list window_list = LIST_INIT(window_list);
49 static inline BOOL is_outer_window(HTMLWindow *window)
51 return &window->outer_window->base == window;
54 static void release_children(HTMLOuterWindow *This)
56 HTMLOuterWindow *child;
58 while(!list_empty(&This->children)) {
59 child = LIST_ENTRY(list_tail(&This->children), HTMLOuterWindow, sibling_entry);
61 list_remove(&child->sibling_entry);
62 child->parent = NULL;
63 IHTMLWindow2_Release(&child->base.IHTMLWindow2_iface);
67 static HRESULT get_location(HTMLInnerWindow *This, HTMLLocation **ret)
69 if(This->location) {
70 IHTMLLocation_AddRef(&This->location->IHTMLLocation_iface);
71 }else {
72 HRESULT hres;
74 hres = HTMLLocation_Create(This, &This->location);
75 if(FAILED(hres))
76 return hres;
79 *ret = This->location;
80 return S_OK;
83 void get_top_window(HTMLOuterWindow *window, HTMLOuterWindow **ret)
85 HTMLOuterWindow *iter;
87 for(iter = window; iter->parent; iter = iter->parent);
88 *ret = iter;
91 static inline HRESULT set_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var)
93 if(!window->inner_window->doc) {
94 FIXME("No document\n");
95 return E_FAIL;
98 return set_event_handler(&window->inner_window->dispex, &window->inner_window->doc->body_event_target,
99 window->inner_window->doc, eid, var);
102 static inline HRESULT get_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var)
104 if(!window->inner_window->doc) {
105 FIXME("No document\n");
106 return E_FAIL;
109 return get_event_handler(&window->inner_window->dispex, &window->inner_window->doc->body_event_target, eid, var);
112 static void detach_inner_window(HTMLInnerWindow *window)
114 HTMLOuterWindow *outer_window = window->base.outer_window;
116 if(outer_window && outer_window->doc_obj && outer_window == outer_window->doc_obj->basedoc.window)
117 window->doc->basedoc.cp_container.forward_container = NULL;
119 if(window->doc) {
120 detach_events(window->doc);
121 while(!list_empty(&window->doc->plugin_hosts))
122 detach_plugin_host(LIST_ENTRY(list_head(&window->doc->plugin_hosts), PluginHost, entry));
125 abort_window_bindings(window);
126 remove_target_tasks(window->task_magic);
127 release_script_hosts(window);
128 window->base.outer_window = NULL;
130 if(outer_window && outer_window->base.inner_window == window) {
131 outer_window->base.inner_window = NULL;
132 IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface);
136 static inline HTMLWindow *impl_from_IHTMLWindow2(IHTMLWindow2 *iface)
138 return CONTAINING_RECORD(iface, HTMLWindow, IHTMLWindow2_iface);
141 static HRESULT WINAPI HTMLWindow2_QueryInterface(IHTMLWindow2 *iface, REFIID riid, void **ppv)
143 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
145 TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
147 if(IsEqualGUID(&IID_IUnknown, riid)) {
148 *ppv = &This->IHTMLWindow2_iface;
149 }else if(IsEqualGUID(&IID_IDispatch, riid)) {
150 *ppv = &This->IHTMLWindow2_iface;
151 }else if(IsEqualGUID(&IID_IDispatchEx, riid)) {
152 *ppv = &This->IDispatchEx_iface;
153 }else if(IsEqualGUID(&IID_IHTMLFramesCollection2, riid)) {
154 *ppv = &This->IHTMLWindow2_iface;
155 }else if(IsEqualGUID(&IID_IHTMLWindow2, riid)) {
156 *ppv = &This->IHTMLWindow2_iface;
157 }else if(IsEqualGUID(&IID_IHTMLWindow3, riid)) {
158 *ppv = &This->IHTMLWindow3_iface;
159 }else if(IsEqualGUID(&IID_IHTMLWindow4, riid)) {
160 *ppv = &This->IHTMLWindow4_iface;
161 }else if(IsEqualGUID(&IID_IHTMLWindow5, riid)) {
162 *ppv = &This->IHTMLWindow5_iface;
163 }else if(IsEqualGUID(&IID_IHTMLWindow6, riid)) {
164 *ppv = &This->IHTMLWindow6_iface;
165 }else if(IsEqualGUID(&IID_IHTMLPrivateWindow, riid)) {
166 *ppv = &This->IHTMLPrivateWindow_iface;
167 }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
168 *ppv = &This->IServiceProvider_iface;
169 }else if(IsEqualGUID(&IID_ITravelLogClient, riid)) {
170 *ppv = &This->ITravelLogClient_iface;
171 }else if(IsEqualGUID(&IID_IObjectIdentity, riid)) {
172 *ppv = &This->IObjectIdentity_iface;
173 }else if(dispex_query_interface(&This->inner_window->dispex, riid, ppv)) {
174 assert(!*ppv);
175 return E_NOINTERFACE;
176 }else {
177 *ppv = NULL;
178 WARN("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
179 return E_NOINTERFACE;
182 IUnknown_AddRef((IUnknown*)*ppv);
183 return S_OK;
186 static ULONG WINAPI HTMLWindow2_AddRef(IHTMLWindow2 *iface)
188 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
189 LONG ref = InterlockedIncrement(&This->ref);
191 TRACE("(%p) ref=%d\n", This, ref);
193 return ref;
196 static void release_outer_window(HTMLOuterWindow *This)
198 if(This->pending_window) {
199 abort_window_bindings(This->pending_window);
200 This->pending_window->base.outer_window = NULL;
201 IHTMLWindow2_Release(&This->pending_window->base.IHTMLWindow2_iface);
204 remove_target_tasks(This->task_magic);
205 set_current_mon(This, NULL, 0);
206 if(This->base.inner_window)
207 detach_inner_window(This->base.inner_window);
208 release_children(This);
210 if(This->secmgr)
211 IInternetSecurityManager_Release(This->secmgr);
213 if(This->frame_element)
214 This->frame_element->content_window = NULL;
216 This->window_ref->window = NULL;
217 windowref_release(This->window_ref);
219 if(This->nswindow)
220 nsIDOMWindow_Release(This->nswindow);
222 list_remove(&This->entry);
223 heap_free(This);
226 static void release_inner_window(HTMLInnerWindow *This)
228 unsigned i;
230 TRACE("%p\n", This);
232 detach_inner_window(This);
234 if(This->doc) {
235 This->doc->window = NULL;
236 htmldoc_release(&This->doc->basedoc);
239 release_dispex(&This->dispex);
241 for(i=0; i < This->global_prop_cnt; i++)
242 heap_free(This->global_props[i].name);
243 heap_free(This->global_props);
245 if(This->location) {
246 This->location->window = NULL;
247 IHTMLLocation_Release(&This->location->IHTMLLocation_iface);
250 if(This->image_factory) {
251 This->image_factory->window = NULL;
252 IHTMLImageElementFactory_Release(&This->image_factory->IHTMLImageElementFactory_iface);
255 if(This->option_factory) {
256 This->option_factory->window = NULL;
257 IHTMLOptionElementFactory_Release(&This->option_factory->IHTMLOptionElementFactory_iface);
260 if(This->screen)
261 IHTMLScreen_Release(This->screen);
263 if(This->history) {
264 This->history->window = NULL;
265 IOmHistory_Release(&This->history->IOmHistory_iface);
268 if(This->session_storage)
269 IHTMLStorage_Release(This->session_storage);
271 if(This->mon)
272 IMoniker_Release(This->mon);
274 heap_free(This);
277 static ULONG WINAPI HTMLWindow2_Release(IHTMLWindow2 *iface)
279 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
280 LONG ref = InterlockedDecrement(&This->ref);
282 TRACE("(%p) ref=%d\n", This, ref);
284 if(!ref) {
285 if(is_outer_window(This))
286 release_outer_window(This->outer_window);
287 else
288 release_inner_window(This->inner_window);
291 return ref;
294 static HRESULT WINAPI HTMLWindow2_GetTypeInfoCount(IHTMLWindow2 *iface, UINT *pctinfo)
296 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
298 return IDispatchEx_GetTypeInfoCount(&This->IDispatchEx_iface, pctinfo);
301 static HRESULT WINAPI HTMLWindow2_GetTypeInfo(IHTMLWindow2 *iface, UINT iTInfo,
302 LCID lcid, ITypeInfo **ppTInfo)
304 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
306 return IDispatchEx_GetTypeInfo(&This->IDispatchEx_iface, iTInfo, lcid, ppTInfo);
309 static HRESULT WINAPI HTMLWindow2_GetIDsOfNames(IHTMLWindow2 *iface, REFIID riid,
310 LPOLESTR *rgszNames, UINT cNames,
311 LCID lcid, DISPID *rgDispId)
313 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
315 return IDispatchEx_GetIDsOfNames(&This->IDispatchEx_iface, riid, rgszNames, cNames, lcid,
316 rgDispId);
319 static HRESULT WINAPI HTMLWindow2_Invoke(IHTMLWindow2 *iface, DISPID dispIdMember,
320 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
321 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
323 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
325 return IDispatchEx_Invoke(&This->IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
326 pDispParams, pVarResult, pExcepInfo, puArgErr);
329 static HRESULT get_frame_by_index(HTMLOuterWindow *This, UINT32 index, HTMLOuterWindow **ret)
331 nsIDOMWindowCollection *nsframes;
332 nsIDOMWindow *nswindow;
333 UINT32 length;
334 nsresult nsres;
336 nsres = nsIDOMWindow_GetFrames(This->nswindow, &nsframes);
337 if(NS_FAILED(nsres)) {
338 FIXME("nsIDOMWindow_GetFrames failed: 0x%08x\n", nsres);
339 return E_FAIL;
342 nsres = nsIDOMWindowCollection_GetLength(nsframes, &length);
343 assert(nsres == NS_OK);
345 if(index >= length) {
346 nsIDOMWindowCollection_Release(nsframes);
347 return DISP_E_MEMBERNOTFOUND;
350 nsres = nsIDOMWindowCollection_Item(nsframes, index, &nswindow);
351 nsIDOMWindowCollection_Release(nsframes);
352 if(NS_FAILED(nsres)) {
353 FIXME("nsIDOMWindowCollection_Item failed: 0x%08x\n", nsres);
354 return E_FAIL;
357 *ret = nswindow_to_window(nswindow);
359 nsIDOMWindow_Release(nswindow);
360 return S_OK;
363 HRESULT get_frame_by_name(HTMLOuterWindow *This, const WCHAR *name, BOOL deep, HTMLOuterWindow **ret)
365 nsIDOMWindowCollection *nsframes;
366 HTMLOuterWindow *window = NULL;
367 nsIDOMWindow *nswindow;
368 nsAString name_str;
369 UINT32 length, i;
370 nsresult nsres;
371 HRESULT hres = S_OK;
373 nsres = nsIDOMWindow_GetFrames(This->nswindow, &nsframes);
374 if(NS_FAILED(nsres)) {
375 FIXME("nsIDOMWindow_GetFrames failed: 0x%08x\n", nsres);
376 return E_FAIL;
379 nsAString_InitDepend(&name_str, name);
380 nsres = nsIDOMWindowCollection_NamedItem(nsframes, &name_str, &nswindow);
381 nsAString_Finish(&name_str);
382 if(NS_FAILED(nsres)) {
383 nsIDOMWindowCollection_Release(nsframes);
384 return E_FAIL;
387 if(nswindow) {
388 *ret = nswindow_to_window(nswindow);
389 return S_OK;
392 nsres = nsIDOMWindowCollection_GetLength(nsframes, &length);
393 assert(nsres == NS_OK);
395 for(i = 0; i < length && !window; ++i) {
396 HTMLOuterWindow *window_iter;
397 BSTR id;
399 nsres = nsIDOMWindowCollection_Item(nsframes, i, &nswindow);
400 if(NS_FAILED(nsres)) {
401 FIXME("nsIDOMWindowCollection_Item failed: 0x%08x\n", nsres);
402 hres = E_FAIL;
403 break;
406 window_iter = nswindow_to_window(nswindow);
408 nsIDOMWindow_Release(nswindow);
410 hres = IHTMLElement_get_id(&window_iter->frame_element->element.IHTMLElement_iface, &id);
411 if(FAILED(hres)) {
412 FIXME("IHTMLElement_get_id failed: 0x%08x\n", hres);
413 break;
416 if(id && !strcmpiW(id, name))
417 window = window_iter;
419 SysFreeString(id);
421 if(!window && deep)
422 get_frame_by_name(window_iter, name, TRUE, &window);
425 nsIDOMWindowCollection_Release(nsframes);
426 if(FAILED(hres))
427 return hres;
429 *ret = window;
430 return NS_OK;
433 static HRESULT WINAPI HTMLWindow2_item(IHTMLWindow2 *iface, VARIANT *pvarIndex, VARIANT *pvarResult)
435 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
436 HTMLOuterWindow *window = NULL;
437 HRESULT hres;
439 TRACE("(%p)->(%p %p)\n", This, pvarIndex, pvarResult);
441 switch(V_VT(pvarIndex)) {
442 case VT_I4: {
443 int index = V_I4(pvarIndex);
444 TRACE("Getting index %d\n", index);
445 if(index < 0)
446 return DISP_E_MEMBERNOTFOUND;
447 hres = get_frame_by_index(This->outer_window, index, &window);
448 break;
450 case VT_UINT: {
451 unsigned int index = V_UINT(pvarIndex);
452 TRACE("Getting index %u\n", index);
453 hres = get_frame_by_index(This->outer_window, index, &window);
454 break;
456 case VT_BSTR: {
457 BSTR str = V_BSTR(pvarIndex);
458 TRACE("Getting name %s\n", wine_dbgstr_w(str));
459 hres = get_frame_by_name(This->outer_window, str, FALSE, &window);
460 break;
462 default:
463 WARN("Invalid index %s\n", debugstr_variant(pvarIndex));
464 return E_INVALIDARG;
467 if(FAILED(hres))
468 return hres;
469 if(!window)
470 return DISP_E_MEMBERNOTFOUND;
472 IHTMLWindow2_AddRef(&window->base.IHTMLWindow2_iface);
473 V_VT(pvarResult) = VT_DISPATCH;
474 V_DISPATCH(pvarResult) = (IDispatch*)window;
475 return S_OK;
478 static HRESULT WINAPI HTMLWindow2_get_length(IHTMLWindow2 *iface, LONG *p)
480 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
481 nsIDOMWindowCollection *nscollection;
482 UINT32 length;
483 nsresult nsres;
485 TRACE("(%p)->(%p)\n", This, p);
487 nsres = nsIDOMWindow_GetFrames(This->outer_window->nswindow, &nscollection);
488 if(NS_FAILED(nsres)) {
489 ERR("GetFrames failed: %08x\n", nsres);
490 return E_FAIL;
493 nsres = nsIDOMWindowCollection_GetLength(nscollection, &length);
494 nsIDOMWindowCollection_Release(nscollection);
495 if(NS_FAILED(nsres)) {
496 ERR("GetLength failed: %08x\n", nsres);
497 return E_FAIL;
500 *p = length;
501 return S_OK;
504 static HRESULT WINAPI HTMLWindow2_get_frames(IHTMLWindow2 *iface, IHTMLFramesCollection2 **p)
506 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
507 FIXME("(%p)->(%p): semi-stub\n", This, p);
509 /* FIXME: Should return a separate Window object */
510 *p = (IHTMLFramesCollection2*)&This->IHTMLWindow2_iface;
511 HTMLWindow2_AddRef(iface);
512 return S_OK;
515 static HRESULT WINAPI HTMLWindow2_put_defaultStatus(IHTMLWindow2 *iface, BSTR v)
517 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
518 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
519 return E_NOTIMPL;
522 static HRESULT WINAPI HTMLWindow2_get_defaultStatus(IHTMLWindow2 *iface, BSTR *p)
524 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
525 FIXME("(%p)->(%p)\n", This, p);
526 return E_NOTIMPL;
529 static HRESULT WINAPI HTMLWindow2_put_status(IHTMLWindow2 *iface, BSTR v)
531 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
533 WARN("(%p)->(%s)\n", This, debugstr_w(v));
536 * FIXME: Since IE7, setting status is blocked, but still possible in certain circumstances.
537 * Ignoring the call should be enough for us.
539 return S_OK;
542 static HRESULT WINAPI HTMLWindow2_get_status(IHTMLWindow2 *iface, BSTR *p)
544 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
546 TRACE("(%p)->(%p)\n", This, p);
548 /* See put_status */
549 *p = NULL;
550 return S_OK;
553 static HRESULT WINAPI HTMLWindow2_setTimeout(IHTMLWindow2 *iface, BSTR expression,
554 LONG msec, VARIANT *language, LONG *timerID)
556 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
557 VARIANT expr_var;
559 TRACE("(%p)->(%s %d %p %p)\n", This, debugstr_w(expression), msec, language, timerID);
561 V_VT(&expr_var) = VT_BSTR;
562 V_BSTR(&expr_var) = expression;
564 return IHTMLWindow3_setTimeout(&This->IHTMLWindow3_iface, &expr_var, msec, language, timerID);
567 static HRESULT WINAPI HTMLWindow2_clearTimeout(IHTMLWindow2 *iface, LONG timerID)
569 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
571 TRACE("(%p)->(%d)\n", This, timerID);
573 return clear_task_timer(This->inner_window, FALSE, timerID);
576 #define MAX_MESSAGE_LEN 2000
578 static HRESULT WINAPI HTMLWindow2_alert(IHTMLWindow2 *iface, BSTR message)
580 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
581 WCHAR title[100], *msg = message;
582 DWORD len;
584 TRACE("(%p)->(%s)\n", This, debugstr_w(message));
586 if(!LoadStringW(get_shdoclc(), IDS_MESSAGE_BOX_TITLE, title,
587 sizeof(title)/sizeof(WCHAR))) {
588 WARN("Could not load message box title: %d\n", GetLastError());
589 return S_OK;
592 len = SysStringLen(message);
593 if(len > MAX_MESSAGE_LEN) {
594 msg = heap_alloc((MAX_MESSAGE_LEN+1)*sizeof(WCHAR));
595 if(!msg)
596 return E_OUTOFMEMORY;
597 memcpy(msg, message, MAX_MESSAGE_LEN*sizeof(WCHAR));
598 msg[MAX_MESSAGE_LEN] = 0;
601 MessageBoxW(This->outer_window->doc_obj->hwnd, msg, title, MB_ICONWARNING);
602 if(msg != message)
603 heap_free(msg);
604 return S_OK;
607 static HRESULT WINAPI HTMLWindow2_confirm(IHTMLWindow2 *iface, BSTR message,
608 VARIANT_BOOL *confirmed)
610 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
611 WCHAR wszTitle[100];
613 TRACE("(%p)->(%s %p)\n", This, debugstr_w(message), confirmed);
615 if(!confirmed) return E_INVALIDARG;
617 if(!LoadStringW(get_shdoclc(), IDS_MESSAGE_BOX_TITLE, wszTitle,
618 sizeof(wszTitle)/sizeof(WCHAR))) {
619 WARN("Could not load message box title: %d\n", GetLastError());
620 *confirmed = VARIANT_TRUE;
621 return S_OK;
624 if(MessageBoxW(This->outer_window->doc_obj->hwnd, message, wszTitle,
625 MB_OKCANCEL|MB_ICONQUESTION)==IDOK)
626 *confirmed = VARIANT_TRUE;
627 else *confirmed = VARIANT_FALSE;
629 return S_OK;
632 typedef struct
634 BSTR message;
635 BSTR dststr;
636 VARIANT *textdata;
637 }prompt_arg;
639 static INT_PTR CALLBACK prompt_dlgproc(HWND hwnd, UINT msg,
640 WPARAM wparam, LPARAM lparam)
642 switch(msg)
644 case WM_INITDIALOG:
646 prompt_arg *arg = (prompt_arg*)lparam;
647 WCHAR wszTitle[100];
649 if(!LoadStringW(get_shdoclc(), IDS_MESSAGE_BOX_TITLE, wszTitle,
650 sizeof(wszTitle)/sizeof(WCHAR))) {
651 WARN("Could not load message box title: %d\n", GetLastError());
652 EndDialog(hwnd, wparam);
653 return FALSE;
656 SetWindowLongPtrW(hwnd, DWLP_USER, lparam);
657 SetWindowTextW(hwnd, wszTitle);
658 SetWindowTextW(GetDlgItem(hwnd, ID_PROMPT_PROMPT), arg->message);
659 SetWindowTextW(GetDlgItem(hwnd, ID_PROMPT_EDIT), arg->dststr);
660 return FALSE;
662 case WM_COMMAND:
663 switch(wparam)
665 case MAKEWPARAM(IDCANCEL, BN_CLICKED):
666 EndDialog(hwnd, wparam);
667 return TRUE;
668 case MAKEWPARAM(IDOK, BN_CLICKED):
670 prompt_arg *arg =
671 (prompt_arg*)GetWindowLongPtrW(hwnd, DWLP_USER);
672 HWND hwndPrompt = GetDlgItem(hwnd, ID_PROMPT_EDIT);
673 INT len = GetWindowTextLengthW(hwndPrompt);
675 if(!arg->textdata)
677 EndDialog(hwnd, wparam);
678 return TRUE;
681 V_VT(arg->textdata) = VT_BSTR;
682 if(!len && !arg->dststr)
683 V_BSTR(arg->textdata) = NULL;
684 else
686 V_BSTR(arg->textdata) = SysAllocStringLen(NULL, len);
687 GetWindowTextW(hwndPrompt, V_BSTR(arg->textdata), len+1);
689 EndDialog(hwnd, wparam);
690 return TRUE;
693 return FALSE;
694 case WM_CLOSE:
695 EndDialog(hwnd, IDCANCEL);
696 return TRUE;
697 default:
698 return FALSE;
702 static HRESULT WINAPI HTMLWindow2_prompt(IHTMLWindow2 *iface, BSTR message,
703 BSTR dststr, VARIANT *textdata)
705 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
706 prompt_arg arg;
708 TRACE("(%p)->(%s %s %p)\n", This, debugstr_w(message), debugstr_w(dststr), textdata);
710 if(textdata) V_VT(textdata) = VT_NULL;
712 arg.message = message;
713 arg.dststr = dststr;
714 arg.textdata = textdata;
716 DialogBoxParamW(hInst, MAKEINTRESOURCEW(ID_PROMPT_DIALOG),
717 This->outer_window->doc_obj->hwnd, prompt_dlgproc, (LPARAM)&arg);
718 return S_OK;
721 static HRESULT WINAPI HTMLWindow2_get_Image(IHTMLWindow2 *iface, IHTMLImageElementFactory **p)
723 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
724 HTMLInnerWindow *window = This->inner_window;
726 TRACE("(%p)->(%p)\n", This, p);
728 if(!window->image_factory) {
729 HRESULT hres;
731 hres = HTMLImageElementFactory_Create(window, &window->image_factory);
732 if(FAILED(hres))
733 return hres;
736 *p = &window->image_factory->IHTMLImageElementFactory_iface;
737 IHTMLImageElementFactory_AddRef(*p);
739 return S_OK;
742 static HRESULT WINAPI HTMLWindow2_get_location(IHTMLWindow2 *iface, IHTMLLocation **p)
744 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
745 HTMLLocation *location;
746 HRESULT hres;
748 TRACE("(%p)->(%p)\n", This, p);
750 hres = get_location(This->inner_window, &location);
751 if(FAILED(hres))
752 return hres;
754 *p = &location->IHTMLLocation_iface;
755 return S_OK;
758 static HRESULT WINAPI HTMLWindow2_get_history(IHTMLWindow2 *iface, IOmHistory **p)
760 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
761 HTMLInnerWindow *window = This->inner_window;
763 TRACE("(%p)->(%p)\n", This, p);
765 if(!window->history) {
766 HRESULT hres;
768 hres = create_history(window, &window->history);
769 if(FAILED(hres))
770 return hres;
773 IOmHistory_AddRef(&window->history->IOmHistory_iface);
774 *p = &window->history->IOmHistory_iface;
775 return S_OK;
778 static BOOL notify_webbrowser_close(HTMLOuterWindow *window, HTMLDocumentObj *doc)
780 IConnectionPointContainer *cp_container;
781 VARIANT_BOOL cancel = VARIANT_FALSE;
782 IEnumConnections *enum_conn;
783 VARIANT args[2];
784 DISPPARAMS dp = {args, NULL, 2, 0};
785 CONNECTDATA conn_data;
786 IConnectionPoint *cp;
787 IDispatch *disp;
788 ULONG fetched;
789 HRESULT hres;
791 if(!doc->webbrowser)
792 return TRUE;
794 hres = IUnknown_QueryInterface(doc->webbrowser, &IID_IConnectionPointContainer, (void**)&cp_container);
795 if(FAILED(hres))
796 return TRUE;
798 hres = IConnectionPointContainer_FindConnectionPoint(cp_container, &DIID_DWebBrowserEvents2, &cp);
799 IConnectionPointContainer_Release(cp_container);
800 if(FAILED(hres))
801 return TRUE;
803 hres = IConnectionPoint_EnumConnections(cp, &enum_conn);
804 IConnectionPoint_Release(cp);
805 if(FAILED(hres))
806 return TRUE;
808 while(!cancel) {
809 conn_data.pUnk = NULL;
810 conn_data.dwCookie = 0;
811 fetched = 0;
812 hres = IEnumConnections_Next(enum_conn, 1, &conn_data, &fetched);
813 if(hres != S_OK)
814 break;
816 hres = IUnknown_QueryInterface(conn_data.pUnk, &IID_IDispatch, (void**)&disp);
817 IUnknown_Release(conn_data.pUnk);
818 if(FAILED(hres))
819 continue;
821 V_VT(args) = VT_BYREF|VT_BOOL;
822 V_BOOLREF(args) = &cancel;
823 V_VT(args+1) = VT_BOOL;
824 V_BOOL(args+1) = window->parent ? VARIANT_TRUE : VARIANT_FALSE;
825 hres = IDispatch_Invoke(disp, DISPID_WINDOWCLOSING, &IID_NULL, 0, DISPATCH_METHOD, &dp, NULL, NULL, NULL);
826 IDispatch_Release(disp);
827 if(FAILED(hres))
828 cancel = VARIANT_FALSE;
831 IEnumConnections_Release(enum_conn);
832 return !cancel;
835 static HRESULT WINAPI HTMLWindow2_close(IHTMLWindow2 *iface)
837 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
838 HTMLOuterWindow *window = This->outer_window;
840 TRACE("(%p)\n", This);
842 if(!window->doc_obj) {
843 FIXME("No document object\n");
844 return E_FAIL;
847 if(!notify_webbrowser_close(window, window->doc_obj))
848 return S_OK;
850 FIXME("default action not implemented\n");
851 return E_NOTIMPL;
854 static HRESULT WINAPI HTMLWindow2_put_opener(IHTMLWindow2 *iface, VARIANT v)
856 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
857 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
858 return E_NOTIMPL;
861 static HRESULT WINAPI HTMLWindow2_get_opener(IHTMLWindow2 *iface, VARIANT *p)
863 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
865 FIXME("(%p)->(%p) returning empty\n", This, p);
867 V_VT(p) = VT_EMPTY;
868 return S_OK;
871 static HRESULT WINAPI HTMLWindow2_get_navigator(IHTMLWindow2 *iface, IOmNavigator **p)
873 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
875 TRACE("(%p)->(%p)\n", This, p);
877 *p = OmNavigator_Create();
878 return *p ? S_OK : E_OUTOFMEMORY;
881 static HRESULT WINAPI HTMLWindow2_put_name(IHTMLWindow2 *iface, BSTR v)
883 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
884 nsAString name_str;
885 nsresult nsres;
887 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
889 nsAString_InitDepend(&name_str, v);
890 nsres = nsIDOMWindow_SetName(This->outer_window->nswindow, &name_str);
891 nsAString_Finish(&name_str);
892 if(NS_FAILED(nsres))
893 ERR("SetName failed: %08x\n", nsres);
895 return S_OK;
898 static HRESULT WINAPI HTMLWindow2_get_name(IHTMLWindow2 *iface, BSTR *p)
900 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
901 nsAString name_str;
902 nsresult nsres;
904 TRACE("(%p)->(%p)\n", This, p);
906 nsAString_Init(&name_str, NULL);
907 nsres = nsIDOMWindow_GetName(This->outer_window->nswindow, &name_str);
908 return return_nsstr(nsres, &name_str, p);
911 static HRESULT WINAPI HTMLWindow2_get_parent(IHTMLWindow2 *iface, IHTMLWindow2 **p)
913 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
914 HTMLOuterWindow *window = This->outer_window;
916 TRACE("(%p)->(%p)\n", This, p);
918 if(!window->parent)
919 return IHTMLWindow2_get_self(&This->IHTMLWindow2_iface, p);
921 *p = &window->parent->base.IHTMLWindow2_iface;
922 IHTMLWindow2_AddRef(*p);
923 return S_OK;
926 static HRESULT WINAPI HTMLWindow2_open(IHTMLWindow2 *iface, BSTR url, BSTR name,
927 BSTR features, VARIANT_BOOL replace, IHTMLWindow2 **pomWindowResult)
929 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
930 HTMLOuterWindow *window = This->outer_window;
931 INewWindowManager *new_window_mgr;
932 BSTR uri_str;
933 IUri *uri;
934 HRESULT hres;
936 static const WCHAR _selfW[] = {'_','s','e','l','f',0};
938 TRACE("(%p)->(%s %s %s %x %p)\n", This, debugstr_w(url), debugstr_w(name),
939 debugstr_w(features), replace, pomWindowResult);
941 if(!window->doc_obj || !window->uri_nofrag)
942 return E_UNEXPECTED;
944 if(name && *name == '_') {
945 if(!strcmpW(name, _selfW)) {
946 if((features && *features) || replace)
947 FIXME("Unsupported arguments for _self target\n");
949 hres = IHTMLWindow2_navigate(&This->IHTMLWindow2_iface, url);
950 if(FAILED(hres))
951 return hres;
953 if(pomWindowResult) {
954 FIXME("Returning this window for _self target\n");
955 *pomWindowResult = &This->IHTMLWindow2_iface;
956 IHTMLWindow2_AddRef(*pomWindowResult);
959 return S_OK;
962 FIXME("Unsupported name %s\n", debugstr_w(name));
963 return E_NOTIMPL;
966 hres = do_query_service((IUnknown*)window->doc_obj->client, &SID_SNewWindowManager, &IID_INewWindowManager,
967 (void**)&new_window_mgr);
968 if(FAILED(hres)) {
969 FIXME("No INewWindowManager\n");
970 return E_NOTIMPL;
973 hres = IUri_GetDisplayUri(window->uri_nofrag, &uri_str);
974 if(SUCCEEDED(hres)) {
975 hres = INewWindowManager_EvaluateNewWindow(new_window_mgr, url, name, uri_str,
976 features, !!replace, window->doc_obj->has_popup ? 0 : NWMF_FIRST, 0);
977 window->doc_obj->has_popup = TRUE;
978 SysFreeString(uri_str);
980 INewWindowManager_Release(new_window_mgr);
981 if(FAILED(hres)) {
982 *pomWindowResult = NULL;
983 return S_OK;
986 hres = create_relative_uri(window, url, &uri);
987 if(FAILED(hres))
988 return hres;
990 hres = navigate_new_window(window, uri, name, NULL, pomWindowResult);
991 IUri_Release(uri);
992 return hres;
995 static HRESULT WINAPI HTMLWindow2_get_self(IHTMLWindow2 *iface, IHTMLWindow2 **p)
997 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
999 TRACE("(%p)->(%p)\n", This, p);
1001 /* FIXME: We should return kind of proxy window here. */
1002 IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
1003 *p = &This->IHTMLWindow2_iface;
1004 return S_OK;
1007 static HRESULT WINAPI HTMLWindow2_get_top(IHTMLWindow2 *iface, IHTMLWindow2 **p)
1009 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1010 HTMLOuterWindow *top;
1012 TRACE("(%p)->(%p)\n", This, p);
1014 get_top_window(This->outer_window, &top);
1015 *p = &top->base.IHTMLWindow2_iface;
1016 IHTMLWindow2_AddRef(*p);
1018 return S_OK;
1021 static HRESULT WINAPI HTMLWindow2_get_window(IHTMLWindow2 *iface, IHTMLWindow2 **p)
1023 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1025 TRACE("(%p)->(%p)\n", This, p);
1027 /* FIXME: We should return kind of proxy window here. */
1028 IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
1029 *p = &This->IHTMLWindow2_iface;
1030 return S_OK;
1033 static HRESULT WINAPI HTMLWindow2_navigate(IHTMLWindow2 *iface, BSTR url)
1035 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1037 TRACE("(%p)->(%s)\n", This, debugstr_w(url));
1039 return navigate_url(This->outer_window, url, This->outer_window->uri, BINDING_NAVIGATED);
1042 static HRESULT WINAPI HTMLWindow2_put_onfocus(IHTMLWindow2 *iface, VARIANT v)
1044 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1046 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1048 return set_window_event(This, EVENTID_FOCUS, &v);
1051 static HRESULT WINAPI HTMLWindow2_get_onfocus(IHTMLWindow2 *iface, VARIANT *p)
1053 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1055 TRACE("(%p)->(%p)\n", This, p);
1057 return get_window_event(This, EVENTID_FOCUS, p);
1060 static HRESULT WINAPI HTMLWindow2_put_onblur(IHTMLWindow2 *iface, VARIANT v)
1062 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1064 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1066 return set_window_event(This, EVENTID_BLUR, &v);
1069 static HRESULT WINAPI HTMLWindow2_get_onblur(IHTMLWindow2 *iface, VARIANT *p)
1071 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1073 TRACE("(%p)->(%p)\n", This, p);
1075 return get_window_event(This, EVENTID_BLUR, p);
1078 static HRESULT WINAPI HTMLWindow2_put_onload(IHTMLWindow2 *iface, VARIANT v)
1080 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1082 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1084 return set_window_event(This, EVENTID_LOAD, &v);
1087 static HRESULT WINAPI HTMLWindow2_get_onload(IHTMLWindow2 *iface, VARIANT *p)
1089 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1091 TRACE("(%p)->(%p)\n", This, p);
1093 return get_window_event(This, EVENTID_LOAD, p);
1096 static HRESULT WINAPI HTMLWindow2_put_onbeforeunload(IHTMLWindow2 *iface, VARIANT v)
1098 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1100 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1102 return set_window_event(This, EVENTID_BEFOREUNLOAD, &v);
1105 static HRESULT WINAPI HTMLWindow2_get_onbeforeunload(IHTMLWindow2 *iface, VARIANT *p)
1107 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1109 TRACE("(%p)->(%p)\n", This, p);
1111 return get_window_event(This, EVENTID_BEFOREUNLOAD, p);
1114 static HRESULT WINAPI HTMLWindow2_put_onunload(IHTMLWindow2 *iface, VARIANT v)
1116 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1117 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
1118 return E_NOTIMPL;
1121 static HRESULT WINAPI HTMLWindow2_get_onunload(IHTMLWindow2 *iface, VARIANT *p)
1123 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1124 FIXME("(%p)->(%p)\n", This, p);
1125 return E_NOTIMPL;
1128 static HRESULT WINAPI HTMLWindow2_put_onhelp(IHTMLWindow2 *iface, VARIANT v)
1130 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1132 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1134 return set_window_event(This, EVENTID_HELP, &v);
1137 static HRESULT WINAPI HTMLWindow2_get_onhelp(IHTMLWindow2 *iface, VARIANT *p)
1139 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1141 TRACE("(%p)->(%p)\n", This, p);
1143 return get_window_event(This, EVENTID_HELP, p);
1146 static HRESULT WINAPI HTMLWindow2_put_onerror(IHTMLWindow2 *iface, VARIANT v)
1148 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1150 FIXME("(%p)->(%s) semi-stub\n", This, debugstr_variant(&v));
1152 return set_window_event(This, EVENTID_ERROR, &v);
1155 static HRESULT WINAPI HTMLWindow2_get_onerror(IHTMLWindow2 *iface, VARIANT *p)
1157 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1159 TRACE("(%p)->(%p)\n", This, p);
1161 return get_window_event(This, EVENTID_ERROR, p);
1164 static HRESULT WINAPI HTMLWindow2_put_onresize(IHTMLWindow2 *iface, VARIANT v)
1166 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1168 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1170 return set_window_event(This, EVENTID_RESIZE, &v);
1173 static HRESULT WINAPI HTMLWindow2_get_onresize(IHTMLWindow2 *iface, VARIANT *p)
1175 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1177 TRACE("(%p)->(%p)\n", This, p);
1179 return get_window_event(This, EVENTID_RESIZE, p);
1182 static HRESULT WINAPI HTMLWindow2_put_onscroll(IHTMLWindow2 *iface, VARIANT v)
1184 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1186 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1188 return set_window_event(This, EVENTID_SCROLL, &v);
1191 static HRESULT WINAPI HTMLWindow2_get_onscroll(IHTMLWindow2 *iface, VARIANT *p)
1193 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1195 TRACE("(%p)->(%p)\n", This, p);
1197 return get_window_event(This, EVENTID_SCROLL, p);
1200 static HRESULT WINAPI HTMLWindow2_get_document(IHTMLWindow2 *iface, IHTMLDocument2 **p)
1202 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1204 TRACE("(%p)->(%p)\n", This, p);
1206 if(This->inner_window->doc) {
1207 /* FIXME: We should return a wrapper object here */
1208 *p = &This->inner_window->doc->basedoc.IHTMLDocument2_iface;
1209 IHTMLDocument2_AddRef(*p);
1210 }else {
1211 *p = NULL;
1214 return S_OK;
1217 static HRESULT WINAPI HTMLWindow2_get_event(IHTMLWindow2 *iface, IHTMLEventObj **p)
1219 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1220 HTMLInnerWindow *window = This->inner_window;
1222 TRACE("(%p)->(%p)\n", This, p);
1224 if(window->event)
1225 IHTMLEventObj_AddRef(window->event);
1226 *p = window->event;
1227 return S_OK;
1230 static HRESULT WINAPI HTMLWindow2_get__newEnum(IHTMLWindow2 *iface, IUnknown **p)
1232 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1233 FIXME("(%p)->(%p)\n", This, p);
1234 return E_NOTIMPL;
1237 static HRESULT WINAPI HTMLWindow2_showModalDialog(IHTMLWindow2 *iface, BSTR dialog,
1238 VARIANT *varArgIn, VARIANT *varOptions, VARIANT *varArgOut)
1240 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1241 FIXME("(%p)->(%s %p %p %p)\n", This, debugstr_w(dialog), varArgIn, varOptions, varArgOut);
1242 return E_NOTIMPL;
1245 static HRESULT WINAPI HTMLWindow2_showHelp(IHTMLWindow2 *iface, BSTR helpURL, VARIANT helpArg,
1246 BSTR features)
1248 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1249 FIXME("(%p)->(%s %s %s)\n", This, debugstr_w(helpURL), debugstr_variant(&helpArg), debugstr_w(features));
1250 return E_NOTIMPL;
1253 static HRESULT WINAPI HTMLWindow2_get_screen(IHTMLWindow2 *iface, IHTMLScreen **p)
1255 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1256 HTMLInnerWindow *window = This->inner_window;
1258 TRACE("(%p)->(%p)\n", This, p);
1260 if(!window->screen) {
1261 HRESULT hres;
1263 hres = HTMLScreen_Create(&window->screen);
1264 if(FAILED(hres))
1265 return hres;
1268 *p = window->screen;
1269 IHTMLScreen_AddRef(window->screen);
1270 return S_OK;
1273 static HRESULT WINAPI HTMLWindow2_get_Option(IHTMLWindow2 *iface, IHTMLOptionElementFactory **p)
1275 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1276 HTMLInnerWindow *window = This->inner_window;
1278 TRACE("(%p)->(%p)\n", This, p);
1280 if(!window->option_factory) {
1281 HRESULT hres;
1283 hres = HTMLOptionElementFactory_Create(window, &window->option_factory);
1284 if(FAILED(hres))
1285 return hres;
1288 *p = &window->option_factory->IHTMLOptionElementFactory_iface;
1289 IHTMLOptionElementFactory_AddRef(*p);
1291 return S_OK;
1294 static HRESULT WINAPI HTMLWindow2_focus(IHTMLWindow2 *iface)
1296 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1298 TRACE("(%p)->()\n", This);
1300 if(This->outer_window->doc_obj)
1301 SetFocus(This->outer_window->doc_obj->hwnd);
1302 return S_OK;
1305 static HRESULT WINAPI HTMLWindow2_get_closed(IHTMLWindow2 *iface, VARIANT_BOOL *p)
1307 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1308 FIXME("(%p)->(%p)\n", This, p);
1309 return E_NOTIMPL;
1312 static HRESULT WINAPI HTMLWindow2_blur(IHTMLWindow2 *iface)
1314 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1315 FIXME("(%p)->()\n", This);
1316 return E_NOTIMPL;
1319 static HRESULT WINAPI HTMLWindow2_scroll(IHTMLWindow2 *iface, LONG x, LONG y)
1321 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1322 nsresult nsres;
1324 TRACE("(%p)->(%d %d)\n", This, x, y);
1326 nsres = nsIDOMWindow_Scroll(This->outer_window->nswindow, x, y);
1327 if(NS_FAILED(nsres)) {
1328 ERR("ScrollBy failed: %08x\n", nsres);
1329 return E_FAIL;
1332 return S_OK;
1335 static HRESULT WINAPI HTMLWindow2_get_clientInformation(IHTMLWindow2 *iface, IOmNavigator **p)
1337 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1338 FIXME("(%p)->(%p)\n", This, p);
1339 return E_NOTIMPL;
1342 static HRESULT WINAPI HTMLWindow2_setInterval(IHTMLWindow2 *iface, BSTR expression,
1343 LONG msec, VARIANT *language, LONG *timerID)
1345 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1346 VARIANT expr;
1348 TRACE("(%p)->(%s %d %p %p)\n", This, debugstr_w(expression), msec, language, timerID);
1350 V_VT(&expr) = VT_BSTR;
1351 V_BSTR(&expr) = expression;
1352 return IHTMLWindow3_setInterval(&This->IHTMLWindow3_iface, &expr, msec, language, timerID);
1355 static HRESULT WINAPI HTMLWindow2_clearInterval(IHTMLWindow2 *iface, LONG timerID)
1357 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1359 TRACE("(%p)->(%d)\n", This, timerID);
1361 return clear_task_timer(This->inner_window, TRUE, timerID);
1364 static HRESULT WINAPI HTMLWindow2_put_offscreenBuffering(IHTMLWindow2 *iface, VARIANT v)
1366 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1367 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
1368 return E_NOTIMPL;
1371 static HRESULT WINAPI HTMLWindow2_get_offscreenBuffering(IHTMLWindow2 *iface, VARIANT *p)
1373 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1374 FIXME("(%p)->(%p)\n", This, p);
1375 return E_NOTIMPL;
1378 static HRESULT WINAPI HTMLWindow2_execScript(IHTMLWindow2 *iface, BSTR scode, BSTR language,
1379 VARIANT *pvarRet)
1381 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1383 TRACE("(%p)->(%s %s %p)\n", This, debugstr_w(scode), debugstr_w(language), pvarRet);
1385 return exec_script(This->inner_window, scode, language, pvarRet);
1388 static HRESULT WINAPI HTMLWindow2_toString(IHTMLWindow2 *iface, BSTR *String)
1390 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1392 static const WCHAR objectW[] = {'[','o','b','j','e','c','t',']',0};
1394 TRACE("(%p)->(%p)\n", This, String);
1396 if(!String)
1397 return E_INVALIDARG;
1399 *String = SysAllocString(objectW);
1400 return *String ? S_OK : E_OUTOFMEMORY;
1403 static HRESULT WINAPI HTMLWindow2_scrollBy(IHTMLWindow2 *iface, LONG x, LONG y)
1405 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1406 nsresult nsres;
1408 TRACE("(%p)->(%d %d)\n", This, x, y);
1410 nsres = nsIDOMWindow_ScrollBy(This->outer_window->nswindow, x, y);
1411 if(NS_FAILED(nsres))
1412 ERR("ScrollBy failed: %08x\n", nsres);
1414 return S_OK;
1417 static HRESULT WINAPI HTMLWindow2_scrollTo(IHTMLWindow2 *iface, LONG x, LONG y)
1419 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1420 nsresult nsres;
1422 TRACE("(%p)->(%d %d)\n", This, x, y);
1424 nsres = nsIDOMWindow_ScrollTo(This->outer_window->nswindow, x, y);
1425 if(NS_FAILED(nsres))
1426 ERR("ScrollTo failed: %08x\n", nsres);
1428 return S_OK;
1431 static HRESULT WINAPI HTMLWindow2_moveTo(IHTMLWindow2 *iface, LONG x, LONG y)
1433 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1434 FIXME("(%p)->(%d %d)\n", This, x, y);
1435 return E_NOTIMPL;
1438 static HRESULT WINAPI HTMLWindow2_moveBy(IHTMLWindow2 *iface, LONG x, LONG y)
1440 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1441 FIXME("(%p)->(%d %d)\n", This, x, y);
1442 return E_NOTIMPL;
1445 static HRESULT WINAPI HTMLWindow2_resizeTo(IHTMLWindow2 *iface, LONG x, LONG y)
1447 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1448 FIXME("(%p)->(%d %d)\n", This, x, y);
1449 return E_NOTIMPL;
1452 static HRESULT WINAPI HTMLWindow2_resizeBy(IHTMLWindow2 *iface, LONG x, LONG y)
1454 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1455 FIXME("(%p)->(%d %d)\n", This, x, y);
1456 return E_NOTIMPL;
1459 static HRESULT WINAPI HTMLWindow2_get_external(IHTMLWindow2 *iface, IDispatch **p)
1461 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1463 TRACE("(%p)->(%p)\n", This, p);
1465 *p = NULL;
1467 if(!This->outer_window->doc_obj->hostui)
1468 return S_OK;
1470 return IDocHostUIHandler_GetExternal(This->outer_window->doc_obj->hostui, p);
1473 static const IHTMLWindow2Vtbl HTMLWindow2Vtbl = {
1474 HTMLWindow2_QueryInterface,
1475 HTMLWindow2_AddRef,
1476 HTMLWindow2_Release,
1477 HTMLWindow2_GetTypeInfoCount,
1478 HTMLWindow2_GetTypeInfo,
1479 HTMLWindow2_GetIDsOfNames,
1480 HTMLWindow2_Invoke,
1481 HTMLWindow2_item,
1482 HTMLWindow2_get_length,
1483 HTMLWindow2_get_frames,
1484 HTMLWindow2_put_defaultStatus,
1485 HTMLWindow2_get_defaultStatus,
1486 HTMLWindow2_put_status,
1487 HTMLWindow2_get_status,
1488 HTMLWindow2_setTimeout,
1489 HTMLWindow2_clearTimeout,
1490 HTMLWindow2_alert,
1491 HTMLWindow2_confirm,
1492 HTMLWindow2_prompt,
1493 HTMLWindow2_get_Image,
1494 HTMLWindow2_get_location,
1495 HTMLWindow2_get_history,
1496 HTMLWindow2_close,
1497 HTMLWindow2_put_opener,
1498 HTMLWindow2_get_opener,
1499 HTMLWindow2_get_navigator,
1500 HTMLWindow2_put_name,
1501 HTMLWindow2_get_name,
1502 HTMLWindow2_get_parent,
1503 HTMLWindow2_open,
1504 HTMLWindow2_get_self,
1505 HTMLWindow2_get_top,
1506 HTMLWindow2_get_window,
1507 HTMLWindow2_navigate,
1508 HTMLWindow2_put_onfocus,
1509 HTMLWindow2_get_onfocus,
1510 HTMLWindow2_put_onblur,
1511 HTMLWindow2_get_onblur,
1512 HTMLWindow2_put_onload,
1513 HTMLWindow2_get_onload,
1514 HTMLWindow2_put_onbeforeunload,
1515 HTMLWindow2_get_onbeforeunload,
1516 HTMLWindow2_put_onunload,
1517 HTMLWindow2_get_onunload,
1518 HTMLWindow2_put_onhelp,
1519 HTMLWindow2_get_onhelp,
1520 HTMLWindow2_put_onerror,
1521 HTMLWindow2_get_onerror,
1522 HTMLWindow2_put_onresize,
1523 HTMLWindow2_get_onresize,
1524 HTMLWindow2_put_onscroll,
1525 HTMLWindow2_get_onscroll,
1526 HTMLWindow2_get_document,
1527 HTMLWindow2_get_event,
1528 HTMLWindow2_get__newEnum,
1529 HTMLWindow2_showModalDialog,
1530 HTMLWindow2_showHelp,
1531 HTMLWindow2_get_screen,
1532 HTMLWindow2_get_Option,
1533 HTMLWindow2_focus,
1534 HTMLWindow2_get_closed,
1535 HTMLWindow2_blur,
1536 HTMLWindow2_scroll,
1537 HTMLWindow2_get_clientInformation,
1538 HTMLWindow2_setInterval,
1539 HTMLWindow2_clearInterval,
1540 HTMLWindow2_put_offscreenBuffering,
1541 HTMLWindow2_get_offscreenBuffering,
1542 HTMLWindow2_execScript,
1543 HTMLWindow2_toString,
1544 HTMLWindow2_scrollBy,
1545 HTMLWindow2_scrollTo,
1546 HTMLWindow2_moveTo,
1547 HTMLWindow2_moveBy,
1548 HTMLWindow2_resizeTo,
1549 HTMLWindow2_resizeBy,
1550 HTMLWindow2_get_external
1553 static inline HTMLWindow *impl_from_IHTMLWindow3(IHTMLWindow3 *iface)
1555 return CONTAINING_RECORD(iface, HTMLWindow, IHTMLWindow3_iface);
1558 static HRESULT WINAPI HTMLWindow3_QueryInterface(IHTMLWindow3 *iface, REFIID riid, void **ppv)
1560 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1562 return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
1565 static ULONG WINAPI HTMLWindow3_AddRef(IHTMLWindow3 *iface)
1567 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1569 return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
1572 static ULONG WINAPI HTMLWindow3_Release(IHTMLWindow3 *iface)
1574 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1576 return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
1579 static HRESULT WINAPI HTMLWindow3_GetTypeInfoCount(IHTMLWindow3 *iface, UINT *pctinfo)
1581 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1583 return IDispatchEx_GetTypeInfoCount(&This->IDispatchEx_iface, pctinfo);
1586 static HRESULT WINAPI HTMLWindow3_GetTypeInfo(IHTMLWindow3 *iface, UINT iTInfo,
1587 LCID lcid, ITypeInfo **ppTInfo)
1589 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1591 return IDispatchEx_GetTypeInfo(&This->IDispatchEx_iface, iTInfo, lcid, ppTInfo);
1594 static HRESULT WINAPI HTMLWindow3_GetIDsOfNames(IHTMLWindow3 *iface, REFIID riid,
1595 LPOLESTR *rgszNames, UINT cNames,
1596 LCID lcid, DISPID *rgDispId)
1598 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1600 return IDispatchEx_GetIDsOfNames(&This->IDispatchEx_iface, riid, rgszNames, cNames, lcid,
1601 rgDispId);
1604 static HRESULT WINAPI HTMLWindow3_Invoke(IHTMLWindow3 *iface, DISPID dispIdMember,
1605 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1606 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1608 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1610 return IDispatchEx_Invoke(&This->IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
1611 pDispParams, pVarResult, pExcepInfo, puArgErr);
1614 static HRESULT WINAPI HTMLWindow3_get_screenLeft(IHTMLWindow3 *iface, LONG *p)
1616 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1617 nsresult nsres;
1619 TRACE("(%p)->(%p)\n", This, p);
1621 nsres = nsIDOMWindow_GetScreenX(This->outer_window->nswindow, p);
1622 if(NS_FAILED(nsres)) {
1623 ERR("GetScreenX failed: %08x\n", nsres);
1624 return E_FAIL;
1627 return S_OK;
1630 static HRESULT WINAPI HTMLWindow3_get_screenTop(IHTMLWindow3 *iface, LONG *p)
1632 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1633 nsresult nsres;
1635 TRACE("(%p)->(%p)\n", This, p);
1637 nsres = nsIDOMWindow_GetScreenY(This->outer_window->nswindow, p);
1638 if(NS_FAILED(nsres)) {
1639 ERR("GetScreenY failed: %08x\n", nsres);
1640 return E_FAIL;
1643 return S_OK;
1646 static HRESULT WINAPI HTMLWindow3_attachEvent(IHTMLWindow3 *iface, BSTR event, IDispatch *pDisp, VARIANT_BOOL *pfResult)
1648 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1649 HTMLInnerWindow *window = This->inner_window;
1651 TRACE("(%p)->(%s %p %p)\n", This, debugstr_w(event), pDisp, pfResult);
1653 if(!window->doc) {
1654 FIXME("No document\n");
1655 return E_FAIL;
1658 return attach_event(&window->doc->body_event_target, &window->doc->basedoc, event, pDisp, pfResult);
1661 static HRESULT WINAPI HTMLWindow3_detachEvent(IHTMLWindow3 *iface, BSTR event, IDispatch *pDisp)
1663 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1664 HTMLInnerWindow *window = This->inner_window;
1666 TRACE("(%p)->()\n", This);
1668 if(!window->doc) {
1669 FIXME("No document\n");
1670 return E_FAIL;
1673 return detach_event(window->doc->body_event_target, &window->doc->basedoc, event, pDisp);
1676 static HRESULT window_set_timer(HTMLInnerWindow *This, VARIANT *expr, LONG msec, VARIANT *language,
1677 BOOL interval, LONG *timer_id)
1679 IDispatch *disp = NULL;
1680 HRESULT hres;
1682 switch(V_VT(expr)) {
1683 case VT_DISPATCH:
1684 disp = V_DISPATCH(expr);
1685 IDispatch_AddRef(disp);
1686 break;
1688 case VT_BSTR:
1689 disp = script_parse_event(This->base.inner_window, V_BSTR(expr));
1690 break;
1692 default:
1693 FIXME("unimplemented expr %s\n", debugstr_variant(expr));
1694 return E_NOTIMPL;
1697 if(!disp)
1698 return E_FAIL;
1700 hres = set_task_timer(This, msec, interval, disp, timer_id);
1701 IDispatch_Release(disp);
1703 return hres;
1706 static HRESULT WINAPI HTMLWindow3_setTimeout(IHTMLWindow3 *iface, VARIANT *expression, LONG msec,
1707 VARIANT *language, LONG *timerID)
1709 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1711 TRACE("(%p)->(%s %d %s %p)\n", This, debugstr_variant(expression), msec, debugstr_variant(language), timerID);
1713 return window_set_timer(This->inner_window, expression, msec, language, FALSE, timerID);
1716 static HRESULT WINAPI HTMLWindow3_setInterval(IHTMLWindow3 *iface, VARIANT *expression, LONG msec,
1717 VARIANT *language, LONG *timerID)
1719 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1721 TRACE("(%p)->(%p %d %p %p)\n", This, expression, msec, language, timerID);
1723 return window_set_timer(This->inner_window, expression, msec, language, TRUE, timerID);
1726 static HRESULT WINAPI HTMLWindow3_print(IHTMLWindow3 *iface)
1728 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1729 FIXME("(%p)\n", This);
1730 return E_NOTIMPL;
1733 static HRESULT WINAPI HTMLWindow3_put_onbeforeprint(IHTMLWindow3 *iface, VARIANT v)
1735 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1736 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
1737 return E_NOTIMPL;
1740 static HRESULT WINAPI HTMLWindow3_get_onbeforeprint(IHTMLWindow3 *iface, VARIANT *p)
1742 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1743 FIXME("(%p)->(%p)\n", This, p);
1744 return E_NOTIMPL;
1747 static HRESULT WINAPI HTMLWindow3_put_onafterprint(IHTMLWindow3 *iface, VARIANT v)
1749 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1750 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
1751 return E_NOTIMPL;
1754 static HRESULT WINAPI HTMLWindow3_get_onafterprint(IHTMLWindow3 *iface, VARIANT *p)
1756 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1757 FIXME("(%p)->(%p)\n", This, p);
1758 return E_NOTIMPL;
1761 static HRESULT WINAPI HTMLWindow3_get_clipboardData(IHTMLWindow3 *iface, IHTMLDataTransfer **p)
1763 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1764 FIXME("(%p)->(%p)\n", This, p);
1765 return E_NOTIMPL;
1768 static HRESULT WINAPI HTMLWindow3_showModelessDialog(IHTMLWindow3 *iface, BSTR url,
1769 VARIANT *varArgIn, VARIANT *options, IHTMLWindow2 **pDialog)
1771 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1772 FIXME("(%p)->(%s %p %p %p)\n", This, debugstr_w(url), varArgIn, options, pDialog);
1773 return E_NOTIMPL;
1776 static const IHTMLWindow3Vtbl HTMLWindow3Vtbl = {
1777 HTMLWindow3_QueryInterface,
1778 HTMLWindow3_AddRef,
1779 HTMLWindow3_Release,
1780 HTMLWindow3_GetTypeInfoCount,
1781 HTMLWindow3_GetTypeInfo,
1782 HTMLWindow3_GetIDsOfNames,
1783 HTMLWindow3_Invoke,
1784 HTMLWindow3_get_screenLeft,
1785 HTMLWindow3_get_screenTop,
1786 HTMLWindow3_attachEvent,
1787 HTMLWindow3_detachEvent,
1788 HTMLWindow3_setTimeout,
1789 HTMLWindow3_setInterval,
1790 HTMLWindow3_print,
1791 HTMLWindow3_put_onbeforeprint,
1792 HTMLWindow3_get_onbeforeprint,
1793 HTMLWindow3_put_onafterprint,
1794 HTMLWindow3_get_onafterprint,
1795 HTMLWindow3_get_clipboardData,
1796 HTMLWindow3_showModelessDialog
1799 static inline HTMLWindow *impl_from_IHTMLWindow4(IHTMLWindow4 *iface)
1801 return CONTAINING_RECORD(iface, HTMLWindow, IHTMLWindow4_iface);
1804 static HRESULT WINAPI HTMLWindow4_QueryInterface(IHTMLWindow4 *iface, REFIID riid, void **ppv)
1806 HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1808 return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
1811 static ULONG WINAPI HTMLWindow4_AddRef(IHTMLWindow4 *iface)
1813 HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1815 return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
1818 static ULONG WINAPI HTMLWindow4_Release(IHTMLWindow4 *iface)
1820 HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1822 return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
1825 static HRESULT WINAPI HTMLWindow4_GetTypeInfoCount(IHTMLWindow4 *iface, UINT *pctinfo)
1827 HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1829 return IDispatchEx_GetTypeInfoCount(&This->IDispatchEx_iface, pctinfo);
1832 static HRESULT WINAPI HTMLWindow4_GetTypeInfo(IHTMLWindow4 *iface, UINT iTInfo,
1833 LCID lcid, ITypeInfo **ppTInfo)
1835 HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1837 return IDispatchEx_GetTypeInfo(&This->IDispatchEx_iface, iTInfo, lcid, ppTInfo);
1840 static HRESULT WINAPI HTMLWindow4_GetIDsOfNames(IHTMLWindow4 *iface, REFIID riid,
1841 LPOLESTR *rgszNames, UINT cNames,
1842 LCID lcid, DISPID *rgDispId)
1844 HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1846 return IDispatchEx_GetIDsOfNames(&This->IDispatchEx_iface, riid, rgszNames, cNames, lcid,
1847 rgDispId);
1850 static HRESULT WINAPI HTMLWindow4_Invoke(IHTMLWindow4 *iface, DISPID dispIdMember,
1851 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1852 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1854 HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1856 return IDispatchEx_Invoke(&This->IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
1857 pDispParams, pVarResult, pExcepInfo, puArgErr);
1860 static HRESULT WINAPI HTMLWindow4_createPopup(IHTMLWindow4 *iface, VARIANT *varArgIn,
1861 IDispatch **ppPopup)
1863 HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1864 FIXME("(%p)->(%p %p)\n", This, varArgIn, ppPopup);
1865 return E_NOTIMPL;
1868 static HRESULT WINAPI HTMLWindow4_get_frameElement(IHTMLWindow4 *iface, IHTMLFrameBase **p)
1870 HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1871 TRACE("(%p)->(%p)\n", This, p);
1873 if(This->outer_window->frame_element) {
1874 *p = &This->outer_window->frame_element->IHTMLFrameBase_iface;
1875 IHTMLFrameBase_AddRef(*p);
1876 }else
1877 *p = NULL;
1879 return S_OK;
1882 static const IHTMLWindow4Vtbl HTMLWindow4Vtbl = {
1883 HTMLWindow4_QueryInterface,
1884 HTMLWindow4_AddRef,
1885 HTMLWindow4_Release,
1886 HTMLWindow4_GetTypeInfoCount,
1887 HTMLWindow4_GetTypeInfo,
1888 HTMLWindow4_GetIDsOfNames,
1889 HTMLWindow4_Invoke,
1890 HTMLWindow4_createPopup,
1891 HTMLWindow4_get_frameElement
1894 static inline HTMLWindow *impl_from_IHTMLWindow5(IHTMLWindow5 *iface)
1896 return CONTAINING_RECORD(iface, HTMLWindow, IHTMLWindow5_iface);
1899 static HRESULT WINAPI HTMLWindow5_QueryInterface(IHTMLWindow5 *iface, REFIID riid, void **ppv)
1901 HTMLWindow *This = impl_from_IHTMLWindow5(iface);
1903 return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
1906 static ULONG WINAPI HTMLWindow5_AddRef(IHTMLWindow5 *iface)
1908 HTMLWindow *This = impl_from_IHTMLWindow5(iface);
1910 return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
1913 static ULONG WINAPI HTMLWindow5_Release(IHTMLWindow5 *iface)
1915 HTMLWindow *This = impl_from_IHTMLWindow5(iface);
1917 return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
1920 static HRESULT WINAPI HTMLWindow5_GetTypeInfoCount(IHTMLWindow5 *iface, UINT *pctinfo)
1922 HTMLWindow *This = impl_from_IHTMLWindow5(iface);
1924 return IDispatchEx_GetTypeInfoCount(&This->IDispatchEx_iface, pctinfo);
1927 static HRESULT WINAPI HTMLWindow5_GetTypeInfo(IHTMLWindow5 *iface, UINT iTInfo,
1928 LCID lcid, ITypeInfo **ppTInfo)
1930 HTMLWindow *This = impl_from_IHTMLWindow5(iface);
1932 return IDispatchEx_GetTypeInfo(&This->IDispatchEx_iface, iTInfo, lcid, ppTInfo);
1935 static HRESULT WINAPI HTMLWindow5_GetIDsOfNames(IHTMLWindow5 *iface, REFIID riid,
1936 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
1938 HTMLWindow *This = impl_from_IHTMLWindow5(iface);
1940 return IDispatchEx_GetIDsOfNames(&This->IDispatchEx_iface, riid, rgszNames, cNames, lcid,
1941 rgDispId);
1944 static HRESULT WINAPI HTMLWindow5_Invoke(IHTMLWindow5 *iface, DISPID dispIdMember,
1945 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1946 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1948 HTMLWindow *This = impl_from_IHTMLWindow5(iface);
1950 return IDispatchEx_Invoke(&This->IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
1951 pDispParams, pVarResult, pExcepInfo, puArgErr);
1954 static HRESULT WINAPI HTMLWindow5_put_XMLHttpRequest(IHTMLWindow5 *iface, VARIANT v)
1956 HTMLWindow *This = impl_from_IHTMLWindow5(iface);
1957 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
1958 return E_NOTIMPL;
1961 static HRESULT WINAPI HTMLWindow5_get_XMLHttpRequest(IHTMLWindow5 *iface, VARIANT *p)
1963 HTMLWindow *This = impl_from_IHTMLWindow5(iface);
1964 FIXME("(%p)->(%p)\n", This, p);
1965 return E_NOTIMPL;
1968 static const IHTMLWindow5Vtbl HTMLWindow5Vtbl = {
1969 HTMLWindow5_QueryInterface,
1970 HTMLWindow5_AddRef,
1971 HTMLWindow5_Release,
1972 HTMLWindow5_GetTypeInfoCount,
1973 HTMLWindow5_GetTypeInfo,
1974 HTMLWindow5_GetIDsOfNames,
1975 HTMLWindow5_Invoke,
1976 HTMLWindow5_put_XMLHttpRequest,
1977 HTMLWindow5_get_XMLHttpRequest
1980 static inline HTMLWindow *impl_from_IHTMLWindow6(IHTMLWindow6 *iface)
1982 return CONTAINING_RECORD(iface, HTMLWindow, IHTMLWindow6_iface);
1985 static HRESULT WINAPI HTMLWindow6_QueryInterface(IHTMLWindow6 *iface, REFIID riid, void **ppv)
1987 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1989 return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
1992 static ULONG WINAPI HTMLWindow6_AddRef(IHTMLWindow6 *iface)
1994 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1996 return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
1999 static ULONG WINAPI HTMLWindow6_Release(IHTMLWindow6 *iface)
2001 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
2003 return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
2006 static HRESULT WINAPI HTMLWindow6_GetTypeInfoCount(IHTMLWindow6 *iface, UINT *pctinfo)
2008 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
2010 return IDispatchEx_GetTypeInfoCount(&This->IDispatchEx_iface, pctinfo);
2013 static HRESULT WINAPI HTMLWindow6_GetTypeInfo(IHTMLWindow6 *iface, UINT iTInfo,
2014 LCID lcid, ITypeInfo **ppTInfo)
2016 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
2018 return IDispatchEx_GetTypeInfo(&This->IDispatchEx_iface, iTInfo, lcid, ppTInfo);
2021 static HRESULT WINAPI HTMLWindow6_GetIDsOfNames(IHTMLWindow6 *iface, REFIID riid,
2022 LPOLESTR *rgszNames, UINT cNames,
2023 LCID lcid, DISPID *rgDispId)
2025 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
2027 return IDispatchEx_GetIDsOfNames(&This->IDispatchEx_iface, riid, rgszNames, cNames, lcid,
2028 rgDispId);
2031 static HRESULT WINAPI HTMLWindow6_Invoke(IHTMLWindow6 *iface, DISPID dispIdMember,
2032 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
2033 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
2035 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
2037 return IDispatchEx_Invoke(&This->IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
2038 pDispParams, pVarResult, pExcepInfo, puArgErr);
2041 static HRESULT WINAPI HTMLWindow6_put_XDomainRequest(IHTMLWindow6 *iface, VARIANT v)
2043 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
2044 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
2045 return E_NOTIMPL;
2048 static HRESULT WINAPI HTMLWindow6_get_XDomainRequest(IHTMLWindow6 *iface, VARIANT *p)
2050 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
2051 FIXME("(%p)->(%p)\n", This, p);
2052 return E_NOTIMPL;
2055 static HRESULT WINAPI HTMLWindow6_get_sessionStorage(IHTMLWindow6 *iface, IHTMLStorage **p)
2057 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
2059 FIXME("(%p)->(%p)\n", This, p);
2061 if(!This->inner_window->session_storage) {
2062 HRESULT hres;
2064 hres = create_storage(&This->inner_window->session_storage);
2065 if(FAILED(hres))
2066 return hres;
2069 IHTMLStorage_AddRef(This->inner_window->session_storage);
2070 *p = This->inner_window->session_storage;
2071 return S_OK;
2074 static HRESULT WINAPI HTMLWindow6_get_localStorage(IHTMLWindow6 *iface, IHTMLStorage **p)
2076 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
2077 FIXME("(%p)->(%p)\n", This, p);
2078 return E_NOTIMPL;
2081 static HRESULT WINAPI HTMLWindow6_put_onhashchange(IHTMLWindow6 *iface, VARIANT v)
2083 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
2084 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
2085 return E_NOTIMPL;
2088 static HRESULT WINAPI HTMLWindow6_get_onhashchange(IHTMLWindow6 *iface, VARIANT *p)
2090 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
2091 FIXME("(%p)->(%p)\n", This, p);
2092 return E_NOTIMPL;
2095 static HRESULT WINAPI HTMLWindow6_get_maxConnectionsPerServer(IHTMLWindow6 *iface, LONG *p)
2097 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
2098 FIXME("(%p)->(%p)\n", This, p);
2099 return E_NOTIMPL;
2102 static HRESULT WINAPI HTMLWindow6_postMessage(IHTMLWindow6 *iface, BSTR msg, VARIANT targetOrigin)
2104 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
2105 FIXME("(%p)->(%s %s)\n", This, debugstr_w(msg), debugstr_variant(&targetOrigin));
2106 return E_NOTIMPL;
2109 static HRESULT WINAPI HTMLWindow6_toStaticHTML(IHTMLWindow6 *iface, BSTR bstrHTML, BSTR *pbstrStaticHTML)
2111 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
2112 FIXME("(%p)->(%s %p)\n", This, debugstr_w(bstrHTML), pbstrStaticHTML);
2113 return E_NOTIMPL;
2116 static HRESULT WINAPI HTMLWindow6_put_onmessage(IHTMLWindow6 *iface, VARIANT v)
2118 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
2119 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
2120 return E_NOTIMPL;
2123 static HRESULT WINAPI HTMLWindow6_get_onmessage(IHTMLWindow6 *iface, VARIANT *p)
2125 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
2126 FIXME("(%p)->(%p)\n", This, p);
2127 return E_NOTIMPL;
2130 static HRESULT WINAPI HTMLWindow6_msWriteProfilerMark(IHTMLWindow6 *iface, BSTR bstrProfilerMark)
2132 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
2133 FIXME("(%p)->(%s)\n", This, debugstr_w(bstrProfilerMark));
2134 return E_NOTIMPL;
2137 static const IHTMLWindow6Vtbl HTMLWindow6Vtbl = {
2138 HTMLWindow6_QueryInterface,
2139 HTMLWindow6_AddRef,
2140 HTMLWindow6_Release,
2141 HTMLWindow6_GetTypeInfoCount,
2142 HTMLWindow6_GetTypeInfo,
2143 HTMLWindow6_GetIDsOfNames,
2144 HTMLWindow6_Invoke,
2145 HTMLWindow6_put_XDomainRequest,
2146 HTMLWindow6_get_XDomainRequest,
2147 HTMLWindow6_get_sessionStorage,
2148 HTMLWindow6_get_localStorage,
2149 HTMLWindow6_put_onhashchange,
2150 HTMLWindow6_get_onhashchange,
2151 HTMLWindow6_get_maxConnectionsPerServer,
2152 HTMLWindow6_postMessage,
2153 HTMLWindow6_toStaticHTML,
2154 HTMLWindow6_put_onmessage,
2155 HTMLWindow6_get_onmessage,
2156 HTMLWindow6_msWriteProfilerMark
2159 static inline HTMLWindow *impl_from_IHTMLPrivateWindow(IHTMLPrivateWindow *iface)
2161 return CONTAINING_RECORD(iface, HTMLWindow, IHTMLPrivateWindow_iface);
2164 static HRESULT WINAPI HTMLPrivateWindow_QueryInterface(IHTMLPrivateWindow *iface, REFIID riid, void **ppv)
2166 HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
2168 return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
2171 static ULONG WINAPI HTMLPrivateWindow_AddRef(IHTMLPrivateWindow *iface)
2173 HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
2175 return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
2178 static ULONG WINAPI HTMLPrivateWindow_Release(IHTMLPrivateWindow *iface)
2180 HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
2182 return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
2185 static HRESULT WINAPI HTMLPrivateWindow_SuperNavigate(IHTMLPrivateWindow *iface, BSTR url, BSTR arg2, BSTR arg3,
2186 BSTR arg4, VARIANT *post_data_var, VARIANT *headers_var, ULONG flags)
2188 HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
2189 HTMLOuterWindow *window = This->outer_window;
2190 OLECHAR *translated_url = NULL;
2191 DWORD post_data_size = 0;
2192 BYTE *post_data = NULL;
2193 WCHAR *headers = NULL;
2194 IUri *uri;
2195 HRESULT hres;
2197 TRACE("(%p)->(%s %s %s %s %s %s %x)\n", This, debugstr_w(url), debugstr_w(arg2), debugstr_w(arg3), debugstr_w(arg4),
2198 debugstr_variant(post_data_var), debugstr_variant(headers_var), flags);
2200 if(window->doc_obj->hostui) {
2201 hres = IDocHostUIHandler_TranslateUrl(window->doc_obj->hostui, 0, url, &translated_url);
2202 if(hres != S_OK)
2203 translated_url = NULL;
2206 hres = create_uri(translated_url ? translated_url : url, 0, &uri);
2207 CoTaskMemFree(translated_url);
2208 if(FAILED(hres))
2209 return hres;
2211 if(post_data_var) {
2212 if(V_VT(post_data_var) == (VT_ARRAY|VT_UI1)) {
2213 SafeArrayAccessData(V_ARRAY(post_data_var), (void**)&post_data);
2214 post_data_size = V_ARRAY(post_data_var)->rgsabound[0].cElements;
2218 if(headers_var && V_VT(headers_var) != VT_EMPTY && V_VT(headers_var) != VT_ERROR) {
2219 if(V_VT(headers_var) != VT_BSTR)
2220 return E_INVALIDARG;
2222 headers = V_BSTR(headers_var);
2225 hres = super_navigate(window, uri, BINDING_NAVIGATED|BINDING_NOFRAG, headers, post_data, post_data_size);
2226 IUri_Release(uri);
2227 if(post_data)
2228 SafeArrayUnaccessData(V_ARRAY(post_data_var));
2230 return hres;
2233 static HRESULT WINAPI HTMLPrivateWindow_GetPendingUrl(IHTMLPrivateWindow *iface, BSTR *url)
2235 HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
2236 FIXME("(%p)->(%p)\n", This, url);
2237 return E_NOTIMPL;
2240 static HRESULT WINAPI HTMLPrivateWindow_SetPICSTarget(IHTMLPrivateWindow *iface, IOleCommandTarget *cmdtrg)
2242 HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
2243 FIXME("(%p)->(%p)\n", This, cmdtrg);
2244 return E_NOTIMPL;
2247 static HRESULT WINAPI HTMLPrivateWindow_PICSComplete(IHTMLPrivateWindow *iface, int arg)
2249 HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
2250 FIXME("(%p)->(%x)\n", This, arg);
2251 return E_NOTIMPL;
2254 static HRESULT WINAPI HTMLPrivateWindow_FindWindowByName(IHTMLPrivateWindow *iface, LPCWSTR name, IHTMLWindow2 **ret)
2256 HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
2257 FIXME("(%p)->(%s %p)\n", This, debugstr_w(name), ret);
2258 return E_NOTIMPL;
2261 static HRESULT WINAPI HTMLPrivateWindow_GetAddressBarUrl(IHTMLPrivateWindow *iface, BSTR *url)
2263 HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
2264 TRACE("(%p)->(%p)\n", This, url);
2266 if(!url)
2267 return E_INVALIDARG;
2269 *url = SysAllocString(This->outer_window->url);
2270 return S_OK;
2273 static const IHTMLPrivateWindowVtbl HTMLPrivateWindowVtbl = {
2274 HTMLPrivateWindow_QueryInterface,
2275 HTMLPrivateWindow_AddRef,
2276 HTMLPrivateWindow_Release,
2277 HTMLPrivateWindow_SuperNavigate,
2278 HTMLPrivateWindow_GetPendingUrl,
2279 HTMLPrivateWindow_SetPICSTarget,
2280 HTMLPrivateWindow_PICSComplete,
2281 HTMLPrivateWindow_FindWindowByName,
2282 HTMLPrivateWindow_GetAddressBarUrl
2285 static inline HTMLWindow *impl_from_ITravelLogClient(ITravelLogClient *iface)
2287 return CONTAINING_RECORD(iface, HTMLWindow, ITravelLogClient_iface);
2290 static HRESULT WINAPI TravelLogClient_QueryInterface(ITravelLogClient *iface, REFIID riid, void **ppv)
2292 HTMLWindow *This = impl_from_ITravelLogClient(iface);
2294 return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
2297 static ULONG WINAPI TravelLogClient_AddRef(ITravelLogClient *iface)
2299 HTMLWindow *This = impl_from_ITravelLogClient(iface);
2301 return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
2304 static ULONG WINAPI TravelLogClient_Release(ITravelLogClient *iface)
2306 HTMLWindow *This = impl_from_ITravelLogClient(iface);
2308 return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
2311 static HRESULT WINAPI TravelLogClient_FindWindowByIndex(ITravelLogClient *iface, DWORD dwID, IUnknown **ppunk)
2313 HTMLWindow *This = impl_from_ITravelLogClient(iface);
2315 FIXME("(%p)->(%d %p) semi-stub\n", This, dwID, ppunk);
2317 *ppunk = NULL;
2318 return E_FAIL;
2321 static HRESULT WINAPI TravelLogClient_GetWindowData(ITravelLogClient *iface, IStream *pStream, LPWINDOWDATA pWinData)
2323 HTMLWindow *This = impl_from_ITravelLogClient(iface);
2324 FIXME("(%p)->(%p %p)\n", This, pStream, pWinData);
2325 return E_NOTIMPL;
2328 static HRESULT WINAPI TravelLogClient_LoadHistoryPosition(ITravelLogClient *iface, LPWSTR pszUrlLocation, DWORD dwPosition)
2330 HTMLWindow *This = impl_from_ITravelLogClient(iface);
2331 FIXME("(%p)->(%s %d)\n", This, debugstr_w(pszUrlLocation), dwPosition);
2332 return E_NOTIMPL;
2335 static const ITravelLogClientVtbl TravelLogClientVtbl = {
2336 TravelLogClient_QueryInterface,
2337 TravelLogClient_AddRef,
2338 TravelLogClient_Release,
2339 TravelLogClient_FindWindowByIndex,
2340 TravelLogClient_GetWindowData,
2341 TravelLogClient_LoadHistoryPosition
2344 static inline HTMLWindow *impl_from_IObjectIdentity(IObjectIdentity *iface)
2346 return CONTAINING_RECORD(iface, HTMLWindow, IObjectIdentity_iface);
2349 static HRESULT WINAPI ObjectIdentity_QueryInterface(IObjectIdentity *iface, REFIID riid, void **ppv)
2351 HTMLWindow *This = impl_from_IObjectIdentity(iface);
2353 return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
2356 static ULONG WINAPI ObjectIdentity_AddRef(IObjectIdentity *iface)
2358 HTMLWindow *This = impl_from_IObjectIdentity(iface);
2360 return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
2363 static ULONG WINAPI ObjectIdentity_Release(IObjectIdentity *iface)
2365 HTMLWindow *This = impl_from_IObjectIdentity(iface);
2367 return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
2370 static HRESULT WINAPI ObjectIdentity_IsEqualObject(IObjectIdentity *iface, IUnknown *unk)
2372 HTMLWindow *This = impl_from_IObjectIdentity(iface);
2373 IServiceProvider *sp;
2374 HRESULT hres;
2376 TRACE("(%p)->(%p)\n", This, unk);
2378 hres = IUnknown_QueryInterface(unk, &IID_IServiceProvider, (void**)&sp);
2379 if(hres != S_OK)
2380 return hres;
2382 hres = &This->inner_window->base.IServiceProvider_iface==sp ||
2383 &This->outer_window->base.IServiceProvider_iface==sp ? S_OK : S_FALSE;
2384 IServiceProvider_Release(sp);
2385 return hres;
2388 static const IObjectIdentityVtbl ObjectIdentityVtbl = {
2389 ObjectIdentity_QueryInterface,
2390 ObjectIdentity_AddRef,
2391 ObjectIdentity_Release,
2392 ObjectIdentity_IsEqualObject
2395 static inline HTMLWindow *impl_from_IDispatchEx(IDispatchEx *iface)
2397 return CONTAINING_RECORD(iface, HTMLWindow, IDispatchEx_iface);
2400 static HRESULT WINAPI WindowDispEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
2402 HTMLWindow *This = impl_from_IDispatchEx(iface);
2404 return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
2407 static ULONG WINAPI WindowDispEx_AddRef(IDispatchEx *iface)
2409 HTMLWindow *This = impl_from_IDispatchEx(iface);
2411 return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
2414 static ULONG WINAPI WindowDispEx_Release(IDispatchEx *iface)
2416 HTMLWindow *This = impl_from_IDispatchEx(iface);
2418 return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
2421 static HRESULT WINAPI WindowDispEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
2423 HTMLWindow *This = impl_from_IDispatchEx(iface);
2425 TRACE("(%p)->(%p)\n", This, pctinfo);
2427 return IDispatchEx_GetTypeInfoCount(&This->inner_window->dispex.IDispatchEx_iface, pctinfo);
2430 static HRESULT WINAPI WindowDispEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
2431 LCID lcid, ITypeInfo **ppTInfo)
2433 HTMLWindow *This = impl_from_IDispatchEx(iface);
2435 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
2437 return IDispatchEx_GetTypeInfo(&This->inner_window->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
2440 static HRESULT WINAPI WindowDispEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
2441 LPOLESTR *rgszNames, UINT cNames,
2442 LCID lcid, DISPID *rgDispId)
2444 HTMLWindow *This = impl_from_IDispatchEx(iface);
2445 UINT i;
2446 HRESULT hres;
2448 WARN("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
2450 for(i=0; i < cNames; i++) {
2451 /* We shouldn't use script's IDispatchEx here, so we shouldn't use GetDispID */
2452 hres = IDispatchEx_GetDispID(&This->IDispatchEx_iface, rgszNames[i], 0, rgDispId+i);
2453 if(FAILED(hres))
2454 return hres;
2457 return S_OK;
2460 static HRESULT WINAPI WindowDispEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
2461 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
2462 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
2464 HTMLWindow *This = impl_from_IDispatchEx(iface);
2466 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
2467 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
2469 /* FIXME: Use script dispatch */
2471 return IDispatchEx_Invoke(&This->inner_window->dispex.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
2472 pDispParams, pVarResult, pExcepInfo, puArgErr);
2475 static global_prop_t *alloc_global_prop(HTMLInnerWindow *This, global_prop_type_t type, BSTR name)
2477 if(This->global_prop_cnt == This->global_prop_size) {
2478 global_prop_t *new_props;
2479 DWORD new_size;
2481 if(This->global_props) {
2482 new_size = This->global_prop_size*2;
2483 new_props = heap_realloc(This->global_props, new_size*sizeof(global_prop_t));
2484 }else {
2485 new_size = 16;
2486 new_props = heap_alloc(new_size*sizeof(global_prop_t));
2488 if(!new_props)
2489 return NULL;
2490 This->global_props = new_props;
2491 This->global_prop_size = new_size;
2494 This->global_props[This->global_prop_cnt].name = heap_strdupW(name);
2495 if(!This->global_props[This->global_prop_cnt].name)
2496 return NULL;
2498 This->global_props[This->global_prop_cnt].type = type;
2499 return This->global_props + This->global_prop_cnt++;
2502 static inline DWORD prop_to_dispid(HTMLInnerWindow *This, global_prop_t *prop)
2504 return MSHTML_DISPID_CUSTOM_MIN + (prop-This->global_props);
2507 HRESULT search_window_props(HTMLInnerWindow *This, BSTR bstrName, DWORD grfdex, DISPID *pid)
2509 DWORD i;
2510 ScriptHost *script_host;
2511 DISPID id;
2513 for(i=0; i < This->global_prop_cnt; i++) {
2514 /* FIXME: case sensitivity */
2515 if(!strcmpW(This->global_props[i].name, bstrName)) {
2516 *pid = MSHTML_DISPID_CUSTOM_MIN+i;
2517 return S_OK;
2521 if(find_global_prop(This->base.inner_window, bstrName, grfdex, &script_host, &id)) {
2522 global_prop_t *prop;
2524 prop = alloc_global_prop(This, GLOBAL_SCRIPTVAR, bstrName);
2525 if(!prop)
2526 return E_OUTOFMEMORY;
2528 prop->script_host = script_host;
2529 prop->id = id;
2531 *pid = prop_to_dispid(This, prop);
2532 return S_OK;
2535 return DISP_E_UNKNOWNNAME;
2538 static HRESULT WINAPI WindowDispEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
2540 HTMLWindow *This = impl_from_IDispatchEx(iface);
2541 HTMLInnerWindow *window = This->inner_window;
2542 HRESULT hres;
2544 TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid);
2546 hres = search_window_props(window, bstrName, grfdex, pid);
2547 if(hres != DISP_E_UNKNOWNNAME)
2548 return hres;
2550 hres = IDispatchEx_GetDispID(&window->base.inner_window->dispex.IDispatchEx_iface, bstrName, grfdex, pid);
2551 if(hres != DISP_E_UNKNOWNNAME)
2552 return hres;
2554 if(This->outer_window) {
2555 HTMLOuterWindow *frame;
2557 hres = get_frame_by_name(This->outer_window, bstrName, FALSE, &frame);
2558 if(SUCCEEDED(hres) && frame) {
2559 global_prop_t *prop;
2561 IHTMLWindow2_Release(&frame->base.IHTMLWindow2_iface);
2563 prop = alloc_global_prop(window, GLOBAL_FRAMEVAR, bstrName);
2564 if(!prop)
2565 return E_OUTOFMEMORY;
2567 *pid = prop_to_dispid(window, prop);
2568 return S_OK;
2572 if(window->doc) {
2573 global_prop_t *prop;
2574 IHTMLElement *elem;
2576 hres = IHTMLDocument3_getElementById(&window->base.inner_window->doc->basedoc.IHTMLDocument3_iface,
2577 bstrName, &elem);
2578 if(SUCCEEDED(hres) && elem) {
2579 IHTMLElement_Release(elem);
2581 prop = alloc_global_prop(window, GLOBAL_ELEMENTVAR, bstrName);
2582 if(!prop)
2583 return E_OUTOFMEMORY;
2585 *pid = prop_to_dispid(window, prop);
2586 return S_OK;
2590 return DISP_E_UNKNOWNNAME;
2593 static HRESULT WINAPI WindowDispEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
2594 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
2596 HTMLWindow *This = impl_from_IDispatchEx(iface);
2597 HTMLInnerWindow *window = This->inner_window;
2599 TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
2601 if(id == DISPID_IHTMLWINDOW2_LOCATION && (wFlags & DISPATCH_PROPERTYPUT)) {
2602 HTMLLocation *location;
2603 HRESULT hres;
2605 TRACE("forwarding to location.href\n");
2607 hres = get_location(window, &location);
2608 if(FAILED(hres))
2609 return hres;
2611 hres = IDispatchEx_InvokeEx(&location->dispex.IDispatchEx_iface, DISPID_VALUE, lcid,
2612 wFlags, pdp, pvarRes, pei, pspCaller);
2613 IHTMLLocation_Release(&location->IHTMLLocation_iface);
2614 return hres;
2617 return IDispatchEx_InvokeEx(&window->dispex.IDispatchEx_iface, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
2620 static HRESULT WINAPI WindowDispEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
2622 HTMLWindow *This = impl_from_IDispatchEx(iface);
2624 TRACE("(%p)->(%s %x)\n", This, debugstr_w(bstrName), grfdex);
2626 return IDispatchEx_DeleteMemberByName(&This->inner_window->dispex.IDispatchEx_iface, bstrName, grfdex);
2629 static HRESULT WINAPI WindowDispEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
2631 HTMLWindow *This = impl_from_IDispatchEx(iface);
2633 TRACE("(%p)->(%x)\n", This, id);
2635 return IDispatchEx_DeleteMemberByDispID(&This->inner_window->dispex.IDispatchEx_iface, id);
2638 static HRESULT WINAPI WindowDispEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
2640 HTMLWindow *This = impl_from_IDispatchEx(iface);
2642 TRACE("(%p)->(%x %x %p)\n", This, id, grfdexFetch, pgrfdex);
2644 return IDispatchEx_GetMemberProperties(&This->inner_window->dispex.IDispatchEx_iface, id, grfdexFetch,
2645 pgrfdex);
2648 static HRESULT WINAPI WindowDispEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
2650 HTMLWindow *This = impl_from_IDispatchEx(iface);
2652 TRACE("(%p)->(%x %p)\n", This, id, pbstrName);
2654 return IDispatchEx_GetMemberName(&This->inner_window->dispex.IDispatchEx_iface, id, pbstrName);
2657 static HRESULT WINAPI WindowDispEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
2659 HTMLWindow *This = impl_from_IDispatchEx(iface);
2661 TRACE("(%p)->(%x %x %p)\n", This, grfdex, id, pid);
2663 return IDispatchEx_GetNextDispID(&This->inner_window->dispex.IDispatchEx_iface, grfdex, id, pid);
2666 static HRESULT WINAPI WindowDispEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
2668 HTMLWindow *This = impl_from_IDispatchEx(iface);
2670 TRACE("(%p)->(%p)\n", This, ppunk);
2672 *ppunk = NULL;
2673 return S_OK;
2676 static const IDispatchExVtbl WindowDispExVtbl = {
2677 WindowDispEx_QueryInterface,
2678 WindowDispEx_AddRef,
2679 WindowDispEx_Release,
2680 WindowDispEx_GetTypeInfoCount,
2681 WindowDispEx_GetTypeInfo,
2682 WindowDispEx_GetIDsOfNames,
2683 WindowDispEx_Invoke,
2684 WindowDispEx_GetDispID,
2685 WindowDispEx_InvokeEx,
2686 WindowDispEx_DeleteMemberByName,
2687 WindowDispEx_DeleteMemberByDispID,
2688 WindowDispEx_GetMemberProperties,
2689 WindowDispEx_GetMemberName,
2690 WindowDispEx_GetNextDispID,
2691 WindowDispEx_GetNameSpaceParent
2694 static inline HTMLWindow *impl_from_IServiceProvider(IServiceProvider *iface)
2696 return CONTAINING_RECORD(iface, HTMLWindow, IServiceProvider_iface);
2699 static HRESULT WINAPI HTMLWindowSP_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
2701 HTMLWindow *This = impl_from_IServiceProvider(iface);
2702 return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
2705 static ULONG WINAPI HTMLWindowSP_AddRef(IServiceProvider *iface)
2707 HTMLWindow *This = impl_from_IServiceProvider(iface);
2708 return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
2711 static ULONG WINAPI HTMLWindowSP_Release(IServiceProvider *iface)
2713 HTMLWindow *This = impl_from_IServiceProvider(iface);
2714 return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
2717 static HRESULT WINAPI HTMLWindowSP_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
2719 HTMLWindow *This = impl_from_IServiceProvider(iface);
2721 if(IsEqualGUID(guidService, &IID_IHTMLWindow2)) {
2722 TRACE("IID_IHTMLWindow2\n");
2723 return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
2726 TRACE("(%p)->(%s %s %p)\n", This, debugstr_mshtml_guid(guidService), debugstr_mshtml_guid(riid), ppv);
2728 if(!This->outer_window->doc_obj)
2729 return E_NOINTERFACE;
2731 return IServiceProvider_QueryService(&This->outer_window->doc_obj->basedoc.IServiceProvider_iface,
2732 guidService, riid, ppv);
2735 static const IServiceProviderVtbl ServiceProviderVtbl = {
2736 HTMLWindowSP_QueryInterface,
2737 HTMLWindowSP_AddRef,
2738 HTMLWindowSP_Release,
2739 HTMLWindowSP_QueryService
2742 static inline HTMLInnerWindow *impl_from_DispatchEx(DispatchEx *iface)
2744 return CONTAINING_RECORD(iface, HTMLInnerWindow, dispex);
2747 static HRESULT HTMLWindow_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params,
2748 VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
2750 HTMLInnerWindow *This = impl_from_DispatchEx(dispex);
2751 global_prop_t *prop;
2752 DWORD idx;
2753 HRESULT hres;
2755 idx = id - MSHTML_DISPID_CUSTOM_MIN;
2756 if(idx >= This->global_prop_cnt)
2757 return DISP_E_MEMBERNOTFOUND;
2759 prop = This->global_props+idx;
2761 switch(prop->type) {
2762 case GLOBAL_SCRIPTVAR: {
2763 IDispatchEx *iface;
2764 IDispatch *disp;
2766 disp = get_script_disp(prop->script_host);
2767 if(!disp)
2768 return E_UNEXPECTED;
2770 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&iface);
2771 if(SUCCEEDED(hres)) {
2772 TRACE("%s >>>\n", debugstr_w(prop->name));
2773 hres = IDispatchEx_InvokeEx(iface, prop->id, lcid, flags, params, res, ei, caller);
2774 if(hres == S_OK)
2775 TRACE("%s <<<\n", debugstr_w(prop->name));
2776 else
2777 WARN("%s <<< %08x\n", debugstr_w(prop->name), hres);
2778 IDispatchEx_Release(iface);
2779 }else {
2780 FIXME("No IDispatchEx\n");
2782 IDispatch_Release(disp);
2783 break;
2785 case GLOBAL_ELEMENTVAR:
2786 switch(flags) {
2787 case DISPATCH_PROPERTYGET|DISPATCH_METHOD:
2788 case DISPATCH_PROPERTYGET: {
2789 IHTMLElement *elem;
2791 hres = IHTMLDocument3_getElementById(&This->base.inner_window->doc->basedoc.IHTMLDocument3_iface,
2792 prop->name, &elem);
2793 if(FAILED(hres))
2794 return hres;
2796 if(!elem)
2797 return DISP_E_MEMBERNOTFOUND;
2799 V_VT(res) = VT_DISPATCH;
2800 V_DISPATCH(res) = (IDispatch*)elem;
2801 return S_OK;
2803 case DISPATCH_PROPERTYPUT: {
2804 DISPID dispex_id;
2806 hres = dispex_get_dynid(&This->dispex, prop->name, &dispex_id);
2807 if(FAILED(hres))
2808 return hres;
2810 prop->type = GLOBAL_DISPEXVAR;
2811 prop->id = dispex_id;
2812 return IDispatchEx_InvokeEx(&This->dispex.IDispatchEx_iface, dispex_id, 0, flags, params, res, ei, caller);
2814 default:
2815 FIXME("Not supported flags: %x\n", flags);
2816 return E_NOTIMPL;
2818 case GLOBAL_FRAMEVAR:
2819 if(!This->base.outer_window)
2820 return E_UNEXPECTED;
2822 switch(flags) {
2823 case DISPATCH_PROPERTYGET: {
2824 HTMLOuterWindow *frame;
2826 hres = get_frame_by_name(This->base.outer_window, prop->name, FALSE, &frame);
2827 if(FAILED(hres))
2828 return hres;
2830 if(!frame)
2831 return DISP_E_MEMBERNOTFOUND;
2833 V_VT(res) = VT_DISPATCH;
2834 V_DISPATCH(res) = (IDispatch*)&frame->base.inner_window->base.IHTMLWindow2_iface;
2835 IDispatch_AddRef(V_DISPATCH(res));
2836 return S_OK;
2838 default:
2839 FIXME("Not supported flags: %x\n", flags);
2840 return E_NOTIMPL;
2842 case GLOBAL_DISPEXVAR:
2843 return IDispatchEx_InvokeEx(&This->dispex.IDispatchEx_iface, prop->id, 0, flags, params, res, ei, caller);
2844 default:
2845 ERR("invalid type %d\n", prop->type);
2846 hres = DISP_E_MEMBERNOTFOUND;
2849 return hres;
2853 static const dispex_static_data_vtbl_t HTMLWindow_dispex_vtbl = {
2854 NULL,
2855 NULL,
2856 HTMLWindow_invoke,
2857 NULL
2860 static const tid_t HTMLWindow_iface_tids[] = {
2861 IHTMLWindow2_tid,
2862 IHTMLWindow3_tid,
2863 IHTMLWindow4_tid,
2864 IHTMLWindow6_tid,
2868 static dispex_static_data_t HTMLWindow_dispex = {
2869 &HTMLWindow_dispex_vtbl,
2870 DispHTMLWindow2_tid,
2871 NULL,
2872 HTMLWindow_iface_tids
2875 static void *alloc_window(size_t size)
2877 HTMLWindow *window;
2879 window = heap_alloc_zero(size);
2880 if(!window)
2881 return NULL;
2883 window->IHTMLWindow2_iface.lpVtbl = &HTMLWindow2Vtbl;
2884 window->IHTMLWindow3_iface.lpVtbl = &HTMLWindow3Vtbl;
2885 window->IHTMLWindow4_iface.lpVtbl = &HTMLWindow4Vtbl;
2886 window->IHTMLWindow5_iface.lpVtbl = &HTMLWindow5Vtbl;
2887 window->IHTMLWindow6_iface.lpVtbl = &HTMLWindow6Vtbl;
2888 window->IHTMLPrivateWindow_iface.lpVtbl = &HTMLPrivateWindowVtbl;
2889 window->IDispatchEx_iface.lpVtbl = &WindowDispExVtbl;
2890 window->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl;
2891 window->ITravelLogClient_iface.lpVtbl = &TravelLogClientVtbl;
2892 window->IObjectIdentity_iface.lpVtbl = &ObjectIdentityVtbl;
2893 window->ref = 1;
2895 return window;
2898 static HRESULT create_inner_window(HTMLOuterWindow *outer_window, IMoniker *mon, HTMLInnerWindow **ret)
2900 HTMLInnerWindow *window;
2902 window = alloc_window(sizeof(HTMLInnerWindow));
2903 if(!window)
2904 return E_OUTOFMEMORY;
2906 list_init(&window->script_hosts);
2907 list_init(&window->bindings);
2908 list_init(&window->script_queue);
2910 window->base.outer_window = outer_window;
2911 window->base.inner_window = window;
2913 init_dispex(&window->dispex, (IUnknown*)&window->base.IHTMLWindow2_iface, &HTMLWindow_dispex);
2915 window->task_magic = get_task_target_magic();
2917 if(mon) {
2918 IMoniker_AddRef(mon);
2919 window->mon = mon;
2922 *ret = window;
2923 return S_OK;
2926 HRESULT HTMLOuterWindow_Create(HTMLDocumentObj *doc_obj, nsIDOMWindow *nswindow,
2927 HTMLOuterWindow *parent, HTMLOuterWindow **ret)
2929 HTMLOuterWindow *window;
2930 HRESULT hres;
2932 window = alloc_window(sizeof(HTMLOuterWindow));
2933 if(!window)
2934 return E_OUTOFMEMORY;
2936 window->base.outer_window = window;
2937 window->base.inner_window = NULL;
2939 window->window_ref = heap_alloc(sizeof(windowref_t));
2940 if(!window->window_ref) {
2941 heap_free(window);
2942 return E_OUTOFMEMORY;
2945 window->doc_obj = doc_obj;
2947 window->window_ref->window = window;
2948 window->window_ref->ref = 1;
2950 if(nswindow) {
2951 nsIDOMWindow_AddRef(nswindow);
2952 window->nswindow = nswindow;
2955 window->scriptmode = parent ? parent->scriptmode : SCRIPTMODE_GECKO;
2956 window->readystate = READYSTATE_UNINITIALIZED;
2958 hres = create_pending_window(window, NULL);
2959 if(SUCCEEDED(hres))
2960 hres = update_window_doc(window->pending_window);
2961 if(FAILED(hres)) {
2962 IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface);
2963 return hres;
2966 hres = CoInternetCreateSecurityManager(NULL, &window->secmgr, 0);
2967 if(FAILED(hres)) {
2968 IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface);
2969 return hres;
2972 window->task_magic = get_task_target_magic();
2974 list_init(&window->children);
2975 list_add_head(&window_list, &window->entry);
2977 if(parent) {
2978 IHTMLWindow2_AddRef(&window->base.IHTMLWindow2_iface);
2980 window->parent = parent;
2981 list_add_tail(&parent->children, &window->sibling_entry);
2984 TRACE("%p inner_window %p\n", window, window->base.inner_window);
2986 *ret = window;
2987 return S_OK;
2990 HRESULT create_pending_window(HTMLOuterWindow *outer_window, nsChannelBSC *channelbsc)
2992 HTMLInnerWindow *pending_window;
2993 HRESULT hres;
2995 hres = create_inner_window(outer_window, outer_window->mon /* FIXME */, &pending_window);
2996 if(FAILED(hres))
2997 return hres;
2999 if(channelbsc) {
3000 IBindStatusCallback_AddRef(&channelbsc->bsc.IBindStatusCallback_iface);
3001 pending_window->bscallback = channelbsc;
3004 if(outer_window->pending_window) {
3005 abort_window_bindings(outer_window->pending_window);
3006 outer_window->pending_window->base.outer_window = NULL;
3007 IHTMLWindow2_Release(&outer_window->pending_window->base.IHTMLWindow2_iface);
3010 outer_window->pending_window = pending_window;
3011 return S_OK;
3014 HRESULT update_window_doc(HTMLInnerWindow *window)
3016 HTMLOuterWindow *outer_window = window->base.outer_window;
3017 nsIDOMHTMLDocument *nshtmldoc;
3018 nsIDOMDocument *nsdoc;
3019 nsresult nsres;
3020 HRESULT hres;
3022 assert(!window->doc);
3024 if(!outer_window) {
3025 ERR("NULL outer window\n");
3026 return E_UNEXPECTED;
3029 nsres = nsIDOMWindow_GetDocument(outer_window->nswindow, &nsdoc);
3030 if(NS_FAILED(nsres) || !nsdoc) {
3031 ERR("GetDocument failed: %08x\n", nsres);
3032 return E_FAIL;
3035 nsres = nsIDOMDocument_QueryInterface(nsdoc, &IID_nsIDOMHTMLDocument, (void**)&nshtmldoc);
3036 nsIDOMDocument_Release(nsdoc);
3037 if(NS_FAILED(nsres)) {
3038 ERR("Could not get nsIDOMHTMLDocument iface: %08x\n", nsres);
3039 return E_FAIL;
3042 hres = create_doc_from_nsdoc(nshtmldoc, outer_window->doc_obj, window, &window->doc);
3043 nsIDOMHTMLDocument_Release(nshtmldoc);
3044 if(FAILED(hres))
3045 return hres;
3047 if(outer_window->doc_obj->usermode == EDITMODE) {
3048 nsAString mode_str;
3049 nsresult nsres;
3051 static const PRUnichar onW[] = {'o','n',0};
3053 nsAString_InitDepend(&mode_str, onW);
3054 nsres = nsIDOMHTMLDocument_SetDesignMode(window->doc->nsdoc, &mode_str);
3055 nsAString_Finish(&mode_str);
3056 if(NS_FAILED(nsres))
3057 ERR("SetDesignMode failed: %08x\n", nsres);
3060 if(window != outer_window->pending_window) {
3061 ERR("not current pending window\n");
3062 return S_OK;
3065 if(outer_window->base.inner_window)
3066 detach_inner_window(outer_window->base.inner_window);
3067 outer_window->base.inner_window = window;
3068 outer_window->pending_window = NULL;
3070 if(outer_window->doc_obj->basedoc.window == outer_window || !outer_window->doc_obj->basedoc.window) {
3071 if(outer_window->doc_obj->basedoc.doc_node)
3072 htmldoc_release(&outer_window->doc_obj->basedoc.doc_node->basedoc);
3073 outer_window->doc_obj->basedoc.doc_node = window->doc;
3074 htmldoc_addref(&window->doc->basedoc);
3077 return hres;
3080 HTMLOuterWindow *nswindow_to_window(const nsIDOMWindow *nswindow)
3082 HTMLOuterWindow *iter;
3084 LIST_FOR_EACH_ENTRY(iter, &window_list, HTMLOuterWindow, entry) {
3085 if(iter->nswindow == nswindow)
3086 return iter;
3089 return NULL;