From: Jacek Caban jacek@codeweavers.com
--- dlls/mshtml/dispex.c | 69 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 54 insertions(+), 15 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index c40b63cb980..efdbbf3da81 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -1894,6 +1894,49 @@ static HRESULT WINAPI DispatchEx_GetDispID(IWineJSDispatchHost *iface, BSTR bstr return S_OK; }
+static HRESULT dispex_prop_put(DispatchEx *dispex, DISPID id, LCID lcid, VARIANT *v, EXCEPINFO *ei, IServiceProvider *caller) +{ + static DISPID propput_dispid = DISPID_PROPERTYPUT; + + switch(get_dispid_type(id)) { + case DISPEXPROP_CUSTOM: { + DISPPARAMS dp = { .cArgs = 1, .rgvarg = v, .cNamedArgs = 1, .rgdispidNamedArgs = &propput_dispid }; + if(!dispex->info->desc->vtbl->invoke) + return DISP_E_MEMBERNOTFOUND; + return dispex->info->desc->vtbl->invoke(dispex, id, lcid, DISPATCH_PROPERTYPUT, &dp, NULL, ei, caller); + } + + case DISPEXPROP_DYNAMIC: { + DWORD idx = id - DISPID_DYNPROP_0; + dynamic_prop_t *prop; + HRESULT hres; + + if(!get_dynamic_data(dispex) || dispex->dynamic_data->prop_cnt <= idx) + return DISP_E_MEMBERNOTFOUND; + + prop = dispex->dynamic_data->props + idx; + + TRACE("put %s\n", debugstr_variant(v)); + VariantClear(&prop->var); + hres = variant_copy(&prop->var, v); + if(FAILED(hres)) + return hres; + + prop->flags &= ~DYNPROP_DELETED; + return S_OK; + } + + case DISPEXPROP_BUILTIN: { + DISPPARAMS dp = { .cArgs = 1, .rgvarg = v, .cNamedArgs = 1, .rgdispidNamedArgs = &propput_dispid }; + return invoke_builtin_prop(dispex, id, lcid, DISPATCH_PROPERTYPUT, &dp, NULL, ei, caller); + } + + default: + assert(0); + return E_FAIL; + } +} + static HRESULT WINAPI DispatchEx_InvokeEx(IWineJSDispatchHost *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) { @@ -1914,6 +1957,17 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IWineJSDispatchHost *iface, DISPID id, return hres; }
+ switch(wFlags) { + case DISPATCH_PROPERTYPUT: { + if(pdp->cArgs != 1 || (pdp->cNamedArgs == 1 && *pdp->rgdispidNamedArgs != DISPID_PROPERTYPUT) + || pdp->cNamedArgs > 1) { + FIXME("invalid args\n"); + return E_INVALIDARG; + } + return dispex_prop_put(This, id, lcid, pdp->rgvarg, pei, pspCaller); + } + } + switch(get_dispid_type(id)) { case DISPEXPROP_CUSTOM: if(!This->info->desc->vtbl->invoke) @@ -1946,21 +2000,6 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IWineJSDispatchHost *iface, DISPID id, return DISP_E_MEMBERNOTFOUND; V_VT(pvarRes) = VT_EMPTY; return variant_copy(pvarRes, &prop->var); - case DISPATCH_PROPERTYPUT: - if(pdp->cArgs != 1 || (pdp->cNamedArgs == 1 && *pdp->rgdispidNamedArgs != DISPID_PROPERTYPUT) - || pdp->cNamedArgs > 1) { - FIXME("invalid args\n"); - return E_INVALIDARG; - } - - TRACE("put %s\n", debugstr_variant(pdp->rgvarg)); - VariantClear(&prop->var); - hres = variant_copy(&prop->var, pdp->rgvarg); - if(FAILED(hres)) - return hres; - - prop->flags &= ~DYNPROP_DELETED; - return S_OK; default: FIXME("unhandled wFlags %x\n", wFlags); return E_NOTIMPL;
From: Jacek Caban jacek@codeweavers.com
--- dlls/mshtml/dispex.c | 46 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index efdbbf3da81..d21d9f20433 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -1894,6 +1894,42 @@ static HRESULT WINAPI DispatchEx_GetDispID(IWineJSDispatchHost *iface, BSTR bstr return S_OK; }
+static HRESULT dispex_prop_get(DispatchEx *dispex, DISPID id, LCID lcid, VARIANT *r, EXCEPINFO *ei, IServiceProvider *caller) +{ + switch(get_dispid_type(id)) { + case DISPEXPROP_CUSTOM: { + DISPPARAMS dp = { .cArgs = 0 }; + if(!dispex->info->desc->vtbl->invoke) + return DISP_E_MEMBERNOTFOUND; + return dispex->info->desc->vtbl->invoke(dispex, id, lcid, DISPATCH_PROPERTYGET, &dp, r, ei, caller); + } + + case DISPEXPROP_DYNAMIC: { + DWORD idx = id - DISPID_DYNPROP_0; + dynamic_prop_t *prop; + + if(!get_dynamic_data(dispex) || dispex->dynamic_data->prop_cnt <= idx) + return DISP_E_MEMBERNOTFOUND; + + prop = dispex->dynamic_data->props+idx; + if(prop->flags & DYNPROP_DELETED) + return DISP_E_MEMBERNOTFOUND; + + V_VT(r) = VT_EMPTY; + return variant_copy(r, &prop->var); + } + + case DISPEXPROP_BUILTIN: { + DISPPARAMS dp = { .cArgs = 0 }; + return invoke_builtin_prop(dispex, id, lcid, DISPATCH_PROPERTYGET, &dp, r, ei, caller); + } + + default: + assert(0); + return E_FAIL; + } +} + static HRESULT dispex_prop_put(DispatchEx *dispex, DISPID id, LCID lcid, VARIANT *v, EXCEPINFO *ei, IServiceProvider *caller) { static DISPID propput_dispid = DISPID_PROPERTYPUT; @@ -1958,6 +1994,11 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IWineJSDispatchHost *iface, DISPID id, }
switch(wFlags) { + case DISPATCH_PROPERTYGET: + if(!pvarRes) + return E_INVALIDARG; + return dispex_prop_get(This, id, lcid, pvarRes, pei, pspCaller); + case DISPATCH_PROPERTYPUT: { if(pdp->cArgs != 1 || (pdp->cNamedArgs == 1 && *pdp->rgdispidNamedArgs != DISPID_PROPERTYPUT) || pdp->cNamedArgs > 1) { @@ -1995,11 +2036,6 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IWineJSDispatchHost *iface, DISPID id, }
return invoke_disp_value(This, V_DISPATCH(&prop->var), lcid, wFlags, pdp, pvarRes, pei, pspCaller); - case DISPATCH_PROPERTYGET: - if(prop->flags & DYNPROP_DELETED) - return DISP_E_MEMBERNOTFOUND; - V_VT(pvarRes) = VT_EMPTY; - return variant_copy(pvarRes, &prop->var); default: FIXME("unhandled wFlags %x\n", wFlags); return E_NOTIMPL;
From: Jacek Caban jacek@codeweavers.com
--- dlls/mshtml/dispex.c | 101 +++++++++++++++++++++++-------------------- 1 file changed, 54 insertions(+), 47 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index d21d9f20433..2e436b364c4 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -1973,60 +1973,27 @@ static HRESULT dispex_prop_put(DispatchEx *dispex, DISPID id, LCID lcid, VARIANT } }
-static HRESULT WINAPI DispatchEx_InvokeEx(IWineJSDispatchHost *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, - VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) +static HRESULT dispex_prop_call(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *r, + EXCEPINFO *ei, IServiceProvider *caller) { - DispatchEx *This = impl_from_IWineJSDispatchHost(iface); - HRESULT hres; - - TRACE("%s (%p)->(%lx %lx %x %p %p %p %p)\n", This->info->desc->name, This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); - - if(!ensure_real_info(This)) - return E_OUTOFMEMORY; - - if(wFlags == (DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF)) - wFlags = DISPATCH_PROPERTYPUT; - - if(This->info->desc->vtbl->disp_invoke) { - hres = This->info->desc->vtbl->disp_invoke(This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); - if(hres != S_FALSE) - return hres; - } - - switch(wFlags) { - case DISPATCH_PROPERTYGET: - if(!pvarRes) - return E_INVALIDARG; - return dispex_prop_get(This, id, lcid, pvarRes, pei, pspCaller); - - case DISPATCH_PROPERTYPUT: { - if(pdp->cArgs != 1 || (pdp->cNamedArgs == 1 && *pdp->rgdispidNamedArgs != DISPID_PROPERTYPUT) - || pdp->cNamedArgs > 1) { - FIXME("invalid args\n"); - return E_INVALIDARG; - } - return dispex_prop_put(This, id, lcid, pdp->rgvarg, pei, pspCaller); - } - } - switch(get_dispid_type(id)) { case DISPEXPROP_CUSTOM: - if(!This->info->desc->vtbl->invoke) + if(!dispex->info->desc->vtbl->invoke) return DISP_E_MEMBERNOTFOUND; - return This->info->desc->vtbl->invoke(This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); + return dispex->info->desc->vtbl->invoke(dispex, id, lcid, flags, dp, r, ei, caller);
case DISPEXPROP_DYNAMIC: { DWORD idx = id - DISPID_DYNPROP_0; dynamic_prop_t *prop;
- if(!get_dynamic_data(This) || This->dynamic_data->prop_cnt <= idx) + if(!get_dynamic_data(dispex) || dispex->dynamic_data->prop_cnt <= idx) return DISP_E_MEMBERNOTFOUND;
- prop = This->dynamic_data->props+idx; + prop = dispex->dynamic_data->props + idx;
- switch(wFlags) { + switch(flags) { case DISPATCH_METHOD|DISPATCH_PROPERTYGET: - if(!pvarRes) + if(!r) return E_INVALIDARG; /* fall through */ case DISPATCH_METHOD: @@ -2035,17 +2002,17 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IWineJSDispatchHost *iface, DISPID id, return E_NOTIMPL; }
- return invoke_disp_value(This, V_DISPATCH(&prop->var), lcid, wFlags, pdp, pvarRes, pei, pspCaller); + return invoke_disp_value(dispex, V_DISPATCH(&prop->var), lcid, flags, dp, r, ei, caller); default: - FIXME("unhandled wFlags %x\n", wFlags); + FIXME("unhandled flags %x on dynamic property\n", flags); return E_NOTIMPL; } } case DISPEXPROP_BUILTIN: - if(wFlags == DISPATCH_CONSTRUCT) { + if(flags == DISPATCH_CONSTRUCT) { if(id == DISPID_VALUE) { - if(This->info->desc->vtbl->value) { - return This->info->desc->vtbl->value(This, lcid, wFlags, pdp, pvarRes, pei, pspCaller); + if(dispex->info->desc->vtbl->value) { + return dispex->info->desc->vtbl->value(dispex, lcid, flags, dp, r, ei, caller); } FIXME("DISPATCH_CONSTRUCT flag but missing value function\n"); return E_FAIL; @@ -2054,13 +2021,53 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IWineJSDispatchHost *iface, DISPID id, return E_FAIL; }
- return invoke_builtin_prop(This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); + return invoke_builtin_prop(dispex, id, lcid, flags, dp, r, ei, caller); + default: assert(0); return E_FAIL; } }
+static HRESULT WINAPI DispatchEx_InvokeEx(IWineJSDispatchHost *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, + VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) +{ + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); + + TRACE("%s (%p)->(%lx %lx %x %p %p %p %p)\n", This->info->desc->name, This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); + + if(!ensure_real_info(This)) + return E_OUTOFMEMORY; + + if(wFlags == (DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF)) + wFlags = DISPATCH_PROPERTYPUT; + + if(This->info->desc->vtbl->disp_invoke) { + HRESULT hres = This->info->desc->vtbl->disp_invoke(This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); + if(hres != S_FALSE) + return hres; + } + + switch(wFlags) { + case DISPATCH_PROPERTYGET: + if(!pvarRes) + return E_INVALIDARG; + return dispex_prop_get(This, id, lcid, pvarRes, pei, pspCaller); + + case DISPATCH_PROPERTYPUT: { + if(pdp->cArgs != 1 || (pdp->cNamedArgs == 1 && *pdp->rgdispidNamedArgs != DISPID_PROPERTYPUT) + || pdp->cNamedArgs > 1) { + FIXME("invalid args\n"); + return E_INVALIDARG; + } + return dispex_prop_put(This, id, lcid, pdp->rgvarg, pei, pspCaller); + } + + default: + return dispex_prop_call(This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); + } +} + static HRESULT WINAPI DispatchEx_DeleteMemberByName(IWineJSDispatchHost *iface, BSTR name, DWORD grfdex) { DispatchEx *This = impl_from_IWineJSDispatchHost(iface);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=146878
Your paranoid android.
=== debian11b (64 bit WoW report) ===
user32: win.c:4037: Test failed: Expected active window 00000000063E0180, got 0000000003740182. win.c:4038: Test failed: Expected focus window 00000000063E0180, got 0000000003740182.