Piotr Caban : ieframe: Restore closed IOleClientSite in DoVerb.

Alexandre Julliard julliard at winehq.org
Mon Aug 22 07:32:37 CDT 2016


Module: wine
Branch: stable
Commit: bc47b126a9bb72942b15a340892899e123a6b7ce
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=bc47b126a9bb72942b15a340892899e123a6b7ce

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Mon Apr 11 18:46:09 2016 +0200

ieframe: Restore closed IOleClientSite in DoVerb.

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>
(cherry picked from commit 17379dcd083e66539014ab73cade423c22f26128)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 dlls/ieframe/ieframe.h          |  1 +
 dlls/ieframe/oleobject.c        | 28 +++++++++++++++++++++++++++-
 dlls/ieframe/tests/webbrowser.c | 24 ++++++++++++++++++------
 3 files changed, 46 insertions(+), 7 deletions(-)

diff --git a/dlls/ieframe/ieframe.h b/dlls/ieframe/ieframe.h
index 371cb03..2df5e1c 100644
--- a/dlls/ieframe/ieframe.h
+++ b/dlls/ieframe/ieframe.h
@@ -189,6 +189,7 @@ struct WebBrowser {
     INT version;
 
     IOleClientSite *client;
+    IOleClientSite *client_closed;
     IOleContainer *container;
     IOleInPlaceSiteEx *inplace;
 
diff --git a/dlls/ieframe/oleobject.c b/dlls/ieframe/oleobject.c
index 1076afe..4dcc536 100644
--- a/dlls/ieframe/oleobject.c
+++ b/dlls/ieframe/oleobject.c
@@ -292,6 +292,11 @@ static void release_client_site(WebBrowser *This)
         This->client = NULL;
     }
 
+    if(This->client_closed) {
+        IOleClientSite_Release(This->client_closed);
+        This->client_closed = NULL;
+    }
+
     if(This->shell_embedding_hwnd) {
         DestroyWindow(This->shell_embedding_hwnd);
         This->shell_embedding_hwnd = NULL;
@@ -460,6 +465,11 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, LPOLECLIENTSITE
 
     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;
 
@@ -549,6 +559,8 @@ static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR szCont
 static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption)
 {
     WebBrowser *This = impl_from_IOleObject(iface);
+    IOleClientSite *client;
+    HRESULT hres;
 
     TRACE("(%p)->(%d)\n", This, dwSaveOption);
 
@@ -569,7 +581,13 @@ static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption)
     if(This->inplace)
         IOleInPlaceSiteEx_OnInPlaceDeactivate(This->inplace);
 
-    return IOleObject_SetClientSite(iface, NULL);
+    /* store old client site - we need to restore it in DoVerb */
+    client = This->client;
+    if(This->client)
+        IOleClientSite_AddRef(This->client);
+    hres = IOleObject_SetClientSite(iface, NULL);
+    This->client_closed = client;
+    return hres;
 }
 
 static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD dwWhichMoniker, IMoniker* pmk)
@@ -611,6 +629,14 @@ static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG iVerb, struct tag
     TRACE("(%p)->(%d %p %p %d %p %s)\n", This, iVerb, lpmsg, pActiveSite, lindex, hwndParent,
           wine_dbgstr_rect(lprcPosRect));
 
+    /* restore closed client site if we have one */
+    if(!This->client && This->client_closed) {
+        IOleClientSite *client = This->client_closed;
+        This->client_closed = NULL;
+        IOleObject_SetClientSite(iface, client);
+        IOleClientSite_Release(client);
+    }
+
     switch (iVerb)
     {
     case OLEIVERB_SHOW:
diff --git a/dlls/ieframe/tests/webbrowser.c b/dlls/ieframe/tests/webbrowser.c
index 3201499..783740a 100644
--- a/dlls/ieframe/tests/webbrowser.c
+++ b/dlls/ieframe/tests/webbrowser.c
@@ -50,7 +50,7 @@ DEFINE_OLEGUID(CGID_DocHostCmdPriv, 0x000214D4L, 0, 0);
     static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
 
 #define SET_EXPECT(func) \
-    expect_ ## func = TRUE
+    do { called_ ## func = FALSE; expect_ ## func = TRUE; } while(0)
 
 #define CHECK_EXPECT2(func) \
     do { \
@@ -70,6 +70,12 @@ DEFINE_OLEGUID(CGID_DocHostCmdPriv, 0x000214D4L, 0, 0);
         expect_ ## func = called_ ## func = FALSE; \
     }while(0)
 
+#define CHECK_NOT_CALLED(func) \
+    do { \
+        ok(!called_ ## func, "unexpected " #func "\n"); \
+        expect_ ## func = called_ ## func = FALSE; \
+    }while(0)
+
 #define CLEAR_CALLED(func) \
     expect_ ## func = called_ ## func = FALSE
 
@@ -3634,19 +3640,25 @@ static void test_Close(IWebBrowser2 *wb, BOOL do_download)
     hres = IOleObject_DoVerb(oo, OLEIVERB_HIDE, NULL, (IOleClientSite*)0xdeadbeef,
             0, (HWND)0xdeadbeef, NULL);
     ok(hres == S_OK, "DoVerb failed: %08x\n", hres);
-    todo_wine CHECK_CALLED(GetContainer);
-    todo_wine CHECK_CALLED(Site_GetWindow);
-    todo_wine CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
-    todo_wine CHECK_CALLED(Invoke_AMBIENT_SILENT);
+    CHECK_CALLED(GetContainer);
+    CHECK_CALLED(Site_GetWindow);
+    CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
+    CHECK_CALLED(Invoke_AMBIENT_SILENT);
 
     hres = IOleObject_GetClientSite(oo, &ocs);
     ok(hres == S_OK, "hres = %x\n", hres);
-    todo_wine ok(ocs == &ClientSite, "ocs != &ClientSite\n");
+    ok(ocs == &ClientSite, "ocs != &ClientSite\n");
     if(ocs)
         IOleClientSite_Release(ocs);
 
+    SET_EXPECT(OnFocus_FALSE);
+    SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE);
+    SET_EXPECT(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE);
     hres = IOleObject_Close(oo, OLECLOSE_NOSAVE);
     ok(hres == S_OK, "OleObject_Close failed: %x\n", hres);
+    todo_wine CHECK_NOT_CALLED(OnFocus_FALSE);
+    todo_wine CHECK_NOT_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEBACK_FALSE);
+    todo_wine CHECK_NOT_CALLED(Invoke_COMMANDSTATECHANGE_NAVIGATEFORWARD_FALSE);
 
     test_close = FALSE;
     IOleObject_Release(oo);




More information about the wine-cvs mailing list