[PATCH 0/2] MR10004: jscript: Fix DISPATCH_METHOD | DISPATCH_PROPERTYGET in ES5+ modes.
From: Gabriel Ivăncescu <gabrielopcode@gmail.com> Fixes a regression introduced by a965a5c39fa6da97c3f8f0b5956c5dde3d075b8d which broke the Adobe cloud installers. Spotted by Filip Bakreski. Signed-off-by: Gabriel Ivăncescu <gabrielopcode@gmail.com> --- dlls/jscript/dispex.c | 2 +- dlls/mshtml/tests/dom.c | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index dc2ff9f6a55..14eb30b03c5 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -2137,7 +2137,7 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IWineJSDispatch *iface, DISPID id, LCI IServiceProvider_AddRef(pspCaller); if(wFlags == (DISPATCH_METHOD | DISPATCH_PROPERTYGET)) - wFlags = (This->ctx->version < SCRIPTLANGUAGEVERSION_ES5) ? DISPATCH_METHOD : DISPATCH_PROPERTYGET; + wFlags = (This->ctx->version < SCRIPTLANGUAGEVERSION_ES5 || pdp->cArgs) ? DISPATCH_METHOD : DISPATCH_PROPERTYGET; switch(wFlags) { case DISPATCH_METHOD: diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 58a409a7a77..0a8398f935d 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -11735,9 +11735,9 @@ static void test_method_vs_getter(IHTMLDocument2 *doc) { DISPPARAMS dp = { 0 }; IDispatchEx *dispex; + VARIANT v, arg; DISPID dispid; HRESULT hres; - VARIANT v; BSTR bstr; hres = IHTMLDocument2_QueryInterface(doc, &IID_IDispatchEx, (void**)&dispex); @@ -11785,6 +11785,15 @@ static void test_method_vs_getter(IHTMLDocument2 *doc) } VariantClear(&v); + dp.cArgs = 1; + dp.rgvarg = &arg; + V_VT(&arg) = VT_I4; + V_I4(&arg) = 42; + hres = IDispatchEx_InvokeEx(dispex, dispid, LOCALE_NEUTRAL, DISPATCH_METHOD | DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL); + ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres); + ok(V_VT(&v) == VT_EMPTY, "V_VT = %d\n", V_VT(&v)); + + dp.cArgs = 0; hres = IDispatchEx_InvokeEx(dispex, dispid, LOCALE_NEUTRAL, DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL); ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres); ok(V_VT(&v) == VT_DISPATCH, "V_VT = %d\n", V_VT(&v)); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10004
From: Filip Bakreski <bakreski03@gmail.com> --- dlls/mshtml/dispex.c | 2 ++ dlls/mshtml/tests/dom.c | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index a6b8afb0543..ebb13562659 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -1151,6 +1151,8 @@ static HRESULT function_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR case DISPATCH_METHOD|DISPATCH_PROPERTYGET: if(!res) return E_INVALIDARG; + if(This->obj) + return E_ACCESSDENIED; /* fall through */ case DISPATCH_METHOD: if(!This->obj) diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 0a8398f935d..c6c9a845afa 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -11806,7 +11806,6 @@ static void test_method_vs_getter(IHTMLDocument2 *doc) hres = IDispatchEx_InvokeEx(dispex, DISPID_VALUE, LOCALE_NEUTRAL, DISPATCH_METHOD | DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL); if(compat_mode < COMPAT_IE9) - todo_wine ok(hres == E_ACCESSDENIED, "InvokeEx returned: %08lx\n", hres); else { ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10004
Jacek Caban (@jacek) commented about dlls/mshtml/dispex.c:
case DISPATCH_METHOD|DISPATCH_PROPERTYGET: if(!res) return E_INVALIDARG; + if(This->obj) + return E_ACCESSDENIED;
Those flags may be used by jscript, so we can't unconditionally treat them as invalid. Consider something like that for an example: ``` var f = document.body.getElementsByTagName; var r = f("test"); ok(r.length === 0, "r.length = " + r.length); ``` -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10004#note_128571
On Mon Feb 2 18:33:23 2026 +0000, Jacek Caban wrote:
Those flags may be used by jscript, so we can't unconditionally treat them as invalid. Consider something like that for an example: ``` var f = document.body.getElementsByTagName; var r = f("test"); ok(r.length === 0, "r.length = " + r.length); ``` Ah right. I think getting this done properly will be more complicated, and I don't think the Adobe Cloud Installer needs it. I think, based on the error code, it might have something to do with SID_GetCaller (like in other similar places we have TODOs about it), because obviously jscript has to send those flags as we have tests for that, so that can't be changed.
So I'll just drop this patch and add the basic tests for future. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10004#note_128668
participants (4)
-
Filip Bakreski -
Gabriel Ivăncescu -
Gabriel Ivăncescu (@insn) -
Jacek Caban (@jacek)