Jacek Caban : mshtml: Added tests for returning ActiveX object' s interfaces from object element's QueryInterface.
Alexandre Julliard
julliard at winehq.org
Mon Dec 5 14:55:03 CST 2011
Module: wine
Branch: master
Commit: d73b1b6d8fb493bece9446bed89357ce156824c3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d73b1b6d8fb493bece9446bed89357ce156824c3
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Dec 5 17:31:14 2011 +0100
mshtml: Added tests for returning ActiveX object's interfaces from object element's QueryInterface.
---
dlls/mshtml/tests/activex.c | 126 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 126 insertions(+), 0 deletions(-)
diff --git a/dlls/mshtml/tests/activex.c b/dlls/mshtml/tests/activex.c
index d9e9c1f..0972392 100644
--- a/dlls/mshtml/tests/activex.c
+++ b/dlls/mshtml/tests/activex.c
@@ -86,6 +86,10 @@ DEFINE_EXPECT(QueryService_TestActiveX);
DEFINE_EXPECT(GetMiscStatus);
DEFINE_EXPECT(SetAdvise);
DEFINE_EXPECT(GetViewStatus);
+DEFINE_EXPECT(QI_ITestActiveX);
+DEFINE_EXPECT(wrapped_AddRef);
+DEFINE_EXPECT(wrapped_Release);
+DEFINE_EXPECT(wrapped_func);
#define DISPID_SCRIPTPROP 1000
@@ -102,6 +106,9 @@ static int plugin_behavior;
static const GUID CLSID_TestActiveX =
{0x178fc163,0xf585,0x4e24,{0x9c,0x13,0x4b,0xb7,0xf6,0x68,0x07,0x46}};
+static const GUID IID_ITestActiveX =
+ {0x178fc663,0xf585,0x4e24,{0x9c,0x13,0x4b,0xb7,0xf6,0x68,0x07,0x46}};
+
static const char object_ax_str[] =
"<html><head></head><body>"
"<object classid=\"clsid:" TESTACTIVEX_CLSID "\" width=\"300\" height=\"200\" id=\"objid\">"
@@ -1143,6 +1150,57 @@ static const IOleInPlaceObjectWindowlessVtbl OleInPlaceObjectWindowlessVtbl = {
static IOleInPlaceObjectWindowless OleInPlaceObjectWindowless = { &OleInPlaceObjectWindowlessVtbl };
+static void *wrapped_iface_vtbl[100];
+static IUnknown wrapped_iface = { (IUnknownVtbl*)wrapped_iface_vtbl };
+
+static HRESULT WINAPI wrapped_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
+{
+ ok(0, "unexpected wrapped_QueryInterface call\n");
+ *ppv = NULL;
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI wrapped_AddRef(IUnknown *iface)
+{
+ CHECK_EXPECT(wrapped_AddRef);
+ return 2;
+}
+
+static ULONG WINAPI wrapped_Release(IUnknown *iface)
+{
+ CHECK_EXPECT(wrapped_Release);
+ return 1;
+}
+
+static HRESULT WINAPI wrapped_func_nocall(IUnknown *iface, int i, double d)
+{
+ ok(0, "unexpected call\n");
+ return E_FAIL;
+}
+
+static HRESULT WINAPI wrapped_func(IUnknown *iface, int i, double d)
+{
+ CHECK_EXPECT(wrapped_func);
+ ok(iface == &wrapped_iface, "iface != wrapped_iface\n");
+ ok(i == 10, "i = %d\n", i);
+ ok(d == 32.0, "d = %lf\n", d);
+ return S_OK;
+}
+
+static void init_wrapped_iface(void)
+{
+ unsigned i;
+
+ wrapped_iface_vtbl[0] = wrapped_QueryInterface;
+ wrapped_iface_vtbl[1] = wrapped_AddRef;
+ wrapped_iface_vtbl[2] = wrapped_Release;
+
+ for(i=3; i<100; i++)
+ wrapped_iface_vtbl[i] = wrapped_func_nocall;
+
+ wrapped_iface_vtbl[63] = wrapped_func;
+}
+
static HRESULT ax_qi(REFIID riid, void **ppv)
{
if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IOleControl)) {
@@ -1158,6 +1216,9 @@ static HRESULT ax_qi(REFIID riid, void **ppv)
*ppv = &ViewObjectEx;
}else if(IsEqualGUID(riid, &IID_IOleObject)) {
*ppv = &OleObject;
+ }else if(IsEqualGUID(riid, &IID_ITestActiveX)) {
+ CHECK_EXPECT(QI_ITestActiveX);
+ *ppv = &wrapped_iface;
}else if(IsEqualGUID(riid, &IID_IOleWindow) || IsEqualGUID(riid, &IID_IOleInPlaceObject)
|| IsEqualGUID(&IID_IOleInPlaceObjectWindowless, riid)) {
*ppv = &OleInPlaceObjectWindowless;
@@ -1257,6 +1318,68 @@ static void test_elem_dispex(IDispatchEx *dispex)
CHECK_CALLED(Invoke_SCRIPTPROP);
}
+static void test_iface_wrapping(IHTMLObjectElement *elem)
+{
+ IHTMLObjectElement *elem2;
+ IUnknown *unk, *unk2;
+ ULONG ref;
+ void **vtbl;
+ HRESULT hres;
+
+ SET_EXPECT(QI_ITestActiveX);
+ SET_EXPECT(wrapped_AddRef);
+ SET_EXPECT(wrapped_Release);
+ unk = (void*)0xdeadbeef;
+ hres = IHTMLObjectElement_QueryInterface(elem, &IID_ITestActiveX, (void**)&unk);
+ ok(hres == S_OK, "QueryInerface(IID_ITestActiveX failed: %08x\n", hres);
+ CHECK_CALLED(QI_ITestActiveX);
+ CHECK_CALLED(wrapped_AddRef);
+ CHECK_CALLED(wrapped_Release);
+
+ /* See dlls/mshtml/ifacewrap.c */
+ ok(unk != &wrapped_iface, "Unexpected unk %p, expected %p (%p, %p)\n", unk, &ViewObjectEx, unk->lpVtbl, &ViewObjectExVtbl);
+ ok(unk->lpVtbl != wrapped_iface.lpVtbl, "unk->lpVtbl == wrapped_iface->lpVtbl\n");
+ ok(unk->lpVtbl->QueryInterface != wrapped_QueryInterface, "QueryInterface not wrapped\n");
+ ok(unk->lpVtbl->AddRef != wrapped_AddRef, "AddRef not wrapped\n");
+ ok(unk->lpVtbl->Release != wrapped_Release, "Release not wrapped\n");
+
+ vtbl = (void**)unk->lpVtbl;
+ ok(vtbl[4] != wrapped_func_nocall, "func not wrapped\n");
+ ok(vtbl[63] != wrapped_func, "func not wrapped\n");
+
+ SET_EXPECT(wrapped_func);
+ hres = ((HRESULT (WINAPI*)(IUnknown*,int,double))vtbl[63])(unk, 10, 32.0);
+ ok(hres == S_OK, "wrapped_func returned %08x\n", hres);
+ CHECK_CALLED(wrapped_func);
+
+ hres = IUnknown_QueryInterface(unk, &IID_IHTMLObjectElement, (void**)&elem2);
+ ok(hres == S_OK, "Could not get IHTMLObjectElement from wrapped iface: %08x\n", hres);
+ ok(iface_cmp((IUnknown*)elem2, (IUnknown*)elem), "elem2 != elem\n");
+ IHTMLObjectElement_Release(elem2);
+
+ SET_EXPECT(wrapped_Release);
+ ref = IUnknown_Release(unk);
+ ok(!ref, "ref=%d\n", ref);
+ CHECK_CALLED(wrapped_Release);
+
+ SET_EXPECT(QI_ITestActiveX);
+ SET_EXPECT(wrapped_AddRef);
+ SET_EXPECT(wrapped_Release);
+ unk = (void*)0xdeadbeef;
+ hres = IHTMLObjectElement_QueryInterface(elem, &IID_ITestActiveX, (void**)&unk2);
+ ok(hres == S_OK, "QueryInerface(IID_ITestActiveX failed: %08x\n", hres);
+ CHECK_CALLED(QI_ITestActiveX);
+ CHECK_CALLED(wrapped_AddRef);
+ CHECK_CALLED(wrapped_Release);
+
+ ok(unk != unk2, "unk == unk2\n");
+
+ SET_EXPECT(wrapped_Release);
+ ref = IUnknown_Release(unk2);
+ ok(!ref, "ref=%d\n", ref);
+ CHECK_CALLED(wrapped_Release);
+}
+
static void test_object_elem(IHTMLDocument2 *doc)
{
IHTMLObjectElement *objelem;
@@ -1293,6 +1416,8 @@ static void test_object_elem(IHTMLDocument2 *doc)
test_elem_dispex(dispex);
IDispatchEx_Release(dispex);
+ test_iface_wrapping(objelem);
+
IHTMLObjectElement_Release(objelem);
}
@@ -2171,6 +2296,7 @@ START_TEST(activex)
return;
}
+ init_wrapped_iface();
container_hwnd = create_container_window();
ShowWindow(container_hwnd, SW_SHOW);
More information about the wine-cvs
mailing list