Hans Leidekker : ieframe: Implement IViewObject::GetAdvise and IViewObject ::SetAdvise.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jul 17 08:03:41 CDT 2015
Module: wine
Branch: master
Commit: 99613c003ed43f5725ef08d32fea440f737e8aba
URL: http://source.winehq.org/git/wine.git/?a=commit;h=99613c003ed43f5725ef08d32fea440f737e8aba
Author: Hans Leidekker <hans at codeweavers.com>
Date: Fri Jul 17 12:35:45 2015 +0200
ieframe: Implement IViewObject::GetAdvise and IViewObject::SetAdvise.
---
dlls/ieframe/ieframe.h | 4 ++
dlls/ieframe/oleobject.c | 5 ++
dlls/ieframe/tests/webbrowser.c | 121 ++++++++++++++++++++++++++++++++++++++++
dlls/ieframe/view.c | 28 ++++++++--
4 files changed, 154 insertions(+), 4 deletions(-)
diff --git a/dlls/ieframe/ieframe.h b/dlls/ieframe/ieframe.h
index f8c204c..a83ff35 100644
--- a/dlls/ieframe/ieframe.h
+++ b/dlls/ieframe/ieframe.h
@@ -191,6 +191,10 @@ struct WebBrowser {
IOleContainer *container;
IOleInPlaceSiteEx *inplace;
+ IAdviseSink *sink;
+ DWORD sink_aspects;
+ DWORD sink_flags;
+
/* window context */
HWND frame_hwnd;
diff --git a/dlls/ieframe/oleobject.c b/dlls/ieframe/oleobject.c
index 330804b..53c0e36 100644
--- a/dlls/ieframe/oleobject.c
+++ b/dlls/ieframe/oleobject.c
@@ -288,6 +288,11 @@ static void release_client_site(WebBrowser *This)
IOleClientSite_Release(This->client);
This->client = 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 b19ae7c..4d3ab24 100644
--- a/dlls/ieframe/tests/webbrowser.c
+++ b/dlls/ieframe/tests/webbrowser.c
@@ -3841,6 +3841,126 @@ static void test_FileProtocol(void)
DeleteFileA(file_path);
}
+struct sink
+{
+ IAdviseSink IAdviseSink_iface;
+};
+
+static inline struct sink *impl_from_IAdviseSink(IAdviseSink *iface)
+{
+ return CONTAINING_RECORD(iface, struct sink, IAdviseSink_iface);
+}
+
+static HRESULT WINAPI sink_QueryInterface( IAdviseSink *iface, REFIID riid, void **obj)
+{
+ struct sink *sink = impl_from_IAdviseSink(iface);
+
+ trace("%p, %p, %p\n", iface, riid, obj);
+
+ if (IsEqualGUID(riid, &IID_IAdviseSink) || IsEqualGUID(riid, &IID_IUnknown))
+ {
+ *obj = &sink->IAdviseSink_iface;
+ }
+ else
+ {
+ return E_NOINTERFACE;
+ }
+ IAdviseSink_AddRef(iface);
+ return S_OK;
+}
+
+static ULONG WINAPI sink_AddRef(IAdviseSink *iface)
+{
+ trace("%p\n", iface);
+ return 2;
+}
+
+static ULONG WINAPI sink_Release(IAdviseSink *iface)
+{
+ trace("%p\n", iface);
+ return 1;
+}
+
+static void WINAPI sink_OnDataChange(IAdviseSink *iface, FORMATETC *format, STGMEDIUM *medium)
+{
+ trace("%p, %p, %p\n", iface, format, medium);
+}
+
+static void WINAPI sink_OnViewChange(IAdviseSink *iface, DWORD aspect, LONG index)
+{
+ trace("%p, %08x, %d\n", iface, aspect, index);
+}
+
+static void WINAPI sink_OnRename(IAdviseSink *iface, IMoniker *moniker)
+{
+ trace("%p, %p\n", iface, moniker);
+}
+
+static void WINAPI sink_OnSave(IAdviseSink *iface)
+{
+ trace("%p\n", iface);
+}
+
+static void WINAPI sink_OnClose(IAdviseSink *iface)
+{
+ trace("%p\n", iface);
+}
+
+static const IAdviseSinkVtbl sink_vtbl =
+{
+ sink_QueryInterface,
+ sink_AddRef,
+ sink_Release,
+ sink_OnDataChange,
+ sink_OnViewChange,
+ sink_OnRename,
+ sink_OnSave,
+ sink_OnClose
+};
+
+static IAdviseSink test_sink = { &sink_vtbl };
+
+static void test_SetAdvise(void)
+{
+ HRESULT hr;
+ IWebBrowser2 *browser;
+ IViewObject2 *view;
+ IAdviseSink *sink;
+ DWORD aspects, flags;
+
+ if (!(browser = create_webbrowser())) return;
+ init_test(browser, 0);
+
+ hr = IWebBrowser2_QueryInterface(browser, &IID_IViewObject2, (void **)&view);
+ ok(hr == S_OK, "got %08x\n", hr);
+ if (FAILED(hr)) return;
+
+ aspects = flags = 0xdeadbeef;
+ sink = (IAdviseSink *)0xdeadbeef;
+ hr = IViewObject2_GetAdvise(view, &aspects, &flags, &sink);
+ ok(hr == S_OK, "got %08x\n", hr);
+ ok(!aspects, "got %08x\n", aspects);
+ ok(!flags, "got %08x\n", aspects);
+ ok(sink == NULL, "got %p\n", sink);
+
+ hr = IViewObject2_SetAdvise(view, DVASPECT_CONTENT, 0, (IAdviseSink *)&test_sink);
+ 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(aspects == DVASPECT_CONTENT, "got %08x\n", aspects);
+ ok(!flags, "got %08x\n", aspects);
+ ok(sink == &test_sink, "got %p\n", sink);
+
+ hr = IViewObject2_SetAdvise(view, 0, 0, NULL);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ IViewObject2_Release(view);
+ IWebBrowser2_Release(browser);
+}
+
START_TEST(webbrowser)
{
OleInitialize(NULL);
@@ -3867,6 +3987,7 @@ START_TEST(webbrowser)
trace("Testing WebBrowserV1...\n");
test_WebBrowserV1();
test_FileProtocol();
+ test_SetAdvise();
OleUninitialize();
}
diff --git a/dlls/ieframe/view.c b/dlls/ieframe/view.c
index 2bf14b5..3e44991 100644
--- a/dlls/ieframe/view.c
+++ b/dlls/ieframe/view.c
@@ -92,16 +92,36 @@ static HRESULT WINAPI ViewObject_SetAdvise(IViewObject2 *iface, DWORD aspects, D
IAdviseSink *pAdvSink)
{
WebBrowser *This = impl_from_IViewObject2(iface);
- FIXME("(%p)->(%d %08x %p)\n", This, aspects, advf, pAdvSink);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%d %08x %p)\n", This, aspects, advf, pAdvSink);
+
+ if (aspects || advf) FIXME("aspects and/or flags not supported yet\n");
+
+ This->sink_aspects = aspects;
+ This->sink_flags = advf;
+ if (This->sink) IAdviseSink_Release(This->sink);
+ This->sink = pAdvSink;
+ if (This->sink) IAdviseSink_AddRef(This->sink);
+
+ return S_OK;
}
static HRESULT WINAPI ViewObject_GetAdvise(IViewObject2 *iface, DWORD *pAspects,
DWORD *pAdvf, IAdviseSink **ppAdvSink)
{
WebBrowser *This = impl_from_IViewObject2(iface);
- FIXME("(%p)->(%p %p %p)\n", This, pAspects, pAdvf, ppAdvSink);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p %p %p)\n", This, pAspects, pAdvf, ppAdvSink);
+
+ if (pAspects) *pAspects = This->sink_aspects;
+ if (pAdvf) *pAdvf = This->sink_flags;
+ if (ppAdvSink)
+ {
+ *ppAdvSink = This->sink;
+ if (*ppAdvSink) IAdviseSink_AddRef(*ppAdvSink);
+ }
+
+ return S_OK;
}
static HRESULT WINAPI ViewObject_GetExtent(IViewObject2 *iface, DWORD dwAspect, LONG lindex,
More information about the wine-cvs
mailing list