ieframe: Don't release the advise sink in IOleObject::SetClientSite.

Jacek Caban jacek at codeweavers.com
Thu Nov 26 08:42:59 CST 2015


Hi Hans,

On 11/26/15 10:53, Hans Leidekker wrote:
> 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;
>  }

IMO checking GetAdvise result after SetClientSite() call would be
cleaner than checking Release calls.

>  @@ -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);

You can't do it that way. All SET_EXPECT()s need CHECK_CALLED() or
alike. Otherwise you leave tests in an inconsistent state.

> +
> +    SET_EXPECT(AdviseSink_Release);
>      hr = IViewObject2_SetAdvise(view, 0, 0, NULL);
>      ok(hr == S_OK, "got %08x\n", hr);
> +    CHECK_CALLED(AdviseSink_Release);

It would be also interesting to see what happens in SetClientSite(NULL)
call.


Thanks,
Jacek
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20151126/e19d185e/attachment.html>


More information about the wine-devel mailing list