Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenhtmlwindow.c
Go to the documentation of this file.
00001 /* 00002 * Copyright 2006-2010 Jacek Caban for CodeWeavers 00003 * 00004 * This library is free software; you can redistribute it and/or 00005 * modify it under the terms of the GNU Lesser General Public 00006 * License as published by the Free Software Foundation; either 00007 * version 2.1 of the License, or (at your option) any later version. 00008 * 00009 * This library is distributed in the hope that it will be useful, 00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 * Lesser General Public License for more details. 00013 * 00014 * You should have received a copy of the GNU Lesser General Public 00015 * License along with this library; if not, write to the Free Software 00016 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00017 */ 00018 00019 #include <stdarg.h> 00020 00021 #define COBJMACROS 00022 00023 #include "windef.h" 00024 #include "winbase.h" 00025 #include "winuser.h" 00026 #include "ole2.h" 00027 #include "mshtmdid.h" 00028 #include "shlguid.h" 00029 00030 #include "wine/debug.h" 00031 00032 #include "mshtml_private.h" 00033 #include "htmlevent.h" 00034 #include "resource.h" 00035 00036 WINE_DEFAULT_DEBUG_CHANNEL(mshtml); 00037 00038 #define HTMLPRIVWINDOW(x) ((IHTMLPrivateWindow*) &(x)->lpIHTMLPrivateWindowVtbl) 00039 00040 static struct list window_list = LIST_INIT(window_list); 00041 00042 static void window_set_docnode(HTMLWindow *window, HTMLDocumentNode *doc_node) 00043 { 00044 if(window->doc) { 00045 abort_document_bindings(window->doc); 00046 window->doc->basedoc.window = NULL; 00047 htmldoc_release(&window->doc->basedoc); 00048 } 00049 window->doc = doc_node; 00050 if(doc_node) 00051 htmldoc_addref(&doc_node->basedoc); 00052 00053 if(window->doc_obj && window->doc_obj->basedoc.window == window) { 00054 if(window->doc_obj->basedoc.doc_node) 00055 htmldoc_release(&window->doc_obj->basedoc.doc_node->basedoc); 00056 window->doc_obj->basedoc.doc_node = doc_node; 00057 if(doc_node) 00058 htmldoc_addref(&doc_node->basedoc); 00059 } 00060 00061 if(doc_node && window->doc_obj && window->doc_obj->usermode == EDITMODE) { 00062 nsIDOMNSHTMLDocument *nshtmldoc; 00063 nsAString mode_str; 00064 nsresult nsres; 00065 00066 static const PRUnichar onW[] = {'o','n',0}; 00067 00068 nsres = nsIDOMHTMLDocument_QueryInterface(doc_node->nsdoc, &IID_nsIDOMNSHTMLDocument, (void**)&nshtmldoc); 00069 if(NS_SUCCEEDED(nsres)) { 00070 nsAString_Init(&mode_str, onW); 00071 nsres = nsIDOMNSHTMLDocument_SetDesignMode(nshtmldoc, &mode_str); 00072 nsAString_Finish(&mode_str); 00073 nsIDOMNSHTMLDocument_Release(nshtmldoc); 00074 if(NS_FAILED(nsres)) 00075 ERR("SetDesignMode failed: %08x\n", nsres); 00076 }else { 00077 ERR("Could not get nsIDOMNSHTMLDocument interface: %08x\n", nsres); 00078 } 00079 } 00080 } 00081 00082 nsIDOMWindow *get_nsdoc_window(nsIDOMDocument *nsdoc) 00083 { 00084 nsIDOMDocumentView *nsdocview; 00085 nsIDOMAbstractView *nsview; 00086 nsIDOMWindow *nswindow; 00087 nsresult nsres; 00088 00089 nsres = nsIDOMDocument_QueryInterface(nsdoc, &IID_nsIDOMDocumentView, (void**)&nsdocview); 00090 nsIDOMDocument_Release(nsdoc); 00091 if(NS_FAILED(nsres)) { 00092 ERR("Could not get nsIDOMDocumentView iface: %08x\n", nsres); 00093 return NULL; 00094 } 00095 00096 nsres = nsIDOMDocumentView_GetDefaultView(nsdocview, &nsview); 00097 nsIDOMDocumentView_Release(nsview); 00098 if(NS_FAILED(nsres)) { 00099 ERR("GetDefaultView failed: %08x\n", nsres); 00100 return NULL; 00101 } 00102 00103 nsres = nsIDOMAbstractView_QueryInterface(nsview, &IID_nsIDOMWindow, (void**)&nswindow); 00104 nsIDOMAbstractView_Release(nsview); 00105 if(NS_FAILED(nsres)) { 00106 ERR("Coult not get nsIDOMWindow iface: %08x\n", nsres); 00107 return NULL; 00108 } 00109 00110 return nswindow; 00111 } 00112 00113 static void release_children(HTMLWindow *This) 00114 { 00115 HTMLWindow *child; 00116 00117 while(!list_empty(&This->children)) { 00118 child = LIST_ENTRY(list_tail(&This->children), HTMLWindow, sibling_entry); 00119 00120 list_remove(&child->sibling_entry); 00121 child->parent = NULL; 00122 IHTMLWindow2_Release(HTMLWINDOW2(child)); 00123 } 00124 } 00125 00126 static HRESULT get_location(HTMLWindow *This, HTMLLocation **ret) 00127 { 00128 if(This->location) { 00129 IHTMLLocation_AddRef(HTMLLOCATION(This->location)); 00130 }else { 00131 HRESULT hres; 00132 00133 hres = HTMLLocation_Create(This, &This->location); 00134 if(FAILED(hres)) 00135 return hres; 00136 } 00137 00138 *ret = This->location; 00139 return S_OK; 00140 } 00141 00142 static inline HRESULT set_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var) 00143 { 00144 if(!window->doc) { 00145 FIXME("No document\n"); 00146 return E_FAIL; 00147 } 00148 00149 return set_event_handler(&window->doc->body_event_target, NULL, window->doc, eid, var); 00150 } 00151 00152 static inline HRESULT get_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var) 00153 { 00154 if(!window->doc) { 00155 FIXME("No document\n"); 00156 return E_FAIL; 00157 } 00158 00159 return get_event_handler(&window->doc->body_event_target, eid, var); 00160 } 00161 00162 #define HTMLWINDOW2_THIS(iface) DEFINE_THIS(HTMLWindow, HTMLWindow2, iface) 00163 00164 static HRESULT WINAPI HTMLWindow2_QueryInterface(IHTMLWindow2 *iface, REFIID riid, void **ppv) 00165 { 00166 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00167 00168 *ppv = NULL; 00169 00170 if(IsEqualGUID(&IID_IUnknown, riid)) { 00171 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); 00172 *ppv = HTMLWINDOW2(This); 00173 }else if(IsEqualGUID(&IID_IDispatch, riid)) { 00174 TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); 00175 *ppv = HTMLWINDOW2(This); 00176 }else if(IsEqualGUID(&IID_IDispatchEx, riid)) { 00177 TRACE("(%p)->(IID_IDispatchEx %p)\n", This, ppv); 00178 *ppv = DISPATCHEX(This); 00179 }else if(IsEqualGUID(&IID_IHTMLFramesCollection2, riid)) { 00180 TRACE("(%p)->(IID_IHTMLFramesCollection2 %p)\n", This, ppv); 00181 *ppv = HTMLWINDOW2(This); 00182 }else if(IsEqualGUID(&IID_IHTMLWindow2, riid)) { 00183 TRACE("(%p)->(IID_IHTMLWindow2 %p)\n", This, ppv); 00184 *ppv = HTMLWINDOW2(This); 00185 }else if(IsEqualGUID(&IID_IHTMLWindow3, riid)) { 00186 TRACE("(%p)->(IID_IHTMLWindow3 %p)\n", This, ppv); 00187 *ppv = HTMLWINDOW3(This); 00188 }else if(IsEqualGUID(&IID_IHTMLWindow4, riid)) { 00189 TRACE("(%p)->(IID_IHTMLWindow4 %p)\n", This, ppv); 00190 *ppv = HTMLWINDOW4(This); 00191 }else if(IsEqualGUID(&IID_IHTMLPrivateWindow, riid)) { 00192 TRACE("(%p)->(IID_IHTMLPrivateWindow %p)\n", This, ppv); 00193 *ppv = HTMLPRIVWINDOW(This); 00194 }else if(dispex_query_interface(&This->dispex, riid, ppv)) { 00195 return *ppv ? S_OK : E_NOINTERFACE; 00196 } 00197 00198 if(*ppv) { 00199 IUnknown_AddRef((IUnknown*)*ppv); 00200 return S_OK; 00201 } 00202 00203 WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); 00204 return E_NOINTERFACE; 00205 } 00206 00207 static ULONG WINAPI HTMLWindow2_AddRef(IHTMLWindow2 *iface) 00208 { 00209 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00210 LONG ref = InterlockedIncrement(&This->ref); 00211 00212 TRACE("(%p) ref=%d\n", This, ref); 00213 00214 return ref; 00215 } 00216 00217 static ULONG WINAPI HTMLWindow2_Release(IHTMLWindow2 *iface) 00218 { 00219 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00220 LONG ref = InterlockedDecrement(&This->ref); 00221 00222 TRACE("(%p) ref=%d\n", This, ref); 00223 00224 if(!ref) { 00225 DWORD i; 00226 00227 remove_target_tasks(This->task_magic); 00228 set_window_bscallback(This, NULL); 00229 set_current_mon(This, NULL); 00230 window_set_docnode(This, NULL); 00231 release_children(This); 00232 00233 if(This->frame_element) 00234 This->frame_element->content_window = NULL; 00235 00236 if(This->option_factory) { 00237 This->option_factory->window = NULL; 00238 IHTMLOptionElementFactory_Release(HTMLOPTFACTORY(This->option_factory)); 00239 } 00240 00241 if(This->image_factory) { 00242 This->image_factory->window = NULL; 00243 IHTMLImageElementFactory_Release(HTMLIMGFACTORY(This->image_factory)); 00244 } 00245 00246 if(This->location) { 00247 This->location->window = NULL; 00248 IHTMLLocation_Release(HTMLLOCATION(This->location)); 00249 } 00250 00251 if(This->screen) 00252 IHTMLScreen_Release(This->screen); 00253 00254 for(i=0; i < This->global_prop_cnt; i++) 00255 heap_free(This->global_props[i].name); 00256 00257 This->window_ref->window = NULL; 00258 windowref_release(This->window_ref); 00259 00260 heap_free(This->global_props); 00261 release_script_hosts(This); 00262 00263 if(This->nswindow) 00264 nsIDOMWindow_Release(This->nswindow); 00265 00266 list_remove(&This->entry); 00267 release_dispex(&This->dispex); 00268 heap_free(This); 00269 } 00270 00271 return ref; 00272 } 00273 00274 static HRESULT WINAPI HTMLWindow2_GetTypeInfoCount(IHTMLWindow2 *iface, UINT *pctinfo) 00275 { 00276 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00277 00278 return IDispatchEx_GetTypeInfoCount(DISPATCHEX(This), pctinfo); 00279 } 00280 00281 static HRESULT WINAPI HTMLWindow2_GetTypeInfo(IHTMLWindow2 *iface, UINT iTInfo, 00282 LCID lcid, ITypeInfo **ppTInfo) 00283 { 00284 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00285 00286 return IDispatchEx_GetTypeInfo(DISPATCHEX(This), iTInfo, lcid, ppTInfo); 00287 } 00288 00289 static HRESULT WINAPI HTMLWindow2_GetIDsOfNames(IHTMLWindow2 *iface, REFIID riid, 00290 LPOLESTR *rgszNames, UINT cNames, 00291 LCID lcid, DISPID *rgDispId) 00292 { 00293 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00294 00295 return IDispatchEx_GetIDsOfNames(DISPATCHEX(This), riid, rgszNames, cNames, lcid, rgDispId); 00296 } 00297 00298 static HRESULT WINAPI HTMLWindow2_Invoke(IHTMLWindow2 *iface, DISPID dispIdMember, 00299 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, 00300 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) 00301 { 00302 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00303 00304 return IDispatchEx_Invoke(DISPATCHEX(This), dispIdMember, riid, lcid, wFlags, pDispParams, 00305 pVarResult, pExcepInfo, puArgErr); 00306 } 00307 00308 static HRESULT get_frame_by_index(nsIDOMWindowCollection *nsFrames, PRUint32 index, HTMLWindow **ret) 00309 { 00310 PRUint32 length; 00311 nsIDOMWindow *nsWindow; 00312 nsresult nsres; 00313 00314 nsres = nsIDOMWindowCollection_GetLength(nsFrames, &length); 00315 if(NS_FAILED(nsres)) { 00316 FIXME("nsIDOMWindowCollection_GetLength failed: 0x%08x\n", nsres); 00317 return E_FAIL; 00318 } 00319 00320 if(index >= length) 00321 return DISP_E_MEMBERNOTFOUND; 00322 00323 nsres = nsIDOMWindowCollection_Item(nsFrames, index, &nsWindow); 00324 if(NS_FAILED(nsres)) { 00325 FIXME("nsIDOMWindowCollection_Item failed: 0x%08x\n", nsres); 00326 return E_FAIL; 00327 } 00328 00329 *ret = nswindow_to_window(nsWindow); 00330 00331 nsIDOMWindow_Release(nsWindow); 00332 00333 return S_OK; 00334 } 00335 00336 static HRESULT WINAPI HTMLWindow2_item(IHTMLWindow2 *iface, VARIANT *pvarIndex, VARIANT *pvarResult) 00337 { 00338 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00339 nsIDOMWindowCollection *nsFrames; 00340 HTMLWindow *window; 00341 HRESULT hres; 00342 nsresult nsres; 00343 00344 TRACE("(%p)->(%p %p)\n", This, pvarIndex, pvarResult); 00345 00346 nsres = nsIDOMWindow_GetFrames(This->nswindow, &nsFrames); 00347 if(NS_FAILED(nsres)) { 00348 FIXME("nsIDOMWindow_GetFrames failed: 0x%08x\n", nsres); 00349 return E_FAIL; 00350 } 00351 00352 if(V_VT(pvarIndex) == VT_I4) { 00353 int index = V_I4(pvarIndex); 00354 TRACE("Getting index %d\n", index); 00355 if(index < 0) { 00356 hres = DISP_E_MEMBERNOTFOUND; 00357 goto cleanup; 00358 } 00359 hres = get_frame_by_index(nsFrames, index, &window); 00360 if(FAILED(hres)) 00361 goto cleanup; 00362 }else if(V_VT(pvarIndex) == VT_UINT) { 00363 unsigned int index = V_UINT(pvarIndex); 00364 TRACE("Getting index %u\n", index); 00365 hres = get_frame_by_index(nsFrames, index, &window); 00366 if(FAILED(hres)) 00367 goto cleanup; 00368 }else if(V_VT(pvarIndex) == VT_BSTR) { 00369 BSTR str = V_BSTR(pvarIndex); 00370 PRUint32 length, i; 00371 00372 TRACE("Getting name %s\n", wine_dbgstr_w(str)); 00373 00374 nsres = nsIDOMWindowCollection_GetLength(nsFrames, &length); 00375 00376 window = NULL; 00377 for(i = 0; i < length && !window; ++i) { 00378 HTMLWindow *cur_window; 00379 nsIDOMWindow *nsWindow; 00380 BSTR id; 00381 00382 nsres = nsIDOMWindowCollection_Item(nsFrames, i, &nsWindow); 00383 if(NS_FAILED(nsres)) { 00384 FIXME("nsIDOMWindowCollection_Item failed: 0x%08x\n", nsres); 00385 hres = E_FAIL; 00386 goto cleanup; 00387 } 00388 00389 cur_window = nswindow_to_window(nsWindow); 00390 00391 nsIDOMWindow_Release(nsWindow); 00392 00393 hres = IHTMLElement_get_id(HTMLELEM(&cur_window->frame_element->element), &id); 00394 if(FAILED(hres)) { 00395 FIXME("IHTMLElement_get_id failed: 0x%08x\n", hres); 00396 goto cleanup; 00397 } 00398 00399 if(!strcmpW(id, str)) 00400 window = cur_window; 00401 00402 SysFreeString(id); 00403 } 00404 00405 if(!window) { 00406 hres = DISP_E_MEMBERNOTFOUND; 00407 goto cleanup; 00408 } 00409 }else { 00410 hres = E_INVALIDARG; 00411 goto cleanup; 00412 } 00413 00414 IHTMLWindow2_AddRef(HTMLWINDOW2(window)); 00415 V_VT(pvarResult) = VT_DISPATCH; 00416 V_DISPATCH(pvarResult) = (IDispatch*)window; 00417 00418 hres = S_OK; 00419 00420 cleanup: 00421 nsIDOMWindowCollection_Release(nsFrames); 00422 00423 return hres; 00424 } 00425 00426 static HRESULT WINAPI HTMLWindow2_get_length(IHTMLWindow2 *iface, LONG *p) 00427 { 00428 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00429 nsIDOMWindowCollection *nscollection; 00430 PRUint32 length; 00431 nsresult nsres; 00432 00433 TRACE("(%p)->(%p)\n", This, p); 00434 00435 nsres = nsIDOMWindow_GetFrames(This->nswindow, &nscollection); 00436 if(NS_FAILED(nsres)) { 00437 ERR("GetFrames failed: %08x\n", nsres); 00438 return E_FAIL; 00439 } 00440 00441 nsres = nsIDOMWindowCollection_GetLength(nscollection, &length); 00442 nsIDOMWindowCollection_Release(nscollection); 00443 if(NS_FAILED(nsres)) { 00444 ERR("GetLength failed: %08x\n", nsres); 00445 return E_FAIL; 00446 } 00447 00448 *p = length; 00449 return S_OK; 00450 } 00451 00452 static HRESULT WINAPI HTMLWindow2_get_frames(IHTMLWindow2 *iface, IHTMLFramesCollection2 **p) 00453 { 00454 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00455 FIXME("(%p)->(%p): semi-stub\n", This, p); 00456 00457 /* FIXME: Should return a separate Window object */ 00458 *p = (IHTMLFramesCollection2*)HTMLWINDOW2(This); 00459 HTMLWindow2_AddRef(iface); 00460 return S_OK; 00461 } 00462 00463 static HRESULT WINAPI HTMLWindow2_put_defaultStatus(IHTMLWindow2 *iface, BSTR v) 00464 { 00465 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00466 FIXME("(%p)->(%s)\n", This, debugstr_w(v)); 00467 return E_NOTIMPL; 00468 } 00469 00470 static HRESULT WINAPI HTMLWindow2_get_defaultStatus(IHTMLWindow2 *iface, BSTR *p) 00471 { 00472 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00473 FIXME("(%p)->(%p)\n", This, p); 00474 return E_NOTIMPL; 00475 } 00476 00477 static HRESULT WINAPI HTMLWindow2_put_status(IHTMLWindow2 *iface, BSTR v) 00478 { 00479 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00480 FIXME("(%p)->(%s)\n", This, debugstr_w(v)); 00481 return E_NOTIMPL; 00482 } 00483 00484 static HRESULT WINAPI HTMLWindow2_get_status(IHTMLWindow2 *iface, BSTR *p) 00485 { 00486 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00487 FIXME("(%p)->(%p)\n", This, p); 00488 return E_NOTIMPL; 00489 } 00490 00491 static HRESULT WINAPI HTMLWindow2_setTimeout(IHTMLWindow2 *iface, BSTR expression, 00492 LONG msec, VARIANT *language, LONG *timerID) 00493 { 00494 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00495 VARIANT expr_var; 00496 00497 TRACE("(%p)->(%s %d %p %p)\n", This, debugstr_w(expression), msec, language, timerID); 00498 00499 V_VT(&expr_var) = VT_BSTR; 00500 V_BSTR(&expr_var) = expression; 00501 00502 return IHTMLWindow3_setTimeout(HTMLWINDOW3(This), &expr_var, msec, language, timerID); 00503 } 00504 00505 static HRESULT WINAPI HTMLWindow2_clearTimeout(IHTMLWindow2 *iface, LONG timerID) 00506 { 00507 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00508 00509 TRACE("(%p)->(%d)\n", This, timerID); 00510 00511 return clear_task_timer(&This->doc->basedoc, FALSE, timerID); 00512 } 00513 00514 #define MAX_MESSAGE_LEN 2000 00515 00516 static HRESULT WINAPI HTMLWindow2_alert(IHTMLWindow2 *iface, BSTR message) 00517 { 00518 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00519 WCHAR title[100], *msg = message; 00520 DWORD len; 00521 00522 TRACE("(%p)->(%s)\n", This, debugstr_w(message)); 00523 00524 if(!LoadStringW(get_shdoclc(), IDS_MESSAGE_BOX_TITLE, title, 00525 sizeof(title)/sizeof(WCHAR))) { 00526 WARN("Could not load message box title: %d\n", GetLastError()); 00527 return S_OK; 00528 } 00529 00530 len = SysStringLen(message); 00531 if(len > MAX_MESSAGE_LEN) { 00532 msg = heap_alloc((MAX_MESSAGE_LEN+1)*sizeof(WCHAR)); 00533 if(!msg) 00534 return E_OUTOFMEMORY; 00535 memcpy(msg, message, MAX_MESSAGE_LEN*sizeof(WCHAR)); 00536 msg[MAX_MESSAGE_LEN] = 0; 00537 } 00538 00539 MessageBoxW(This->doc_obj->hwnd, msg, title, MB_ICONWARNING); 00540 if(msg != message) 00541 heap_free(msg); 00542 return S_OK; 00543 } 00544 00545 static HRESULT WINAPI HTMLWindow2_confirm(IHTMLWindow2 *iface, BSTR message, 00546 VARIANT_BOOL *confirmed) 00547 { 00548 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00549 WCHAR wszTitle[100]; 00550 00551 TRACE("(%p)->(%s %p)\n", This, debugstr_w(message), confirmed); 00552 00553 if(!confirmed) return E_INVALIDARG; 00554 00555 if(!LoadStringW(get_shdoclc(), IDS_MESSAGE_BOX_TITLE, wszTitle, 00556 sizeof(wszTitle)/sizeof(WCHAR))) { 00557 WARN("Could not load message box title: %d\n", GetLastError()); 00558 *confirmed = VARIANT_TRUE; 00559 return S_OK; 00560 } 00561 00562 if(MessageBoxW(This->doc_obj->hwnd, message, wszTitle, 00563 MB_OKCANCEL|MB_ICONQUESTION)==IDOK) 00564 *confirmed = VARIANT_TRUE; 00565 else *confirmed = VARIANT_FALSE; 00566 00567 return S_OK; 00568 } 00569 00570 typedef struct 00571 { 00572 BSTR message; 00573 BSTR dststr; 00574 VARIANT *textdata; 00575 }prompt_arg; 00576 00577 static INT_PTR CALLBACK prompt_dlgproc(HWND hwnd, UINT msg, 00578 WPARAM wparam, LPARAM lparam) 00579 { 00580 switch(msg) 00581 { 00582 case WM_INITDIALOG: 00583 { 00584 prompt_arg *arg = (prompt_arg*)lparam; 00585 WCHAR wszTitle[100]; 00586 00587 if(!LoadStringW(get_shdoclc(), IDS_MESSAGE_BOX_TITLE, wszTitle, 00588 sizeof(wszTitle)/sizeof(WCHAR))) { 00589 WARN("Could not load message box title: %d\n", GetLastError()); 00590 EndDialog(hwnd, wparam); 00591 return FALSE; 00592 } 00593 00594 SetWindowLongPtrW(hwnd, DWLP_USER, lparam); 00595 SetWindowTextW(hwnd, wszTitle); 00596 SetWindowTextW(GetDlgItem(hwnd, ID_PROMPT_PROMPT), arg->message); 00597 SetWindowTextW(GetDlgItem(hwnd, ID_PROMPT_EDIT), arg->dststr); 00598 return FALSE; 00599 } 00600 case WM_COMMAND: 00601 switch(wparam) 00602 { 00603 case MAKEWPARAM(IDCANCEL, BN_CLICKED): 00604 EndDialog(hwnd, wparam); 00605 return TRUE; 00606 case MAKEWPARAM(IDOK, BN_CLICKED): 00607 { 00608 prompt_arg *arg = 00609 (prompt_arg*)GetWindowLongPtrW(hwnd, DWLP_USER); 00610 HWND hwndPrompt = GetDlgItem(hwnd, ID_PROMPT_EDIT); 00611 INT len = GetWindowTextLengthW(hwndPrompt); 00612 00613 if(!arg->textdata) 00614 { 00615 EndDialog(hwnd, wparam); 00616 return TRUE; 00617 } 00618 00619 V_VT(arg->textdata) = VT_BSTR; 00620 if(!len && !arg->dststr) 00621 V_BSTR(arg->textdata) = NULL; 00622 else 00623 { 00624 V_BSTR(arg->textdata) = SysAllocStringLen(NULL, len); 00625 GetWindowTextW(hwndPrompt, V_BSTR(arg->textdata), len+1); 00626 } 00627 EndDialog(hwnd, wparam); 00628 return TRUE; 00629 } 00630 } 00631 return FALSE; 00632 case WM_CLOSE: 00633 EndDialog(hwnd, IDCANCEL); 00634 return TRUE; 00635 default: 00636 return FALSE; 00637 } 00638 } 00639 00640 static HRESULT WINAPI HTMLWindow2_prompt(IHTMLWindow2 *iface, BSTR message, 00641 BSTR dststr, VARIANT *textdata) 00642 { 00643 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00644 prompt_arg arg; 00645 00646 TRACE("(%p)->(%s %s %p)\n", This, debugstr_w(message), debugstr_w(dststr), textdata); 00647 00648 if(textdata) V_VT(textdata) = VT_NULL; 00649 00650 arg.message = message; 00651 arg.dststr = dststr; 00652 arg.textdata = textdata; 00653 00654 DialogBoxParamW(hInst, MAKEINTRESOURCEW(ID_PROMPT_DIALOG), 00655 This->doc_obj->hwnd, prompt_dlgproc, (LPARAM)&arg); 00656 return S_OK; 00657 } 00658 00659 static HRESULT WINAPI HTMLWindow2_get_Image(IHTMLWindow2 *iface, IHTMLImageElementFactory **p) 00660 { 00661 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00662 00663 TRACE("(%p)->(%p)\n", This, p); 00664 00665 if(!This->image_factory) 00666 This->image_factory = HTMLImageElementFactory_Create(This); 00667 00668 *p = HTMLIMGFACTORY(This->image_factory); 00669 IHTMLImageElementFactory_AddRef(*p); 00670 00671 return S_OK; 00672 } 00673 00674 static HRESULT WINAPI HTMLWindow2_get_location(IHTMLWindow2 *iface, IHTMLLocation **p) 00675 { 00676 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00677 HTMLLocation *location; 00678 HRESULT hres; 00679 00680 TRACE("(%p)->(%p)\n", This, p); 00681 00682 hres = get_location(This, &location); 00683 if(FAILED(hres)) 00684 return hres; 00685 00686 *p = HTMLLOCATION(location); 00687 return S_OK; 00688 } 00689 00690 static HRESULT WINAPI HTMLWindow2_get_history(IHTMLWindow2 *iface, IOmHistory **p) 00691 { 00692 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00693 FIXME("(%p)->(%p)\n", This, p); 00694 return E_NOTIMPL; 00695 } 00696 00697 static HRESULT WINAPI HTMLWindow2_close(IHTMLWindow2 *iface) 00698 { 00699 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00700 FIXME("(%p)->()\n", This); 00701 return E_NOTIMPL; 00702 } 00703 00704 static HRESULT WINAPI HTMLWindow2_put_opener(IHTMLWindow2 *iface, VARIANT v) 00705 { 00706 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00707 FIXME("(%p)->(v(%d))\n", This, V_VT(&v)); 00708 return E_NOTIMPL; 00709 } 00710 00711 static HRESULT WINAPI HTMLWindow2_get_opener(IHTMLWindow2 *iface, VARIANT *p) 00712 { 00713 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00714 FIXME("(%p)->(%p)\n", This, p); 00715 return E_NOTIMPL; 00716 } 00717 00718 static HRESULT WINAPI HTMLWindow2_get_navigator(IHTMLWindow2 *iface, IOmNavigator **p) 00719 { 00720 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00721 00722 TRACE("(%p)->(%p)\n", This, p); 00723 00724 *p = OmNavigator_Create(); 00725 return S_OK; 00726 } 00727 00728 static HRESULT WINAPI HTMLWindow2_put_name(IHTMLWindow2 *iface, BSTR v) 00729 { 00730 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00731 nsAString name_str; 00732 nsresult nsres; 00733 00734 TRACE("(%p)->(%s)\n", This, debugstr_w(v)); 00735 00736 nsAString_InitDepend(&name_str, v); 00737 nsres = nsIDOMWindow_SetName(This->nswindow, &name_str); 00738 nsAString_Finish(&name_str); 00739 if(NS_FAILED(nsres)) 00740 ERR("SetName failed: %08x\n", nsres); 00741 00742 return S_OK; 00743 } 00744 00745 static HRESULT WINAPI HTMLWindow2_get_name(IHTMLWindow2 *iface, BSTR *p) 00746 { 00747 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00748 nsAString name_str; 00749 nsresult nsres; 00750 HRESULT hres; 00751 00752 TRACE("(%p)->(%p)\n", This, p); 00753 00754 nsAString_Init(&name_str, NULL); 00755 nsres = nsIDOMWindow_GetName(This->nswindow, &name_str); 00756 if(NS_SUCCEEDED(nsres)) { 00757 const PRUnichar *name; 00758 00759 nsAString_GetData(&name_str, &name); 00760 if(*name) { 00761 *p = SysAllocString(name); 00762 hres = *p ? S_OK : E_OUTOFMEMORY; 00763 }else { 00764 *p = NULL; 00765 hres = S_OK; 00766 } 00767 }else { 00768 ERR("GetName failed: %08x\n", nsres); 00769 hres = E_FAIL; 00770 } 00771 nsAString_Finish(&name_str); 00772 00773 return hres; 00774 } 00775 00776 static HRESULT WINAPI HTMLWindow2_get_parent(IHTMLWindow2 *iface, IHTMLWindow2 **p) 00777 { 00778 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00779 TRACE("(%p)->(%p)\n", This, p); 00780 00781 if(This->parent) { 00782 *p = HTMLWINDOW2(This->parent); 00783 IHTMLWindow2_AddRef(*p); 00784 }else 00785 *p = NULL; 00786 00787 return S_OK; 00788 } 00789 00790 static HRESULT WINAPI HTMLWindow2_open(IHTMLWindow2 *iface, BSTR url, BSTR name, 00791 BSTR features, VARIANT_BOOL replace, IHTMLWindow2 **pomWindowResult) 00792 { 00793 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00794 FIXME("(%p)->(%s %s %s %x %p)\n", This, debugstr_w(url), debugstr_w(name), 00795 debugstr_w(features), replace, pomWindowResult); 00796 return E_NOTIMPL; 00797 } 00798 00799 static HRESULT WINAPI HTMLWindow2_get_self(IHTMLWindow2 *iface, IHTMLWindow2 **p) 00800 { 00801 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00802 00803 TRACE("(%p)->(%p)\n", This, p); 00804 00805 /* FIXME: We should return kind of proxy window here. */ 00806 IHTMLWindow2_AddRef(HTMLWINDOW2(This)); 00807 *p = HTMLWINDOW2(This); 00808 return S_OK; 00809 } 00810 00811 static HRESULT WINAPI HTMLWindow2_get_top(IHTMLWindow2 *iface, IHTMLWindow2 **p) 00812 { 00813 HTMLWindow *This = HTMLWINDOW2_THIS(iface), *curr; 00814 TRACE("(%p)->(%p)\n", This, p); 00815 00816 curr = This; 00817 while(curr->parent) 00818 curr = curr->parent; 00819 *p = HTMLWINDOW2(curr); 00820 IHTMLWindow2_AddRef(*p); 00821 00822 return S_OK; 00823 } 00824 00825 static HRESULT WINAPI HTMLWindow2_get_window(IHTMLWindow2 *iface, IHTMLWindow2 **p) 00826 { 00827 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00828 00829 TRACE("(%p)->(%p)\n", This, p); 00830 00831 /* FIXME: We should return kind of proxy window here. */ 00832 IHTMLWindow2_AddRef(HTMLWINDOW2(This)); 00833 *p = HTMLWINDOW2(This); 00834 return S_OK; 00835 } 00836 00837 static HRESULT WINAPI HTMLWindow2_navigate(IHTMLWindow2 *iface, BSTR url) 00838 { 00839 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00840 FIXME("(%p)->(%s)\n", This, debugstr_w(url)); 00841 return E_NOTIMPL; 00842 } 00843 00844 static HRESULT WINAPI HTMLWindow2_put_onfocus(IHTMLWindow2 *iface, VARIANT v) 00845 { 00846 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00847 FIXME("(%p)->(v(%d))\n", This, V_VT(&v)); 00848 return E_NOTIMPL; 00849 } 00850 00851 static HRESULT WINAPI HTMLWindow2_get_onfocus(IHTMLWindow2 *iface, VARIANT *p) 00852 { 00853 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00854 FIXME("(%p)->(%p)\n", This, p); 00855 return E_NOTIMPL; 00856 } 00857 00858 static HRESULT WINAPI HTMLWindow2_put_onblur(IHTMLWindow2 *iface, VARIANT v) 00859 { 00860 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00861 FIXME("(%p)->(v(%d))\n", This, V_VT(&v)); 00862 return E_NOTIMPL; 00863 } 00864 00865 static HRESULT WINAPI HTMLWindow2_get_onblur(IHTMLWindow2 *iface, VARIANT *p) 00866 { 00867 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00868 FIXME("(%p)->(%p)\n", This, p); 00869 return E_NOTIMPL; 00870 } 00871 00872 static HRESULT WINAPI HTMLWindow2_put_onload(IHTMLWindow2 *iface, VARIANT v) 00873 { 00874 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00875 00876 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); 00877 00878 return set_window_event(This, EVENTID_LOAD, &v); 00879 } 00880 00881 static HRESULT WINAPI HTMLWindow2_get_onload(IHTMLWindow2 *iface, VARIANT *p) 00882 { 00883 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00884 00885 TRACE("(%p)->(%p)\n", This, p); 00886 00887 return get_window_event(This, EVENTID_LOAD, p); 00888 } 00889 00890 static HRESULT WINAPI HTMLWindow2_put_onbeforeunload(IHTMLWindow2 *iface, VARIANT v) 00891 { 00892 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00893 00894 TRACE("(%p)->(v(%d))\n", This, V_VT(&v)); 00895 00896 return set_window_event(This, EVENTID_BEFOREUNLOAD, &v); 00897 } 00898 00899 static HRESULT WINAPI HTMLWindow2_get_onbeforeunload(IHTMLWindow2 *iface, VARIANT *p) 00900 { 00901 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00902 00903 TRACE("(%p)->(%p)\n", This, p); 00904 00905 return get_window_event(This, EVENTID_BEFOREUNLOAD, p); 00906 } 00907 00908 static HRESULT WINAPI HTMLWindow2_put_onunload(IHTMLWindow2 *iface, VARIANT v) 00909 { 00910 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00911 FIXME("(%p)->(v(%d))\n", This, V_VT(&v)); 00912 return E_NOTIMPL; 00913 } 00914 00915 static HRESULT WINAPI HTMLWindow2_get_onunload(IHTMLWindow2 *iface, VARIANT *p) 00916 { 00917 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00918 FIXME("(%p)->(%p)\n", This, p); 00919 return E_NOTIMPL; 00920 } 00921 00922 static HRESULT WINAPI HTMLWindow2_put_onhelp(IHTMLWindow2 *iface, VARIANT v) 00923 { 00924 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00925 FIXME("(%p)->(v(%d))\n", This, V_VT(&v)); 00926 return E_NOTIMPL; 00927 } 00928 00929 static HRESULT WINAPI HTMLWindow2_get_onhelp(IHTMLWindow2 *iface, VARIANT *p) 00930 { 00931 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00932 FIXME("(%p)->(%p)\n", This, p); 00933 return E_NOTIMPL; 00934 } 00935 00936 static HRESULT WINAPI HTMLWindow2_put_onerror(IHTMLWindow2 *iface, VARIANT v) 00937 { 00938 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00939 FIXME("(%p)->(v(%d))\n", This, V_VT(&v)); 00940 return E_NOTIMPL; 00941 } 00942 00943 static HRESULT WINAPI HTMLWindow2_get_onerror(IHTMLWindow2 *iface, VARIANT *p) 00944 { 00945 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00946 FIXME("(%p)->(%p)\n", This, p); 00947 return E_NOTIMPL; 00948 } 00949 00950 static HRESULT WINAPI HTMLWindow2_put_onresize(IHTMLWindow2 *iface, VARIANT v) 00951 { 00952 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00953 00954 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); 00955 00956 return set_window_event(This, EVENTID_RESIZE, &v); 00957 } 00958 00959 static HRESULT WINAPI HTMLWindow2_get_onresize(IHTMLWindow2 *iface, VARIANT *p) 00960 { 00961 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00962 00963 TRACE("(%p)->(%p)\n", This, p); 00964 00965 return get_window_event(This, EVENTID_RESIZE, p); 00966 } 00967 00968 static HRESULT WINAPI HTMLWindow2_put_onscroll(IHTMLWindow2 *iface, VARIANT v) 00969 { 00970 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00971 FIXME("(%p)->(v(%d))\n", This, V_VT(&v)); 00972 return E_NOTIMPL; 00973 } 00974 00975 static HRESULT WINAPI HTMLWindow2_get_onscroll(IHTMLWindow2 *iface, VARIANT *p) 00976 { 00977 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00978 FIXME("(%p)->(%p)\n", This, p); 00979 return E_NOTIMPL; 00980 } 00981 00982 static HRESULT WINAPI HTMLWindow2_get_document(IHTMLWindow2 *iface, IHTMLDocument2 **p) 00983 { 00984 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 00985 00986 TRACE("(%p)->(%p)\n", This, p); 00987 00988 if(This->doc) { 00989 /* FIXME: We should return a wrapper object here */ 00990 *p = HTMLDOC(&This->doc->basedoc); 00991 IHTMLDocument2_AddRef(*p); 00992 }else { 00993 *p = NULL; 00994 } 00995 00996 return S_OK; 00997 } 00998 00999 static HRESULT WINAPI HTMLWindow2_get_event(IHTMLWindow2 *iface, IHTMLEventObj **p) 01000 { 01001 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01002 01003 TRACE("(%p)->(%p)\n", This, p); 01004 01005 if(This->event) 01006 IHTMLEventObj_AddRef(This->event); 01007 *p = This->event; 01008 return S_OK; 01009 } 01010 01011 static HRESULT WINAPI HTMLWindow2_get__newEnum(IHTMLWindow2 *iface, IUnknown **p) 01012 { 01013 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01014 FIXME("(%p)->(%p)\n", This, p); 01015 return E_NOTIMPL; 01016 } 01017 01018 static HRESULT WINAPI HTMLWindow2_showModalDialog(IHTMLWindow2 *iface, BSTR dialog, 01019 VARIANT *varArgIn, VARIANT *varOptions, VARIANT *varArgOut) 01020 { 01021 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01022 FIXME("(%p)->(%s %p %p %p)\n", This, debugstr_w(dialog), varArgIn, varOptions, varArgOut); 01023 return E_NOTIMPL; 01024 } 01025 01026 static HRESULT WINAPI HTMLWindow2_showHelp(IHTMLWindow2 *iface, BSTR helpURL, VARIANT helpArg, 01027 BSTR features) 01028 { 01029 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01030 FIXME("(%p)->(%s v(%d) %s)\n", This, debugstr_w(helpURL), V_VT(&helpArg), debugstr_w(features)); 01031 return E_NOTIMPL; 01032 } 01033 01034 static HRESULT WINAPI HTMLWindow2_get_screen(IHTMLWindow2 *iface, IHTMLScreen **p) 01035 { 01036 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01037 01038 TRACE("(%p)->(%p)\n", This, p); 01039 01040 if(!This->screen) { 01041 HRESULT hres; 01042 01043 hres = HTMLScreen_Create(&This->screen); 01044 if(FAILED(hres)) 01045 return hres; 01046 } 01047 01048 *p = This->screen; 01049 IHTMLScreen_AddRef(This->screen); 01050 return S_OK; 01051 } 01052 01053 static HRESULT WINAPI HTMLWindow2_get_Option(IHTMLWindow2 *iface, IHTMLOptionElementFactory **p) 01054 { 01055 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01056 01057 TRACE("(%p)->(%p)\n", This, p); 01058 01059 if(!This->option_factory) 01060 This->option_factory = HTMLOptionElementFactory_Create(This); 01061 01062 *p = HTMLOPTFACTORY(This->option_factory); 01063 IHTMLOptionElementFactory_AddRef(*p); 01064 01065 return S_OK; 01066 } 01067 01068 static HRESULT WINAPI HTMLWindow2_focus(IHTMLWindow2 *iface) 01069 { 01070 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01071 FIXME("(%p)->()\n", This); 01072 return E_NOTIMPL; 01073 } 01074 01075 static HRESULT WINAPI HTMLWindow2_get_closed(IHTMLWindow2 *iface, VARIANT_BOOL *p) 01076 { 01077 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01078 FIXME("(%p)->(%p)\n", This, p); 01079 return E_NOTIMPL; 01080 } 01081 01082 static HRESULT WINAPI HTMLWindow2_blur(IHTMLWindow2 *iface) 01083 { 01084 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01085 FIXME("(%p)->()\n", This); 01086 return E_NOTIMPL; 01087 } 01088 01089 static HRESULT WINAPI HTMLWindow2_scroll(IHTMLWindow2 *iface, LONG x, LONG y) 01090 { 01091 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01092 FIXME("(%p)->(%d %d)\n", This, x, y); 01093 return E_NOTIMPL; 01094 } 01095 01096 static HRESULT WINAPI HTMLWindow2_get_clientInformation(IHTMLWindow2 *iface, IOmNavigator **p) 01097 { 01098 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01099 FIXME("(%p)->(%p)\n", This, p); 01100 return E_NOTIMPL; 01101 } 01102 01103 static HRESULT WINAPI HTMLWindow2_setInterval(IHTMLWindow2 *iface, BSTR expression, 01104 LONG msec, VARIANT *language, LONG *timerID) 01105 { 01106 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01107 VARIANT expr; 01108 01109 TRACE("(%p)->(%s %d %p %p)\n", This, debugstr_w(expression), msec, language, timerID); 01110 01111 V_VT(&expr) = VT_BSTR; 01112 V_BSTR(&expr) = expression; 01113 return IHTMLWindow3_setInterval(HTMLWINDOW3(This), &expr, msec, language, timerID); 01114 } 01115 01116 static HRESULT WINAPI HTMLWindow2_clearInterval(IHTMLWindow2 *iface, LONG timerID) 01117 { 01118 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01119 01120 TRACE("(%p)->(%d)\n", This, timerID); 01121 01122 return clear_task_timer(&This->doc->basedoc, TRUE, timerID); 01123 } 01124 01125 static HRESULT WINAPI HTMLWindow2_put_offscreenBuffering(IHTMLWindow2 *iface, VARIANT v) 01126 { 01127 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01128 FIXME("(%p)->(v(%d))\n", This, V_VT(&v)); 01129 return E_NOTIMPL; 01130 } 01131 01132 static HRESULT WINAPI HTMLWindow2_get_offscreenBuffering(IHTMLWindow2 *iface, VARIANT *p) 01133 { 01134 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01135 FIXME("(%p)->(%p)\n", This, p); 01136 return E_NOTIMPL; 01137 } 01138 01139 static HRESULT WINAPI HTMLWindow2_execScript(IHTMLWindow2 *iface, BSTR scode, BSTR language, 01140 VARIANT *pvarRet) 01141 { 01142 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01143 FIXME("(%p)->(%s %s %p)\n", This, debugstr_w(scode), debugstr_w(language), pvarRet); 01144 return E_NOTIMPL; 01145 } 01146 01147 static HRESULT WINAPI HTMLWindow2_toString(IHTMLWindow2 *iface, BSTR *String) 01148 { 01149 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01150 01151 static const WCHAR objectW[] = {'[','o','b','j','e','c','t',']',0}; 01152 01153 TRACE("(%p)->(%p)\n", This, String); 01154 01155 if(!String) 01156 return E_INVALIDARG; 01157 01158 *String = SysAllocString(objectW); 01159 return *String ? S_OK : E_OUTOFMEMORY; 01160 } 01161 01162 static HRESULT WINAPI HTMLWindow2_scrollBy(IHTMLWindow2 *iface, LONG x, LONG y) 01163 { 01164 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01165 nsresult nsres; 01166 01167 TRACE("(%p)->(%d %d)\n", This, x, y); 01168 01169 nsres = nsIDOMWindow_ScrollBy(This->nswindow, x, y); 01170 if(NS_FAILED(nsres)) 01171 ERR("ScrollBy failed: %08x\n", nsres); 01172 01173 return S_OK; 01174 } 01175 01176 static HRESULT WINAPI HTMLWindow2_scrollTo(IHTMLWindow2 *iface, LONG x, LONG y) 01177 { 01178 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01179 nsresult nsres; 01180 01181 TRACE("(%p)->(%d %d)\n", This, x, y); 01182 01183 nsres = nsIDOMWindow_ScrollTo(This->nswindow, x, y); 01184 if(NS_FAILED(nsres)) 01185 ERR("ScrollTo failed: %08x\n", nsres); 01186 01187 return S_OK; 01188 } 01189 01190 static HRESULT WINAPI HTMLWindow2_moveTo(IHTMLWindow2 *iface, LONG x, LONG y) 01191 { 01192 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01193 FIXME("(%p)->(%d %d)\n", This, x, y); 01194 return E_NOTIMPL; 01195 } 01196 01197 static HRESULT WINAPI HTMLWindow2_moveBy(IHTMLWindow2 *iface, LONG x, LONG y) 01198 { 01199 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01200 FIXME("(%p)->(%d %d)\n", This, x, y); 01201 return E_NOTIMPL; 01202 } 01203 01204 static HRESULT WINAPI HTMLWindow2_resizeTo(IHTMLWindow2 *iface, LONG x, LONG y) 01205 { 01206 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01207 FIXME("(%p)->(%d %d)\n", This, x, y); 01208 return E_NOTIMPL; 01209 } 01210 01211 static HRESULT WINAPI HTMLWindow2_resizeBy(IHTMLWindow2 *iface, LONG x, LONG y) 01212 { 01213 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01214 FIXME("(%p)->(%d %d)\n", This, x, y); 01215 return E_NOTIMPL; 01216 } 01217 01218 static HRESULT WINAPI HTMLWindow2_get_external(IHTMLWindow2 *iface, IDispatch **p) 01219 { 01220 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01221 01222 TRACE("(%p)->(%p)\n", This, p); 01223 01224 *p = NULL; 01225 01226 if(!This->doc_obj->hostui) 01227 return S_OK; 01228 01229 return IDocHostUIHandler_GetExternal(This->doc_obj->hostui, p); 01230 } 01231 01232 static HRESULT HTMLWindow_invoke(IUnknown *iface, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params, 01233 VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) 01234 { 01235 HTMLWindow *This = HTMLWINDOW2_THIS(iface); 01236 global_prop_t *prop; 01237 DWORD idx; 01238 HRESULT hres; 01239 01240 idx = id - MSHTML_DISPID_CUSTOM_MIN; 01241 if(idx >= This->global_prop_cnt) 01242 return DISP_E_MEMBERNOTFOUND; 01243 01244 prop = This->global_props+idx; 01245 01246 switch(prop->type) { 01247 case GLOBAL_SCRIPTVAR: { 01248 IDispatchEx *dispex; 01249 IDispatch *disp; 01250 01251 disp = get_script_disp(prop->script_host); 01252 if(!disp) 01253 return E_UNEXPECTED; 01254 01255 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); 01256 if(SUCCEEDED(hres)) { 01257 TRACE("%s >>>\n", debugstr_w(prop->name)); 01258 hres = IDispatchEx_InvokeEx(dispex, prop->id, lcid, flags, params, res, ei, caller); 01259 if(hres == S_OK) 01260 TRACE("%s <<<\n", debugstr_w(prop->name)); 01261 else 01262 WARN("%s <<< %08x\n", debugstr_w(prop->name), hres); 01263 IDispatchEx_Release(dispex); 01264 }else { 01265 FIXME("No IDispatchEx\n"); 01266 } 01267 IDispatch_Release(disp); 01268 break; 01269 } 01270 case GLOBAL_ELEMENTVAR: { 01271 IHTMLElement *elem; 01272 01273 hres = IHTMLDocument3_getElementById(HTMLDOC3(&This->doc->basedoc), prop->name, &elem); 01274 if(FAILED(hres)) 01275 return hres; 01276 01277 if(!elem) 01278 return DISP_E_MEMBERNOTFOUND; 01279 01280 V_VT(res) = VT_DISPATCH; 01281 V_DISPATCH(res) = (IDispatch*)elem; 01282 break; 01283 } 01284 default: 01285 ERR("invalid type %d\n", prop->type); 01286 hres = DISP_E_MEMBERNOTFOUND; 01287 } 01288 01289 return hres; 01290 } 01291 01292 #undef HTMLWINDOW2_THIS 01293 01294 static const IHTMLWindow2Vtbl HTMLWindow2Vtbl = { 01295 HTMLWindow2_QueryInterface, 01296 HTMLWindow2_AddRef, 01297 HTMLWindow2_Release, 01298 HTMLWindow2_GetTypeInfoCount, 01299 HTMLWindow2_GetTypeInfo, 01300 HTMLWindow2_GetIDsOfNames, 01301 HTMLWindow2_Invoke, 01302 HTMLWindow2_item, 01303 HTMLWindow2_get_length, 01304 HTMLWindow2_get_frames, 01305 HTMLWindow2_put_defaultStatus, 01306 HTMLWindow2_get_defaultStatus, 01307 HTMLWindow2_put_status, 01308 HTMLWindow2_get_status, 01309 HTMLWindow2_setTimeout, 01310 HTMLWindow2_clearTimeout, 01311 HTMLWindow2_alert, 01312 HTMLWindow2_confirm, 01313 HTMLWindow2_prompt, 01314 HTMLWindow2_get_Image, 01315 HTMLWindow2_get_location, 01316 HTMLWindow2_get_history, 01317 HTMLWindow2_close, 01318 HTMLWindow2_put_opener, 01319 HTMLWindow2_get_opener, 01320 HTMLWindow2_get_navigator, 01321 HTMLWindow2_put_name, 01322 HTMLWindow2_get_name, 01323 HTMLWindow2_get_parent, 01324 HTMLWindow2_open, 01325 HTMLWindow2_get_self, 01326 HTMLWindow2_get_top, 01327 HTMLWindow2_get_window, 01328 HTMLWindow2_navigate, 01329 HTMLWindow2_put_onfocus, 01330 HTMLWindow2_get_onfocus, 01331 HTMLWindow2_put_onblur, 01332 HTMLWindow2_get_onblur, 01333 HTMLWindow2_put_onload, 01334 HTMLWindow2_get_onload, 01335 HTMLWindow2_put_onbeforeunload, 01336 HTMLWindow2_get_onbeforeunload, 01337 HTMLWindow2_put_onunload, 01338 HTMLWindow2_get_onunload, 01339 HTMLWindow2_put_onhelp, 01340 HTMLWindow2_get_onhelp, 01341 HTMLWindow2_put_onerror, 01342 HTMLWindow2_get_onerror, 01343 HTMLWindow2_put_onresize, 01344 HTMLWindow2_get_onresize, 01345 HTMLWindow2_put_onscroll, 01346 HTMLWindow2_get_onscroll, 01347 HTMLWindow2_get_document, 01348 HTMLWindow2_get_event, 01349 HTMLWindow2_get__newEnum, 01350 HTMLWindow2_showModalDialog, 01351 HTMLWindow2_showHelp, 01352 HTMLWindow2_get_screen, 01353 HTMLWindow2_get_Option, 01354 HTMLWindow2_focus, 01355 HTMLWindow2_get_closed, 01356 HTMLWindow2_blur, 01357 HTMLWindow2_scroll, 01358 HTMLWindow2_get_clientInformation, 01359 HTMLWindow2_setInterval, 01360 HTMLWindow2_clearInterval, 01361 HTMLWindow2_put_offscreenBuffering, 01362 HTMLWindow2_get_offscreenBuffering, 01363 HTMLWindow2_execScript, 01364 HTMLWindow2_toString, 01365 HTMLWindow2_scrollBy, 01366 HTMLWindow2_scrollTo, 01367 HTMLWindow2_moveTo, 01368 HTMLWindow2_moveBy, 01369 HTMLWindow2_resizeTo, 01370 HTMLWindow2_resizeBy, 01371 HTMLWindow2_get_external 01372 }; 01373 01374 #define HTMLWINDOW3_THIS(iface) DEFINE_THIS(HTMLWindow, HTMLWindow3, iface) 01375 01376 static HRESULT WINAPI HTMLWindow3_QueryInterface(IHTMLWindow3 *iface, REFIID riid, void **ppv) 01377 { 01378 HTMLWindow *This = HTMLWINDOW3_THIS(iface); 01379 01380 return IHTMLWindow2_QueryInterface(HTMLWINDOW2(This), riid, ppv); 01381 } 01382 01383 static ULONG WINAPI HTMLWindow3_AddRef(IHTMLWindow3 *iface) 01384 { 01385 HTMLWindow *This = HTMLWINDOW3_THIS(iface); 01386 01387 return IHTMLWindow2_AddRef(HTMLWINDOW2(This)); 01388 } 01389 01390 static ULONG WINAPI HTMLWindow3_Release(IHTMLWindow3 *iface) 01391 { 01392 HTMLWindow *This = HTMLWINDOW3_THIS(iface); 01393 01394 return IHTMLWindow2_Release(HTMLWINDOW2(This)); 01395 } 01396 01397 static HRESULT WINAPI HTMLWindow3_GetTypeInfoCount(IHTMLWindow3 *iface, UINT *pctinfo) 01398 { 01399 HTMLWindow *This = HTMLWINDOW3_THIS(iface); 01400 01401 return IDispatchEx_GetTypeInfoCount(DISPATCHEX(This), pctinfo); 01402 } 01403 01404 static HRESULT WINAPI HTMLWindow3_GetTypeInfo(IHTMLWindow3 *iface, UINT iTInfo, 01405 LCID lcid, ITypeInfo **ppTInfo) 01406 { 01407 HTMLWindow *This = HTMLWINDOW3_THIS(iface); 01408 01409 return IDispatchEx_GetTypeInfo(DISPATCHEX(This), iTInfo, lcid, ppTInfo); 01410 } 01411 01412 static HRESULT WINAPI HTMLWindow3_GetIDsOfNames(IHTMLWindow3 *iface, REFIID riid, 01413 LPOLESTR *rgszNames, UINT cNames, 01414 LCID lcid, DISPID *rgDispId) 01415 { 01416 HTMLWindow *This = HTMLWINDOW3_THIS(iface); 01417 01418 return IDispatchEx_GetIDsOfNames(DISPATCHEX(This), riid, rgszNames, cNames, lcid, rgDispId); 01419 } 01420 01421 static HRESULT WINAPI HTMLWindow3_Invoke(IHTMLWindow3 *iface, DISPID dispIdMember, 01422 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, 01423 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) 01424 { 01425 HTMLWindow *This = HTMLWINDOW3_THIS(iface); 01426 01427 return IDispatchEx_Invoke(DISPATCHEX(This), dispIdMember, riid, lcid, wFlags, pDispParams, 01428 pVarResult, pExcepInfo, puArgErr); 01429 } 01430 01431 static HRESULT WINAPI HTMLWindow3_get_screenLeft(IHTMLWindow3 *iface, LONG *p) 01432 { 01433 HTMLWindow *This = HTMLWINDOW3_THIS(iface); 01434 FIXME("(%p)->(%p)\n", This, p); 01435 return E_NOTIMPL; 01436 } 01437 01438 static HRESULT WINAPI HTMLWindow3_get_screenTop(IHTMLWindow3 *iface, LONG *p) 01439 { 01440 HTMLWindow *This = HTMLWINDOW3_THIS(iface); 01441 FIXME("(%p)->(%p)\n", This, p); 01442 return E_NOTIMPL; 01443 } 01444 01445 static HRESULT WINAPI HTMLWindow3_attachEvent(IHTMLWindow3 *iface, BSTR event, IDispatch *pDisp, VARIANT_BOOL *pfResult) 01446 { 01447 HTMLWindow *This = HTMLWINDOW3_THIS(iface); 01448 01449 TRACE("(%p)->(%s %p %p)\n", This, debugstr_w(event), pDisp, pfResult); 01450 01451 if(!This->doc) { 01452 FIXME("No document\n"); 01453 return E_FAIL; 01454 } 01455 01456 return attach_event(&This->doc->body_event_target, NULL, &This->doc->basedoc, event, pDisp, pfResult); 01457 } 01458 01459 static HRESULT WINAPI HTMLWindow3_detachEvent(IHTMLWindow3 *iface, BSTR event, IDispatch *pDisp) 01460 { 01461 HTMLWindow *This = HTMLWINDOW3_THIS(iface); 01462 FIXME("(%p)->()\n", This); 01463 return E_NOTIMPL; 01464 } 01465 01466 static HRESULT window_set_timer(HTMLWindow *This, VARIANT *expr, LONG msec, VARIANT *language, 01467 BOOL interval, LONG *timer_id) 01468 { 01469 IDispatch *disp = NULL; 01470 01471 switch(V_VT(expr)) { 01472 case VT_DISPATCH: 01473 disp = V_DISPATCH(expr); 01474 IDispatch_AddRef(disp); 01475 break; 01476 01477 case VT_BSTR: 01478 disp = script_parse_event(This, V_BSTR(expr)); 01479 break; 01480 01481 default: 01482 FIXME("unimplemented vt=%d\n", V_VT(expr)); 01483 return E_NOTIMPL; 01484 } 01485 01486 if(!disp) 01487 return E_FAIL; 01488 01489 *timer_id = set_task_timer(&This->doc->basedoc, msec, interval, disp); 01490 IDispatch_Release(disp); 01491 01492 return S_OK; 01493 } 01494 01495 static HRESULT WINAPI HTMLWindow3_setTimeout(IHTMLWindow3 *iface, VARIANT *expression, LONG msec, 01496 VARIANT *language, LONG *timerID) 01497 { 01498 HTMLWindow *This = HTMLWINDOW3_THIS(iface); 01499 01500 TRACE("(%p)->(%p(%d) %d %p %p)\n", This, expression, V_VT(expression), msec, language, timerID); 01501 01502 return window_set_timer(This, expression, msec, language, FALSE, timerID); 01503 } 01504 01505 static HRESULT WINAPI HTMLWindow3_setInterval(IHTMLWindow3 *iface, VARIANT *expression, LONG msec, 01506 VARIANT *language, LONG *timerID) 01507 { 01508 HTMLWindow *This = HTMLWINDOW3_THIS(iface); 01509 01510 TRACE("(%p)->(%p %d %p %p)\n", This, expression, msec, language, timerID); 01511 01512 return window_set_timer(This, expression, msec, language, TRUE, timerID); 01513 } 01514 01515 static HRESULT WINAPI HTMLWindow3_print(IHTMLWindow3 *iface) 01516 { 01517 HTMLWindow *This = HTMLWINDOW3_THIS(iface); 01518 FIXME("(%p)\n", This); 01519 return E_NOTIMPL; 01520 } 01521 01522 static HRESULT WINAPI HTMLWindow3_put_onbeforeprint(IHTMLWindow3 *iface, VARIANT v) 01523 { 01524 HTMLWindow *This = HTMLWINDOW3_THIS(iface); 01525 FIXME("(%p)->()\n", This); 01526 return E_NOTIMPL; 01527 } 01528 01529 static HRESULT WINAPI HTMLWindow3_get_onbeforeprint(IHTMLWindow3 *iface, VARIANT *p) 01530 { 01531 HTMLWindow *This = HTMLWINDOW3_THIS(iface); 01532 FIXME("(%p)->(%p)\n", This, p); 01533 return E_NOTIMPL; 01534 } 01535 01536 static HRESULT WINAPI HTMLWindow3_put_onafterprint(IHTMLWindow3 *iface, VARIANT v) 01537 { 01538 HTMLWindow *This = HTMLWINDOW3_THIS(iface); 01539 FIXME("(%p)->()\n", This); 01540 return E_NOTIMPL; 01541 } 01542 01543 static HRESULT WINAPI HTMLWindow3_get_onafterprint(IHTMLWindow3 *iface, VARIANT *p) 01544 { 01545 HTMLWindow *This = HTMLWINDOW3_THIS(iface); 01546 FIXME("(%p)->(%p)\n", This, p); 01547 return E_NOTIMPL; 01548 } 01549 01550 static HRESULT WINAPI HTMLWindow3_get_clipboardData(IHTMLWindow3 *iface, IHTMLDataTransfer **p) 01551 { 01552 HTMLWindow *This = HTMLWINDOW3_THIS(iface); 01553 FIXME("(%p)->(%p)\n", This, p); 01554 return E_NOTIMPL; 01555 } 01556 01557 static HRESULT WINAPI HTMLWindow3_showModelessDialog(IHTMLWindow3 *iface, BSTR url, 01558 VARIANT *varArgIn, VARIANT *options, IHTMLWindow2 **pDialog) 01559 { 01560 HTMLWindow *This = HTMLWINDOW3_THIS(iface); 01561 FIXME("(%p)->(%s %p %p %p)\n", This, debugstr_w(url), varArgIn, options, pDialog); 01562 return E_NOTIMPL; 01563 } 01564 01565 #undef HTMLWINDOW3_THIS 01566 01567 static const IHTMLWindow3Vtbl HTMLWindow3Vtbl = { 01568 HTMLWindow3_QueryInterface, 01569 HTMLWindow3_AddRef, 01570 HTMLWindow3_Release, 01571 HTMLWindow3_GetTypeInfoCount, 01572 HTMLWindow3_GetTypeInfo, 01573 HTMLWindow3_GetIDsOfNames, 01574 HTMLWindow3_Invoke, 01575 HTMLWindow3_get_screenLeft, 01576 HTMLWindow3_get_screenTop, 01577 HTMLWindow3_attachEvent, 01578 HTMLWindow3_detachEvent, 01579 HTMLWindow3_setTimeout, 01580 HTMLWindow3_setInterval, 01581 HTMLWindow3_print, 01582 HTMLWindow3_put_onbeforeprint, 01583 HTMLWindow3_get_onbeforeprint, 01584 HTMLWindow3_put_onafterprint, 01585 HTMLWindow3_get_onafterprint, 01586 HTMLWindow3_get_clipboardData, 01587 HTMLWindow3_showModelessDialog 01588 }; 01589 01590 #define HTMLWINDOW4_THIS(iface) DEFINE_THIS(HTMLWindow, HTMLWindow4, iface) 01591 01592 static HRESULT WINAPI HTMLWindow4_QueryInterface(IHTMLWindow4 *iface, REFIID riid, void **ppv) 01593 { 01594 HTMLWindow *This = HTMLWINDOW4_THIS(iface); 01595 01596 return IHTMLWindow2_QueryInterface(HTMLWINDOW2(This), riid, ppv); 01597 } 01598 01599 static ULONG WINAPI HTMLWindow4_AddRef(IHTMLWindow4 *iface) 01600 { 01601 HTMLWindow *This = HTMLWINDOW4_THIS(iface); 01602 01603 return IHTMLWindow2_AddRef(HTMLWINDOW2(This)); 01604 } 01605 01606 static ULONG WINAPI HTMLWindow4_Release(IHTMLWindow4 *iface) 01607 { 01608 HTMLWindow *This = HTMLWINDOW4_THIS(iface); 01609 01610 return IHTMLWindow2_Release(HTMLWINDOW2(This)); 01611 } 01612 01613 static HRESULT WINAPI HTMLWindow4_GetTypeInfoCount(IHTMLWindow4 *iface, UINT *pctinfo) 01614 { 01615 HTMLWindow *This = HTMLWINDOW4_THIS(iface); 01616 01617 return IDispatchEx_GetTypeInfoCount(DISPATCHEX(This), pctinfo); 01618 } 01619 01620 static HRESULT WINAPI HTMLWindow4_GetTypeInfo(IHTMLWindow4 *iface, UINT iTInfo, 01621 LCID lcid, ITypeInfo **ppTInfo) 01622 { 01623 HTMLWindow *This = HTMLWINDOW4_THIS(iface); 01624 01625 return IDispatchEx_GetTypeInfo(DISPATCHEX(This), iTInfo, lcid, ppTInfo); 01626 } 01627 01628 static HRESULT WINAPI HTMLWindow4_GetIDsOfNames(IHTMLWindow4 *iface, REFIID riid, 01629 LPOLESTR *rgszNames, UINT cNames, 01630 LCID lcid, DISPID *rgDispId) 01631 { 01632 HTMLWindow *This = HTMLWINDOW4_THIS(iface); 01633 01634 return IDispatchEx_GetIDsOfNames(DISPATCHEX(This), riid, rgszNames, cNames, lcid, rgDispId); 01635 } 01636 01637 static HRESULT WINAPI HTMLWindow4_Invoke(IHTMLWindow4 *iface, DISPID dispIdMember, 01638 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, 01639 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) 01640 { 01641 HTMLWindow *This = HTMLWINDOW4_THIS(iface); 01642 01643 return IDispatchEx_Invoke(DISPATCHEX(This), dispIdMember, riid, lcid, wFlags, pDispParams, 01644 pVarResult, pExcepInfo, puArgErr); 01645 } 01646 01647 static HRESULT WINAPI HTMLWindow4_createPopup(IHTMLWindow4 *iface, VARIANT *varArgIn, 01648 IDispatch **ppPopup) 01649 { 01650 HTMLWindow *This = HTMLWINDOW4_THIS(iface); 01651 FIXME("(%p)->(%p %p)\n", This, varArgIn, ppPopup); 01652 return E_NOTIMPL; 01653 } 01654 01655 static HRESULT WINAPI HTMLWindow4_get_frameElement(IHTMLWindow4 *iface, IHTMLFrameBase **p) 01656 { 01657 HTMLWindow *This = HTMLWINDOW4_THIS(iface); 01658 TRACE("(%p)->(%p)\n", This, p); 01659 01660 if(This->frame_element) { 01661 *p = HTMLFRAMEBASE(This->frame_element); 01662 IHTMLFrameBase_AddRef(*p); 01663 }else 01664 *p = NULL; 01665 01666 return S_OK; 01667 } 01668 01669 #undef HTMLWINDOW4_THIS 01670 01671 static const IHTMLWindow4Vtbl HTMLWindow4Vtbl = { 01672 HTMLWindow4_QueryInterface, 01673 HTMLWindow4_AddRef, 01674 HTMLWindow4_Release, 01675 HTMLWindow4_GetTypeInfoCount, 01676 HTMLWindow4_GetTypeInfo, 01677 HTMLWindow4_GetIDsOfNames, 01678 HTMLWindow4_Invoke, 01679 HTMLWindow4_createPopup, 01680 HTMLWindow4_get_frameElement 01681 }; 01682 01683 #define HTMLPRIVWINDOW_THIS(iface) DEFINE_THIS(HTMLWindow, IHTMLPrivateWindow, iface) 01684 01685 static HRESULT WINAPI HTMLPrivateWindow_QueryInterface(IHTMLPrivateWindow *iface, REFIID riid, void **ppv) 01686 { 01687 HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface); 01688 01689 return IHTMLWindow2_QueryInterface(HTMLWINDOW2(This), riid, ppv); 01690 } 01691 01692 static ULONG WINAPI HTMLPrivateWindow_AddRef(IHTMLPrivateWindow *iface) 01693 { 01694 HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface); 01695 01696 return IHTMLWindow2_AddRef(HTMLWINDOW2(This)); 01697 } 01698 01699 static ULONG WINAPI HTMLPrivateWindow_Release(IHTMLPrivateWindow *iface) 01700 { 01701 HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface); 01702 01703 return IHTMLWindow2_Release(HTMLWINDOW2(This)); 01704 } 01705 01706 static HRESULT WINAPI HTMLPrivateWindow_SuperNavigate(IHTMLPrivateWindow *iface, BSTR url, BSTR arg2, BSTR arg3, 01707 BSTR arg4, VARIANT *post_data_var, VARIANT *headers_var, ULONG flags) 01708 { 01709 HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface); 01710 DWORD post_data_size = 0; 01711 BYTE *post_data = NULL; 01712 WCHAR *headers = NULL; 01713 nsChannelBSC *bsc; 01714 IMoniker *mon; 01715 BSTR new_url; 01716 HRESULT hres; 01717 01718 TRACE("(%p)->(%s %s %s %s %s %s %x)\n", This, debugstr_w(url), debugstr_w(arg2), debugstr_w(arg3), debugstr_w(arg4), 01719 debugstr_variant(post_data_var), debugstr_variant(headers_var), flags); 01720 01721 new_url = url; 01722 if(This->doc_obj->hostui) { 01723 OLECHAR *translated_url = NULL; 01724 01725 hres = IDocHostUIHandler_TranslateUrl(This->doc_obj->hostui, 0, url, &translated_url); 01726 if(hres == S_OK && translated_url) { 01727 new_url = SysAllocString(translated_url); 01728 CoTaskMemFree(translated_url); 01729 } 01730 } 01731 01732 if(This->doc_obj->client) { 01733 IOleCommandTarget *cmdtrg; 01734 01735 hres = IOleClientSite_QueryInterface(This->doc_obj->client, &IID_IOleCommandTarget, (void**)&cmdtrg); 01736 if(SUCCEEDED(hres)) { 01737 VARIANT in, out; 01738 01739 V_VT(&in) = VT_BSTR; 01740 V_BSTR(&in) = new_url; 01741 V_VT(&out) = VT_BOOL; 01742 V_BOOL(&out) = VARIANT_TRUE; 01743 hres = IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 67, 0, &in, &out); 01744 IOleCommandTarget_Release(cmdtrg); 01745 if(SUCCEEDED(hres)) 01746 VariantClear(&out); 01747 } 01748 } 01749 01750 /* FIXME: Why not set_ready_state? */ 01751 This->readystate = READYSTATE_UNINITIALIZED; 01752 01753 hres = CreateURLMoniker(NULL, new_url, &mon); 01754 if(new_url != url) 01755 SysFreeString(new_url); 01756 if(FAILED(hres)) 01757 return hres; 01758 01759 if(post_data_var) { 01760 if(V_VT(post_data_var) == (VT_ARRAY|VT_UI1)) { 01761 SafeArrayAccessData(V_ARRAY(post_data_var), (void**)&post_data); 01762 post_data_size = V_ARRAY(post_data_var)->rgsabound[0].cElements; 01763 } 01764 } 01765 01766 if(headers_var && V_VT(headers_var) != VT_EMPTY && V_VT(headers_var) != VT_ERROR) { 01767 if(V_VT(headers_var) != VT_BSTR) 01768 return E_INVALIDARG; 01769 01770 headers = V_BSTR(headers_var); 01771 } 01772 01773 hres = create_channelbsc(mon, headers, post_data, post_data_size, &bsc); 01774 if(post_data) 01775 SafeArrayUnaccessData(V_ARRAY(post_data_var)); 01776 if(FAILED(hres)) { 01777 IMoniker_Release(mon); 01778 return hres; 01779 } 01780 01781 hres = set_moniker(&This->doc_obj->basedoc, mon, NULL, bsc, TRUE); 01782 if(SUCCEEDED(hres)) 01783 hres = async_start_doc_binding(This, bsc); 01784 01785 IUnknown_Release((IUnknown*)bsc); 01786 IMoniker_Release(mon); 01787 return hres; 01788 } 01789 01790 static HRESULT WINAPI HTMLPrivateWindow_GetPendingUrl(IHTMLPrivateWindow *iface, BSTR *url) 01791 { 01792 HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface); 01793 FIXME("(%p)->(%p)\n", This, url); 01794 return E_NOTIMPL; 01795 } 01796 01797 static HRESULT WINAPI HTMLPrivateWindow_SetPICSTarget(IHTMLPrivateWindow *iface, IOleCommandTarget *cmdtrg) 01798 { 01799 HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface); 01800 FIXME("(%p)->(%p)\n", This, cmdtrg); 01801 return E_NOTIMPL; 01802 } 01803 01804 static HRESULT WINAPI HTMLPrivateWindow_PICSComplete(IHTMLPrivateWindow *iface, int arg) 01805 { 01806 HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface); 01807 FIXME("(%p)->(%x)\n", This, arg); 01808 return E_NOTIMPL; 01809 } 01810 01811 static HRESULT WINAPI HTMLPrivateWindow_FindWindowByName(IHTMLPrivateWindow *iface, LPCWSTR name, IHTMLWindow2 **ret) 01812 { 01813 HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface); 01814 FIXME("(%p)->(%s %p)\n", This, debugstr_w(name), ret); 01815 return E_NOTIMPL; 01816 } 01817 01818 static HRESULT WINAPI HTMLPrivateWindow_GetAddressBar(IHTMLPrivateWindow *iface, BSTR *url) 01819 { 01820 HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface); 01821 FIXME("(%p)->(%p)\n", This, url); 01822 return E_NOTIMPL; 01823 } 01824 01825 #undef HTMLPRIVWINDOW_THIS 01826 01827 static const IHTMLPrivateWindowVtbl HTMLPrivateWindowVtbl = { 01828 HTMLPrivateWindow_QueryInterface, 01829 HTMLPrivateWindow_AddRef, 01830 HTMLPrivateWindow_Release, 01831 HTMLPrivateWindow_SuperNavigate, 01832 HTMLPrivateWindow_GetPendingUrl, 01833 HTMLPrivateWindow_SetPICSTarget, 01834 HTMLPrivateWindow_PICSComplete, 01835 HTMLPrivateWindow_FindWindowByName, 01836 HTMLPrivateWindow_GetAddressBar 01837 }; 01838 01839 #define DISPEX_THIS(iface) DEFINE_THIS(HTMLWindow, IDispatchEx, iface) 01840 01841 static HRESULT WINAPI WindowDispEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv) 01842 { 01843 HTMLWindow *This = DISPEX_THIS(iface); 01844 01845 return IHTMLWindow2_QueryInterface(HTMLWINDOW2(This), riid, ppv); 01846 } 01847 01848 static ULONG WINAPI WindowDispEx_AddRef(IDispatchEx *iface) 01849 { 01850 HTMLWindow *This = DISPEX_THIS(iface); 01851 01852 return IHTMLWindow2_AddRef(HTMLWINDOW2(This)); 01853 } 01854 01855 static ULONG WINAPI WindowDispEx_Release(IDispatchEx *iface) 01856 { 01857 HTMLWindow *This = DISPEX_THIS(iface); 01858 01859 return IHTMLWindow2_Release(HTMLWINDOW2(This)); 01860 } 01861 01862 static HRESULT WINAPI WindowDispEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo) 01863 { 01864 HTMLWindow *This = DISPEX_THIS(iface); 01865 01866 TRACE("(%p)->(%p)\n", This, pctinfo); 01867 01868 return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->dispex), pctinfo); 01869 } 01870 01871 static HRESULT WINAPI WindowDispEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo, 01872 LCID lcid, ITypeInfo **ppTInfo) 01873 { 01874 HTMLWindow *This = DISPEX_THIS(iface); 01875 01876 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo); 01877 01878 return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->dispex), iTInfo, lcid, ppTInfo); 01879 } 01880 01881 static HRESULT WINAPI WindowDispEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid, 01882 LPOLESTR *rgszNames, UINT cNames, 01883 LCID lcid, DISPID *rgDispId) 01884 { 01885 HTMLWindow *This = DISPEX_THIS(iface); 01886 UINT i; 01887 HRESULT hres; 01888 01889 WARN("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, 01890 lcid, rgDispId); 01891 01892 for(i=0; i < cNames; i++) { 01893 /* We shouldn't use script's IDispatchEx here, so we shouldn't use GetDispID */ 01894 hres = IDispatchEx_GetDispID(DISPATCHEX(This), rgszNames[i], 0, rgDispId+i); 01895 if(FAILED(hres)) 01896 return hres; 01897 } 01898 01899 return S_OK; 01900 } 01901 01902 static HRESULT WINAPI WindowDispEx_Invoke(IDispatchEx *iface, DISPID dispIdMember, 01903 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, 01904 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) 01905 { 01906 HTMLWindow *This = DISPEX_THIS(iface); 01907 01908 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid), 01909 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); 01910 01911 /* FIXME: Use script dispatch */ 01912 01913 return IDispatchEx_Invoke(DISPATCHEX(&This->dispex), dispIdMember, riid, lcid, wFlags, pDispParams, 01914 pVarResult, pExcepInfo, puArgErr); 01915 } 01916 01917 static global_prop_t *alloc_global_prop(HTMLWindow *This, global_prop_type_t type, BSTR name) 01918 { 01919 if(This->global_prop_cnt == This->global_prop_size) { 01920 global_prop_t *new_props; 01921 DWORD new_size; 01922 01923 if(This->global_props) { 01924 new_size = This->global_prop_size*2; 01925 new_props = heap_realloc(This->global_props, new_size*sizeof(global_prop_t)); 01926 }else { 01927 new_size = 16; 01928 new_props = heap_alloc(new_size*sizeof(global_prop_t)); 01929 } 01930 if(!new_props) 01931 return NULL; 01932 This->global_props = new_props; 01933 This->global_prop_size = new_size; 01934 } 01935 01936 This->global_props[This->global_prop_cnt].name = heap_strdupW(name); 01937 if(!This->global_props[This->global_prop_cnt].name) 01938 return NULL; 01939 01940 This->global_props[This->global_prop_cnt].type = type; 01941 return This->global_props + This->global_prop_cnt++; 01942 } 01943 01944 static inline DWORD prop_to_dispid(HTMLWindow *This, global_prop_t *prop) 01945 { 01946 return MSHTML_DISPID_CUSTOM_MIN + (prop-This->global_props); 01947 } 01948 01949 HRESULT search_window_props(HTMLWindow *This, BSTR bstrName, DWORD grfdex, DISPID *pid) 01950 { 01951 DWORD i; 01952 ScriptHost *script_host; 01953 DISPID id; 01954 01955 for(i=0; i < This->global_prop_cnt; i++) { 01956 /* FIXME: case sensitivity */ 01957 if(!strcmpW(This->global_props[i].name, bstrName)) { 01958 *pid = MSHTML_DISPID_CUSTOM_MIN+i; 01959 return S_OK; 01960 } 01961 } 01962 01963 if(find_global_prop(This, bstrName, grfdex, &script_host, &id)) { 01964 global_prop_t *prop; 01965 01966 prop = alloc_global_prop(This, GLOBAL_SCRIPTVAR, bstrName); 01967 if(!prop) 01968 return E_OUTOFMEMORY; 01969 01970 prop->script_host = script_host; 01971 prop->id = id; 01972 01973 *pid = prop_to_dispid(This, prop); 01974 return S_OK; 01975 } 01976 01977 return DISP_E_UNKNOWNNAME; 01978 } 01979 01980 static HRESULT WINAPI WindowDispEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) 01981 { 01982 HTMLWindow *This = DISPEX_THIS(iface); 01983 HRESULT hres; 01984 01985 TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid); 01986 01987 hres = search_window_props(This, bstrName, grfdex, pid); 01988 if(hres != DISP_E_UNKNOWNNAME) 01989 return hres; 01990 01991 hres = IDispatchEx_GetDispID(DISPATCHEX(&This->dispex), bstrName, grfdex, pid); 01992 if(hres != DISP_E_UNKNOWNNAME) 01993 return hres; 01994 01995 if(This->doc) { 01996 global_prop_t *prop; 01997 IHTMLElement *elem; 01998 01999 hres = IHTMLDocument3_getElementById(HTMLDOC3(&This->doc->basedoc), bstrName, &elem); 02000 if(SUCCEEDED(hres) && elem) { 02001 IHTMLElement_Release(elem); 02002 02003 prop = alloc_global_prop(This, GLOBAL_ELEMENTVAR, bstrName); 02004 if(!prop) 02005 return E_OUTOFMEMORY; 02006 02007 *pid = prop_to_dispid(This, prop); 02008 return S_OK; 02009 } 02010 } 02011 02012 return DISP_E_UNKNOWNNAME; 02013 } 02014 02015 static HRESULT WINAPI WindowDispEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, 02016 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) 02017 { 02018 HTMLWindow *This = DISPEX_THIS(iface); 02019 02020 TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); 02021 02022 if(id == DISPID_IHTMLWINDOW2_LOCATION && (wFlags & DISPATCH_PROPERTYPUT)) { 02023 HTMLLocation *location; 02024 HRESULT hres; 02025 02026 TRACE("forwarding to location.href\n"); 02027 02028 hres = get_location(This, &location); 02029 if(FAILED(hres)) 02030 return hres; 02031 02032 hres = IDispatchEx_InvokeEx(DISPATCHEX(&location->dispex), DISPID_VALUE, lcid, wFlags, pdp, pvarRes, pei, pspCaller); 02033 IHTMLLocation_Release(HTMLLOCATION(location)); 02034 return hres; 02035 } 02036 02037 return IDispatchEx_InvokeEx(DISPATCHEX(&This->dispex), id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); 02038 } 02039 02040 static HRESULT WINAPI WindowDispEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex) 02041 { 02042 HTMLWindow *This = DISPEX_THIS(iface); 02043 02044 TRACE("(%p)->(%s %x)\n", This, debugstr_w(bstrName), grfdex); 02045 02046 return IDispatchEx_DeleteMemberByName(DISPATCHEX(&This->dispex), bstrName, grfdex); 02047 } 02048 02049 static HRESULT WINAPI WindowDispEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id) 02050 { 02051 HTMLWindow *This = DISPEX_THIS(iface); 02052 02053 TRACE("(%p)->(%x)\n", This, id); 02054 02055 return IDispatchEx_DeleteMemberByDispID(DISPATCHEX(&This->dispex), id); 02056 } 02057 02058 static HRESULT WINAPI WindowDispEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex) 02059 { 02060 HTMLWindow *This = DISPEX_THIS(iface); 02061 02062 TRACE("(%p)->(%x %x %p)\n", This, id, grfdexFetch, pgrfdex); 02063 02064 return IDispatchEx_GetMemberProperties(DISPATCHEX(&This->dispex), id, grfdexFetch, pgrfdex); 02065 } 02066 02067 static HRESULT WINAPI WindowDispEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName) 02068 { 02069 HTMLWindow *This = DISPEX_THIS(iface); 02070 02071 TRACE("(%p)->(%x %p)\n", This, id, pbstrName); 02072 02073 return IDispatchEx_GetMemberName(DISPATCHEX(&This->dispex), id, pbstrName); 02074 } 02075 02076 static HRESULT WINAPI WindowDispEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid) 02077 { 02078 HTMLWindow *This = DISPEX_THIS(iface); 02079 02080 TRACE("(%p)->(%x %x %p)\n", This, grfdex, id, pid); 02081 02082 return IDispatchEx_GetNextDispID(DISPATCHEX(&This->dispex), grfdex, id, pid); 02083 } 02084 02085 static HRESULT WINAPI WindowDispEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk) 02086 { 02087 HTMLWindow *This = DISPEX_THIS(iface); 02088 02089 TRACE("(%p)->(%p)\n", This, ppunk); 02090 02091 *ppunk = NULL; 02092 return S_OK; 02093 } 02094 02095 #undef DISPEX_THIS 02096 02097 static const IDispatchExVtbl WindowDispExVtbl = { 02098 WindowDispEx_QueryInterface, 02099 WindowDispEx_AddRef, 02100 WindowDispEx_Release, 02101 WindowDispEx_GetTypeInfoCount, 02102 WindowDispEx_GetTypeInfo, 02103 WindowDispEx_GetIDsOfNames, 02104 WindowDispEx_Invoke, 02105 WindowDispEx_GetDispID, 02106 WindowDispEx_InvokeEx, 02107 WindowDispEx_DeleteMemberByName, 02108 WindowDispEx_DeleteMemberByDispID, 02109 WindowDispEx_GetMemberProperties, 02110 WindowDispEx_GetMemberName, 02111 WindowDispEx_GetNextDispID, 02112 WindowDispEx_GetNameSpaceParent 02113 }; 02114 02115 static const tid_t HTMLWindow_iface_tids[] = { 02116 IHTMLWindow2_tid, 02117 IHTMLWindow3_tid, 02118 IHTMLWindow4_tid, 02119 0 02120 }; 02121 02122 static const dispex_static_data_vtbl_t HTMLWindow_dispex_vtbl = { 02123 NULL, 02124 NULL, 02125 HTMLWindow_invoke 02126 }; 02127 02128 static dispex_static_data_t HTMLWindow_dispex = { 02129 &HTMLWindow_dispex_vtbl, 02130 DispHTMLWindow2_tid, 02131 NULL, 02132 HTMLWindow_iface_tids 02133 }; 02134 02135 HRESULT HTMLWindow_Create(HTMLDocumentObj *doc_obj, nsIDOMWindow *nswindow, HTMLWindow *parent, HTMLWindow **ret) 02136 { 02137 HTMLWindow *window; 02138 02139 window = heap_alloc_zero(sizeof(HTMLWindow)); 02140 if(!window) 02141 return E_OUTOFMEMORY; 02142 02143 window->window_ref = heap_alloc(sizeof(windowref_t)); 02144 if(!window->window_ref) { 02145 heap_free(window); 02146 return E_OUTOFMEMORY; 02147 } 02148 02149 window->lpHTMLWindow2Vtbl = &HTMLWindow2Vtbl; 02150 window->lpHTMLWindow3Vtbl = &HTMLWindow3Vtbl; 02151 window->lpHTMLWindow4Vtbl = &HTMLWindow4Vtbl; 02152 window->lpIHTMLPrivateWindowVtbl = &HTMLPrivateWindowVtbl; 02153 window->lpIDispatchExVtbl = &WindowDispExVtbl; 02154 window->ref = 1; 02155 window->doc_obj = doc_obj; 02156 02157 window->window_ref->window = window; 02158 window->window_ref->ref = 1; 02159 02160 init_dispex(&window->dispex, (IUnknown*)HTMLWINDOW2(window), &HTMLWindow_dispex); 02161 02162 if(nswindow) { 02163 nsIDOMWindow_AddRef(nswindow); 02164 window->nswindow = nswindow; 02165 } 02166 02167 window->scriptmode = parent ? parent->scriptmode : SCRIPTMODE_GECKO; 02168 window->readystate = READYSTATE_UNINITIALIZED; 02169 list_init(&window->script_hosts); 02170 02171 window->task_magic = get_task_target_magic(); 02172 update_window_doc(window); 02173 02174 list_init(&window->children); 02175 list_add_head(&window_list, &window->entry); 02176 02177 if(parent) { 02178 IHTMLWindow2_AddRef(HTMLWINDOW2(window)); 02179 02180 window->parent = parent; 02181 list_add_tail(&parent->children, &window->sibling_entry); 02182 } 02183 02184 *ret = window; 02185 return S_OK; 02186 } 02187 02188 void update_window_doc(HTMLWindow *window) 02189 { 02190 nsIDOMHTMLDocument *nshtmldoc; 02191 nsIDOMDocument *nsdoc; 02192 nsresult nsres; 02193 02194 nsres = nsIDOMWindow_GetDocument(window->nswindow, &nsdoc); 02195 if(NS_FAILED(nsres) || !nsdoc) { 02196 ERR("GetDocument failed: %08x\n", nsres); 02197 return; 02198 } 02199 02200 nsres = nsIDOMDocument_QueryInterface(nsdoc, &IID_nsIDOMHTMLDocument, (void**)&nshtmldoc); 02201 nsIDOMDocument_Release(nsdoc); 02202 if(NS_FAILED(nsres)) { 02203 ERR("Could not get nsIDOMHTMLDocument iface: %08x\n", nsres); 02204 return; 02205 } 02206 02207 if(!window->doc || window->doc->nsdoc != nshtmldoc) { 02208 HTMLDocumentNode *doc; 02209 HRESULT hres; 02210 02211 hres = create_doc_from_nsdoc(nshtmldoc, window->doc_obj, window, &doc); 02212 if(SUCCEEDED(hres)) { 02213 window_set_docnode(window, doc); 02214 htmldoc_release(&doc->basedoc); 02215 }else { 02216 ERR("create_doc_from_nsdoc failed: %08x\n", hres); 02217 } 02218 } 02219 02220 nsIDOMHTMLDocument_Release(nshtmldoc); 02221 } 02222 02223 HTMLWindow *nswindow_to_window(const nsIDOMWindow *nswindow) 02224 { 02225 HTMLWindow *iter; 02226 02227 LIST_FOR_EACH_ENTRY(iter, &window_list, HTMLWindow, entry) { 02228 if(iter->nswindow == nswindow) 02229 return iter; 02230 } 02231 02232 return NULL; 02233 } Generated on Sun May 27 2012 04:25:01 for ReactOS by
1.7.6.1
|