static HRESULT navigate_bsc(DocHost *This, BindStatusCallback *bsc, IMoniker *mon) { IBindCtx *bindctx; VARIANT_BOOL cancel = VARIANT_FALSE; HRESULT hres; on_before_navigate2(This, bsc->url, bsc->post_data, bsc->post_data_len, bsc->headers, &cancel); if(cancel) { FIXME("Navigation canceled\n"); return S_OK; } if(This->document) deactivate_document(This); CreateAsyncBindCtx(0, BINDSC(bsc), 0, &bindctx); if(This->frame) IOleInPlaceFrame_EnableModeless(This->frame, FALSE); hres = bind_to_object(This, mon, bsc->url, bindctx, BINDSC(bsc)); if(This->frame) IOleInPlaceFrame_EnableModeless(This->frame, TRUE); IBindCtx_Release(bindctx); return hres; }
static ULONG WINAPI InternetExplorer_Release(IWebBrowser2 *iface) { InternetExplorer *This = impl_from_IWebBrowser2(iface); LONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); if(!ref) { if(This->doc_host) { deactivate_document(&This->doc_host->doc_host); DocHost_Release(&This->doc_host->doc_host); if(This->doc_host) { This->doc_host->ie = NULL; This->doc_host->doc_host.container_vtbl->release(&This->doc_host->doc_host); } } if(This->frame_hwnd) DestroyWindow(This->frame_hwnd); list_remove(&This->entry); heap_free(This); released_obj(); } return ref; }
static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, LPOLECLIENTSITE pClientSite) { WebBrowser *This = impl_from_IOleObject(iface); IDocHostUIHandler *hostui; IOleContainer *container; IDispatch *disp; HRESULT hres; TRACE("(%p)->(%p)\n", This, pClientSite); if(This->client == pClientSite) return S_OK; release_client_site(This); if(!pClientSite) { if(This->doc_host.document) deactivate_document(&This->doc_host); return S_OK; } IOleClientSite_AddRef(pClientSite); This->client = pClientSite; hres = IOleClientSite_QueryInterface(This->client, &IID_IDispatch, (void**)&disp); if(SUCCEEDED(hres)) This->doc_host.client_disp = disp; hres = IOleClientSite_QueryInterface(This->client, &IID_IDocHostUIHandler, (void**)&hostui); if(SUCCEEDED(hres)) This->doc_host.hostui = hostui; hres = IOleClientSite_GetContainer(This->client, &container); if(SUCCEEDED(hres)) { ITargetContainer *target_container; hres = IOleContainer_QueryInterface(container, &IID_ITargetContainer, (void**)&target_container); if(SUCCEEDED(hres)) { FIXME("Unsupported ITargetContainer\n"); ITargetContainer_Release(target_container); } IOleContainer_Release(container); } create_shell_embedding_hwnd(This); on_offlineconnected_change(This); on_silent_change(This); return S_OK; }
/* * Document may keep references to InternetExplorer object causing circular references. * We keep track of external references and release the document object when all * external references are released. A visible main window is also considered as * an external reference. */ DWORD release_extern_ref(InternetExplorer *This, BOOL last_closes) { LONG ref = InterlockedDecrement(&This->extern_ref); TRACE("ref = %d\n", ref); if(ref) return ref; if(!last_closes) { WARN("Last external connection released with FALSE last_closes.\n"); return ref; } deactivate_document(&This->doc_host); return ref; }
static HRESULT navigate_bsc(DocHost *This, BindStatusCallback *bsc, IMoniker *mon) { VARIANT_BOOL cancel = VARIANT_FALSE; SAFEARRAY *post_data = NULL; IBindCtx *bindctx; HRESULT hres; set_doc_state(This, READYSTATE_LOADING); if(bsc->post_data) { post_data = SafeArrayCreateVector(VT_UI1, 0, bsc->post_data_len); memcpy(post_data->pvData, post_data, bsc->post_data_len); } on_before_navigate2(This, bsc->url, post_data, bsc->headers, &cancel); if(post_data) SafeArrayDestroy(post_data); if(cancel) { FIXME("Navigation canceled\n"); return S_OK; } notify_download_state(This, TRUE); on_commandstate_change(This, CSC_NAVIGATEBACK, VARIANT_FALSE); on_commandstate_change(This, CSC_NAVIGATEFORWARD, VARIANT_FALSE); if(This->document) deactivate_document(This); CreateAsyncBindCtx(0, &bsc->IBindStatusCallback_iface, 0, &bindctx); if(This->frame) IOleInPlaceFrame_EnableModeless(This->frame, FALSE); hres = bind_to_object(This, mon, bsc->url, bindctx, &bsc->IBindStatusCallback_iface); if(This->frame) IOleInPlaceFrame_EnableModeless(This->frame, TRUE); IBindCtx_Release(bindctx); return hres; }
static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, LPOLECLIENTSITE pClientSite) { WebBrowser *This = OLEOBJ_THIS(iface); IOleContainer *container; HRESULT hres; TRACE("(%p)->(%p)\n", This, pClientSite); if(This->client == pClientSite) return S_OK; if(This->doc_host.hwnd) { DestroyWindow(This->doc_host.hwnd); This->doc_host.hwnd = NULL; } if(This->shell_embedding_hwnd) { DestroyWindow(This->shell_embedding_hwnd); This->shell_embedding_hwnd = NULL; } if(This->inplace) { IOleInPlaceSite_Release(This->inplace); This->inplace = NULL; } if(This->doc_host.hostui) IDocHostUIHandler_Release(This->doc_host.hostui); if(This->client) IOleClientSite_Release(This->client); if(!pClientSite) { if(This->doc_host.document) deactivate_document(&This->doc_host); This->client = NULL; return S_OK; } This->client = pClientSite; IOleClientSite_AddRef(pClientSite); hres = IOleClientSite_QueryInterface(This->client, &IID_IDocHostUIHandler, (void**)&This->doc_host.hostui); if(FAILED(hres)) This->doc_host.hostui = NULL; hres = IOleClientSite_GetContainer(This->client, &container); if(SUCCEEDED(hres)) { ITargetContainer *target_container; hres = IOleContainer_QueryInterface(container, &IID_ITargetContainer, (void**)&target_container); if(SUCCEEDED(hres)) { FIXME("Unsupported ITargetContainer\n"); ITargetContainer_Release(target_container); } IOleContainer_Release(container); } create_shell_embedding_hwnd(This); return S_OK; }
static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, LPOLECLIENTSITE pClientSite) { WebBrowser *This = impl_from_IOleObject(iface); IDocHostUIHandler *hostui; IOleCommandTarget *olecmd; BOOL get_olecmd = TRUE; IOleContainer *container; IDispatch *disp; HRESULT hres; TRACE("(%p)->(%p)\n", This, pClientSite); if(This->client_closed) { IOleClientSite_Release(This->client_closed); This->client_closed = NULL; } if(This->client == pClientSite) return S_OK; if(This->client && pClientSite) { get_olecmd = FALSE; olecmd = This->doc_host.olecmd; if(olecmd) IOleCommandTarget_AddRef(olecmd); } release_client_site(This, !pClientSite); if(!pClientSite) { on_commandstate_change(&This->doc_host, CSC_NAVIGATEBACK, FALSE); on_commandstate_change(&This->doc_host, CSC_NAVIGATEFORWARD, FALSE); if(This->doc_host.document) deactivate_document(&This->doc_host); return S_OK; } IOleClientSite_AddRef(pClientSite); This->client = pClientSite; hres = IOleClientSite_QueryInterface(This->client, &IID_IDispatch, (void**)&disp); if(SUCCEEDED(hres)) This->doc_host.client_disp = disp; hres = IOleClientSite_QueryInterface(This->client, &IID_IDocHostUIHandler, (void**)&hostui); if(SUCCEEDED(hres)) This->doc_host.hostui = hostui; if(get_olecmd) { hres = IOleClientSite_GetContainer(This->client, &container); if(SUCCEEDED(hres)) { ITargetContainer *target_container; hres = IOleContainer_QueryInterface(container, &IID_ITargetContainer, (void**)&target_container); if(SUCCEEDED(hres)) { FIXME("Unsupported ITargetContainer\n"); ITargetContainer_Release(target_container); } hres = IOleContainer_QueryInterface(container, &IID_IOleCommandTarget, (void**)&olecmd); if(FAILED(hres)) olecmd = NULL; IOleContainer_Release(container); }else { hres = IOleClientSite_QueryInterface(This->client, &IID_IOleCommandTarget, (void**)&olecmd); if(FAILED(hres)) olecmd = NULL; } } This->doc_host.olecmd = olecmd; if(This->shell_embedding_hwnd) { IOleInPlaceSite *inplace; HWND parent; hres = IOleClientSite_QueryInterface(This->client, &IID_IOleInPlaceSite, (void**)&inplace); if(SUCCEEDED(hres)) { hres = IOleInPlaceSite_GetWindow(inplace, &parent); IOleInPlaceSite_Release(inplace); if(SUCCEEDED(hres)) SHSetParentHwnd(This->shell_embedding_hwnd, parent); } }else { create_shell_embedding_hwnd(This); } on_offlineconnected_change(This); on_silent_change(This); return S_OK; }