2 * Copyright 2006-2010 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
31 #define NO_SHLWAPI_REG
34 #include "wine/debug.h"
36 #include "mshtml_private.h"
37 #include "htmlevent.h"
41 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
43 static struct list window_list = LIST_INIT(window_list);
45 static void window_set_docnode(HTMLWindow *window, HTMLDocumentNode *doc_node)
48 if(window->doc_obj && window == window->doc_obj->basedoc.window)
49 window->doc->basedoc.cp_container.forward_container = NULL;
50 detach_events(window->doc);
51 abort_document_bindings(window->doc);
52 window->doc->basedoc.window = NULL;
53 htmldoc_release(&window->doc->basedoc);
55 window->doc = doc_node;
57 htmldoc_addref(&doc_node->basedoc);
59 if(window->doc_obj && window->doc_obj->basedoc.window == window) {
60 if(window->doc_obj->basedoc.doc_node)
61 htmldoc_release(&window->doc_obj->basedoc.doc_node->basedoc);
62 window->doc_obj->basedoc.doc_node = doc_node;
64 htmldoc_addref(&doc_node->basedoc);
67 if(doc_node && window->doc_obj && window->doc_obj->usermode == EDITMODE) {
71 static const PRUnichar onW[] = {'o','n',0};
73 nsAString_Init(&mode_str, onW);
74 nsres = nsIDOMHTMLDocument_SetDesignMode(doc_node->nsdoc, &mode_str);
75 nsAString_Finish(&mode_str);
77 ERR("SetDesignMode failed: %08x\n", nsres);
81 static void release_children(HTMLWindow *This)
85 while(!list_empty(&This->children)) {
86 child = LIST_ENTRY(list_tail(&This->children), HTMLWindow, sibling_entry);
88 list_remove(&child->sibling_entry);
90 IHTMLWindow2_Release(&child->IHTMLWindow2_iface);
94 static HRESULT get_location(HTMLWindow *This, HTMLLocation **ret)
97 IHTMLLocation_AddRef(&This->location->IHTMLLocation_iface);
101 hres = HTMLLocation_Create(This, &This->location);
106 *ret = This->location;
110 static inline HRESULT set_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var)
113 FIXME("No document\n");
117 return set_event_handler(&window->doc->body_event_target, NULL, window->doc, eid, var);
120 static inline HRESULT get_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var)
123 FIXME("No document\n");
127 return get_event_handler(&window->doc->body_event_target, eid, var);
130 static inline HTMLWindow *impl_from_IHTMLWindow2(IHTMLWindow2 *iface)
132 return CONTAINING_RECORD(iface, HTMLWindow, IHTMLWindow2_iface);
135 static HRESULT WINAPI HTMLWindow2_QueryInterface(IHTMLWindow2 *iface, REFIID riid, void **ppv)
137 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
141 if(IsEqualGUID(&IID_IUnknown, riid)) {
142 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
143 *ppv = &This->IHTMLWindow2_iface;
144 }else if(IsEqualGUID(&IID_IDispatch, riid)) {
145 TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
146 *ppv = &This->IHTMLWindow2_iface;
147 }else if(IsEqualGUID(&IID_IDispatchEx, riid)) {
148 TRACE("(%p)->(IID_IDispatchEx %p)\n", This, ppv);
149 *ppv = &This->IDispatchEx_iface;
150 }else if(IsEqualGUID(&IID_IHTMLFramesCollection2, riid)) {
151 TRACE("(%p)->(IID_IHTMLFramesCollection2 %p)\n", This, ppv);
152 *ppv = &This->IHTMLWindow2_iface;
153 }else if(IsEqualGUID(&IID_IHTMLWindow2, riid)) {
154 TRACE("(%p)->(IID_IHTMLWindow2 %p)\n", This, ppv);
155 *ppv = &This->IHTMLWindow2_iface;
156 }else if(IsEqualGUID(&IID_IHTMLWindow3, riid)) {
157 TRACE("(%p)->(IID_IHTMLWindow3 %p)\n", This, ppv);
158 *ppv = &This->IHTMLWindow3_iface;
159 }else if(IsEqualGUID(&IID_IHTMLWindow4, riid)) {
160 TRACE("(%p)->(IID_IHTMLWindow4 %p)\n", This, ppv);
161 *ppv = &This->IHTMLWindow4_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->dispex, riid, ppv)) {
175 return *ppv ? S_OK : E_NOINTERFACE;
179 IUnknown_AddRef((IUnknown*)*ppv);
183 WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
184 return E_NOINTERFACE;
187 static ULONG WINAPI HTMLWindow2_AddRef(IHTMLWindow2 *iface)
189 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
190 LONG ref = InterlockedIncrement(&This->ref);
192 TRACE("(%p) ref=%d\n", This, ref);
197 static ULONG WINAPI HTMLWindow2_Release(IHTMLWindow2 *iface)
199 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
200 LONG ref = InterlockedDecrement(&This->ref);
202 TRACE("(%p) ref=%d\n", This, ref);
207 remove_target_tasks(This->task_magic);
208 set_window_bscallback(This, NULL);
209 set_current_mon(This, NULL);
210 window_set_docnode(This, NULL);
211 release_children(This);
214 IInternetSecurityManager_Release(This->secmgr);
216 if(This->frame_element)
217 This->frame_element->content_window = NULL;
219 if(This->option_factory) {
220 This->option_factory->window = NULL;
221 IHTMLOptionElementFactory_Release(&This->option_factory->IHTMLOptionElementFactory_iface);
224 if(This->image_factory) {
225 This->image_factory->window = NULL;
226 IHTMLImageElementFactory_Release(&This->image_factory->IHTMLImageElementFactory_iface);
230 This->location->window = NULL;
231 IHTMLLocation_Release(&This->location->IHTMLLocation_iface);
235 IHTMLScreen_Release(This->screen);
237 for(i=0; i < This->global_prop_cnt; i++)
238 heap_free(This->global_props[i].name);
240 This->window_ref->window = NULL;
241 windowref_release(This->window_ref);
243 heap_free(This->global_props);
244 release_script_hosts(This);
247 nsIDOMWindow_Release(This->nswindow);
249 list_remove(&This->entry);
250 release_dispex(&This->dispex);
257 static HRESULT WINAPI HTMLWindow2_GetTypeInfoCount(IHTMLWindow2 *iface, UINT *pctinfo)
259 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
261 return IDispatchEx_GetTypeInfoCount(&This->IDispatchEx_iface, pctinfo);
264 static HRESULT WINAPI HTMLWindow2_GetTypeInfo(IHTMLWindow2 *iface, UINT iTInfo,
265 LCID lcid, ITypeInfo **ppTInfo)
267 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
269 return IDispatchEx_GetTypeInfo(&This->IDispatchEx_iface, iTInfo, lcid, ppTInfo);
272 static HRESULT WINAPI HTMLWindow2_GetIDsOfNames(IHTMLWindow2 *iface, REFIID riid,
273 LPOLESTR *rgszNames, UINT cNames,
274 LCID lcid, DISPID *rgDispId)
276 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
278 return IDispatchEx_GetIDsOfNames(&This->IDispatchEx_iface, riid, rgszNames, cNames, lcid,
282 static HRESULT WINAPI HTMLWindow2_Invoke(IHTMLWindow2 *iface, DISPID dispIdMember,
283 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
284 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
286 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
288 return IDispatchEx_Invoke(&This->IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
289 pDispParams, pVarResult, pExcepInfo, puArgErr);
292 static HRESULT get_frame_by_index(nsIDOMWindowCollection *nsFrames, PRUint32 index, HTMLWindow **ret)
295 nsIDOMWindow *nsWindow;
298 nsres = nsIDOMWindowCollection_GetLength(nsFrames, &length);
299 if(NS_FAILED(nsres)) {
300 FIXME("nsIDOMWindowCollection_GetLength failed: 0x%08x\n", nsres);
305 return DISP_E_MEMBERNOTFOUND;
307 nsres = nsIDOMWindowCollection_Item(nsFrames, index, &nsWindow);
308 if(NS_FAILED(nsres)) {
309 FIXME("nsIDOMWindowCollection_Item failed: 0x%08x\n", nsres);
313 *ret = nswindow_to_window(nsWindow);
315 nsIDOMWindow_Release(nsWindow);
320 static HRESULT WINAPI HTMLWindow2_item(IHTMLWindow2 *iface, VARIANT *pvarIndex, VARIANT *pvarResult)
322 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
323 nsIDOMWindowCollection *nsFrames;
324 HTMLWindow *window = NULL;
328 TRACE("(%p)->(%p %p)\n", This, pvarIndex, pvarResult);
330 nsres = nsIDOMWindow_GetFrames(This->nswindow, &nsFrames);
331 if(NS_FAILED(nsres)) {
332 FIXME("nsIDOMWindow_GetFrames failed: 0x%08x\n", nsres);
336 switch(V_VT(pvarIndex)) {
338 int index = V_I4(pvarIndex);
339 TRACE("Getting index %d\n", index);
342 hres = get_frame_by_index(nsFrames, index, &window);
346 unsigned int index = V_UINT(pvarIndex);
347 TRACE("Getting index %u\n", index);
348 hres = get_frame_by_index(nsFrames, index, &window);
352 BSTR str = V_BSTR(pvarIndex);
355 TRACE("Getting name %s\n", wine_dbgstr_w(str));
357 nsIDOMWindowCollection_GetLength(nsFrames, &length);
360 for(i = 0; i < length && !window; ++i) {
361 HTMLWindow *cur_window;
362 nsIDOMWindow *nsWindow;
365 nsres = nsIDOMWindowCollection_Item(nsFrames, i, &nsWindow);
366 if(NS_FAILED(nsres)) {
367 FIXME("nsIDOMWindowCollection_Item failed: 0x%08x\n", nsres);
372 cur_window = nswindow_to_window(nsWindow);
374 nsIDOMWindow_Release(nsWindow);
376 hres = IHTMLElement_get_id(&cur_window->frame_element->element.IHTMLElement_iface, &id);
378 FIXME("IHTMLElement_get_id failed: 0x%08x\n", hres);
382 if(!strcmpW(id, str))
393 nsIDOMWindowCollection_Release(nsFrames);
397 return DISP_E_MEMBERNOTFOUND;
399 IHTMLWindow2_AddRef(&window->IHTMLWindow2_iface);
400 V_VT(pvarResult) = VT_DISPATCH;
401 V_DISPATCH(pvarResult) = (IDispatch*)window;
405 static HRESULT WINAPI HTMLWindow2_get_length(IHTMLWindow2 *iface, LONG *p)
407 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
408 nsIDOMWindowCollection *nscollection;
412 TRACE("(%p)->(%p)\n", This, p);
414 nsres = nsIDOMWindow_GetFrames(This->nswindow, &nscollection);
415 if(NS_FAILED(nsres)) {
416 ERR("GetFrames failed: %08x\n", nsres);
420 nsres = nsIDOMWindowCollection_GetLength(nscollection, &length);
421 nsIDOMWindowCollection_Release(nscollection);
422 if(NS_FAILED(nsres)) {
423 ERR("GetLength failed: %08x\n", nsres);
431 static HRESULT WINAPI HTMLWindow2_get_frames(IHTMLWindow2 *iface, IHTMLFramesCollection2 **p)
433 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
434 FIXME("(%p)->(%p): semi-stub\n", This, p);
436 /* FIXME: Should return a separate Window object */
437 *p = (IHTMLFramesCollection2*)&This->IHTMLWindow2_iface;
438 HTMLWindow2_AddRef(iface);
442 static HRESULT WINAPI HTMLWindow2_put_defaultStatus(IHTMLWindow2 *iface, BSTR v)
444 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
445 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
449 static HRESULT WINAPI HTMLWindow2_get_defaultStatus(IHTMLWindow2 *iface, BSTR *p)
451 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
452 FIXME("(%p)->(%p)\n", This, p);
456 static HRESULT WINAPI HTMLWindow2_put_status(IHTMLWindow2 *iface, BSTR v)
458 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
460 WARN("(%p)->(%s)\n", This, debugstr_w(v));
463 * FIXME: Since IE7, setting status is blocked, but still possible in certain circumstances.
464 * Ignoring the call should be enough for us.
469 static HRESULT WINAPI HTMLWindow2_get_status(IHTMLWindow2 *iface, BSTR *p)
471 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
473 TRACE("(%p)->(%p)\n", This, p);
480 static HRESULT WINAPI HTMLWindow2_setTimeout(IHTMLWindow2 *iface, BSTR expression,
481 LONG msec, VARIANT *language, LONG *timerID)
483 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
486 TRACE("(%p)->(%s %d %p %p)\n", This, debugstr_w(expression), msec, language, timerID);
488 V_VT(&expr_var) = VT_BSTR;
489 V_BSTR(&expr_var) = expression;
491 return IHTMLWindow3_setTimeout(&This->IHTMLWindow3_iface, &expr_var, msec, language, timerID);
494 static HRESULT WINAPI HTMLWindow2_clearTimeout(IHTMLWindow2 *iface, LONG timerID)
496 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
498 TRACE("(%p)->(%d)\n", This, timerID);
500 return clear_task_timer(&This->doc->basedoc, FALSE, timerID);
503 #define MAX_MESSAGE_LEN 2000
505 static HRESULT WINAPI HTMLWindow2_alert(IHTMLWindow2 *iface, BSTR message)
507 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
508 WCHAR title[100], *msg = message;
511 TRACE("(%p)->(%s)\n", This, debugstr_w(message));
513 if(!LoadStringW(get_shdoclc(), IDS_MESSAGE_BOX_TITLE, title,
514 sizeof(title)/sizeof(WCHAR))) {
515 WARN("Could not load message box title: %d\n", GetLastError());
519 len = SysStringLen(message);
520 if(len > MAX_MESSAGE_LEN) {
521 msg = heap_alloc((MAX_MESSAGE_LEN+1)*sizeof(WCHAR));
523 return E_OUTOFMEMORY;
524 memcpy(msg, message, MAX_MESSAGE_LEN*sizeof(WCHAR));
525 msg[MAX_MESSAGE_LEN] = 0;
528 MessageBoxW(This->doc_obj->hwnd, msg, title, MB_ICONWARNING);
534 static HRESULT WINAPI HTMLWindow2_confirm(IHTMLWindow2 *iface, BSTR message,
535 VARIANT_BOOL *confirmed)
537 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
540 TRACE("(%p)->(%s %p)\n", This, debugstr_w(message), confirmed);
542 if(!confirmed) return E_INVALIDARG;
544 if(!LoadStringW(get_shdoclc(), IDS_MESSAGE_BOX_TITLE, wszTitle,
545 sizeof(wszTitle)/sizeof(WCHAR))) {
546 WARN("Could not load message box title: %d\n", GetLastError());
547 *confirmed = VARIANT_TRUE;
551 if(MessageBoxW(This->doc_obj->hwnd, message, wszTitle,
552 MB_OKCANCEL|MB_ICONQUESTION)==IDOK)
553 *confirmed = VARIANT_TRUE;
554 else *confirmed = VARIANT_FALSE;
566 static INT_PTR CALLBACK prompt_dlgproc(HWND hwnd, UINT msg,
567 WPARAM wparam, LPARAM lparam)
573 prompt_arg *arg = (prompt_arg*)lparam;
576 if(!LoadStringW(get_shdoclc(), IDS_MESSAGE_BOX_TITLE, wszTitle,
577 sizeof(wszTitle)/sizeof(WCHAR))) {
578 WARN("Could not load message box title: %d\n", GetLastError());
579 EndDialog(hwnd, wparam);
583 SetWindowLongPtrW(hwnd, DWLP_USER, lparam);
584 SetWindowTextW(hwnd, wszTitle);
585 SetWindowTextW(GetDlgItem(hwnd, ID_PROMPT_PROMPT), arg->message);
586 SetWindowTextW(GetDlgItem(hwnd, ID_PROMPT_EDIT), arg->dststr);
592 case MAKEWPARAM(IDCANCEL, BN_CLICKED):
593 EndDialog(hwnd, wparam);
595 case MAKEWPARAM(IDOK, BN_CLICKED):
598 (prompt_arg*)GetWindowLongPtrW(hwnd, DWLP_USER);
599 HWND hwndPrompt = GetDlgItem(hwnd, ID_PROMPT_EDIT);
600 INT len = GetWindowTextLengthW(hwndPrompt);
604 EndDialog(hwnd, wparam);
608 V_VT(arg->textdata) = VT_BSTR;
609 if(!len && !arg->dststr)
610 V_BSTR(arg->textdata) = NULL;
613 V_BSTR(arg->textdata) = SysAllocStringLen(NULL, len);
614 GetWindowTextW(hwndPrompt, V_BSTR(arg->textdata), len+1);
616 EndDialog(hwnd, wparam);
622 EndDialog(hwnd, IDCANCEL);
629 static HRESULT WINAPI HTMLWindow2_prompt(IHTMLWindow2 *iface, BSTR message,
630 BSTR dststr, VARIANT *textdata)
632 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
635 TRACE("(%p)->(%s %s %p)\n", This, debugstr_w(message), debugstr_w(dststr), textdata);
637 if(textdata) V_VT(textdata) = VT_NULL;
639 arg.message = message;
641 arg.textdata = textdata;
643 DialogBoxParamW(hInst, MAKEINTRESOURCEW(ID_PROMPT_DIALOG),
644 This->doc_obj->hwnd, prompt_dlgproc, (LPARAM)&arg);
648 static HRESULT WINAPI HTMLWindow2_get_Image(IHTMLWindow2 *iface, IHTMLImageElementFactory **p)
650 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
652 TRACE("(%p)->(%p)\n", This, p);
654 if(!This->image_factory)
655 This->image_factory = HTMLImageElementFactory_Create(This);
657 *p = &This->image_factory->IHTMLImageElementFactory_iface;
658 IHTMLImageElementFactory_AddRef(*p);
663 static HRESULT WINAPI HTMLWindow2_get_location(IHTMLWindow2 *iface, IHTMLLocation **p)
665 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
666 HTMLLocation *location;
669 TRACE("(%p)->(%p)\n", This, p);
671 hres = get_location(This, &location);
675 *p = &location->IHTMLLocation_iface;
679 static HRESULT WINAPI HTMLWindow2_get_history(IHTMLWindow2 *iface, IOmHistory **p)
681 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
682 FIXME("(%p)->(%p)\n", This, p);
686 static HRESULT WINAPI HTMLWindow2_close(IHTMLWindow2 *iface)
688 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
689 FIXME("(%p)->()\n", This);
693 static HRESULT WINAPI HTMLWindow2_put_opener(IHTMLWindow2 *iface, VARIANT v)
695 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
696 FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
700 static HRESULT WINAPI HTMLWindow2_get_opener(IHTMLWindow2 *iface, VARIANT *p)
702 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
703 FIXME("(%p)->(%p)\n", This, p);
707 static HRESULT WINAPI HTMLWindow2_get_navigator(IHTMLWindow2 *iface, IOmNavigator **p)
709 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
711 TRACE("(%p)->(%p)\n", This, p);
713 *p = OmNavigator_Create();
717 static HRESULT WINAPI HTMLWindow2_put_name(IHTMLWindow2 *iface, BSTR v)
719 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
723 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
725 nsAString_InitDepend(&name_str, v);
726 nsres = nsIDOMWindow_SetName(This->nswindow, &name_str);
727 nsAString_Finish(&name_str);
729 ERR("SetName failed: %08x\n", nsres);
734 static HRESULT WINAPI HTMLWindow2_get_name(IHTMLWindow2 *iface, BSTR *p)
736 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
741 TRACE("(%p)->(%p)\n", This, p);
743 nsAString_Init(&name_str, NULL);
744 nsres = nsIDOMWindow_GetName(This->nswindow, &name_str);
745 if(NS_SUCCEEDED(nsres)) {
746 const PRUnichar *name;
748 nsAString_GetData(&name_str, &name);
750 *p = SysAllocString(name);
751 hres = *p ? S_OK : E_OUTOFMEMORY;
757 ERR("GetName failed: %08x\n", nsres);
760 nsAString_Finish(&name_str);
765 static HRESULT WINAPI HTMLWindow2_get_parent(IHTMLWindow2 *iface, IHTMLWindow2 **p)
767 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
768 TRACE("(%p)->(%p)\n", This, p);
771 *p = &This->parent->IHTMLWindow2_iface;
772 IHTMLWindow2_AddRef(*p);
779 static HRESULT WINAPI HTMLWindow2_open(IHTMLWindow2 *iface, BSTR url, BSTR name,
780 BSTR features, VARIANT_BOOL replace, IHTMLWindow2 **pomWindowResult)
782 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
783 INewWindowManager *new_window_mgr;
787 TRACE("(%p)->(%s %s %s %x %p)\n", This, debugstr_w(url), debugstr_w(name),
788 debugstr_w(features), replace, pomWindowResult);
793 if(name && *name == '_') {
794 FIXME("Unsupported name %s\n", debugstr_w(name));
798 hres = do_query_service((IUnknown*)This->doc_obj->client, &SID_SNewWindowManager, &IID_INewWindowManager,
799 (void**)&new_window_mgr);
801 FIXME("No INewWindowManager\n");
805 hres = INewWindowManager_EvaluateNewWindow(new_window_mgr, url, name, This->url,
806 features, !!replace, This->doc_obj->has_popup ? 0 : NWMF_FIRST, 0);
807 INewWindowManager_Release(new_window_mgr);
808 This->doc_obj->has_popup = TRUE;
810 *pomWindowResult = NULL;
815 hres = CoInternetCombineUrlEx(This->uri, url, URL_ESCAPE_SPACES_ONLY|URL_DONT_ESCAPE_EXTRA_INFO, &uri, 0);
817 hres = CreateUri(url, 0, 0, &uri);
821 hres = navigate_new_window(This, uri, name, pomWindowResult);
826 static HRESULT WINAPI HTMLWindow2_get_self(IHTMLWindow2 *iface, IHTMLWindow2 **p)
828 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
830 TRACE("(%p)->(%p)\n", This, p);
832 /* FIXME: We should return kind of proxy window here. */
833 IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
834 *p = &This->IHTMLWindow2_iface;
838 static HRESULT WINAPI HTMLWindow2_get_top(IHTMLWindow2 *iface, IHTMLWindow2 **p)
840 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
842 TRACE("(%p)->(%p)\n", This, p);
847 *p = &curr->IHTMLWindow2_iface;
848 IHTMLWindow2_AddRef(*p);
853 static HRESULT WINAPI HTMLWindow2_get_window(IHTMLWindow2 *iface, IHTMLWindow2 **p)
855 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
857 TRACE("(%p)->(%p)\n", This, p);
859 /* FIXME: We should return kind of proxy window here. */
860 IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
861 *p = &This->IHTMLWindow2_iface;
865 static HRESULT WINAPI HTMLWindow2_navigate(IHTMLWindow2 *iface, BSTR url)
867 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
868 FIXME("(%p)->(%s)\n", This, debugstr_w(url));
872 static HRESULT WINAPI HTMLWindow2_put_onfocus(IHTMLWindow2 *iface, VARIANT v)
874 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
875 FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
879 static HRESULT WINAPI HTMLWindow2_get_onfocus(IHTMLWindow2 *iface, VARIANT *p)
881 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
882 FIXME("(%p)->(%p)\n", This, p);
886 static HRESULT WINAPI HTMLWindow2_put_onblur(IHTMLWindow2 *iface, VARIANT v)
888 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
889 FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
893 static HRESULT WINAPI HTMLWindow2_get_onblur(IHTMLWindow2 *iface, VARIANT *p)
895 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
896 FIXME("(%p)->(%p)\n", This, p);
900 static HRESULT WINAPI HTMLWindow2_put_onload(IHTMLWindow2 *iface, VARIANT v)
902 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
904 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
906 return set_window_event(This, EVENTID_LOAD, &v);
909 static HRESULT WINAPI HTMLWindow2_get_onload(IHTMLWindow2 *iface, VARIANT *p)
911 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
913 TRACE("(%p)->(%p)\n", This, p);
915 return get_window_event(This, EVENTID_LOAD, p);
918 static HRESULT WINAPI HTMLWindow2_put_onbeforeunload(IHTMLWindow2 *iface, VARIANT v)
920 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
922 TRACE("(%p)->(v(%d))\n", This, V_VT(&v));
924 return set_window_event(This, EVENTID_BEFOREUNLOAD, &v);
927 static HRESULT WINAPI HTMLWindow2_get_onbeforeunload(IHTMLWindow2 *iface, VARIANT *p)
929 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
931 TRACE("(%p)->(%p)\n", This, p);
933 return get_window_event(This, EVENTID_BEFOREUNLOAD, p);
936 static HRESULT WINAPI HTMLWindow2_put_onunload(IHTMLWindow2 *iface, VARIANT v)
938 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
939 FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
943 static HRESULT WINAPI HTMLWindow2_get_onunload(IHTMLWindow2 *iface, VARIANT *p)
945 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
946 FIXME("(%p)->(%p)\n", This, p);
950 static HRESULT WINAPI HTMLWindow2_put_onhelp(IHTMLWindow2 *iface, VARIANT v)
952 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
953 FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
957 static HRESULT WINAPI HTMLWindow2_get_onhelp(IHTMLWindow2 *iface, VARIANT *p)
959 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
960 FIXME("(%p)->(%p)\n", This, p);
964 static HRESULT WINAPI HTMLWindow2_put_onerror(IHTMLWindow2 *iface, VARIANT v)
966 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
967 FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
971 static HRESULT WINAPI HTMLWindow2_get_onerror(IHTMLWindow2 *iface, VARIANT *p)
973 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
974 FIXME("(%p)->(%p)\n", This, p);
978 static HRESULT WINAPI HTMLWindow2_put_onresize(IHTMLWindow2 *iface, VARIANT v)
980 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
982 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
984 return set_window_event(This, EVENTID_RESIZE, &v);
987 static HRESULT WINAPI HTMLWindow2_get_onresize(IHTMLWindow2 *iface, VARIANT *p)
989 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
991 TRACE("(%p)->(%p)\n", This, p);
993 return get_window_event(This, EVENTID_RESIZE, p);
996 static HRESULT WINAPI HTMLWindow2_put_onscroll(IHTMLWindow2 *iface, VARIANT v)
998 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
999 FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
1003 static HRESULT WINAPI HTMLWindow2_get_onscroll(IHTMLWindow2 *iface, VARIANT *p)
1005 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1006 FIXME("(%p)->(%p)\n", This, p);
1010 static HRESULT WINAPI HTMLWindow2_get_document(IHTMLWindow2 *iface, IHTMLDocument2 **p)
1012 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1014 TRACE("(%p)->(%p)\n", This, p);
1017 /* FIXME: We should return a wrapper object here */
1018 *p = &This->doc->basedoc.IHTMLDocument2_iface;
1019 IHTMLDocument2_AddRef(*p);
1027 static HRESULT WINAPI HTMLWindow2_get_event(IHTMLWindow2 *iface, IHTMLEventObj **p)
1029 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1031 TRACE("(%p)->(%p)\n", This, p);
1034 IHTMLEventObj_AddRef(This->event);
1039 static HRESULT WINAPI HTMLWindow2_get__newEnum(IHTMLWindow2 *iface, IUnknown **p)
1041 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1042 FIXME("(%p)->(%p)\n", This, p);
1046 static HRESULT WINAPI HTMLWindow2_showModalDialog(IHTMLWindow2 *iface, BSTR dialog,
1047 VARIANT *varArgIn, VARIANT *varOptions, VARIANT *varArgOut)
1049 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1050 FIXME("(%p)->(%s %p %p %p)\n", This, debugstr_w(dialog), varArgIn, varOptions, varArgOut);
1054 static HRESULT WINAPI HTMLWindow2_showHelp(IHTMLWindow2 *iface, BSTR helpURL, VARIANT helpArg,
1057 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1058 FIXME("(%p)->(%s v(%d) %s)\n", This, debugstr_w(helpURL), V_VT(&helpArg), debugstr_w(features));
1062 static HRESULT WINAPI HTMLWindow2_get_screen(IHTMLWindow2 *iface, IHTMLScreen **p)
1064 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1066 TRACE("(%p)->(%p)\n", This, p);
1071 hres = HTMLScreen_Create(&This->screen);
1077 IHTMLScreen_AddRef(This->screen);
1081 static HRESULT WINAPI HTMLWindow2_get_Option(IHTMLWindow2 *iface, IHTMLOptionElementFactory **p)
1083 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1085 TRACE("(%p)->(%p)\n", This, p);
1087 if(!This->option_factory)
1088 This->option_factory = HTMLOptionElementFactory_Create(This);
1090 *p = &This->option_factory->IHTMLOptionElementFactory_iface;
1091 IHTMLOptionElementFactory_AddRef(*p);
1096 static HRESULT WINAPI HTMLWindow2_focus(IHTMLWindow2 *iface)
1098 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1100 TRACE("(%p)->()\n", This);
1103 SetFocus(This->doc_obj->hwnd);
1107 static HRESULT WINAPI HTMLWindow2_get_closed(IHTMLWindow2 *iface, VARIANT_BOOL *p)
1109 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1110 FIXME("(%p)->(%p)\n", This, p);
1114 static HRESULT WINAPI HTMLWindow2_blur(IHTMLWindow2 *iface)
1116 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1117 FIXME("(%p)->()\n", This);
1121 static HRESULT WINAPI HTMLWindow2_scroll(IHTMLWindow2 *iface, LONG x, LONG y)
1123 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1124 FIXME("(%p)->(%d %d)\n", This, x, y);
1128 static HRESULT WINAPI HTMLWindow2_get_clientInformation(IHTMLWindow2 *iface, IOmNavigator **p)
1130 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1131 FIXME("(%p)->(%p)\n", This, p);
1135 static HRESULT WINAPI HTMLWindow2_setInterval(IHTMLWindow2 *iface, BSTR expression,
1136 LONG msec, VARIANT *language, LONG *timerID)
1138 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1141 TRACE("(%p)->(%s %d %p %p)\n", This, debugstr_w(expression), msec, language, timerID);
1143 V_VT(&expr) = VT_BSTR;
1144 V_BSTR(&expr) = expression;
1145 return IHTMLWindow3_setInterval(&This->IHTMLWindow3_iface, &expr, msec, language, timerID);
1148 static HRESULT WINAPI HTMLWindow2_clearInterval(IHTMLWindow2 *iface, LONG timerID)
1150 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1152 TRACE("(%p)->(%d)\n", This, timerID);
1154 return clear_task_timer(&This->doc->basedoc, TRUE, timerID);
1157 static HRESULT WINAPI HTMLWindow2_put_offscreenBuffering(IHTMLWindow2 *iface, VARIANT v)
1159 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1160 FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
1164 static HRESULT WINAPI HTMLWindow2_get_offscreenBuffering(IHTMLWindow2 *iface, VARIANT *p)
1166 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1167 FIXME("(%p)->(%p)\n", This, p);
1171 static HRESULT WINAPI HTMLWindow2_execScript(IHTMLWindow2 *iface, BSTR scode, BSTR language,
1174 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1176 TRACE("(%p)->(%s %s %p)\n", This, debugstr_w(scode), debugstr_w(language), pvarRet);
1178 return exec_script(This, scode, language, pvarRet);
1181 static HRESULT WINAPI HTMLWindow2_toString(IHTMLWindow2 *iface, BSTR *String)
1183 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1185 static const WCHAR objectW[] = {'[','o','b','j','e','c','t',']',0};
1187 TRACE("(%p)->(%p)\n", This, String);
1190 return E_INVALIDARG;
1192 *String = SysAllocString(objectW);
1193 return *String ? S_OK : E_OUTOFMEMORY;
1196 static HRESULT WINAPI HTMLWindow2_scrollBy(IHTMLWindow2 *iface, LONG x, LONG y)
1198 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1201 TRACE("(%p)->(%d %d)\n", This, x, y);
1203 nsres = nsIDOMWindow_ScrollBy(This->nswindow, x, y);
1204 if(NS_FAILED(nsres))
1205 ERR("ScrollBy failed: %08x\n", nsres);
1210 static HRESULT WINAPI HTMLWindow2_scrollTo(IHTMLWindow2 *iface, LONG x, LONG y)
1212 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1215 TRACE("(%p)->(%d %d)\n", This, x, y);
1217 nsres = nsIDOMWindow_ScrollTo(This->nswindow, x, y);
1218 if(NS_FAILED(nsres))
1219 ERR("ScrollTo failed: %08x\n", nsres);
1224 static HRESULT WINAPI HTMLWindow2_moveTo(IHTMLWindow2 *iface, LONG x, LONG y)
1226 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1227 FIXME("(%p)->(%d %d)\n", This, x, y);
1231 static HRESULT WINAPI HTMLWindow2_moveBy(IHTMLWindow2 *iface, LONG x, LONG y)
1233 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1234 FIXME("(%p)->(%d %d)\n", This, x, y);
1238 static HRESULT WINAPI HTMLWindow2_resizeTo(IHTMLWindow2 *iface, LONG x, LONG y)
1240 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1241 FIXME("(%p)->(%d %d)\n", This, x, y);
1245 static HRESULT WINAPI HTMLWindow2_resizeBy(IHTMLWindow2 *iface, LONG x, LONG y)
1247 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1248 FIXME("(%p)->(%d %d)\n", This, x, y);
1252 static HRESULT WINAPI HTMLWindow2_get_external(IHTMLWindow2 *iface, IDispatch **p)
1254 HTMLWindow *This = impl_from_IHTMLWindow2(iface);
1256 TRACE("(%p)->(%p)\n", This, p);
1260 if(!This->doc_obj->hostui)
1263 return IDocHostUIHandler_GetExternal(This->doc_obj->hostui, p);
1266 static const IHTMLWindow2Vtbl HTMLWindow2Vtbl = {
1267 HTMLWindow2_QueryInterface,
1269 HTMLWindow2_Release,
1270 HTMLWindow2_GetTypeInfoCount,
1271 HTMLWindow2_GetTypeInfo,
1272 HTMLWindow2_GetIDsOfNames,
1275 HTMLWindow2_get_length,
1276 HTMLWindow2_get_frames,
1277 HTMLWindow2_put_defaultStatus,
1278 HTMLWindow2_get_defaultStatus,
1279 HTMLWindow2_put_status,
1280 HTMLWindow2_get_status,
1281 HTMLWindow2_setTimeout,
1282 HTMLWindow2_clearTimeout,
1284 HTMLWindow2_confirm,
1286 HTMLWindow2_get_Image,
1287 HTMLWindow2_get_location,
1288 HTMLWindow2_get_history,
1290 HTMLWindow2_put_opener,
1291 HTMLWindow2_get_opener,
1292 HTMLWindow2_get_navigator,
1293 HTMLWindow2_put_name,
1294 HTMLWindow2_get_name,
1295 HTMLWindow2_get_parent,
1297 HTMLWindow2_get_self,
1298 HTMLWindow2_get_top,
1299 HTMLWindow2_get_window,
1300 HTMLWindow2_navigate,
1301 HTMLWindow2_put_onfocus,
1302 HTMLWindow2_get_onfocus,
1303 HTMLWindow2_put_onblur,
1304 HTMLWindow2_get_onblur,
1305 HTMLWindow2_put_onload,
1306 HTMLWindow2_get_onload,
1307 HTMLWindow2_put_onbeforeunload,
1308 HTMLWindow2_get_onbeforeunload,
1309 HTMLWindow2_put_onunload,
1310 HTMLWindow2_get_onunload,
1311 HTMLWindow2_put_onhelp,
1312 HTMLWindow2_get_onhelp,
1313 HTMLWindow2_put_onerror,
1314 HTMLWindow2_get_onerror,
1315 HTMLWindow2_put_onresize,
1316 HTMLWindow2_get_onresize,
1317 HTMLWindow2_put_onscroll,
1318 HTMLWindow2_get_onscroll,
1319 HTMLWindow2_get_document,
1320 HTMLWindow2_get_event,
1321 HTMLWindow2_get__newEnum,
1322 HTMLWindow2_showModalDialog,
1323 HTMLWindow2_showHelp,
1324 HTMLWindow2_get_screen,
1325 HTMLWindow2_get_Option,
1327 HTMLWindow2_get_closed,
1330 HTMLWindow2_get_clientInformation,
1331 HTMLWindow2_setInterval,
1332 HTMLWindow2_clearInterval,
1333 HTMLWindow2_put_offscreenBuffering,
1334 HTMLWindow2_get_offscreenBuffering,
1335 HTMLWindow2_execScript,
1336 HTMLWindow2_toString,
1337 HTMLWindow2_scrollBy,
1338 HTMLWindow2_scrollTo,
1341 HTMLWindow2_resizeTo,
1342 HTMLWindow2_resizeBy,
1343 HTMLWindow2_get_external
1346 static inline HTMLWindow *impl_from_IHTMLWindow3(IHTMLWindow3 *iface)
1348 return CONTAINING_RECORD(iface, HTMLWindow, IHTMLWindow3_iface);
1351 static HRESULT WINAPI HTMLWindow3_QueryInterface(IHTMLWindow3 *iface, REFIID riid, void **ppv)
1353 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1355 return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
1358 static ULONG WINAPI HTMLWindow3_AddRef(IHTMLWindow3 *iface)
1360 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1362 return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
1365 static ULONG WINAPI HTMLWindow3_Release(IHTMLWindow3 *iface)
1367 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1369 return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
1372 static HRESULT WINAPI HTMLWindow3_GetTypeInfoCount(IHTMLWindow3 *iface, UINT *pctinfo)
1374 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1376 return IDispatchEx_GetTypeInfoCount(&This->IDispatchEx_iface, pctinfo);
1379 static HRESULT WINAPI HTMLWindow3_GetTypeInfo(IHTMLWindow3 *iface, UINT iTInfo,
1380 LCID lcid, ITypeInfo **ppTInfo)
1382 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1384 return IDispatchEx_GetTypeInfo(&This->IDispatchEx_iface, iTInfo, lcid, ppTInfo);
1387 static HRESULT WINAPI HTMLWindow3_GetIDsOfNames(IHTMLWindow3 *iface, REFIID riid,
1388 LPOLESTR *rgszNames, UINT cNames,
1389 LCID lcid, DISPID *rgDispId)
1391 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1393 return IDispatchEx_GetIDsOfNames(&This->IDispatchEx_iface, riid, rgszNames, cNames, lcid,
1397 static HRESULT WINAPI HTMLWindow3_Invoke(IHTMLWindow3 *iface, DISPID dispIdMember,
1398 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1399 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1401 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1403 return IDispatchEx_Invoke(&This->IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
1404 pDispParams, pVarResult, pExcepInfo, puArgErr);
1407 static HRESULT WINAPI HTMLWindow3_get_screenLeft(IHTMLWindow3 *iface, LONG *p)
1409 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1410 FIXME("(%p)->(%p)\n", This, p);
1414 static HRESULT WINAPI HTMLWindow3_get_screenTop(IHTMLWindow3 *iface, LONG *p)
1416 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1417 FIXME("(%p)->(%p)\n", This, p);
1421 static HRESULT WINAPI HTMLWindow3_attachEvent(IHTMLWindow3 *iface, BSTR event, IDispatch *pDisp, VARIANT_BOOL *pfResult)
1423 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1425 TRACE("(%p)->(%s %p %p)\n", This, debugstr_w(event), pDisp, pfResult);
1428 FIXME("No document\n");
1432 return attach_event(&This->doc->body_event_target, NULL, &This->doc->basedoc, event, pDisp, pfResult);
1435 static HRESULT WINAPI HTMLWindow3_detachEvent(IHTMLWindow3 *iface, BSTR event, IDispatch *pDisp)
1437 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1438 FIXME("(%p)->()\n", This);
1442 static HRESULT window_set_timer(HTMLWindow *This, VARIANT *expr, LONG msec, VARIANT *language,
1443 BOOL interval, LONG *timer_id)
1445 IDispatch *disp = NULL;
1447 switch(V_VT(expr)) {
1449 disp = V_DISPATCH(expr);
1450 IDispatch_AddRef(disp);
1454 disp = script_parse_event(This, V_BSTR(expr));
1458 FIXME("unimplemented vt=%d\n", V_VT(expr));
1465 *timer_id = set_task_timer(&This->doc->basedoc, msec, interval, disp);
1466 IDispatch_Release(disp);
1471 static HRESULT WINAPI HTMLWindow3_setTimeout(IHTMLWindow3 *iface, VARIANT *expression, LONG msec,
1472 VARIANT *language, LONG *timerID)
1474 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1476 TRACE("(%p)->(%p(%d) %d %p %p)\n", This, expression, V_VT(expression), msec, language, timerID);
1478 return window_set_timer(This, expression, msec, language, FALSE, timerID);
1481 static HRESULT WINAPI HTMLWindow3_setInterval(IHTMLWindow3 *iface, VARIANT *expression, LONG msec,
1482 VARIANT *language, LONG *timerID)
1484 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1486 TRACE("(%p)->(%p %d %p %p)\n", This, expression, msec, language, timerID);
1488 return window_set_timer(This, expression, msec, language, TRUE, timerID);
1491 static HRESULT WINAPI HTMLWindow3_print(IHTMLWindow3 *iface)
1493 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1494 FIXME("(%p)\n", This);
1498 static HRESULT WINAPI HTMLWindow3_put_onbeforeprint(IHTMLWindow3 *iface, VARIANT v)
1500 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1501 FIXME("(%p)->()\n", This);
1505 static HRESULT WINAPI HTMLWindow3_get_onbeforeprint(IHTMLWindow3 *iface, VARIANT *p)
1507 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1508 FIXME("(%p)->(%p)\n", This, p);
1512 static HRESULT WINAPI HTMLWindow3_put_onafterprint(IHTMLWindow3 *iface, VARIANT v)
1514 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1515 FIXME("(%p)->()\n", This);
1519 static HRESULT WINAPI HTMLWindow3_get_onafterprint(IHTMLWindow3 *iface, VARIANT *p)
1521 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1522 FIXME("(%p)->(%p)\n", This, p);
1526 static HRESULT WINAPI HTMLWindow3_get_clipboardData(IHTMLWindow3 *iface, IHTMLDataTransfer **p)
1528 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1529 FIXME("(%p)->(%p)\n", This, p);
1533 static HRESULT WINAPI HTMLWindow3_showModelessDialog(IHTMLWindow3 *iface, BSTR url,
1534 VARIANT *varArgIn, VARIANT *options, IHTMLWindow2 **pDialog)
1536 HTMLWindow *This = impl_from_IHTMLWindow3(iface);
1537 FIXME("(%p)->(%s %p %p %p)\n", This, debugstr_w(url), varArgIn, options, pDialog);
1541 static const IHTMLWindow3Vtbl HTMLWindow3Vtbl = {
1542 HTMLWindow3_QueryInterface,
1544 HTMLWindow3_Release,
1545 HTMLWindow3_GetTypeInfoCount,
1546 HTMLWindow3_GetTypeInfo,
1547 HTMLWindow3_GetIDsOfNames,
1549 HTMLWindow3_get_screenLeft,
1550 HTMLWindow3_get_screenTop,
1551 HTMLWindow3_attachEvent,
1552 HTMLWindow3_detachEvent,
1553 HTMLWindow3_setTimeout,
1554 HTMLWindow3_setInterval,
1556 HTMLWindow3_put_onbeforeprint,
1557 HTMLWindow3_get_onbeforeprint,
1558 HTMLWindow3_put_onafterprint,
1559 HTMLWindow3_get_onafterprint,
1560 HTMLWindow3_get_clipboardData,
1561 HTMLWindow3_showModelessDialog
1564 static inline HTMLWindow *impl_from_IHTMLWindow4(IHTMLWindow4 *iface)
1566 return CONTAINING_RECORD(iface, HTMLWindow, IHTMLWindow4_iface);
1569 static HRESULT WINAPI HTMLWindow4_QueryInterface(IHTMLWindow4 *iface, REFIID riid, void **ppv)
1571 HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1573 return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
1576 static ULONG WINAPI HTMLWindow4_AddRef(IHTMLWindow4 *iface)
1578 HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1580 return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
1583 static ULONG WINAPI HTMLWindow4_Release(IHTMLWindow4 *iface)
1585 HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1587 return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
1590 static HRESULT WINAPI HTMLWindow4_GetTypeInfoCount(IHTMLWindow4 *iface, UINT *pctinfo)
1592 HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1594 return IDispatchEx_GetTypeInfoCount(&This->IDispatchEx_iface, pctinfo);
1597 static HRESULT WINAPI HTMLWindow4_GetTypeInfo(IHTMLWindow4 *iface, UINT iTInfo,
1598 LCID lcid, ITypeInfo **ppTInfo)
1600 HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1602 return IDispatchEx_GetTypeInfo(&This->IDispatchEx_iface, iTInfo, lcid, ppTInfo);
1605 static HRESULT WINAPI HTMLWindow4_GetIDsOfNames(IHTMLWindow4 *iface, REFIID riid,
1606 LPOLESTR *rgszNames, UINT cNames,
1607 LCID lcid, DISPID *rgDispId)
1609 HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1611 return IDispatchEx_GetIDsOfNames(&This->IDispatchEx_iface, riid, rgszNames, cNames, lcid,
1615 static HRESULT WINAPI HTMLWindow4_Invoke(IHTMLWindow4 *iface, DISPID dispIdMember,
1616 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1617 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1619 HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1621 return IDispatchEx_Invoke(&This->IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
1622 pDispParams, pVarResult, pExcepInfo, puArgErr);
1625 static HRESULT WINAPI HTMLWindow4_createPopup(IHTMLWindow4 *iface, VARIANT *varArgIn,
1626 IDispatch **ppPopup)
1628 HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1629 FIXME("(%p)->(%p %p)\n", This, varArgIn, ppPopup);
1633 static HRESULT WINAPI HTMLWindow4_get_frameElement(IHTMLWindow4 *iface, IHTMLFrameBase **p)
1635 HTMLWindow *This = impl_from_IHTMLWindow4(iface);
1636 TRACE("(%p)->(%p)\n", This, p);
1638 if(This->frame_element) {
1639 *p = &This->frame_element->IHTMLFrameBase_iface;
1640 IHTMLFrameBase_AddRef(*p);
1647 static const IHTMLWindow4Vtbl HTMLWindow4Vtbl = {
1648 HTMLWindow4_QueryInterface,
1650 HTMLWindow4_Release,
1651 HTMLWindow4_GetTypeInfoCount,
1652 HTMLWindow4_GetTypeInfo,
1653 HTMLWindow4_GetIDsOfNames,
1655 HTMLWindow4_createPopup,
1656 HTMLWindow4_get_frameElement
1659 static inline HTMLWindow *impl_from_IHTMLWindow6(IHTMLWindow6 *iface)
1661 return CONTAINING_RECORD(iface, HTMLWindow, IHTMLWindow6_iface);
1664 static HRESULT WINAPI HTMLWindow6_QueryInterface(IHTMLWindow6 *iface, REFIID riid, void **ppv)
1666 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1668 return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
1671 static ULONG WINAPI HTMLWindow6_AddRef(IHTMLWindow6 *iface)
1673 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1675 return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
1678 static ULONG WINAPI HTMLWindow6_Release(IHTMLWindow6 *iface)
1680 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1682 return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
1685 static HRESULT WINAPI HTMLWindow6_GetTypeInfoCount(IHTMLWindow6 *iface, UINT *pctinfo)
1687 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1689 return IDispatchEx_GetTypeInfoCount(&This->IDispatchEx_iface, pctinfo);
1692 static HRESULT WINAPI HTMLWindow6_GetTypeInfo(IHTMLWindow6 *iface, UINT iTInfo,
1693 LCID lcid, ITypeInfo **ppTInfo)
1695 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1697 return IDispatchEx_GetTypeInfo(&This->IDispatchEx_iface, iTInfo, lcid, ppTInfo);
1700 static HRESULT WINAPI HTMLWindow6_GetIDsOfNames(IHTMLWindow6 *iface, REFIID riid,
1701 LPOLESTR *rgszNames, UINT cNames,
1702 LCID lcid, DISPID *rgDispId)
1704 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1706 return IDispatchEx_GetIDsOfNames(&This->IDispatchEx_iface, riid, rgszNames, cNames, lcid,
1710 static HRESULT WINAPI HTMLWindow6_Invoke(IHTMLWindow6 *iface, DISPID dispIdMember,
1711 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1712 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1714 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1716 return IDispatchEx_Invoke(&This->IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
1717 pDispParams, pVarResult, pExcepInfo, puArgErr);
1720 static HRESULT WINAPI HTMLWindow6_put_XDomainRequest(IHTMLWindow6 *iface, VARIANT v)
1722 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1723 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
1727 static HRESULT WINAPI HTMLWindow6_get_XDomainRequest(IHTMLWindow6 *iface, VARIANT *p)
1729 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1730 FIXME("(%p)->(%p)\n", This, p);
1734 static HRESULT WINAPI HTMLWindow6_get_sessionStorage(IHTMLWindow6 *iface, IHTMLStorage **p)
1736 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1737 FIXME("(%p)->(%p)\n", This, p);
1741 static HRESULT WINAPI HTMLWindow6_get_localStorage(IHTMLWindow6 *iface, IHTMLStorage **p)
1743 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1744 FIXME("(%p)->(%p)\n", This, p);
1748 static HRESULT WINAPI HTMLWindow6_put_onhashchange(IHTMLWindow6 *iface, VARIANT v)
1750 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1751 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
1755 static HRESULT WINAPI HTMLWindow6_get_onhashchange(IHTMLWindow6 *iface, VARIANT *p)
1757 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1758 FIXME("(%p)->(%p)\n", This, p);
1762 static HRESULT WINAPI HTMLWindow6_get_maxConnectionsPerServer(IHTMLWindow6 *iface, LONG *p)
1764 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1765 FIXME("(%p)->(%p)\n", This, p);
1769 static HRESULT WINAPI HTMLWindow6_postMessage(IHTMLWindow6 *iface, BSTR msg, VARIANT targetOrigin)
1771 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1772 FIXME("(%p)->(%s %s)\n", This, debugstr_w(msg), debugstr_variant(&targetOrigin));
1776 static HRESULT WINAPI HTMLWindow6_toStaticHTML(IHTMLWindow6 *iface, BSTR bstrHTML, BSTR *pbstrStaticHTML)
1778 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1779 FIXME("(%p)->(%s %p)\n", This, debugstr_w(bstrHTML), pbstrStaticHTML);
1783 static HRESULT WINAPI HTMLWindow6_put_onmessage(IHTMLWindow6 *iface, VARIANT v)
1785 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1786 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
1790 static HRESULT WINAPI HTMLWindow6_get_onmessage(IHTMLWindow6 *iface, VARIANT *p)
1792 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1793 FIXME("(%p)->(%p)\n", This, p);
1797 static HRESULT WINAPI HTMLWindow6_msWriteProfilerMark(IHTMLWindow6 *iface, BSTR bstrProfilerMark)
1799 HTMLWindow *This = impl_from_IHTMLWindow6(iface);
1800 FIXME("(%p)->(%s)\n", This, debugstr_w(bstrProfilerMark));
1804 static const IHTMLWindow6Vtbl HTMLWindow6Vtbl = {
1805 HTMLWindow6_QueryInterface,
1807 HTMLWindow6_Release,
1808 HTMLWindow6_GetTypeInfoCount,
1809 HTMLWindow6_GetTypeInfo,
1810 HTMLWindow6_GetIDsOfNames,
1812 HTMLWindow6_put_XDomainRequest,
1813 HTMLWindow6_get_XDomainRequest,
1814 HTMLWindow6_get_sessionStorage,
1815 HTMLWindow6_get_localStorage,
1816 HTMLWindow6_put_onhashchange,
1817 HTMLWindow6_get_onhashchange,
1818 HTMLWindow6_get_maxConnectionsPerServer,
1819 HTMLWindow6_postMessage,
1820 HTMLWindow6_toStaticHTML,
1821 HTMLWindow6_put_onmessage,
1822 HTMLWindow6_get_onmessage,
1823 HTMLWindow6_msWriteProfilerMark
1826 static inline HTMLWindow *impl_from_IHTMLPrivateWindow(IHTMLPrivateWindow *iface)
1828 return CONTAINING_RECORD(iface, HTMLWindow, IHTMLPrivateWindow_iface);
1831 static HRESULT WINAPI HTMLPrivateWindow_QueryInterface(IHTMLPrivateWindow *iface, REFIID riid, void **ppv)
1833 HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
1835 return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
1838 static ULONG WINAPI HTMLPrivateWindow_AddRef(IHTMLPrivateWindow *iface)
1840 HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
1842 return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
1845 static ULONG WINAPI HTMLPrivateWindow_Release(IHTMLPrivateWindow *iface)
1847 HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
1849 return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
1852 static HRESULT WINAPI HTMLPrivateWindow_SuperNavigate(IHTMLPrivateWindow *iface, BSTR url, BSTR arg2, BSTR arg3,
1853 BSTR arg4, VARIANT *post_data_var, VARIANT *headers_var, ULONG flags)
1855 HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
1856 OLECHAR *translated_url = NULL;
1857 DWORD post_data_size = 0;
1858 BYTE *post_data = NULL;
1859 WCHAR *headers = NULL;
1863 TRACE("(%p)->(%s %s %s %s %s %s %x)\n", This, debugstr_w(url), debugstr_w(arg2), debugstr_w(arg3), debugstr_w(arg4),
1864 debugstr_variant(post_data_var), debugstr_variant(headers_var), flags);
1866 if(This->doc_obj->hostui) {
1867 hres = IDocHostUIHandler_TranslateUrl(This->doc_obj->hostui, 0, url, &translated_url);
1869 translated_url = NULL;
1872 hres = CreateUri(translated_url ? translated_url : url, 0, 0, &uri);
1873 CoTaskMemFree(translated_url);
1878 if(V_VT(post_data_var) == (VT_ARRAY|VT_UI1)) {
1879 SafeArrayAccessData(V_ARRAY(post_data_var), (void**)&post_data);
1880 post_data_size = V_ARRAY(post_data_var)->rgsabound[0].cElements;
1884 if(headers_var && V_VT(headers_var) != VT_EMPTY && V_VT(headers_var) != VT_ERROR) {
1885 if(V_VT(headers_var) != VT_BSTR)
1886 return E_INVALIDARG;
1888 headers = V_BSTR(headers_var);
1891 hres = super_navigate(This, uri, headers, post_data, post_data_size);
1894 SafeArrayUnaccessData(V_ARRAY(post_data_var));
1899 static HRESULT WINAPI HTMLPrivateWindow_GetPendingUrl(IHTMLPrivateWindow *iface, BSTR *url)
1901 HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
1902 FIXME("(%p)->(%p)\n", This, url);
1906 static HRESULT WINAPI HTMLPrivateWindow_SetPICSTarget(IHTMLPrivateWindow *iface, IOleCommandTarget *cmdtrg)
1908 HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
1909 FIXME("(%p)->(%p)\n", This, cmdtrg);
1913 static HRESULT WINAPI HTMLPrivateWindow_PICSComplete(IHTMLPrivateWindow *iface, int arg)
1915 HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
1916 FIXME("(%p)->(%x)\n", This, arg);
1920 static HRESULT WINAPI HTMLPrivateWindow_FindWindowByName(IHTMLPrivateWindow *iface, LPCWSTR name, IHTMLWindow2 **ret)
1922 HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
1923 FIXME("(%p)->(%s %p)\n", This, debugstr_w(name), ret);
1927 static HRESULT WINAPI HTMLPrivateWindow_GetAddressBarUrl(IHTMLPrivateWindow *iface, BSTR *url)
1929 HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
1930 TRACE("(%p)->(%p)\n", This, url);
1933 return E_INVALIDARG;
1935 *url = SysAllocString(This->url);
1939 static const IHTMLPrivateWindowVtbl HTMLPrivateWindowVtbl = {
1940 HTMLPrivateWindow_QueryInterface,
1941 HTMLPrivateWindow_AddRef,
1942 HTMLPrivateWindow_Release,
1943 HTMLPrivateWindow_SuperNavigate,
1944 HTMLPrivateWindow_GetPendingUrl,
1945 HTMLPrivateWindow_SetPICSTarget,
1946 HTMLPrivateWindow_PICSComplete,
1947 HTMLPrivateWindow_FindWindowByName,
1948 HTMLPrivateWindow_GetAddressBarUrl
1951 static inline HTMLWindow *impl_from_ITravelLogClient(ITravelLogClient *iface)
1953 return CONTAINING_RECORD(iface, HTMLWindow, ITravelLogClient_iface);
1956 static HRESULT WINAPI TravelLogClient_QueryInterface(ITravelLogClient *iface, REFIID riid, void **ppv)
1958 HTMLWindow *This = impl_from_ITravelLogClient(iface);
1960 return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
1963 static ULONG WINAPI TravelLogClient_AddRef(ITravelLogClient *iface)
1965 HTMLWindow *This = impl_from_ITravelLogClient(iface);
1967 return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
1970 static ULONG WINAPI TravelLogClient_Release(ITravelLogClient *iface)
1972 HTMLWindow *This = impl_from_ITravelLogClient(iface);
1974 return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
1977 static HRESULT WINAPI TravelLogClient_FindWindowByIndex(ITravelLogClient *iface, DWORD dwID, IUnknown **ppunk)
1979 HTMLWindow *This = impl_from_ITravelLogClient(iface);
1981 FIXME("(%p)->(%d %p) semi-stub\n", This, dwID, ppunk);
1987 static HRESULT WINAPI TravelLogClient_GetWindowData(ITravelLogClient *iface, IStream *pStream, LPWINDOWDATA pWinData)
1989 HTMLWindow *This = impl_from_ITravelLogClient(iface);
1990 FIXME("(%p)->(%p %p)\n", This, pStream, pWinData);
1994 static HRESULT WINAPI TravelLogClient_LoadHistoryPosition(ITravelLogClient *iface, LPWSTR pszUrlLocation, DWORD dwPosition)
1996 HTMLWindow *This = impl_from_ITravelLogClient(iface);
1997 FIXME("(%p)->(%s %d)\n", This, debugstr_w(pszUrlLocation), dwPosition);
2001 static const ITravelLogClientVtbl TravelLogClientVtbl = {
2002 TravelLogClient_QueryInterface,
2003 TravelLogClient_AddRef,
2004 TravelLogClient_Release,
2005 TravelLogClient_FindWindowByIndex,
2006 TravelLogClient_GetWindowData,
2007 TravelLogClient_LoadHistoryPosition
2010 static inline HTMLWindow *impl_from_IDispatchEx(IDispatchEx *iface)
2012 return CONTAINING_RECORD(iface, HTMLWindow, IDispatchEx_iface);
2015 static HRESULT WINAPI WindowDispEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
2017 HTMLWindow *This = impl_from_IDispatchEx(iface);
2019 return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
2022 static ULONG WINAPI WindowDispEx_AddRef(IDispatchEx *iface)
2024 HTMLWindow *This = impl_from_IDispatchEx(iface);
2026 return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
2029 static ULONG WINAPI WindowDispEx_Release(IDispatchEx *iface)
2031 HTMLWindow *This = impl_from_IDispatchEx(iface);
2033 return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
2036 static HRESULT WINAPI WindowDispEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
2038 HTMLWindow *This = impl_from_IDispatchEx(iface);
2040 TRACE("(%p)->(%p)\n", This, pctinfo);
2042 return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo);
2045 static HRESULT WINAPI WindowDispEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
2046 LCID lcid, ITypeInfo **ppTInfo)
2048 HTMLWindow *This = impl_from_IDispatchEx(iface);
2050 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
2052 return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
2055 static HRESULT WINAPI WindowDispEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
2056 LPOLESTR *rgszNames, UINT cNames,
2057 LCID lcid, DISPID *rgDispId)
2059 HTMLWindow *This = impl_from_IDispatchEx(iface);
2063 WARN("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
2066 for(i=0; i < cNames; i++) {
2067 /* We shouldn't use script's IDispatchEx here, so we shouldn't use GetDispID */
2068 hres = IDispatchEx_GetDispID(&This->IDispatchEx_iface, rgszNames[i], 0, rgDispId+i);
2076 static HRESULT WINAPI WindowDispEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
2077 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
2078 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
2080 HTMLWindow *This = impl_from_IDispatchEx(iface);
2082 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
2083 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
2085 /* FIXME: Use script dispatch */
2087 return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
2088 pDispParams, pVarResult, pExcepInfo, puArgErr);
2091 static global_prop_t *alloc_global_prop(HTMLWindow *This, global_prop_type_t type, BSTR name)
2093 if(This->global_prop_cnt == This->global_prop_size) {
2094 global_prop_t *new_props;
2097 if(This->global_props) {
2098 new_size = This->global_prop_size*2;
2099 new_props = heap_realloc(This->global_props, new_size*sizeof(global_prop_t));
2102 new_props = heap_alloc(new_size*sizeof(global_prop_t));
2106 This->global_props = new_props;
2107 This->global_prop_size = new_size;
2110 This->global_props[This->global_prop_cnt].name = heap_strdupW(name);
2111 if(!This->global_props[This->global_prop_cnt].name)
2114 This->global_props[This->global_prop_cnt].type = type;
2115 return This->global_props + This->global_prop_cnt++;
2118 static inline DWORD prop_to_dispid(HTMLWindow *This, global_prop_t *prop)
2120 return MSHTML_DISPID_CUSTOM_MIN + (prop-This->global_props);
2123 HRESULT search_window_props(HTMLWindow *This, BSTR bstrName, DWORD grfdex, DISPID *pid)
2126 ScriptHost *script_host;
2129 for(i=0; i < This->global_prop_cnt; i++) {
2130 /* FIXME: case sensitivity */
2131 if(!strcmpW(This->global_props[i].name, bstrName)) {
2132 *pid = MSHTML_DISPID_CUSTOM_MIN+i;
2137 if(find_global_prop(This, bstrName, grfdex, &script_host, &id)) {
2138 global_prop_t *prop;
2140 prop = alloc_global_prop(This, GLOBAL_SCRIPTVAR, bstrName);
2142 return E_OUTOFMEMORY;
2144 prop->script_host = script_host;
2147 *pid = prop_to_dispid(This, prop);
2151 return DISP_E_UNKNOWNNAME;
2154 static HRESULT WINAPI WindowDispEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
2156 HTMLWindow *This = impl_from_IDispatchEx(iface);
2159 TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid);
2161 hres = search_window_props(This, bstrName, grfdex, pid);
2162 if(hres != DISP_E_UNKNOWNNAME)
2165 hres = IDispatchEx_GetDispID(&This->dispex.IDispatchEx_iface, bstrName, grfdex, pid);
2166 if(hres != DISP_E_UNKNOWNNAME)
2170 global_prop_t *prop;
2173 hres = IHTMLDocument3_getElementById(&This->doc->basedoc.IHTMLDocument3_iface,
2175 if(SUCCEEDED(hres) && elem) {
2176 IHTMLElement_Release(elem);
2178 prop = alloc_global_prop(This, GLOBAL_ELEMENTVAR, bstrName);
2180 return E_OUTOFMEMORY;
2182 *pid = prop_to_dispid(This, prop);
2187 return DISP_E_UNKNOWNNAME;
2190 static HRESULT WINAPI WindowDispEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
2191 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
2193 HTMLWindow *This = impl_from_IDispatchEx(iface);
2195 TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
2197 if(id == DISPID_IHTMLWINDOW2_LOCATION && (wFlags & DISPATCH_PROPERTYPUT)) {
2198 HTMLLocation *location;
2201 TRACE("forwarding to location.href\n");
2203 hres = get_location(This, &location);
2207 hres = IDispatchEx_InvokeEx(&location->dispex.IDispatchEx_iface, DISPID_VALUE, lcid,
2208 wFlags, pdp, pvarRes, pei, pspCaller);
2209 IHTMLLocation_Release(&location->IHTMLLocation_iface);
2213 return IDispatchEx_InvokeEx(&This->dispex.IDispatchEx_iface, id, lcid, wFlags, pdp, pvarRes,
2217 static HRESULT WINAPI WindowDispEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
2219 HTMLWindow *This = impl_from_IDispatchEx(iface);
2221 TRACE("(%p)->(%s %x)\n", This, debugstr_w(bstrName), grfdex);
2223 return IDispatchEx_DeleteMemberByName(&This->dispex.IDispatchEx_iface, bstrName, grfdex);
2226 static HRESULT WINAPI WindowDispEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
2228 HTMLWindow *This = impl_from_IDispatchEx(iface);
2230 TRACE("(%p)->(%x)\n", This, id);
2232 return IDispatchEx_DeleteMemberByDispID(&This->dispex.IDispatchEx_iface, id);
2235 static HRESULT WINAPI WindowDispEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
2237 HTMLWindow *This = impl_from_IDispatchEx(iface);
2239 TRACE("(%p)->(%x %x %p)\n", This, id, grfdexFetch, pgrfdex);
2241 return IDispatchEx_GetMemberProperties(&This->dispex.IDispatchEx_iface, id, grfdexFetch,
2245 static HRESULT WINAPI WindowDispEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
2247 HTMLWindow *This = impl_from_IDispatchEx(iface);
2249 TRACE("(%p)->(%x %p)\n", This, id, pbstrName);
2251 return IDispatchEx_GetMemberName(&This->dispex.IDispatchEx_iface, id, pbstrName);
2254 static HRESULT WINAPI WindowDispEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
2256 HTMLWindow *This = impl_from_IDispatchEx(iface);
2258 TRACE("(%p)->(%x %x %p)\n", This, grfdex, id, pid);
2260 return IDispatchEx_GetNextDispID(&This->dispex.IDispatchEx_iface, grfdex, id, pid);
2263 static HRESULT WINAPI WindowDispEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
2265 HTMLWindow *This = impl_from_IDispatchEx(iface);
2267 TRACE("(%p)->(%p)\n", This, ppunk);
2273 static const IDispatchExVtbl WindowDispExVtbl = {
2274 WindowDispEx_QueryInterface,
2275 WindowDispEx_AddRef,
2276 WindowDispEx_Release,
2277 WindowDispEx_GetTypeInfoCount,
2278 WindowDispEx_GetTypeInfo,
2279 WindowDispEx_GetIDsOfNames,
2280 WindowDispEx_Invoke,
2281 WindowDispEx_GetDispID,
2282 WindowDispEx_InvokeEx,
2283 WindowDispEx_DeleteMemberByName,
2284 WindowDispEx_DeleteMemberByDispID,
2285 WindowDispEx_GetMemberProperties,
2286 WindowDispEx_GetMemberName,
2287 WindowDispEx_GetNextDispID,
2288 WindowDispEx_GetNameSpaceParent
2291 static inline HTMLWindow *impl_from_IServiceProvider(IServiceProvider *iface)
2293 return CONTAINING_RECORD(iface, HTMLWindow, IServiceProvider_iface);
2296 static HRESULT WINAPI HTMLWindowSP_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
2298 HTMLWindow *This = impl_from_IServiceProvider(iface);
2299 return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
2302 static ULONG WINAPI HTMLWindowSP_AddRef(IServiceProvider *iface)
2304 HTMLWindow *This = impl_from_IServiceProvider(iface);
2305 return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
2308 static ULONG WINAPI HTMLWindowSP_Release(IServiceProvider *iface)
2310 HTMLWindow *This = impl_from_IServiceProvider(iface);
2311 return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
2314 static HRESULT WINAPI HTMLWindowSP_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
2316 HTMLWindow *This = impl_from_IServiceProvider(iface);
2318 if(IsEqualGUID(guidService, &IID_IHTMLWindow2)) {
2319 TRACE("IID_IHTMLWindow2\n");
2320 return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
2323 TRACE("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
2326 return E_NOINTERFACE;
2328 return IServiceProvider_QueryService(&This->doc_obj->basedoc.IServiceProvider_iface,
2329 guidService, riid, ppv);
2332 static const IServiceProviderVtbl ServiceProviderVtbl = {
2333 HTMLWindowSP_QueryInterface,
2334 HTMLWindowSP_AddRef,
2335 HTMLWindowSP_Release,
2336 HTMLWindowSP_QueryService
2339 static inline HTMLWindow *impl_from_DispatchEx(DispatchEx *iface)
2341 return CONTAINING_RECORD(iface, HTMLWindow, dispex);
2344 static HRESULT HTMLWindow_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params,
2345 VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
2347 HTMLWindow *This = impl_from_DispatchEx(dispex);
2348 global_prop_t *prop;
2352 idx = id - MSHTML_DISPID_CUSTOM_MIN;
2353 if(idx >= This->global_prop_cnt)
2354 return DISP_E_MEMBERNOTFOUND;
2356 prop = This->global_props+idx;
2358 switch(prop->type) {
2359 case GLOBAL_SCRIPTVAR: {
2363 disp = get_script_disp(prop->script_host);
2365 return E_UNEXPECTED;
2367 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&iface);
2368 if(SUCCEEDED(hres)) {
2369 TRACE("%s >>>\n", debugstr_w(prop->name));
2370 hres = IDispatchEx_InvokeEx(iface, prop->id, lcid, flags, params, res, ei, caller);
2372 TRACE("%s <<<\n", debugstr_w(prop->name));
2374 WARN("%s <<< %08x\n", debugstr_w(prop->name), hres);
2375 IDispatchEx_Release(iface);
2377 FIXME("No IDispatchEx\n");
2379 IDispatch_Release(disp);
2382 case GLOBAL_ELEMENTVAR: {
2385 hres = IHTMLDocument3_getElementById(&This->doc->basedoc.IHTMLDocument3_iface,
2391 return DISP_E_MEMBERNOTFOUND;
2393 V_VT(res) = VT_DISPATCH;
2394 V_DISPATCH(res) = (IDispatch*)elem;
2398 ERR("invalid type %d\n", prop->type);
2399 hres = DISP_E_MEMBERNOTFOUND;
2406 static const dispex_static_data_vtbl_t HTMLWindow_dispex_vtbl = {
2413 static const tid_t HTMLWindow_iface_tids[] = {
2421 static dispex_static_data_t HTMLWindow_dispex = {
2422 &HTMLWindow_dispex_vtbl,
2423 DispHTMLWindow2_tid,
2425 HTMLWindow_iface_tids
2428 HRESULT HTMLWindow_Create(HTMLDocumentObj *doc_obj, nsIDOMWindow *nswindow, HTMLWindow *parent, HTMLWindow **ret)
2433 window = heap_alloc_zero(sizeof(HTMLWindow));
2435 return E_OUTOFMEMORY;
2437 window->window_ref = heap_alloc(sizeof(windowref_t));
2438 if(!window->window_ref) {
2440 return E_OUTOFMEMORY;
2443 window->IHTMLWindow2_iface.lpVtbl = &HTMLWindow2Vtbl;
2444 window->IHTMLWindow3_iface.lpVtbl = &HTMLWindow3Vtbl;
2445 window->IHTMLWindow4_iface.lpVtbl = &HTMLWindow4Vtbl;
2446 window->IHTMLWindow6_iface.lpVtbl = &HTMLWindow6Vtbl;
2447 window->IHTMLPrivateWindow_iface.lpVtbl = &HTMLPrivateWindowVtbl;
2448 window->IDispatchEx_iface.lpVtbl = &WindowDispExVtbl;
2449 window->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl;
2450 window->ITravelLogClient_iface.lpVtbl = &TravelLogClientVtbl;
2452 window->doc_obj = doc_obj;
2454 window->window_ref->window = window;
2455 window->window_ref->ref = 1;
2457 init_dispex(&window->dispex, (IUnknown*)&window->IHTMLWindow2_iface, &HTMLWindow_dispex);
2460 nsIDOMWindow_AddRef(nswindow);
2461 window->nswindow = nswindow;
2464 window->scriptmode = parent ? parent->scriptmode : SCRIPTMODE_GECKO;
2465 window->readystate = READYSTATE_UNINITIALIZED;
2466 list_init(&window->script_hosts);
2468 hres = CoInternetCreateSecurityManager(NULL, &window->secmgr, 0);
2470 IHTMLWindow2_Release(&window->IHTMLWindow2_iface);
2474 window->task_magic = get_task_target_magic();
2475 update_window_doc(window);
2477 list_init(&window->children);
2478 list_add_head(&window_list, &window->entry);
2481 IHTMLWindow2_AddRef(&window->IHTMLWindow2_iface);
2483 window->parent = parent;
2484 list_add_tail(&parent->children, &window->sibling_entry);
2491 void update_window_doc(HTMLWindow *window)
2493 nsIDOMHTMLDocument *nshtmldoc;
2494 nsIDOMDocument *nsdoc;
2497 nsres = nsIDOMWindow_GetDocument(window->nswindow, &nsdoc);
2498 if(NS_FAILED(nsres) || !nsdoc) {
2499 ERR("GetDocument failed: %08x\n", nsres);
2503 nsres = nsIDOMDocument_QueryInterface(nsdoc, &IID_nsIDOMHTMLDocument, (void**)&nshtmldoc);
2504 nsIDOMDocument_Release(nsdoc);
2505 if(NS_FAILED(nsres)) {
2506 ERR("Could not get nsIDOMHTMLDocument iface: %08x\n", nsres);
2510 if(!window->doc || window->doc->nsdoc != nshtmldoc) {
2511 HTMLDocumentNode *doc;
2514 hres = create_doc_from_nsdoc(nshtmldoc, window->doc_obj, window, &doc);
2515 if(SUCCEEDED(hres)) {
2516 window_set_docnode(window, doc);
2517 htmldoc_release(&doc->basedoc);
2519 ERR("create_doc_from_nsdoc failed: %08x\n", hres);
2523 nsIDOMHTMLDocument_Release(nshtmldoc);
2526 HTMLWindow *nswindow_to_window(const nsIDOMWindow *nswindow)
2530 LIST_FOR_EACH_ENTRY(iter, &window_list, HTMLWindow, entry) {
2531 if(iter->nswindow == nswindow)