ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

htmlwindow.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.