mshtml: Added tests for returning ActiveX object's interfaces from object element's QueryInterface.
This commit is contained in:
parent
fc504c9117
commit
d73b1b6d8f
|
@ -86,6 +86,10 @@ DEFINE_EXPECT(QueryService_TestActiveX);
|
||||||
DEFINE_EXPECT(GetMiscStatus);
|
DEFINE_EXPECT(GetMiscStatus);
|
||||||
DEFINE_EXPECT(SetAdvise);
|
DEFINE_EXPECT(SetAdvise);
|
||||||
DEFINE_EXPECT(GetViewStatus);
|
DEFINE_EXPECT(GetViewStatus);
|
||||||
|
DEFINE_EXPECT(QI_ITestActiveX);
|
||||||
|
DEFINE_EXPECT(wrapped_AddRef);
|
||||||
|
DEFINE_EXPECT(wrapped_Release);
|
||||||
|
DEFINE_EXPECT(wrapped_func);
|
||||||
|
|
||||||
#define DISPID_SCRIPTPROP 1000
|
#define DISPID_SCRIPTPROP 1000
|
||||||
|
|
||||||
|
@ -102,6 +106,9 @@ static int plugin_behavior;
|
||||||
static const GUID CLSID_TestActiveX =
|
static const GUID CLSID_TestActiveX =
|
||||||
{0x178fc163,0xf585,0x4e24,{0x9c,0x13,0x4b,0xb7,0xf6,0x68,0x07,0x46}};
|
{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[] =
|
static const char object_ax_str[] =
|
||||||
"<html><head></head><body>"
|
"<html><head></head><body>"
|
||||||
"<object classid=\"clsid:" TESTACTIVEX_CLSID "\" width=\"300\" height=\"200\" id=\"objid\">"
|
"<object classid=\"clsid:" TESTACTIVEX_CLSID "\" width=\"300\" height=\"200\" id=\"objid\">"
|
||||||
|
@ -1143,6 +1150,57 @@ static const IOleInPlaceObjectWindowlessVtbl OleInPlaceObjectWindowlessVtbl = {
|
||||||
|
|
||||||
static IOleInPlaceObjectWindowless OleInPlaceObjectWindowless = { &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)
|
static HRESULT ax_qi(REFIID riid, void **ppv)
|
||||||
{
|
{
|
||||||
if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IOleControl)) {
|
if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IOleControl)) {
|
||||||
|
@ -1158,6 +1216,9 @@ static HRESULT ax_qi(REFIID riid, void **ppv)
|
||||||
*ppv = &ViewObjectEx;
|
*ppv = &ViewObjectEx;
|
||||||
}else if(IsEqualGUID(riid, &IID_IOleObject)) {
|
}else if(IsEqualGUID(riid, &IID_IOleObject)) {
|
||||||
*ppv = &OleObject;
|
*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)
|
}else if(IsEqualGUID(riid, &IID_IOleWindow) || IsEqualGUID(riid, &IID_IOleInPlaceObject)
|
||||||
|| IsEqualGUID(&IID_IOleInPlaceObjectWindowless, riid)) {
|
|| IsEqualGUID(&IID_IOleInPlaceObjectWindowless, riid)) {
|
||||||
*ppv = &OleInPlaceObjectWindowless;
|
*ppv = &OleInPlaceObjectWindowless;
|
||||||
|
@ -1257,6 +1318,68 @@ static void test_elem_dispex(IDispatchEx *dispex)
|
||||||
CHECK_CALLED(Invoke_SCRIPTPROP);
|
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)
|
static void test_object_elem(IHTMLDocument2 *doc)
|
||||||
{
|
{
|
||||||
IHTMLObjectElement *objelem;
|
IHTMLObjectElement *objelem;
|
||||||
|
@ -1293,6 +1416,8 @@ static void test_object_elem(IHTMLDocument2 *doc)
|
||||||
test_elem_dispex(dispex);
|
test_elem_dispex(dispex);
|
||||||
IDispatchEx_Release(dispex);
|
IDispatchEx_Release(dispex);
|
||||||
|
|
||||||
|
test_iface_wrapping(objelem);
|
||||||
|
|
||||||
IHTMLObjectElement_Release(objelem);
|
IHTMLObjectElement_Release(objelem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2171,6 +2296,7 @@ START_TEST(activex)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
init_wrapped_iface();
|
||||||
container_hwnd = create_container_window();
|
container_hwnd = create_container_window();
|
||||||
ShowWindow(container_hwnd, SW_SHOW);
|
ShowWindow(container_hwnd, SW_SHOW);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue