Module: wine Branch: refs/heads/master Commit: 47f796c6293c8a174006b2ab6de1316c407ab29e URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=47f796c6293c8a174006b2ab...
Author: Jacek Caban jacek@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)