Piotr Caban : ieframe: Improve setting different client site in OleObject_SetClientSite.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Apr 13 11:51:48 CDT 2016
Module: wine
Branch: master
Commit: 3fbd56b08ec1812f87a194670d5428ff4e566291
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3fbd56b08ec1812f87a194670d5428ff4e566291
Author: Piotr Caban <piotr at codeweavers.com>
Date: Wed Apr 13 17:11:53 2016 +0200
ieframe: Improve setting different client site in OleObject_SetClientSite.
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ieframe/oleobject.c | 69 ++++++++++++++++++++++++++++++++----------------
1 file changed, 46 insertions(+), 23 deletions(-)
diff --git a/dlls/ieframe/oleobject.c b/dlls/ieframe/oleobject.c
index 4dcc536..1ff9a92 100644
--- a/dlls/ieframe/oleobject.c
+++ b/dlls/ieframe/oleobject.c
@@ -283,7 +283,7 @@ static HRESULT on_silent_change(WebBrowser *This)
return S_OK;
}
-static void release_client_site(WebBrowser *This)
+static void release_client_site(WebBrowser *This, BOOL destroy_win)
{
release_dochost_client(&This->doc_host);
@@ -297,7 +297,7 @@ static void release_client_site(WebBrowser *This)
This->client_closed = NULL;
}
- if(This->shell_embedding_hwnd) {
+ if(destroy_win && This->shell_embedding_hwnd) {
DestroyWindow(This->shell_embedding_hwnd);
This->shell_embedding_hwnd = NULL;
}
@@ -459,6 +459,7 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, LPOLECLIENTSITE
WebBrowser *This = impl_from_IOleObject(iface);
IDocHostUIHandler *hostui;
IOleCommandTarget *olecmd;
+ BOOL get_olecmd = TRUE;
IOleContainer *container;
IDispatch *disp;
HRESULT hres;
@@ -473,7 +474,14 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, LPOLECLIENTSITE
if(This->client == pClientSite)
return S_OK;
- release_client_site(This);
+ 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);
@@ -497,31 +505,46 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, LPOLECLIENTSITE
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(get_olecmd) {
+ hres = IOleClientSite_GetContainer(This->client, &container);
if(SUCCEEDED(hres)) {
- FIXME("Unsupported ITargetContainer\n");
- ITargetContainer_Release(target_container);
+ 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;
}
-
- 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;
- create_shell_embedding_hwnd(This);
+ 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);
@@ -1198,5 +1221,5 @@ void WebBrowser_OleObject_Init(WebBrowser *This)
void WebBrowser_OleObject_Destroy(WebBrowser *This)
{
- release_client_site(This);
+ release_client_site(This, TRUE);
}
More information about the wine-cvs
mailing list