Module: wine Branch: master Commit: 10f35222dc8e7184963076a7e8e58ad64651638e URL: http://source.winehq.org/git/wine.git/?a=commit;h=10f35222dc8e7184963076a7e8...
Author: Hans Leidekker hans@codeweavers.com Date: Mon Nov 30 10:48:04 2015 +0100
ieframe: Don't release the advise sink in IOleObject::SetClientSite.
Signed-off-by: Hans Leidekker hans@codeweavers.com Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ieframe/oleobject.c | 5 ----- dlls/ieframe/tests/webbrowser.c | 30 ++++++++++++++++++++++++++++++ dlls/ieframe/webbrowser.c | 3 +++ 3 files changed, 33 insertions(+), 5 deletions(-)
diff --git a/dlls/ieframe/oleobject.c b/dlls/ieframe/oleobject.c index 2d3cac6..1076afe 100644 --- a/dlls/ieframe/oleobject.c +++ b/dlls/ieframe/oleobject.c @@ -311,11 +311,6 @@ static void release_client_site(WebBrowser *This) IOleInPlaceUIWindow_Release(This->uiwindow); This->uiwindow = NULL; } - - if(This->sink) { - IAdviseSink_Release(This->sink); - This->sink = NULL; - } }
typedef struct { diff --git a/dlls/ieframe/tests/webbrowser.c b/dlls/ieframe/tests/webbrowser.c index c8dfa5b..1617dcb 100644 --- a/dlls/ieframe/tests/webbrowser.c +++ b/dlls/ieframe/tests/webbrowser.c @@ -4003,6 +4003,7 @@ static void test_SetAdvise(void) IWebBrowser2 *browser; IViewObject2 *view; IAdviseSink *sink; + IOleObject *oleobj; DWORD aspects, flags;
if (!(browser = create_webbrowser())) return; @@ -4031,9 +4032,38 @@ static void test_SetAdvise(void) ok(!flags, "got %08x\n", aspects); ok(sink == &test_sink, "got %p\n", sink);
+ hr = IWebBrowser2_QueryInterface(browser, &IID_IOleObject, (void **)&oleobj); + ok(hr == S_OK, "got %08x\n", hr); + + SET_EXPECT(GetContainer); + SET_EXPECT(Site_GetWindow); + SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); + SET_EXPECT(Invoke_AMBIENT_SILENT); + hr = IOleObject_SetClientSite(oleobj, &ClientSite); + ok(hr == S_OK, "got %08x\n", hr); + CHECK_CALLED(GetContainer); + CHECK_CALLED(Site_GetWindow); + CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); + CHECK_CALLED(Invoke_AMBIENT_SILENT); + + sink = (IAdviseSink *)0xdeadbeef; + hr = IViewObject2_GetAdvise(view, &aspects, &flags, &sink); + ok(hr == S_OK, "got %08x\n", hr); + ok(sink == &test_sink, "got %p\n", sink); + + hr = IOleObject_SetClientSite(oleobj, NULL); + ok(hr == S_OK, "got %08x\n", hr); + + aspects = flags = 0xdeadbeef; + sink = (IAdviseSink *)0xdeadbeef; + hr = IViewObject2_GetAdvise(view, &aspects, &flags, &sink); + ok(hr == S_OK, "got %08x\n", hr); + ok(sink == &test_sink, "got %p\n", sink); + hr = IViewObject2_SetAdvise(view, 0, 0, NULL); ok(hr == S_OK, "got %08x\n", hr);
+ IOleObject_Release(oleobj); IViewObject2_Release(view); IWebBrowser2_Release(browser); } diff --git a/dlls/ieframe/webbrowser.c b/dlls/ieframe/webbrowser.c index 0378d6b..03acf38 100644 --- a/dlls/ieframe/webbrowser.c +++ b/dlls/ieframe/webbrowser.c @@ -167,6 +167,9 @@ static ULONG WINAPI WebBrowser_Release(IWebBrowser2 *iface) TRACE("(%p) ref=%d\n", This, ref);
if(!ref) { + if(This->sink) + IAdviseSink_Release(This->sink); + if(This->doc_host.document) IUnknown_Release(This->doc_host.document);