Jacek Caban : shdocvw: Deactivate document in SetClientSite if
ClientSite is NULL.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Jan 18 10:50:44 CST 2006
Module: wine
Branch: refs/heads/master
Commit: 47f796c6293c8a174006b2ab6de1316c407ab29e
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=47f796c6293c8a174006b2ab6de1316c407ab29e
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Jan 18 13:22:52 2006 +0100
shdocvw: Deactivate document in SetClientSite if ClientSite is NULL.
Fix ref counting.
---
dlls/shdocvw/client.c | 1 +
dlls/shdocvw/dochost.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++
dlls/shdocvw/events.c | 1 +
dlls/shdocvw/oleobject.c | 16 +++++++++++---
dlls/shdocvw/shdocvw.h | 1 +
5 files changed, 67 insertions(+), 4 deletions(-)
diff --git a/dlls/shdocvw/client.c b/dlls/shdocvw/client.c
index 170a9a9..842c184 100644
--- a/dlls/shdocvw/client.c
+++ b/dlls/shdocvw/client.c
@@ -204,6 +204,7 @@ static HRESULT WINAPI InPlaceSite_GetWin
TRACE("(%p)->(%p %p %p %p %p)\n", This, ppFrame, ppDoc, lprcPosRect,
lprcClipRect, lpFrameInfo);
+ IOleInPlaceFrame_AddRef(INPLACEFRAME(This));
*ppFrame = INPLACEFRAME(This);
*ppDoc = NULL;
diff --git a/dlls/shdocvw/dochost.c b/dlls/shdocvw/dochost.c
index d5dc95c..57b8660 100644
--- a/dlls/shdocvw/dochost.c
+++ b/dlls/shdocvw/dochost.c
@@ -154,6 +154,58 @@ void create_doc_view_hwnd(WebBrowser *Th
NULL, shdocvw_hinstance, This);
}
+void deactivate_document(WebBrowser *This)
+{
+ IOleInPlaceObjectWindowless *winobj;
+ IOleObject *oleobj = NULL;
+ IHlinkTarget *hlink = NULL;
+ HRESULT hres;
+
+ if(This->view)
+ IOleDocumentView_UIActivate(This->view, FALSE);
+
+ hres = IUnknown_QueryInterface(This->client, &IID_IOleInPlaceObjectWindowless,
+ (void**)&winobj);
+ if(SUCCEEDED(hres)) {
+ IOleInPlaceObjectWindowless_InPlaceDeactivate(winobj);
+ IOleInPlaceObjectWindowless_Release(winobj);
+ }
+
+ if(This->view) {
+ IOleDocumentView_Show(This->view, FALSE);
+ IOleDocumentView_CloseView(This->view, 0);
+ IOleDocumentView_SetInPlaceSite(This->view, NULL);
+ IOleDocumentView_Release(This->view);
+ This->view = NULL;
+ }
+
+ hres = IUnknown_QueryInterface(This->document, &IID_IOleObject, (void**)&oleobj);
+ if(SUCCEEDED(hres))
+ IOleObject_Close(oleobj, OLECLOSE_NOSAVE);
+
+ hres = IUnknown_QueryInterface(This->document, &IID_IHlinkTarget, (void**)&hlink);
+ if(SUCCEEDED(hres)) {
+ IHlinkTarget_SetBrowseContext(hlink, NULL);
+ IHlinkTarget_Release(hlink);
+ }
+
+ if(oleobj) {
+ IOleClientSite *client_site = NULL;
+
+ IOleObject_GetClientSite(oleobj, &client_site);
+ if(client_site) {
+ if(client_site == CLIENTSITE(This))
+ IOleObject_SetClientSite(oleobj, NULL);
+ IOleClientSite_Release(client_site);
+ }
+
+ IOleObject_Release(oleobj);
+ }
+
+ IUnknown_Release(This->document);
+ This->document = NULL;
+}
+
#define DOCHOSTUI_THIS(iface) DEFINE_THIS(WebBrowser, DocHostUIHandler, iface)
static HRESULT WINAPI DocHostUIHandler_QueryInterface(IDocHostUIHandler2 *iface,
diff --git a/dlls/shdocvw/events.c b/dlls/shdocvw/events.c
index 5733447..b7f93b7 100644
--- a/dlls/shdocvw/events.c
+++ b/dlls/shdocvw/events.c
@@ -177,6 +177,7 @@ static HRESULT WINAPI ConnectionPoint_Ge
TRACE("(%p)->(%p)\n", This, ppCPC);
*ppCPC = CONPTCONT(This->webbrowser);
+ IConnectionPointContainer_AddRef(CONPTCONT(This->webbrowser));
return S_OK;
}
diff --git a/dlls/shdocvw/oleobject.c b/dlls/shdocvw/oleobject.c
index a20678a..58eb6ef 100644
--- a/dlls/shdocvw/oleobject.c
+++ b/dlls/shdocvw/oleobject.c
@@ -130,18 +130,26 @@ static HRESULT WINAPI OleObject_SetClien
if(This->client == pClientSite)
return S_OK;
- if(This->doc_view_hwnd)
+ if(This->doc_view_hwnd) {
DestroyWindow(This->doc_view_hwnd);
- if(This->shell_embedding_hwnd)
+ This->doc_view_hwnd = NULL;
+ }
+ if(This->shell_embedding_hwnd) {
DestroyWindow(This->shell_embedding_hwnd);
+ This->shell_embedding_hwnd = NULL;
+ }
if(This->client)
IOleClientSite_Release(This->client);
- This->client = pClientSite;
- if(!pClientSite)
+ if(!pClientSite) {
+ if(This->document)
+ deactivate_document(This);
+ This->client = NULL;
return S_OK;
+ }
+ This->client = pClientSite;
IOleClientSite_AddRef(pClientSite);
create_shell_embedding_hwnd(This);
diff --git a/dlls/shdocvw/shdocvw.h b/dlls/shdocvw/shdocvw.h
index 735c1c4..49508b8 100644
--- a/dlls/shdocvw/shdocvw.h
+++ b/dlls/shdocvw/shdocvw.h
@@ -158,6 +158,7 @@ void WebBrowser_ClientSite_Destroy(WebBr
HRESULT WebBrowser_Create(IUnknown*,REFIID,void**);
void create_doc_view_hwnd(WebBrowser *This);
+void deactivate_document(WebBrowser*);
void call_sink(ConnectionPoint*,DISPID,DISPPARAMS*);
#define WB_WM_NAVIGATE2 (WM_USER+100)
More information about the wine-cvs
mailing list