[PATCH 0/1] MR9863: mshtml/tests: Test calling external object's prop with return value.
From: Gabriel Ivăncescu <gabrielopcode@gmail.com> Signed-off-by: Gabriel Ivăncescu <gabrielopcode@gmail.com> --- dlls/mshtml/tests/es5.js | 2 ++ dlls/mshtml/tests/script.c | 65 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js index 150736dc438..14bc511795c 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -2760,6 +2760,8 @@ sync_test("host this", function() { [137].forEach(external.testHostContext(false), tests[i]); Function.prototype.apply.call(external.testHostContext(false), tests[i], [137, 0, {}]); } + + i = external.objWithProp.prop(42); }); sync_test("head_setter", function() { diff --git a/dlls/mshtml/tests/script.c b/dlls/mshtml/tests/script.c index 2703ba68e4e..1b92636fcc3 100644 --- a/dlls/mshtml/tests/script.c +++ b/dlls/mshtml/tests/script.c @@ -160,6 +160,7 @@ DEFINE_EXPECT(GetTypeInfo); #define DISPID_SCRIPT_TESTPROP2 0x100001 #define DISPID_REFTEST_GET 0x100000 #define DISPID_REFTEST_REF 0x100001 +#define DISPID_OBJWITHPROP_PROP 0x100000 #define DISPID_EXTERNAL_OK 0x300000 #define DISPID_EXTERNAL_TRACE 0x300001 @@ -177,6 +178,7 @@ DEFINE_EXPECT(GetTypeInfo); #define DISPID_EXTERNAL_GETMIMETYPE 0x30000D #define DISPID_EXTERNAL_SETVIEWSIZE 0x30000E #define DISPID_EXTERNAL_NEWREFTEST 0x30000F +#define DISPID_EXTERNAL_OBJWITHPROP 0x300010 static const GUID CLSID_TestScript[] = { {0x178fc163,0xf585,0x4e24,{0x9c,0x13,0x4b,0xb7,0xfa,0xf8,0x07,0x46}}, @@ -971,6 +973,52 @@ static IDispatchExVtbl testHostContextDisp_no_this_vtbl = { static IDispatchEx testHostContextDisp_no_this = { &testHostContextDisp_no_this_vtbl }; +static HRESULT WINAPI objWithProp_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) +{ + if(!lstrcmpW(bstrName, L"prop")) { + *pid = DISPID_OBJWITHPROP_PROP; + return S_OK; + } + + ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName)); + return E_NOTIMPL; +} + +static HRESULT WINAPI objWithProp_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, + VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) +{ + ok(id == DISPID_OBJWITHPROP_PROP, "id = %ld\n", id); + ok(wFlags == (DISPATCH_PROPERTYGET | DISPATCH_METHOD), "wFlags = %x\n", wFlags); + ok(pdp != NULL, "pdp == NULL\n"); + ok(pdp->cArgs == 1, "pdp->cArgs = %d\n", pdp->cArgs); + ok(pdp->cNamedArgs == 0, "pdp->cNamedArgs = %d\n", pdp->cNamedArgs); + ok(V_VT(&pdp->rgvarg[0]) == VT_I4, "V_VT(rgvarg[0]) = %d\n", V_VT(&pdp->rgvarg[0])); + ok(V_I4(&pdp->rgvarg[0]) == 42, "V_I4(rgvarg[0]) = %ld\n", V_I4(&pdp->rgvarg[0])); + ok(!pdp->rgdispidNamedArgs, "pdp->rgdispidNamedArgs != NULL\n"); + ok(pvarRes != NULL, "pvarRes = NULL\n"); + return S_OK; +} + +static IDispatchExVtbl objWithProp_vtbl = { + DispatchEx_QueryInterface, + DispatchEx_AddRef, + DispatchEx_Release, + DispatchEx_GetTypeInfoCount, + DispatchEx_GetTypeInfo, + DispatchEx_GetIDsOfNames, + DispatchEx_Invoke, + objWithProp_GetDispID, + objWithProp_InvokeEx, + DispatchEx_DeleteMemberByName, + DispatchEx_DeleteMemberByDispID, + DispatchEx_GetMemberProperties, + DispatchEx_GetMemberName, + DispatchEx_GetNextDispID, + DispatchEx_GetNameSpaceParent +}; + +static IDispatchEx objWithProp = { &objWithProp_vtbl }; + struct refTestObj { IDispatchEx IDispatchEx_iface; @@ -1212,6 +1260,10 @@ static HRESULT WINAPI externalDisp_GetDispID(IDispatchEx *iface, BSTR bstrName, *pid = DISPID_EXTERNAL_NEWREFTEST; return S_OK; } + if(!lstrcmpW(bstrName, L"objWithProp")) { + *pid = DISPID_EXTERNAL_OBJWITHPROP; + return S_OK; + } ok(0, "unexpected name %s\n", wine_dbgstr_w(bstrName)); return DISP_E_UNKNOWNNAME; @@ -1512,6 +1564,19 @@ static HRESULT WINAPI externalDisp_InvokeEx(IDispatchEx *iface, DISPID id, LCID return S_OK; } + case DISPID_EXTERNAL_OBJWITHPROP: + ok(pdp != NULL, "pdp == NULL\n"); + ok(!pdp->rgvarg, "rgvarg != NULL\n"); + ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n"); + ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs); + ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs); + ok(pvarRes != NULL, "pvarRes == NULL\n"); + ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes)); + ok(pei != NULL, "pei == NULL\n"); + V_VT(pvarRes) = VT_DISPATCH; + V_DISPATCH(pvarRes) = (IDispatch*)&objWithProp; + return S_OK; + default: ok(0, "unexpected call\n"); return E_NOTIMPL; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9863
Jacek Caban (@jacek) commented about dlls/mshtml/tests/es5.js:
[137].forEach(external.testHostContext(false), tests[i]); Function.prototype.apply.call(external.testHostContext(false), tests[i], [137, 0, {}]); } + + i = external.objWithProp.prop(42);
Maybe it would be better to name it after a function rather than a property. That's what you're testing here. A function is technically a property too, but that is not what I would expect from this naming. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/9863#note_126518
participants (3)
-
Gabriel Ivăncescu -
Gabriel Ivăncescu (@insn) -
Jacek Caban (@jacek)