ieframe: Don't release the advise sink in IOleObject::SetClientSite.
Hans Leidekker
hans at codeweavers.com
Thu Nov 26 03:53:32 CST 2015
Fixes a regression in Eclipse Europa.
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
dlls/ieframe/oleobject.c | 5 -----
dlls/ieframe/tests/webbrowser.c | 16 ++++++++++++++++
dlls/ieframe/webbrowser.c | 3 +++
3 files changed, 19 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..f62a943 100644
--- a/dlls/ieframe/tests/webbrowser.c
+++ b/dlls/ieframe/tests/webbrowser.c
@@ -148,6 +148,7 @@ DEFINE_EXPECT(ControlSite_TranslateAccelerator);
DEFINE_EXPECT(OnFocus_TRUE);
DEFINE_EXPECT(OnFocus_FALSE);
DEFINE_EXPECT(GetExternal);
+DEFINE_EXPECT(AdviseSink_Release);
static const WCHAR wszItem[] = {'i','t','e','m',0};
@@ -3955,6 +3956,7 @@ static ULONG WINAPI sink_AddRef(IAdviseSink *iface)
static ULONG WINAPI sink_Release(IAdviseSink *iface)
{
+ CHECK_EXPECT2(AdviseSink_Release);
return 1;
}
@@ -4003,6 +4005,7 @@ static void test_SetAdvise(void)
IWebBrowser2 *browser;
IViewObject2 *view;
IAdviseSink *sink;
+ IOleObject *oleobj;
DWORD aspects, flags;
if (!(browser = create_webbrowser())) return;
@@ -4031,9 +4034,22 @@ 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);
+
+ SET_EXPECT(AdviseSink_Release);
hr = IViewObject2_SetAdvise(view, 0, 0, NULL);
ok(hr == S_OK, "got %08x\n", hr);
+ CHECK_CALLED(AdviseSink_Release);
+ 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);
--
2.1.4
More information about the wine-patches
mailing list