Something went wrong. Try again.
Reactos
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813/* * Copyright 2010 Jacek Caban for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
#include "precomp.h"
#include <test_tlb.h>
#define DEFINE_EXPECT(func) \ static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
#define SET_EXPECT(func) \ do { called_ ## func = FALSE; expect_ ## func = TRUE; } while(0)
#define CHECK_EXPECT2(func) \ do { \ ok(expect_ ##func, "unexpected call " #func "\n"); \ called_ ## func = TRUE; \ }while(0)
#define CHECK_EXPECT(func) \ do { \ CHECK_EXPECT2(func); \ expect_ ## func = FALSE; \ }while(0)
#define CHECK_CALLED(func) \ do { \ ok(called_ ## func, "expected " #func "\n"); \ expect_ ## func = called_ ## func = FALSE; \ }while(0)
#define CLEAR_CALLED(func) \ expect_ ## func = called_ ## func = FALSE
#undef GetClassInfo
DEFINE_EXPECT(CreateInstance);DEFINE_EXPECT(FreezeEvents_TRUE);DEFINE_EXPECT(FreezeEvents_FALSE);DEFINE_EXPECT(QuickActivate);DEFINE_EXPECT(IPersistPropertyBag_InitNew);DEFINE_EXPECT(IPersistPropertyBag_Load);DEFINE_EXPECT(Invoke_READYSTATE);DEFINE_EXPECT(Invoke_ENABLED);DEFINE_EXPECT(Invoke_VALID);DEFINE_EXPECT(Invoke_SECURITYCTX);DEFINE_EXPECT(Invoke_SCRIPTPROP);DEFINE_EXPECT(Invoke_SCRIPTCALL);DEFINE_EXPECT(GetIDsOfNames_scriptprop);DEFINE_EXPECT(DoVerb);DEFINE_EXPECT(SetExtent);DEFINE_EXPECT(GetExtent);DEFINE_EXPECT(SetClientSite);DEFINE_EXPECT(SetClientSite_NULL);DEFINE_EXPECT(Close);DEFINE_EXPECT(InPlaceObject_GetWindow);DEFINE_EXPECT(SetObjectRects);DEFINE_EXPECT(InPlaceDeactivate);DEFINE_EXPECT(UIDeactivate);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_EXPECT(OnAmbientPropertyChange_UNKNOWN);DEFINE_EXPECT(GetTypeInfo);DEFINE_EXPECT(GetClassInfo);DEFINE_EXPECT(FindConnectionPoint);DEFINE_EXPECT(Advise);DEFINE_EXPECT(Unadvise);
#define DISPID_SCRIPTPROP 1000#define DISPID_SCRIPTCALL 1001
enum { TEST_FLASH, TEST_NOQUICKACT, TEST_DISPONLY};
static ITypeInfo *actxtest_typeinfo, *class_typeinfo;static HWND container_hwnd, plugin_hwnd;static int plugin_behavior;static BOOL no_quickact;static LONG activex_refcnt;
#define TESTACTIVEX_CLSID "{178fc163-f585-4e24-9c13-4bb7f6680746}"
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\">" "<param name=\"param_name\" value=\"param_value\">" "<param name=\"num_param\" value=\"3\">" "</object>" "<script>" "objid.scriptCall();" "</script>" "</body></html>";
static const char event_binding_str[] = "<html><head></head><body>" "<object classid=\"clsid:" TESTACTIVEX_CLSID "\" width=\"300\" height=\"200\" id=\"objid\">" "<param name=\"param_name\" value=\"param_value\">" "<param name=\"num_param\" value=\"3\">" "</object>" "<script for=\"objid\" event=\"testfunc\">return 6;</script>" "<script for=\"objid\" event=\"testfunc2(x,y)\">return x+2*y;</script>" "</body></html>";
static REFIID pluginhost_iids[] = { &IID_IOleClientSite, &IID_IAdviseSink, &IID_IAdviseSinkEx, &IID_IPropertyNotifySink, &IID_IDispatch, &IID_IOleWindow, &IID_IOleInPlaceSite, &IID_IOleInPlaceSiteEx, &IID_IOleControlSite, &IID_IBindHost, &IID_IServiceProvider, NULL};
static BOOL iface_cmp(IUnknown *iface1, IUnknown *iface2){ IUnknown *unk1, *unk2;
if(iface1 == iface2) return TRUE;
IUnknown_QueryInterface(iface1, &IID_IUnknown, (void**)&unk1); IUnknown_Release(unk1); IUnknown_QueryInterface(iface2, &IID_IUnknown, (void**)&unk2); IUnknown_Release(unk2);
return unk1 == unk2;}
#define test_ifaces(i,ids) _test_ifaces(__LINE__,i,ids)static void _test_ifaces(unsigned line, IUnknown *iface, REFIID *iids){ const IID * const *piid; IUnknown *unk; HRESULT hres;
for(piid = iids; *piid; piid++) { hres = IUnknown_QueryInterface(iface, *piid, (void**)&unk); ok_(__FILE__,line) (hres == S_OK, "Could not get %s interface: %08x\n", wine_dbgstr_guid(*piid), hres); if(SUCCEEDED(hres)) IUnknown_Release(unk); }}
static int strcmp_wa(LPCWSTR strw, const char *stra){ CHAR buf[512]; WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL); return lstrcmpA(stra, buf);}
static BSTR a2bstr(const char *str){ BSTR ret; int len;
len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); ret = SysAllocStringLen(NULL, len); MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
return ret;}
static IOleClientSite *client_site;static IDispatch *sink_disp;static READYSTATE plugin_readystate = READYSTATE_UNINITIALIZED;static BOOL have_container;
static void set_plugin_readystate(READYSTATE state){ IPropertyNotifySink *prop_notif; HRESULT hres;
plugin_readystate = state;
hres = IOleClientSite_QueryInterface(client_site, &IID_IPropertyNotifySink, (void**)&prop_notif); ok(hres == S_OK, "Could not get IPropertyNotifySink iface: %08x\n", hres);
hres = IPropertyNotifySink_OnChanged(prop_notif, DISPID_READYSTATE); ok(hres == S_OK, "OnChanged(DISPID_READYSTATE) failed: %08x\n", hres);
IPropertyNotifySink_Release(prop_notif);}
static void test_mon_displayname(IMoniker *mon, const char *exname, const char *broken_name){ LPOLESTR display_name; DWORD mksys; HRESULT hres;
hres = IMoniker_GetDisplayName(mon, NULL, NULL, &display_name); ok(hres == S_OK, "GetDisplayName failed: %08x\n", hres); ok(!strcmp_wa(display_name, exname) || broken(broken_name && !strcmp_wa(display_name, broken_name)), "display_name = %s\n", wine_dbgstr_w(display_name)); CoTaskMemFree(display_name);
hres = IMoniker_IsSystemMoniker(mon, &mksys); ok(hres == S_OK, "IsSystemMoniker failed: %08x\n", hres); ok(mksys == MKSYS_URLMONIKER, "mksys = %d\n", mksys);}
static LRESULT WINAPI plugin_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){ switch(msg) { case WM_PAINT: { PAINTSTRUCT ps; HBRUSH brush; RECT rect; HDC dc;
GetClientRect(hwnd, &rect);
dc = BeginPaint(hwnd, &ps); brush = CreateSolidBrush(RGB(255,0,0)); SelectObject(dc, brush); Rectangle(dc, rect.left, rect.top, rect.right, rect.bottom); DeleteObject(brush); EndPaint(hwnd, &ps); break; } }
return DefWindowProcW(hwnd, msg, wParam, lParam);}
static void create_plugin_window(HWND parent, const RECT *rect){ static const WCHAR plugin_testW[] = {'p','l','u','g','i','n',' ','t','e','s','t',0}; static WNDCLASSEXW wndclass = { sizeof(WNDCLASSEXW), 0, plugin_proc, 0, 0, NULL, NULL, NULL, NULL, NULL, plugin_testW, NULL };
RegisterClassExW(&wndclass); plugin_hwnd = CreateWindowW(plugin_testW, plugin_testW, WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN, rect->left, rect->top, rect->right-rect->left, rect->bottom-rect->top, parent, NULL, NULL, NULL);}
static HRESULT WINAPI ConnectionPoint_QueryInterface(IConnectionPoint *iface, REFIID riid, void **ppv){ ok(0, "unexpected QI call %s\n", wine_dbgstr_guid(riid)); return E_NOINTERFACE;}
static ULONG WINAPI ConnectionPoint_AddRef(IConnectionPoint *iface){ return 2;}
static ULONG WINAPI ConnectionPoint_Release(IConnectionPoint *iface){ return 1;}
static HRESULT WINAPI ConnectionPoint_GetConnectionInterface(IConnectionPoint *iface, IID *pIID){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI ConnectionPoint_GetConnectionPointContainer(IConnectionPoint *iface, IConnectionPointContainer **ppCPC){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI ConnectionPoint_Advise(IConnectionPoint *iface, IUnknown *pUnkSink, DWORD *pdwCookie){ DispActiveXTest *ax_test; IDispatchEx *dispex; HRESULT hres;
CHECK_EXPECT(Advise);
hres = IUnknown_QueryInterface(pUnkSink, &IID_IDispatch, (void**)&sink_disp); ok(hres == S_OK, "Could not get IDispatch iface: %08x\n", hres);
hres = IUnknown_QueryInterface(pUnkSink, &IID_IDispatchEx, (void**)&dispex); ok(hres == E_NOINTERFACE, "QueryInterface(IID_IDispatchEx) returned: %08x\n", hres);
hres = IUnknown_QueryInterface(pUnkSink, &DIID_DispActiveXTest, (void**)&ax_test); ok(hres == S_OK, "Could not get DispActiveXTest iface: %08x\n", hres); DispActiveXTest_Release(ax_test);
*pdwCookie = 0xdeadbeef; return S_OK;}
static HRESULT WINAPI ConnectionPoint_Unadvise(IConnectionPoint *iface, DWORD dwCookie){ CHECK_EXPECT(Unadvise);
ok(dwCookie == 0xdeadbeef, "dwCookie = %x\n", dwCookie);
if(sink_disp) { IDispatch_Release(sink_disp); sink_disp = NULL; }
return S_OK;}
static HRESULT WINAPI ConnectionPoint_EnumConnections(IConnectionPoint *iface, IEnumConnections **ppEnum){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static const IConnectionPointVtbl ConnectionPointVtbl = { ConnectionPoint_QueryInterface, ConnectionPoint_AddRef, ConnectionPoint_Release, ConnectionPoint_GetConnectionInterface, ConnectionPoint_GetConnectionPointContainer, ConnectionPoint_Advise, ConnectionPoint_Unadvise, ConnectionPoint_EnumConnections};
static IConnectionPoint ConnectionPoint = { &ConnectionPointVtbl };
static HRESULT ax_qi(REFIID,void**);
static HRESULT WINAPI OleControl_QueryInterface(IOleControl *iface, REFIID riid, void **ppv){ return ax_qi(riid, ppv);}
static ULONG WINAPI OleControl_AddRef(IOleControl *iface){ return ++activex_refcnt;}
static ULONG WINAPI OleControl_Release(IOleControl *iface){ return --activex_refcnt;}
static HRESULT WINAPI OleControl_GetControlInfo(IOleControl *iface, CONTROLINFO *pCI){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI OleControl_OnMnemonic(IOleControl *iface, MSG *mMsg){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID dispID){ switch(dispID) { case DISPID_UNKNOWN: CHECK_EXPECT2(OnAmbientPropertyChange_UNKNOWN); break; default: ok(0, "unexpected call %d\n", dispID); }
return S_OK;}
static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL bFreeze){ if(bFreeze) CHECK_EXPECT2(FreezeEvents_TRUE); else CHECK_EXPECT2(FreezeEvents_FALSE); return S_OK;}
static const IOleControlVtbl OleControlVtbl = { OleControl_QueryInterface, OleControl_AddRef, OleControl_Release, OleControl_GetControlInfo, OleControl_OnMnemonic, OleControl_OnAmbientPropertyChange, OleControl_FreezeEvents};
static IOleControl OleControl = { &OleControlVtbl };
static HRESULT WINAPI QuickActivate_QueryInterface(IQuickActivate *iface, REFIID riid, void **ppv){ return ax_qi(riid, ppv);}
static ULONG WINAPI QuickActivate_AddRef(IQuickActivate *iface){ return ++activex_refcnt;}
static ULONG WINAPI QuickActivate_Release(IQuickActivate *iface){ return --activex_refcnt;}
static HRESULT WINAPI QuickActivate_QuickActivate(IQuickActivate *iface, QACONTAINER *container, QACONTROL *control){ CHECK_EXPECT(QuickActivate);
ok(container != NULL, "container == NULL\n"); ok(container->cbSize == sizeof(*container), "container->cbSize = %d\n", container->cbSize); ok(container->pClientSite != NULL, "container->pClientSite == NULL\n"); ok(container->pAdviseSink != NULL, "container->pAdviseSink == NULL\n"); ok(container->pPropertyNotifySink != NULL, "container->pPropertyNotifySink == NULL\n"); ok(!container->pUnkEventSink, "container->pUnkEventSink != NULL\n"); ok(container->dwAmbientFlags == (QACONTAINER_SUPPORTSMNEMONICS|QACONTAINER_MESSAGEREFLECT|QACONTAINER_USERMODE), "container->dwAmbientFlags = %x\n", container->dwAmbientFlags); if(have_container) ok(!container->colorFore, "container->colorFore = %d\n", container->colorFore); /* FIXME */ todo_wine ok(container->colorBack, "container->colorBack == 0\n"); /* FIXME */ if(have_container) todo_wine ok(container->pFont != NULL, "container->pFont == NULL\n"); else ok(!container->pFont, "container->pFont = %p\n", container->pFont); todo_wine ok(container->pUndoMgr != NULL, "container->pUndoMgr == NULL\n"); ok(!container->dwAppearance, "container->dwAppearance = %x\n", container->dwAppearance); if(have_container) ok(!container->lcid, "container->lcid = %x\n", container->lcid); ok(!container->hpal, "container->hpal = %p\n", container->hpal); ok(!container->pBindHost, "container->pBindHost != NULL\n"); ok(!container->pOleControlSite, "container->pOleControlSite != NULL\n"); ok(!container->pServiceProvider, "container->pServiceProvider != NULL\n");
ok(control->cbSize == sizeof(*control), "control->cbSize = %d\n", control->cbSize); ok(!control->dwMiscStatus, "control->dwMiscStatus = %x\n", control->dwMiscStatus); ok(!control->dwViewStatus, "control->dwViewStatus = %x\n", control->dwViewStatus); ok(!control->dwEventCookie, "control->dwEventCookie = %x\n", control->dwEventCookie); ok(!control->dwPropNotifyCookie, "control->dwPropNotifyCookie = %x\n", control->dwPropNotifyCookie); ok(!control->dwPointerActivationPolicy, "control->dwPointerActivationPolicy = %x\n", control->dwPointerActivationPolicy);
ok(iface_cmp((IUnknown*)container->pClientSite, (IUnknown*)container->pAdviseSink), "container->pClientSite != container->pAdviseSink\n"); ok(iface_cmp((IUnknown*)container->pClientSite, (IUnknown*)container->pPropertyNotifySink), "container->pClientSite != container->pPropertyNotifySink\n"); test_ifaces((IUnknown*)container->pClientSite, pluginhost_iids);
IOleClientSite_AddRef(container->pClientSite); client_site = container->pClientSite;
control->dwMiscStatus = OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|OLEMISC_INSIDEOUT |OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE; control->dwViewStatus = 0x18; control->dwPropNotifyCookie = 1;
return S_OK;}
static HRESULT WINAPI QuickActivate_SetContentExtent(IQuickActivate *iface, LPSIZEL pSizel){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI QuickActivate_GetContentExtent(IQuickActivate *iface, LPSIZEL pSizel){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static const IQuickActivateVtbl QuickActivateVtbl = { QuickActivate_QueryInterface, QuickActivate_AddRef, QuickActivate_Release, QuickActivate_QuickActivate, QuickActivate_GetContentExtent, QuickActivate_SetContentExtent};
static IQuickActivate QuickActivate = { &QuickActivateVtbl };
static HRESULT WINAPI PersistPropertyBag_QueryInterface(IPersistPropertyBag *iface, REFIID riid, void **ppv){ return ax_qi(riid, ppv);}
static ULONG WINAPI PersistPropertyBag_AddRef(IPersistPropertyBag *iface){ return ++activex_refcnt;}
static ULONG WINAPI PersistPropertyBag_Release(IPersistPropertyBag *iface){ return --activex_refcnt;}
static HRESULT WINAPI PersistPropertyBag_GetClassID(IPersistPropertyBag *face, CLSID *pClassID){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI PersistPropertyBag_InitNew(IPersistPropertyBag *face){ CHECK_EXPECT(IPersistPropertyBag_InitNew); return S_OK;}
static HRESULT WINAPI PersistPropertyBag_Load(IPersistPropertyBag *face, IPropertyBag *pPropBag, IErrorLog *pErrorLog){ IBindHost *bind_host, *bind_host2; IServiceProvider *sp; IMoniker *mon; VARIANT v; HRESULT hres;
static const WCHAR param_nameW[] = {'p','a','r','a','m','_','n','a','m','e',0}; static const WCHAR num_paramW[] = {'n','u','m','_','p','a','r','a','m',0}; static const WCHAR no_paramW[] = {'n','o','_','p','a','r','a','m',0}; static WCHAR test_swfW[] = {'t','e','s','t','.','s','w','f',0};
static const IID *propbag_ifaces[] = { &IID_IPropertyBag, &IID_IPropertyBag2, NULL };
CHECK_EXPECT(IPersistPropertyBag_Load);
ok(pPropBag != NULL, "pPropBag == NULL\n"); ok(!pErrorLog, "pErrorLog != NULL\n");
test_ifaces((IUnknown*)pPropBag, propbag_ifaces);
V_VT(&v) = VT_BSTR; hres = IPropertyBag_Read(pPropBag, param_nameW, &v, NULL); ok(hres == S_OK, "Read failed: %08x\n", hres); ok(V_VT(&v) == VT_BSTR, "V_VT(&v) = %d\n", V_VT(&v)); ok(!strcmp_wa(V_BSTR(&v), "param_value"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
V_VT(&v) = VT_I4; V_I4(&v) = 0xdeadbeef; hres = IPropertyBag_Read(pPropBag, param_nameW, &v, NULL); ok(hres == DISP_E_TYPEMISMATCH, "Read failed: %08x, expected DISP_E_TYPEMISMATCH\n", hres); ok(V_VT(&v) == VT_I4, "V_VT(&v) = %d\n", V_VT(&v)); ok(V_I4(&v) == 0xdeadbeef, "V_I4(v) = %x\n", V_I4(&v));
V_VT(&v) = VT_BSTR; hres = IPropertyBag_Read(pPropBag, num_paramW, &v, NULL); ok(hres == S_OK, "Read failed: %08x\n", hres); ok(V_VT(&v) == VT_BSTR, "V_VT(&v) = %d\n", V_VT(&v)); ok(!strcmp_wa(V_BSTR(&v), "3"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v))); SysFreeString(V_BSTR(&v));
V_VT(&v) = VT_I4; V_I4(&v) = 0xdeadbeef; hres = IPropertyBag_Read(pPropBag, num_paramW, &v, NULL); ok(hres == S_OK, "Read failed: %08x\n", hres); ok(V_VT(&v) == VT_I4, "V_VT(&v) = %d\n", V_VT(&v)); ok(V_I4(&v) == 3, "V_I4(v) = %x\n", V_I4(&v));
V_VT(&v) = VT_BSTR; V_BSTR(&v) = (BSTR)0xdeadbeef; hres = IPropertyBag_Read(pPropBag, no_paramW, &v, NULL); ok(hres == E_INVALIDARG, "Read failed: %08x\n", hres); ok(V_VT(&v) == VT_BSTR, "V_VT(&v) = %d\n", V_VT(&v)); ok(V_BSTR(&v) == (BSTR)0xdeadbeef, "V_BSTR(v) = %p\n", V_BSTR(&v));
set_plugin_readystate(READYSTATE_INTERACTIVE);
hres = IOleClientSite_QueryInterface(client_site, &IID_IBindHost, (void**)&bind_host); ok(hres == S_OK, "Could not get IBindHost iface: %08x\n", hres);
hres = IOleClientSite_QueryInterface(client_site, &IID_IServiceProvider, (void**)&sp); ok(hres == S_OK, "Could not get IServiceProvider iface: %08x\n", hres);
hres = IServiceProvider_QueryService(sp, &SID_SBindHost, &IID_IBindHost, (void**)&bind_host2); ok(hres == S_OK, "QueryService(SID_SBindHost) failed: %08x\n", hres); IServiceProvider_Release(sp);
ok(iface_cmp((IUnknown*)bind_host, (IUnknown*)bind_host2), "bind_host != bind_host2\n"); IBindHost_Release(bind_host2);
mon = NULL; hres = IBindHost_CreateMoniker(bind_host, test_swfW, NULL, &mon, 0); ok(hres == S_OK, "CreateMoniker failed: %08x\n", hres); ok(mon != NULL, "mon == NULL\n"); test_mon_displayname(mon, "about:test.swf", "about:blanktest.swf"); IMoniker_Release(mon);
IBindHost_Release(bind_host);
mon = NULL; hres = IOleClientSite_GetMoniker(client_site, OLEGETMONIKER_ONLYIFTHERE, OLEWHICHMK_CONTAINER, &mon); ok(hres == S_OK, "GetMoniker failed: %08x\n", hres); ok(mon != NULL, "mon == NULL\n"); test_mon_displayname(mon, "about:blank", NULL); IMoniker_Release(mon);
set_plugin_readystate(READYSTATE_COMPLETE);
return S_OK;}
static HRESULT WINAPI PersistPropertyBag_Save(IPersistPropertyBag *face, IPropertyBag *pPropBag, BOOL fClearDisrty, BOOL fSaveAllProperties){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static const IPersistPropertyBagVtbl PersistPropertyBagVtbl = { PersistPropertyBag_QueryInterface, PersistPropertyBag_AddRef, PersistPropertyBag_Release, PersistPropertyBag_GetClassID, PersistPropertyBag_InitNew, PersistPropertyBag_Load, PersistPropertyBag_Save
};
static IPersistPropertyBag PersistPropertyBag = { &PersistPropertyBagVtbl };
static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv){ return ax_qi(riid, ppv);}
static ULONG WINAPI Dispatch_AddRef(IDispatch *iface){ return ++activex_refcnt;}
static ULONG WINAPI Dispatch_Release(IDispatch *iface){ return --activex_refcnt;}
static HRESULT WINAPI Dispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI Dispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo){ CHECK_EXPECT(GetTypeInfo);
ITypeInfo_AddRef(actxtest_typeinfo); *ppTInfo = actxtest_typeinfo; return S_OK;}
static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId){ ok(IsEqualGUID(riid, &IID_NULL), "riid = %s\n", wine_dbgstr_guid(riid)); ok(cNames == 1, "cNames = %d\n", cNames); ok(rgszNames != NULL, "rgszNames == NULL\n"); ok(rgDispId != NULL, "rgDispId == NULL\n");
if(!strcmp_wa(rgszNames[0], "scriptprop")) { CHECK_EXPECT(GetIDsOfNames_scriptprop); *rgDispId = DISPID_SCRIPTPROP; }else if(!strcmp_wa(rgszNames[0], "scriptCall")) { *rgDispId = DISPID_SCRIPTCALL; }else { ok(0, "rgszNames[0] = %s\n", wine_dbgstr_w(rgszNames[0])); }
return S_OK;}
static HRESULT WINAPI Dispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr){ ok(IsEqualGUID(riid, &IID_NULL), "riid = %s\n", wine_dbgstr_guid(riid)); ok(pDispParams != NULL, "pDispParams == NULL\n"); ok(!pDispParams->cNamedArgs, "pDispParams->cNamedArgs = %d\n", pDispParams->cNamedArgs); ok(!pDispParams->rgdispidNamedArgs, "pDispParams->rgdispidNamedArgs != NULL\n");
switch(dispIdMember) { case DISPID_READYSTATE: CHECK_EXPECT2(Invoke_READYSTATE); ok(wFlags == DISPATCH_PROPERTYGET, "wFlags = %x\n", wFlags); ok(!pDispParams->cArgs, "pDispParams->cArgs = %d\n", pDispParams->cArgs); ok(!pDispParams->rgvarg, "pDispParams->rgvarg != NULL\n"); ok(!pExcepInfo, "pExcepInfo != NULL\n"); ok(puArgErr != NULL, "puArgErr == NULL\n"); ok(pVarResult != NULL, "pVarResult == NULL\n");
V_VT(pVarResult) = VT_I4; V_I4(pVarResult) = plugin_readystate; return S_OK; case DISPID_ENABLED: CHECK_EXPECT2(Invoke_ENABLED); ok(wFlags == DISPATCH_PROPERTYGET, "wFlags = %x\n", wFlags); ok(!pDispParams->cArgs, "pDispParams->cArgs = %d\n", pDispParams->cArgs); ok(!pDispParams->rgvarg, "pDispParams->rgvarg != NULL\n"); ok(!pExcepInfo, "pExcepInfo != NULL\n"); ok(puArgErr != NULL, "puArgErr == NULL\n"); ok(pVarResult != NULL, "pVarResult == NULL\n"); return DISP_E_MEMBERNOTFOUND; case DISPID_VALID: CHECK_EXPECT(Invoke_VALID); ok(wFlags == DISPATCH_PROPERTYGET, "wFlags = %x\n", wFlags); ok(!pDispParams->cArgs, "pDispParams->cArgs = %d\n", pDispParams->cArgs); ok(!pDispParams->rgvarg, "pDispParams->rgvarg != NULL\n"); ok(!pExcepInfo, "pExcepInfo != NULL\n"); ok(puArgErr != NULL, "puArgErr == NULL\n"); ok(pVarResult != NULL, "pVarResult == NULL\n"); return DISP_E_MEMBERNOTFOUND; case DISPID_SECURITYCTX: CHECK_EXPECT(Invoke_SECURITYCTX); ok(wFlags == DISPATCH_PROPERTYGET, "wFlags = %x\n", wFlags); ok(!pDispParams->cArgs, "pDispParams->cArgs = %d\n", pDispParams->cArgs); ok(!pDispParams->rgvarg, "pDispParams->rgvarg != NULL\n"); ok(!pExcepInfo, "pExcepInfo != NULL\n"); ok(puArgErr != NULL, "puArgErr == NULL\n"); ok(pVarResult != NULL, "pVarResult == NULL\n"); return DISP_E_MEMBERNOTFOUND; case DISPID_SCRIPTPROP: CHECK_EXPECT(Invoke_SCRIPTPROP); ok(wFlags == DISPATCH_PROPERTYGET, "wFlags = %x\n", wFlags); ok(!pDispParams->cArgs, "pDispParams->cArgs = %d\n", pDispParams->cArgs); ok(!pDispParams->rgvarg, "pDispParams->rgvarg != NULL\n"); ok(pExcepInfo != NULL, "pExcepInfo == NULL\n"); ok(!puArgErr, "puArgErr != NULL\n"); ok(pVarResult != NULL, "pVarResult == NULL\n");
V_VT(pVarResult) = VT_I4; V_I4(pVarResult) = 4; return S_OK; case DISPID_SCRIPTCALL: CHECK_EXPECT(Invoke_SCRIPTCALL); ok(wFlags == DISPATCH_METHOD, "wFlags = %x\n", wFlags); ok(!pDispParams->cArgs, "pDispParams->cArgs = %d\n", pDispParams->cArgs); ok(pExcepInfo != NULL, "pExcepInfo == NULL\n"); ok(!puArgErr, "puArgErr != NULL\n"); ok(!pVarResult, "pVarResult != NULL\n"); /* V_VT(pVarResult) = VT_I4; V_I4(pVarResult) = 4; */ return S_OK; default: ok(0, "unexpected call %d\n", dispIdMember); }
return E_NOTIMPL;}
static const IDispatchVtbl DispatchVtbl = { Dispatch_QueryInterface, Dispatch_AddRef, Dispatch_Release, Dispatch_GetTypeInfoCount, Dispatch_GetTypeInfo, Dispatch_GetIDsOfNames, Dispatch_Invoke};
static IDispatch Dispatch = { &DispatchVtbl };
static HRESULT WINAPI ProvideClassInfo_QueryInterface(IProvideClassInfo *iface, REFIID riid, void **ppv){ return ax_qi(riid, ppv);}
static ULONG WINAPI ProvideClassInfo_AddRef(IProvideClassInfo *iface){ return ++activex_refcnt;}
static ULONG WINAPI ProvideClassInfo_Release(IProvideClassInfo *iface){ return --activex_refcnt;}
static HRESULT WINAPI ProvideClassInfo_GetClassInfo(IProvideClassInfo *iface, ITypeInfo **ppTI){ CHECK_EXPECT(GetClassInfo);
ITypeInfo_AddRef(class_typeinfo); *ppTI = class_typeinfo; return S_OK;}
static const IProvideClassInfoVtbl ProvideClassInfoVtbl = { ProvideClassInfo_QueryInterface, ProvideClassInfo_AddRef, ProvideClassInfo_Release, ProvideClassInfo_GetClassInfo};
static IProvideClassInfo ProvideClassInfo = { &ProvideClassInfoVtbl };
static HRESULT WINAPI ConnectionPointContainer_QueryInterface(IConnectionPointContainer *iface, REFIID riid, void **ppv){ return ax_qi(riid, ppv);}
static ULONG WINAPI ConnectionPointContainer_AddRef(IConnectionPointContainer *iface){ return ++activex_refcnt;}
static ULONG WINAPI ConnectionPointContainer_Release(IConnectionPointContainer *iface){ return --activex_refcnt;}
static HRESULT WINAPI ConnectionPointContainer_EnumConnectionPoints(IConnectionPointContainer *iface, IEnumConnectionPoints **ppEnum){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI ConnectionPointContainer_FindConnectionPoint(IConnectionPointContainer *iface, REFIID riid, IConnectionPoint **ppCP){ if(IsEqualGUID(riid, &IID_IPropertyNotifySink)) { /* TODO */ trace("FindConnectionPoint(IID_IPropertyNotifySink)\n"); return CONNECT_E_NOCONNECTION; }
CHECK_EXPECT(FindConnectionPoint); ok(IsEqualGUID(riid, &DIID_DispActiveXTest), "riid = %s\n", wine_dbgstr_guid(riid));
IConnectionPoint_AddRef(&ConnectionPoint); *ppCP = &ConnectionPoint; return S_OK;}
static const IConnectionPointContainerVtbl ConnectionPointContainerVtbl = { ConnectionPointContainer_QueryInterface, ConnectionPointContainer_AddRef, ConnectionPointContainer_Release, ConnectionPointContainer_EnumConnectionPoints, ConnectionPointContainer_FindConnectionPoint};
static IConnectionPointContainer ConnectionPointContainer = { &ConnectionPointContainerVtbl };
static HRESULT WINAPI ViewObjectEx_QueryInterface(IViewObjectEx *iface, REFIID riid, void **ppv){ return ax_qi(riid, ppv);}
static ULONG WINAPI ViewObjectEx_AddRef(IViewObjectEx *iface){ return ++activex_refcnt;}
static ULONG WINAPI ViewObjectEx_Release(IViewObjectEx *iface){ return --activex_refcnt;}
static HRESULT WINAPI ViewObjectEx_Draw(IViewObjectEx *iface, DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcTargetDev, HDC hdcDraw, LPCRECTL lprcBounds, LPCRECTL lprcWBoungs, BOOL (WINAPI*pfnContinue)(ULONG_PTR), ULONG_PTR dwContinue){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI ViewObjectEx_GetColorSet(IViewObjectEx *iface, DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hicTargetDev, LOGPALETTE **ppColorSet){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI ViewObjectEx_Freeze(IViewObjectEx *iface, DWORD dwDrawAspect, LONG lindex, void *pvAspect, DWORD *pdwFreeze){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI ViewObjectEx_Unfreeze(IViewObjectEx *iface, DWORD dwFreeze){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI ViewObjectEx_SetAdvise(IViewObjectEx *iface, DWORD aspects, DWORD advf, IAdviseSink *pAdvSink){ CHECK_EXPECT(SetAdvise);
ok(aspects == DVASPECT_CONTENT, "aspects = %x\n", aspects); ok(!advf, "advf = %x\n", advf); ok(pAdvSink != NULL, "pAdvSink = NULL\n");
return S_OK;}
static HRESULT WINAPI ViewObjectEx_GetAdvise(IViewObjectEx *iface, DWORD *pAspects, DWORD *pAdvf, IAdviseSink **ppAdvSink){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI ViewObjectEx_GetExtent(IViewObjectEx *iface, DWORD dwDrawAspect, LONG lindex, DVTARGETDEVICE *ptd, LPSIZEL lpsizel){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI ViewObjectEx_GetRect(IViewObjectEx *iface, DWORD dwAspect, LPRECTL pRect){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI ViewObjectEx_GetViewStatus(IViewObjectEx *iface, DWORD *pdwStatus){ CHECK_EXPECT(GetViewStatus);
*pdwStatus = VIEWSTATUS_OPAQUE|VIEWSTATUS_SOLIDBKGND; return S_OK;}
static HRESULT WINAPI ViewObjectEx_QueryHitPoint(IViewObjectEx *iface, DWORD dwAspect, LPCRECT pRectBounds, POINT ptlLoc, LONG lCloseHint, DWORD *pHitResult){ trace("QueryHitPoint call ignored\n"); return E_NOTIMPL;}
static HRESULT WINAPI ViewObjectEx_QueryHitRect(IViewObjectEx *iface, DWORD dwAspect, LPCRECT pRectBounds, LPCRECT pRectLoc, LONG lCloseHint, DWORD *pHitResult){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI ViewObjectEx_GetNaturalExtent(IViewObjectEx *iface, DWORD dwAspect, LONG lindex, DVTARGETDEVICE *ptd, HDC hicTargetDev, DVEXTENTINFO *pExtentIngo, LPSIZEL pSizel){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static const IViewObjectExVtbl ViewObjectExVtbl = { ViewObjectEx_QueryInterface, ViewObjectEx_AddRef, ViewObjectEx_Release, ViewObjectEx_Draw, ViewObjectEx_GetColorSet, ViewObjectEx_Freeze, ViewObjectEx_Unfreeze, ViewObjectEx_SetAdvise, ViewObjectEx_GetAdvise, ViewObjectEx_GetExtent, ViewObjectEx_GetRect, ViewObjectEx_GetViewStatus, ViewObjectEx_QueryHitPoint, ViewObjectEx_QueryHitRect, ViewObjectEx_GetNaturalExtent};
static IViewObjectEx ViewObjectEx = { &ViewObjectExVtbl };
static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **ppv){ return ax_qi(riid, ppv);}
static ULONG WINAPI OleObject_AddRef(IOleObject *iface){ return ++activex_refcnt;}
static ULONG WINAPI OleObject_Release(IOleObject *iface){ return --activex_refcnt;}
static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite *pClientSite){ if(!pClientSite) { CHECK_EXPECT(SetClientSite_NULL); return S_OK; }
CHECK_EXPECT(SetClientSite);
IOleClientSite_AddRef(pClientSite); client_site = pClientSite; return S_OK;}
static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, IOleClientSite **ppClientSite){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR szContainerApp, LPCOLESTR szContainerObj){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption){ CHECK_EXPECT(Close);
ok(dwSaveOption == OLECLOSE_NOSAVE, "dwSaveOption = %d\n", dwSaveOption); return S_OK;}
static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD dwWhichMoniker, IMoniker *pmk){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI OleObject_GetMoniker(IOleObject *iface, DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI OleObject_InitFromData(IOleObject *iface, IDataObject *pDataObject, BOOL fCreation, DWORD dwReserved){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI OleObject_GetClipboardData(IOleObject *iface, DWORD dwReserved, IDataObject **ppDataObject){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect){ OLEINPLACEFRAMEINFO frame_info = {0xdeadbeef}; IOleInPlaceUIWindow *ip_uiwindow; IOleInPlaceFrame *ip_frame; IOleInPlaceSiteEx *ip_site; RECT pos_rect, clip_rect; BOOL no_redraw; HWND hwnd; HRESULT hres;
CHECK_EXPECT(DoVerb);
ok(iVerb == OLEIVERB_INPLACEACTIVATE, "iVerb = %d\n", iVerb); ok(!lpmsg, "lpmsg != NULL\n"); ok(pActiveSite != NULL, "pActiveSite == NULL\n"); ok(!lindex, "lindex = %d\n", lindex); ok(hwndParent != NULL, "hwndParent == NULL\n"); ok(lprcPosRect != NULL, "lprcPosRect == NULL\n");
hres = IOleClientSite_QueryInterface(pActiveSite, &IID_IOleInPlaceSiteEx, (void**)&ip_site); ok(hres == S_OK, "Could not get IOleInPlaceSiteEx iface: %08x\n", hres);
hres = IOleInPlaceSiteEx_CanInPlaceActivate(ip_site); ok(hres == S_OK, "CanInPlaceActivate failed: %08x\n", hres);
SET_EXPECT(InPlaceObject_GetWindow); no_redraw = 0xdeadbeef; hres = IOleInPlaceSiteEx_OnInPlaceActivateEx(ip_site, &no_redraw, 0); ok(hres == S_OK, "InPlaceActivateEx failed: %08x\n", hres); ok(!no_redraw, "no_redraw = %x\n", no_redraw); CHECK_CALLED(InPlaceObject_GetWindow);
no_redraw = 0xdeadbeef; hres = IOleInPlaceSiteEx_OnInPlaceActivateEx(ip_site, &no_redraw, 0); ok(hres == S_OK, "InPlaceActivateEx failed: %08x\n", hres); ok(no_redraw == 0xdeadbeef, "no_redraw = %x\n", no_redraw);
hwnd = NULL; hres = IOleInPlaceSiteEx_GetWindow(ip_site, &hwnd); ok(hres == S_OK, "GetWindow failed: %08x\n", hres); ok(hwnd != NULL, "hwnd == NULL\n"); ok(hwnd == hwndParent, "hwnd != hwndParent\n");
create_plugin_window(hwnd, lprcPosRect);
ip_frame = NULL; ip_uiwindow = NULL; frame_info.cb = sizeof(OLEINPLACEFRAMEINFO); hres = IOleInPlaceSiteEx_GetWindowContext(ip_site, &ip_frame, &ip_uiwindow, &pos_rect, &clip_rect, &frame_info); ok(hres == S_OK, "GetWindowContext failed: %08x\n", hres); ok(ip_frame != NULL, "ip_frame == NULL\n"); ok(ip_uiwindow != NULL, "ip_uiwindow == NULL\n"); ok((IOleInPlaceUIWindow*)ip_frame != ip_uiwindow, "ip_frame == ip_uiwindow\n"); ok(!memcmp(&pos_rect, lprcPosRect, sizeof(RECT)), "pos_rect != lpecPosRect\n"); ok(!memcmp(&clip_rect, lprcPosRect, sizeof(RECT)), "clip_rect != lpecPosRect\n"); ok(frame_info.cb == sizeof(frame_info), "frame_info.cb = %d\n", frame_info.cb); ok(!frame_info.fMDIApp, "frame_info.fMDIApp = %x\n", frame_info.fMDIApp); ok(frame_info.hwndFrame != NULL, "frame_info.hwnd == NULL\n"); ok(frame_info.hwndFrame == container_hwnd, "frame_info.hwnd != container_hwnd\n"); ok(!frame_info.haccel, "frame_info.haccel != 0\n"); ok(!frame_info.cAccelEntries, "frame_info.cAccelEntried != 0\n");
IOleInPlaceFrame_Release(ip_frame); IOleInPlaceUIWindow_Release(ip_uiwindow);
IOleInPlaceSiteEx_Release(ip_site);
hres = IOleClientSite_ShowObject(client_site); ok(hres == S_OK, "ShowObject failed: %08x\n", hres);
SET_EXPECT(InPlaceObject_GetWindow); SET_EXPECT(SetObjectRects);
return S_OK;}
static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **ppEnumOleVerb){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI OleObject_Update(IOleObject *iface){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI OleObject_IsUpToDate(IOleObject *iface){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI OleObject_GetUserClassID(IOleObject *iface, CLSID *pClsid){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI OleObject_GetUserType(IOleObject *iface, DWORD dwFormOfType, LPOLESTR *pszUserType){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI OleObject_SetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel){ CHECK_EXPECT(SetExtent); return E_NOTIMPL;}
static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel){ CHECK_EXPECT(GetExtent); return E_NOTIMPL;}
static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *pAdvSink, DWORD *pdwConnection){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD dwConnection){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **ppenumAdvise){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD dwAspect, DWORD *pdwStatus){ CHECK_EXPECT(GetMiscStatus); ok(dwAspect == DVASPECT_CONTENT, "dwAspect = %d\n", dwAspect); ok(pdwStatus != NULL, "pdwStatus == NULL\n"); *pdwStatus = OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE |OLEMISC_INSIDEOUT|OLEMISC_CANTLINKINSIDE|OLEMISC_RECOMPOSEONRESIZE; return S_OK;}
static HRESULT WINAPI OleObject_SetColorScheme(IOleObject *iface, LOGPALETTE *pLogpal){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static const IOleObjectVtbl OleObjectVtbl = { OleObject_QueryInterface, OleObject_AddRef, OleObject_Release, OleObject_SetClientSite, OleObject_GetClientSite, OleObject_SetHostNames, OleObject_Close, OleObject_SetMoniker, OleObject_GetMoniker, OleObject_InitFromData, OleObject_GetClipboardData, OleObject_DoVerb, OleObject_EnumVerbs, OleObject_Update, OleObject_IsUpToDate, OleObject_GetUserClassID, OleObject_GetUserType, OleObject_SetExtent, OleObject_GetExtent, OleObject_Advise, OleObject_Unadvise, OleObject_EnumAdvise, OleObject_GetMiscStatus, OleObject_SetColorScheme};
static IOleObject OleObject = { &OleObjectVtbl };
static HRESULT WINAPI OleInPlaceObject_QueryInterface(IOleInPlaceObjectWindowless *iface, REFIID riid, void **ppv){ return ax_qi(riid, ppv);}
static ULONG WINAPI OleInPlaceObject_AddRef(IOleInPlaceObjectWindowless *iface){ return ++activex_refcnt;}
static ULONG WINAPI OleInPlaceObject_Release(IOleInPlaceObjectWindowless *iface){ return --activex_refcnt;}
static HRESULT WINAPI OleInPlaceObject_GetWindow(IOleInPlaceObjectWindowless *iface, HWND *phwnd){ CHECK_EXPECT2(InPlaceObject_GetWindow);
ok(phwnd != NULL, "phwnd == NULL\n");
*phwnd = plugin_hwnd; return *phwnd ? S_OK : E_UNEXPECTED;}
static HRESULT WINAPI OleInPlaceObject_ContextSensitiveHelp(IOleInPlaceObjectWindowless *iface, BOOL fEnterMode){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI OleInPlaceObject_InPlaceDeactivate(IOleInPlaceObjectWindowless *iface){ IOleInPlaceSite *ip_site; HRESULT hres;
CHECK_EXPECT(InPlaceDeactivate);
hres = IOleClientSite_QueryInterface(client_site, &IID_IOleInPlaceSite, (void**)&ip_site); ok(hres == S_OK, "Could not get IOleInPlaceSite iface: %08x\n", hres);
hres = IOleInPlaceSite_OnInPlaceDeactivate(ip_site); ok(hres == S_OK, "OnInPlaceDeactivate failed: %08x\n", hres);
IOleInPlaceSite_Release(ip_site); return S_OK;}
static HRESULT WINAPI OleInPlaceObject_UIDeactivate(IOleInPlaceObjectWindowless *iface){ CHECK_EXPECT2(UIDeactivate); return S_OK;}
static HRESULT WINAPI OleInPlaceObject_SetObjectRects(IOleInPlaceObjectWindowless *iface, LPCRECT lprcPosRect, LPCRECT lprcClipRect){ CHECK_EXPECT2(SetObjectRects); return S_OK;}
static HRESULT WINAPI OleInPlaceObjectWindowless_ReactivateAndUndo(IOleInPlaceObjectWindowless *iface){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI OleInPlaceObjectWindowless_OnWindowMessage(IOleInPlaceObjectWindowless *iface, UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *lpResult){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI OleInPlaceObjectWindowless_GetDropTarget(IOleInPlaceObjectWindowless *iface, IDropTarget **ppDropTarget){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static const IOleInPlaceObjectWindowlessVtbl OleInPlaceObjectWindowlessVtbl = { OleInPlaceObject_QueryInterface, OleInPlaceObject_AddRef, OleInPlaceObject_Release, OleInPlaceObject_GetWindow, OleInPlaceObject_ContextSensitiveHelp, OleInPlaceObject_InPlaceDeactivate, OleInPlaceObject_UIDeactivate, OleInPlaceObject_SetObjectRects, OleInPlaceObjectWindowless_ReactivateAndUndo, OleInPlaceObjectWindowless_OnWindowMessage, OleInPlaceObjectWindowless_GetDropTarget};
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)) { *ppv = plugin_behavior == TEST_DISPONLY ? NULL : &OleControl; }else if(IsEqualGUID(riid, &IID_IQuickActivate)) { *ppv = no_quickact ? NULL : &QuickActivate; }else if(IsEqualGUID(riid, &IID_IPersistPropertyBag)) { *ppv = no_quickact ? NULL : &PersistPropertyBag; }else if(IsEqualGUID(riid, &IID_IDispatch)) { *ppv = &Dispatch; }else if(IsEqualGUID(riid, &IID_IProvideClassInfo)) { *ppv = &ProvideClassInfo; }else if(IsEqualGUID(riid, &IID_IConnectionPointContainer)) { *ppv = plugin_behavior != TEST_DISPONLY ? &ConnectionPointContainer : NULL; }else if(IsEqualGUID(riid, &IID_IViewObject) || IsEqualGUID(riid, &IID_IViewObject2) || IsEqualGUID(riid, &IID_IViewObjectEx)) { *ppv = plugin_behavior == TEST_DISPONLY ? NULL : &ViewObjectEx; }else if(IsEqualGUID(riid, &IID_IOleObject)) { *ppv = plugin_behavior == TEST_DISPONLY ? NULL : &OleObject; }else if(IsEqualGUID(riid, &IID_ITestActiveX)) { CHECK_EXPECT(QI_ITestActiveX); *ppv = &wrapped_iface; return S_OK; }else if(IsEqualGUID(riid, &IID_IOleWindow) || IsEqualGUID(riid, &IID_IOleInPlaceObject) || IsEqualGUID(&IID_IOleInPlaceObjectWindowless, riid)) { *ppv = plugin_behavior == TEST_DISPONLY ? NULL : &OleInPlaceObjectWindowless; }else { trace("QI %s\n", wine_dbgstr_guid(riid)); *ppv = NULL; }
if(!*ppv) return E_NOINTERFACE;
IUnknown_AddRef((IUnknown*)*ppv); return S_OK;}
static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv){ *ppv = NULL;
if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IClassFactory, riid)) { *ppv = iface; return S_OK; }
if(IsEqualGUID(&IID_IMarshal, riid)) return E_NOINTERFACE; if(IsEqualGUID(&CLSID_IdentityUnmarshal, riid)) return E_NOINTERFACE; if(IsEqualGUID(&IID_IClassFactoryEx, riid)) return E_NOINTERFACE; /* TODO */
ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid)); return E_NOTIMPL;}
static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface){ return 2;}
static ULONG WINAPI ClassFactory_Release(IClassFactory *iface){ return 1;}
static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **ppv){ CHECK_EXPECT(CreateInstance);
ok(!outer, "outer = %p\n", outer); ok(IsEqualGUID(riid, &IID_IUnknown), "riid = %s\n", wine_dbgstr_guid(riid));
activex_refcnt++; *ppv = &OleControl; return S_OK;}
static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL dolock){ ok(0, "unexpected call\n"); return S_OK;}
static const IClassFactoryVtbl ClassFactoryVtbl = { ClassFactory_QueryInterface, ClassFactory_AddRef, ClassFactory_Release, ClassFactory_CreateInstance, ClassFactory_LockServer};
static IClassFactory activex_cf = { &ClassFactoryVtbl };
static void test_elem_dispex(IDispatchEx *dispex){ DISPPARAMS dp; EXCEPINFO ei; VARIANT v; DISPID id; BSTR str; HRESULT hres;
str = a2bstr("scriptprop"); SET_EXPECT(GetIDsOfNames_scriptprop); hres = IDispatchEx_GetDispID(dispex, str, 0, &id); CHECK_CALLED(GetIDsOfNames_scriptprop); SysFreeString(str); ok(hres == S_OK, "GetDispID failed: %08x\n", hres); todo_wine ok(id == DISPID_SCRIPTPROP, "id = %d\n", id);
SET_EXPECT(Invoke_SECURITYCTX); SET_EXPECT(Invoke_SCRIPTPROP); memset(&dp, 0, sizeof(dp)); memset(&ei, 0, sizeof(ei)); V_VT(&v) = VT_EMPTY; hres = IDispatchEx_InvokeEx(dispex, id, LOCALE_NEUTRAL, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL); ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v)); ok(V_I4(&v) == 4, "V_I4(v) = %d\n", V_I4(&v)); CHECK_CALLED(Invoke_SECURITYCTX); 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; IHTMLDocument3 *doc3; IDispatchEx *dispex; IHTMLElement *elem; IDispatch *disp; VARIANT v; BSTR str; HRESULT hres;
hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument3, (void**)&doc3); ok(hres == S_OK, "Could not get IHTMLDocument3 iface: %08x\n", hres);
str = a2bstr("objid"); elem = (void*)0xdeadbeef; hres = IHTMLDocument3_getElementById(doc3, str, &elem); IHTMLDocument3_Release(doc3); SysFreeString(str); ok(hres == S_OK, "getElementById failed: %08x\n", hres); ok(elem != NULL, "elem == NULL\n");
hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLObjectElement, (void**)&objelem); IHTMLElement_Release(elem); ok(hres == S_OK, "Could not get IHTMLObjectElement iface: %08x\n", hres);
SET_EXPECT(Invoke_SECURITYCTX); hres = IHTMLObjectElement_get_object(objelem, &disp); ok(hres == S_OK, "get_object failed: %08x\n", hres); ok(disp == &Dispatch, "disp != Dispatch\n"); CHECK_CALLED(Invoke_SECURITYCTX);
hres = IHTMLObjectElement_QueryInterface(objelem, &IID_IDispatchEx, (void**)&dispex); ok(hres == S_OK, "QueryInterface failed: %08x\n", hres); test_elem_dispex(dispex); IDispatchEx_Release(dispex);
test_iface_wrapping(objelem);
hres = IHTMLObjectElement_get_width(objelem, &v); ok(hres == S_OK, "get_width failed: %08x\n", hres); ok(V_VT(&v) == VT_BSTR, "V_VT(width) = %d\n", V_VT(&v)); ok(!strcmp_wa(V_BSTR(&v), "300"), "V_BSTR(width) = %s\n", wine_dbgstr_w(V_BSTR(&v))); VariantClear(&v);
hres = IHTMLObjectElement_get_height(objelem, &v); ok(hres == S_OK, "get_height failed: %08x\n", hres); ok(V_VT(&v) == VT_BSTR, "V_VT(height) = %d\n", V_VT(&v)); ok(!strcmp_wa(V_BSTR(&v), "200"), "V_BSTR(height) = %s\n", wine_dbgstr_w(V_BSTR(&v))); VariantClear(&v);
V_VT(&v) = VT_I4; V_I4(&v) = 400; SET_EXPECT(OnAmbientPropertyChange_UNKNOWN); SET_EXPECT(Invoke_ENABLED); hres = IHTMLObjectElement_put_width(objelem, v); ok(hres == S_OK, "put_width failed: %08x\n", hres); CHECK_CALLED(OnAmbientPropertyChange_UNKNOWN); CLEAR_CALLED(Invoke_ENABLED); /* Not called on IE10 */
hres = IHTMLObjectElement_get_width(objelem, &v); ok(hres == S_OK, "get_width failed: %08x\n", hres); ok(V_VT(&v) == VT_BSTR, "V_VT(width) = %d\n", V_VT(&v)); ok(!strcmp_wa(V_BSTR(&v), "400"), "V_BSTR(width) = %s\n", wine_dbgstr_w(V_BSTR(&v))); VariantClear(&v);
V_VT(&v) = VT_I4; V_I4(&v) = 250; SET_EXPECT(OnAmbientPropertyChange_UNKNOWN); SET_EXPECT(Invoke_ENABLED); hres = IHTMLObjectElement_put_height(objelem, v); ok(hres == S_OK, "put_height failed: %08x\n", hres); CHECK_CALLED(OnAmbientPropertyChange_UNKNOWN); CLEAR_CALLED(Invoke_ENABLED); /* Not called on IE10 */
hres = IHTMLObjectElement_get_height(objelem, &v); ok(hres == S_OK, "get_height failed: %08x\n", hres); ok(V_VT(&v) == VT_BSTR, "V_VT(height) = %d\n", V_VT(&v)); ok(!strcmp_wa(V_BSTR(&v), "250"), "V_BSTR(height) = %s\n", wine_dbgstr_w(V_BSTR(&v))); VariantClear(&v);
IHTMLObjectElement_Release(objelem);}
static void test_container(IHTMLDocument2 *doc_obj){ IHTMLWindow2 *parent_window, *html_window; IServiceProvider *serv_prov; IOleContainer *container; IHTMLDocument2 *doc; IUnknown *unk; HRESULT hres;
container = NULL; hres = IOleClientSite_GetContainer(client_site, &container); ok(hres == S_OK, "GetContainer failed: %08x\n", hres); ok(container != NULL, "container == NULL\n");
hres = IHTMLDocument2_get_parentWindow(doc_obj, &parent_window); ok(hres == S_OK, "get_parentWindow failed: %08x\n", hres); ok(parent_window != NULL, "parentWindow == NULL\n");
hres = IHTMLWindow2_get_document(parent_window, &doc); ok(hres == S_OK, "get_document failed: %08x\n", hres); ok(doc != NULL, "doc == NULL\n"); ok(iface_cmp((IUnknown*)doc, (IUnknown*)container), "container != doc\n"); IHTMLDocument2_Release(doc);
hres = IOleClientSite_QueryInterface(client_site, &IID_IServiceProvider, (void**)&serv_prov); ok(hres == S_OK, "Could not get IServiceProvider iface: %08x\n", hres);
hres = IServiceProvider_QueryService(serv_prov, &IID_IHTMLWindow2, &IID_IHTMLWindow2, (void**)&html_window); ok(hres == S_OK, "Could not get IHTMLWindow2 service: %08x\n", hres); todo_wine ok(!iface_cmp((IUnknown*)html_window, (IUnknown*)parent_window), "html_window != parent_window\n"); IHTMLWindow2_Release(html_window);
SET_EXPECT(QueryService_TestActiveX); hres = IServiceProvider_QueryService(serv_prov, &CLSID_TestActiveX, &IID_IUnknown, (void**)&unk); ok(hres == S_OK, "QueryService(CLSID_TestActiveX) failed: %08x\n", hres); ok(unk == (IUnknown*)&OleObject, "unexpected unk %p\n", unk); CHECK_CALLED(QueryService_TestActiveX); IUnknown_Release(unk);
IServiceProvider_Release(serv_prov);
IHTMLWindow2_Release(parent_window); IOleContainer_Release(container);}
static void test_ui_activate(void){ IOleInPlaceSite *ip_site; HRESULT hres;
hres = IOleClientSite_QueryInterface(client_site, &IID_IOleInPlaceSite, (void**)&ip_site); ok(hres == S_OK, "Could not get IOleInPlaceSite iface: %08x\n", hres);
SET_EXPECT(Invoke_ENABLED); hres = IOleInPlaceSite_OnUIActivate(ip_site); ok(hres == S_OK, "OnUIActivate failed: %08x\n", hres); CLEAR_CALLED(Invoke_ENABLED); /* Not called on IE10 */
IOleInPlaceSite_Release(ip_site);}
static HRESULT cs_qi(REFIID,void **);static IOleDocumentView *view;
static HRESULT WINAPI InPlaceFrame_QueryInterface(IOleInPlaceFrame *iface, REFIID riid, void **ppv){ static const GUID undocumented_frame_iid = {0xfbece6c9,0x48d7,0x4a37,{0x8f,0xe3,0x6a,0xd4,0x27,0x2f,0xdd,0xac}};
if(!IsEqualGUID(&undocumented_frame_iid, riid)) ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid));
*ppv = NULL; return E_NOINTERFACE;}
static ULONG WINAPI InPlaceFrame_AddRef(IOleInPlaceFrame *iface){ return 2;}
static ULONG WINAPI InPlaceFrame_Release(IOleInPlaceFrame *iface){ return 1;}
static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd){ return E_NOTIMPL;}
static HRESULT WINAPI InPlaceFrame_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode){ return E_NOTIMPL;}
static HRESULT WINAPI InPlaceFrame_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder){ return E_NOTIMPL;}
static HRESULT WINAPI InPlaceFrame_RequestBorderSpace(IOleInPlaceFrame *iface, LPCBORDERWIDTHS pborderwidths){ return E_NOTIMPL;}
static HRESULT WINAPI InPlaceFrame_SetBorderSpace(IOleInPlaceFrame *iface, LPCBORDERWIDTHS pborderwidths){ return S_OK;}
static HRESULT WINAPI InPlaceUIWindow_SetActiveObject(IOleInPlaceFrame *iface, IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName){ return S_OK;}
static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface, IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName){ return S_OK;}
static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths){ return E_NOTIMPL;}
static HRESULT WINAPI InPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText){ return S_OK;}
static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable){ return E_NOTIMPL;}
static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static const IOleInPlaceFrameVtbl InPlaceFrameVtbl = { InPlaceFrame_QueryInterface, InPlaceFrame_AddRef, InPlaceFrame_Release, InPlaceFrame_GetWindow, InPlaceFrame_ContextSensitiveHelp, InPlaceFrame_GetBorder, InPlaceFrame_RequestBorderSpace, InPlaceFrame_SetBorderSpace, InPlaceFrame_SetActiveObject, InPlaceFrame_InsertMenus, InPlaceFrame_SetMenu, InPlaceFrame_RemoveMenus, InPlaceFrame_SetStatusText, InPlaceFrame_EnableModeless, InPlaceFrame_TranslateAccelerator};
static IOleInPlaceFrame InPlaceFrame = { &InPlaceFrameVtbl };
static const IOleInPlaceFrameVtbl InPlaceUIWindowVtbl = { InPlaceFrame_QueryInterface, InPlaceFrame_AddRef, InPlaceFrame_Release, InPlaceFrame_GetWindow, InPlaceFrame_ContextSensitiveHelp, InPlaceFrame_GetBorder, InPlaceFrame_RequestBorderSpace, InPlaceFrame_SetBorderSpace, InPlaceUIWindow_SetActiveObject,};
static IOleInPlaceFrame InPlaceUIWindow = { &InPlaceUIWindowVtbl };
static HRESULT WINAPI InPlaceSite_QueryInterface(IOleInPlaceSite *iface, REFIID riid, void **ppv){ return cs_qi(riid, ppv);}
static ULONG WINAPI InPlaceSite_AddRef(IOleInPlaceSite *iface){ return 2;}
static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSite *iface){ return 1;}
static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSite *iface, HWND *phwnd){ *phwnd = container_hwnd; return S_OK;}
static HRESULT WINAPI InPlaceSite_ContextSensitiveHelp(IOleInPlaceSite *iface, BOOL fEnterMode){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSite *iface){ return S_OK;}
static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSite *iface){ return S_OK;}
static HRESULT WINAPI InPlaceSite_OnUIActivate(IOleInPlaceSite *iface){ return S_OK;}
static HRESULT WINAPI InPlaceSite_GetWindowContext(IOleInPlaceSite *iface, IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo){ static const RECT rect = {0,0,500,500};
*ppFrame = &InPlaceFrame; *ppDoc = (IOleInPlaceUIWindow*)&InPlaceUIWindow; *lprcPosRect = rect; *lprcClipRect = rect;
lpFrameInfo->fMDIApp = FALSE; lpFrameInfo->hwndFrame = container_hwnd; lpFrameInfo->haccel = NULL; lpFrameInfo->cAccelEntries = 0;
return S_OK;}
static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSite *iface, SIZE scrollExtant){ return E_NOTIMPL;}
static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSite *iface, BOOL fUndoable){ return S_OK;}
static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSite *iface){ return S_OK;}
static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSite *iface){ return E_NOTIMPL;}
static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSite *iface){ return E_NOTIMPL;}
static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSite *iface, LPCRECT lprcPosRect){ return E_NOTIMPL;}
static const IOleInPlaceSiteVtbl InPlaceSiteVtbl = { InPlaceSite_QueryInterface, InPlaceSite_AddRef, InPlaceSite_Release, InPlaceSite_GetWindow, InPlaceSite_ContextSensitiveHelp, InPlaceSite_CanInPlaceActivate, InPlaceSite_OnInPlaceActivate, InPlaceSite_OnUIActivate, InPlaceSite_GetWindowContext, InPlaceSite_Scroll, InPlaceSite_OnUIDeactivate, InPlaceSite_OnInPlaceDeactivate, InPlaceSite_DiscardUndoState, InPlaceSite_DeactivateAndUndo, InPlaceSite_OnPosRectChange,};
static IOleInPlaceSite InPlaceSite = { &InPlaceSiteVtbl };
static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv){ return cs_qi(riid, ppv);}
static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface){ return 2;}
static ULONG WINAPI ClientSite_Release(IOleClientSite *iface){ return 1;}
static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmon){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer){ return E_NOTIMPL;}
static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static const IOleClientSiteVtbl ClientSiteVtbl = { ClientSite_QueryInterface, ClientSite_AddRef, ClientSite_Release, ClientSite_SaveObject, ClientSite_GetMoniker, ClientSite_GetContainer, ClientSite_ShowObject, ClientSite_OnShowWindow, ClientSite_RequestNewObjectLayout};
static IOleClientSite ClientSite = { &ClientSiteVtbl };
static HRESULT WINAPI DocumentSite_QueryInterface(IOleDocumentSite *iface, REFIID riid, void **ppv){ return cs_qi(riid, ppv);}
static ULONG WINAPI DocumentSite_AddRef(IOleDocumentSite *iface){ return 2;}
static ULONG WINAPI DocumentSite_Release(IOleDocumentSite *iface){ return 1;}
static HRESULT WINAPI DocumentSite_ActivateMe(IOleDocumentSite *iface, IOleDocumentView *pViewToActivate){ RECT rect = {0,0,400,500}; IOleDocument *document; HRESULT hres;
hres = IOleDocumentView_QueryInterface(pViewToActivate, &IID_IOleDocument, (void**)&document); ok(hres == S_OK, "could not get IOleDocument: %08x\n", hres);
hres = IOleDocument_CreateView(document, &InPlaceSite, NULL, 0, &view); IOleDocument_Release(document); ok(hres == S_OK, "CreateView failed: %08x\n", hres);
hres = IOleDocumentView_SetInPlaceSite(view, &InPlaceSite); ok(hres == S_OK, "SetInPlaceSite failed: %08x\n", hres);
hres = IOleDocumentView_UIActivate(view, TRUE); ok(hres == S_OK, "UIActivate failed: %08x\n", hres);
hres = IOleDocumentView_SetRect(view, &rect); ok(hres == S_OK, "SetRect failed: %08x\n", hres);
hres = IOleDocumentView_Show(view, TRUE); ok(hres == S_OK, "Show failed: %08x\n", hres);
return S_OK;}
static const IOleDocumentSiteVtbl DocumentSiteVtbl = { DocumentSite_QueryInterface, DocumentSite_AddRef, DocumentSite_Release, DocumentSite_ActivateMe};
static IOleDocumentSite DocumentSite = { &DocumentSiteVtbl };
static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv){ return cs_qi(riid, ppv);}
static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface){ return 2;}
static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface){ return 1;}
static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv){ if(IsEqualGUID(&CLSID_TestActiveX, guidService)) { CHECK_EXPECT(QueryService_TestActiveX); ok(IsEqualGUID(&IID_IUnknown, riid), "unexpected riid %s\n", wine_dbgstr_guid(riid)); *ppv = &OleObject; return S_OK; }
*ppv = NULL; return E_NOINTERFACE;}
static const IServiceProviderVtbl ServiceProviderVtbl = { ServiceProvider_QueryInterface, ServiceProvider_AddRef, ServiceProvider_Release, ServiceProvider_QueryService};
static IServiceProvider ServiceProvider = { &ServiceProviderVtbl };
static HRESULT cs_qi(REFIID riid, void **ppv){ *ppv = NULL;
if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IOleClientSite, riid)) *ppv = &ClientSite; else if(IsEqualGUID(&IID_IOleDocumentSite, riid)) *ppv = &DocumentSite; else if(IsEqualGUID(&IID_IOleWindow, riid) || IsEqualGUID(&IID_IOleInPlaceSite, riid)) *ppv = &InPlaceSite; else if(IsEqualGUID(riid, &IID_IServiceProvider)) *ppv = &ServiceProvider;
return *ppv ? S_OK : E_NOINTERFACE;}
static IHTMLDocument2 *notif_doc;static BOOL doc_complete;
static HRESULT WINAPI PropertyNotifySink_QueryInterface(IPropertyNotifySink *iface, REFIID riid, void**ppv){ if(IsEqualGUID(&IID_IPropertyNotifySink, riid)) { *ppv = iface; return S_OK; }
ok(0, "unexpected call\n"); return E_NOINTERFACE;}
static ULONG WINAPI PropertyNotifySink_AddRef(IPropertyNotifySink *iface){ return 2;}
static ULONG WINAPI PropertyNotifySink_Release(IPropertyNotifySink *iface){ return 1;}
static HRESULT WINAPI PropertyNotifySink_OnChanged(IPropertyNotifySink *iface, DISPID dispID){ if(dispID == DISPID_READYSTATE){ BSTR state; HRESULT hres;
static const WCHAR completeW[] = {'c','o','m','p','l','e','t','e',0};
hres = IHTMLDocument2_get_readyState(notif_doc, &state); ok(hres == S_OK, "get_readyState failed: %08x\n", hres);
if(!lstrcmpW(state, completeW)) doc_complete = TRUE;
SysFreeString(state); }
return S_OK;}
static HRESULT WINAPI PropertyNotifySink_OnRequestEdit(IPropertyNotifySink *iface, DISPID dispID){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static IPropertyNotifySinkVtbl PropertyNotifySinkVtbl = { PropertyNotifySink_QueryInterface, PropertyNotifySink_AddRef, PropertyNotifySink_Release, PropertyNotifySink_OnChanged, PropertyNotifySink_OnRequestEdit};
static IPropertyNotifySink PropertyNotifySink = { &PropertyNotifySinkVtbl };
static void doc_load_string(IHTMLDocument2 *doc, const char *str){ IPersistStreamInit *init; IStream *stream; HGLOBAL mem; SIZE_T len;
notif_doc = doc;
doc_complete = FALSE; len = strlen(str); mem = GlobalAlloc(0, len); memcpy(mem, str, len); CreateStreamOnHGlobal(mem, TRUE, &stream);
IHTMLDocument2_QueryInterface(doc, &IID_IPersistStreamInit, (void**)&init);
IPersistStreamInit_Load(init, stream); IPersistStreamInit_Release(init); IStream_Release(stream);}
static void do_advise(IUnknown *unk, REFIID riid, IUnknown *unk_advise){ IConnectionPointContainer *container; IConnectionPoint *cp; DWORD cookie; HRESULT hres;
hres = IUnknown_QueryInterface(unk, &IID_IConnectionPointContainer, (void**)&container); ok(hres == S_OK, "QueryInterface(IID_IConnectionPointContainer) failed: %08x\n", hres);
hres = IConnectionPointContainer_FindConnectionPoint(container, riid, &cp); IConnectionPointContainer_Release(container); ok(hres == S_OK, "FindConnectionPoint failed: %08x\n", hres);
hres = IConnectionPoint_Advise(cp, unk_advise, &cookie); IConnectionPoint_Release(cp); ok(hres == S_OK, "Advise failed: %08x\n", hres);}
static void set_client_site(IHTMLDocument2 *doc, BOOL set){ IOleObject *oleobj; HRESULT hres;
if(!set && view) { IOleDocumentView_Show(view, FALSE); IOleDocumentView_CloseView(view, 0); IOleDocumentView_SetInPlaceSite(view, NULL); IOleDocumentView_Release(view); view = NULL; }
hres = IHTMLDocument2_QueryInterface(doc, &IID_IOleObject, (void**)&oleobj); ok(hres == S_OK, "Could not et IOleObject: %08x\n", hres);
hres = IOleObject_SetClientSite(oleobj, set ? &ClientSite : NULL); ok(hres == S_OK, "SetClientSite failed: %08x\n", hres);
if(set) { IHlinkTarget *hlink;
hres = IOleObject_QueryInterface(oleobj, &IID_IHlinkTarget, (void**)&hlink); ok(hres == S_OK, "Could not get IHlinkTarget iface: %08x\n", hres);
hres = IHlinkTarget_Navigate(hlink, 0, NULL); ok(hres == S_OK, "Navgate failed: %08x\n", hres);
IHlinkTarget_Release(hlink); }
IOleObject_Release(oleobj);}static IHTMLDocument2 *create_document(void){ IHTMLDocument2 *doc; HRESULT hres;
hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, &IID_IHTMLDocument2, (void**)&doc); ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
return doc;}
static IHTMLDocument2 *create_doc(const char *str){ IHTMLDocument2 *doc; MSG msg;
doc = create_document(); set_client_site(doc, TRUE); doc_load_string(doc, str); do_advise((IUnknown*)doc, &IID_IPropertyNotifySink, (IUnknown*)&PropertyNotifySink);
while(!doc_complete && GetMessageW(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessageW(&msg); }
return doc;}
static void release_doc(IHTMLDocument2 *doc){ ULONG ref;
set_client_site(doc, FALSE); ref = IHTMLDocument2_Release(doc); ok(!ref || broken(ref == 1) /* Vista */, "ref = %d\n", ref);
if(client_site) { IOleClientSite_Release(client_site); client_site = NULL; }
if(plugin_hwnd) { DestroyWindow(plugin_hwnd); plugin_hwnd = NULL; }
ok(!activex_refcnt, "activex_refcnt = %d\n", activex_refcnt);}
static void init_test(int behavior){ plugin_behavior = behavior;
activex_refcnt = 0; no_quickact = behavior == TEST_NOQUICKACT || behavior == TEST_DISPONLY; have_container = TRUE;}
static void test_event_call(void){ VARIANT res, args[2]; DISPPARAMS dp = {args}; EXCEPINFO ei = {0}; HRESULT hres;
V_VT(&res) = VT_EMPTY; hres = IDispatch_Invoke(sink_disp, 1, &IID_NULL, 0, DISPATCH_METHOD, &dp, &res, &ei, NULL); ok(hres == S_OK, "Invoke failed: %08x\n", hres); ok(V_VT(&res) == VT_I4 && V_I4(&res) == 6, "unexpected result\n");
V_VT(args) = VT_I4; V_I4(args) = 2; V_VT(args+1) = VT_I4; V_I4(args+1) = 3; dp.cArgs = 2; V_VT(&res) = VT_EMPTY; hres = IDispatch_Invoke(sink_disp, 2, &IID_NULL, 0, DISPATCH_METHOD, &dp, &res, &ei, NULL); ok(hres == S_OK, "Invoke failed: %08x\n", hres); ok(V_VT(&res) == VT_I4 && V_I4(&res) == 7, "unexpected result: %d\n", V_I4(&res));
V_VT(&res) = VT_ERROR; hres = IDispatch_Invoke(sink_disp, 10, &IID_NULL, 0, DISPATCH_METHOD, &dp, &res, &ei, NULL); ok(hres == S_OK, "Invoke failed: %08x\n", hres); ok(V_VT(&res) == VT_EMPTY, "V_VT(res) = %d\n", V_VT(&res));}
static void test_flash_ax(void){ IHTMLDocument2 *doc; IOleClientSite *cs;
init_test(TEST_FLASH);
SET_EXPECT(CreateInstance); SET_EXPECT(FreezeEvents_TRUE); SET_EXPECT(QuickActivate); SET_EXPECT(FreezeEvents_FALSE); SET_EXPECT(IPersistPropertyBag_Load); SET_EXPECT(Invoke_READYSTATE); SET_EXPECT(Invoke_SECURITYCTX); SET_EXPECT(Invoke_SCRIPTCALL); SET_EXPECT(SetExtent); SET_EXPECT(GetExtent); SET_EXPECT(DoVerb);
doc = create_doc(object_ax_str);
CHECK_CALLED(CreateInstance); todo_wine CHECK_CALLED(FreezeEvents_TRUE); CHECK_CALLED(QuickActivate); todo_wine CHECK_CALLED(FreezeEvents_FALSE); CHECK_CALLED(IPersistPropertyBag_Load); CHECK_CALLED(Invoke_READYSTATE); CHECK_CALLED(Invoke_SECURITYCTX); CHECK_CALLED(Invoke_SCRIPTCALL); todo_wine CHECK_CALLED(SetExtent); todo_wine CHECK_CALLED(GetExtent); CHECK_CALLED(DoVerb);
/* Set in DoVerb */ CHECK_CALLED(InPlaceObject_GetWindow); CHECK_CALLED(SetObjectRects); if (winetest_interactive) { test_ui_activate(); test_container(notif_doc); test_object_elem(notif_doc); } else { skip("Skipping test_ui_activate(). ROSTESTS-114.\n"); skip("Skipping test_container(notif_doc). ROSTESTS-114.\n"); skip("Skipping test_object_elem(notif_doc). ROSTESTS-114.\n"); return; }
IOleClientSite_AddRef(client_site); cs = client_site;
SET_EXPECT(UIDeactivate); SET_EXPECT(Invoke_ENABLED); SET_EXPECT(Invoke_VALID); SET_EXPECT(InPlaceDeactivate); SET_EXPECT(Close); SET_EXPECT(SetClientSite_NULL); release_doc(doc); CHECK_CALLED(UIDeactivate); CLEAR_CALLED(Invoke_ENABLED); /* Not called on IE10 */ todo_wine CHECK_CALLED(Invoke_VALID); CHECK_CALLED(InPlaceDeactivate); CHECK_CALLED(Close); CHECK_CALLED(SetClientSite_NULL);
IOleClientSite_Release(cs);}
static void test_noquickact_ax(void){ IHTMLDocument2 *doc;
init_test(TEST_NOQUICKACT);
SET_EXPECT(CreateInstance); SET_EXPECT(FreezeEvents_TRUE); SET_EXPECT(GetMiscStatus); SET_EXPECT(SetClientSite); SET_EXPECT(SetAdvise); SET_EXPECT(GetViewStatus); SET_EXPECT(FreezeEvents_FALSE); SET_EXPECT(Invoke_READYSTATE); SET_EXPECT(Invoke_SECURITYCTX); SET_EXPECT(Invoke_SCRIPTCALL); SET_EXPECT(SetExtent); SET_EXPECT(GetExtent); SET_EXPECT(DoVerb);
doc = create_doc(object_ax_str);
CHECK_CALLED(CreateInstance); todo_wine CHECK_CALLED(FreezeEvents_TRUE); CHECK_CALLED(GetMiscStatus); CHECK_CALLED(SetClientSite); CHECK_CALLED(SetAdvise); CHECK_CALLED(GetViewStatus); todo_wine CHECK_CALLED(FreezeEvents_FALSE); CHECK_CALLED(Invoke_READYSTATE); CHECK_CALLED(Invoke_SECURITYCTX); CHECK_CALLED(Invoke_SCRIPTCALL); todo_wine CHECK_CALLED(SetExtent); todo_wine CHECK_CALLED(GetExtent); CHECK_CALLED(DoVerb);
/* Set in DoVerb */ CHECK_CALLED(InPlaceObject_GetWindow); CHECK_CALLED(SetObjectRects);
SET_EXPECT(InPlaceDeactivate); SET_EXPECT(Close); SET_EXPECT(SetClientSite_NULL); release_doc(doc); CHECK_CALLED(InPlaceDeactivate); CHECK_CALLED(Close); CHECK_CALLED(SetClientSite_NULL);}
static void test_event_binding(void){ IHTMLDocument2 *doc;
init_test(TEST_FLASH);
SET_EXPECT(CreateInstance); SET_EXPECT(FreezeEvents_TRUE); SET_EXPECT(QuickActivate); SET_EXPECT(FreezeEvents_FALSE); SET_EXPECT(IPersistPropertyBag_Load); SET_EXPECT(Invoke_READYSTATE); SET_EXPECT(SetExtent); SET_EXPECT(GetExtent); SET_EXPECT(DoVerb);
SET_EXPECT(GetClassInfo); SET_EXPECT(OnAmbientPropertyChange_UNKNOWN); SET_EXPECT(FindConnectionPoint); SET_EXPECT(Advise);
doc = create_doc(event_binding_str);
CHECK_CALLED(CreateInstance); todo_wine CHECK_CALLED(FreezeEvents_TRUE); CHECK_CALLED(QuickActivate); todo_wine CHECK_CALLED(FreezeEvents_FALSE); CHECK_CALLED(IPersistPropertyBag_Load); CHECK_CALLED(Invoke_READYSTATE); todo_wine CHECK_CALLED(SetExtent); todo_wine CHECK_CALLED(GetExtent); CHECK_CALLED(DoVerb);
/* Set in DoVerb */ CHECK_CALLED(InPlaceObject_GetWindow); CHECK_CALLED(SetObjectRects);
CHECK_CALLED(GetClassInfo); todo_wine CHECK_CALLED(OnAmbientPropertyChange_UNKNOWN); CHECK_CALLED(FindConnectionPoint); CHECK_CALLED(Advise);
if (winetest_interactive) test_event_call(); else skip("Skipping test_event_call(). ROSTESTS-114.\n");
SET_EXPECT(InPlaceDeactivate); SET_EXPECT(Close); SET_EXPECT(SetClientSite_NULL); SET_EXPECT(FindConnectionPoint); SET_EXPECT(Unadvise); release_doc(doc); CHECK_CALLED(InPlaceDeactivate); CHECK_CALLED(Close); CHECK_CALLED(SetClientSite_NULL); CHECK_CALLED(FindConnectionPoint); CHECK_CALLED(Unadvise);}
static void test_nooleobj_ax(void){ IHTMLDocument2 *doc;
init_test(TEST_DISPONLY);
SET_EXPECT(CreateInstance); SET_EXPECT(Invoke_READYSTATE); SET_EXPECT(Invoke_SECURITYCTX); SET_EXPECT(Invoke_SCRIPTCALL);
doc = create_doc(object_ax_str);
CHECK_CALLED(CreateInstance); CHECK_CALLED(Invoke_READYSTATE); CHECK_CALLED(Invoke_SECURITYCTX); CHECK_CALLED(Invoke_SCRIPTCALL);
release_doc(doc);}
static void test_exec_script(IHTMLDocument2 *doc, const char *codea, const char *langa){ IHTMLWindow2 *window; BSTR code, lang; VARIANT v; HRESULT hres;
hres = IHTMLDocument2_get_parentWindow(doc, &window); ok(hres == S_OK, "get_parentWindow failed: %08x\n", hres);
code = a2bstr(codea); lang = a2bstr(langa);
hres = IHTMLWindow2_execScript(window, code, lang, &v); ok(hres == S_OK, "execScript failed: %08x\n", hres); SysFreeString(lang); VariantClear(&v);
IHTMLWindow2_Release(window);}
static void test_create_element(void){ IHTMLDocument2 *doc;
init_test(TEST_FLASH);
doc = create_doc("<html></html>");
have_container = FALSE;
SET_EXPECT(CreateInstance); SET_EXPECT(FreezeEvents_TRUE); SET_EXPECT(QuickActivate); SET_EXPECT(IPersistPropertyBag_InitNew); SET_EXPECT(Invoke_READYSTATE); SET_EXPECT(FreezeEvents_FALSE);
test_exec_script(doc, "var test_elem = document.createElement('object');" "test_elem.classid = 'CLSID:178fc163-f585-4e24-9c13-4bb7f6680746';", "javascript");
CHECK_CALLED(CreateInstance); todo_wine CHECK_CALLED(FreezeEvents_TRUE); CHECK_CALLED(QuickActivate); CHECK_CALLED(IPersistPropertyBag_InitNew); CHECK_CALLED(Invoke_READYSTATE); todo_wine CHECK_CALLED(FreezeEvents_FALSE);
have_container = TRUE;
SET_EXPECT(DoVerb); test_exec_script(doc, "document.body.appendChild(test_elem);", "javascript"); todo_wine CHECK_CALLED(DoVerb);
SET_EXPECT(InPlaceDeactivate); SET_EXPECT(Close); SET_EXPECT(SetClientSite_NULL); release_doc(doc); todo_wine CHECK_CALLED(InPlaceDeactivate); CHECK_CALLED(Close); CHECK_CALLED(SetClientSite_NULL);}
static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){ return DefWindowProcW(hwnd, msg, wParam, lParam);}
static HWND create_container_window(void){ static const WCHAR html_document_testW[] = {'H','T','M','L','D','o','c','u','m','e','n','t','T','e','s','t',0}; static WNDCLASSEXW wndclass = { sizeof(WNDCLASSEXW), 0, wnd_proc, 0, 0, NULL, NULL, NULL, NULL, NULL, html_document_testW, NULL };
RegisterClassExW(&wndclass); return CreateWindowW(html_document_testW, html_document_testW, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 515, 530, NULL, NULL, NULL, NULL);}
static void load_typelib(void){ WCHAR path[MAX_PATH]; ITypeLib *typelib; HRESULT hres;
GetModuleFileNameW(NULL, path, MAX_PATH);
hres = LoadTypeLib(path, &typelib); ok(hres == S_OK, "LoadTypeLib failed: %08x\n", hres);
hres = ITypeLib_GetTypeInfoOfGuid(typelib, &DIID_DispActiveXTest, &actxtest_typeinfo); ok(hres == S_OK, "GetTypeInfoOfGuid(DIID_DispActiveXTest) failed: %08x\n", hres);
hres = ITypeLib_GetTypeInfoOfGuid(typelib, &CLSID_ActiveXTest, &class_typeinfo); ok(hres == S_OK, "GetTypeInfoOfGuid(CLSID_ActiveXTest) failed: %08x\n", hres);
ITypeLib_Release(typelib);}
static BOOL init_key(const char *key_name, const char *def_value, BOOL init){ HKEY hkey; DWORD res;
if(!init) { RegDeleteKeyA(HKEY_CLASSES_ROOT, key_name); return TRUE; }
res = RegCreateKeyA(HKEY_CLASSES_ROOT, key_name, &hkey); if(res != ERROR_SUCCESS) return FALSE;
if(def_value) res = RegSetValueA(hkey, NULL, REG_SZ, def_value, strlen(def_value));
RegCloseKey(hkey);
return res == ERROR_SUCCESS;}
static BOOL init_registry(BOOL init){ return init_key("TestActiveX\\CLSID", TESTACTIVEX_CLSID, init) && init_key("CLSID\\"TESTACTIVEX_CLSID"\\Implemented Categories\\{7dd95801-9882-11cf-9fa9-00aa006c42c4}", NULL, init) && init_key("CLSID\\"TESTACTIVEX_CLSID"\\Implemented Categories\\{7dd95802-9882-11cf-9fa9-00aa006c42c4}", NULL, init);}
static BOOL register_activex(void){ DWORD regid; HRESULT hres;
if(!init_registry(TRUE)) { init_registry(FALSE); return FALSE; }
hres = CoRegisterClassObject(&CLSID_TestActiveX, (IUnknown*)&activex_cf, CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, ®id); ok(hres == S_OK, "Could not register control: %08x\n", hres);
return TRUE;}
static BOOL check_ie(void){ IHTMLDocument5 *doc; HRESULT hres;
hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, &IID_IHTMLDocument5, (void**)&doc); if(FAILED(hres)) return FALSE;
IHTMLDocument5_Release(doc); return TRUE;}
START_TEST(activex){ CoInitialize(NULL);
if(!check_ie()) { CoUninitialize(); win_skip("Too old IE\n"); return; }
if(is_ie_hardened()) { CoUninitialize(); win_skip("IE running in Enhanced Security Configuration\n"); return; }
init_wrapped_iface(); load_typelib(); container_hwnd = create_container_window(); ShowWindow(container_hwnd, SW_SHOW);
if(register_activex()) { trace("Testing emulated flash embedding...\n"); test_flash_ax(); trace("Testing plugin without IQuickActivate iface...\n"); test_noquickact_ax(); trace("Testing plugin with IDispatch iface only...\n"); test_nooleobj_ax(); trace("Testing event object binding...\n"); test_event_binding(); trace("Testing createElement(object)...\n"); test_create_element(); init_registry(FALSE); }else { skip("Could not register ActiveX\n"); }
if(actxtest_typeinfo) ITypeInfo_Release(actxtest_typeinfo); if(class_typeinfo) ITypeInfo_Release(class_typeinfo); DestroyWindow(container_hwnd); CoUninitialize();}