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