From: Jacek Caban jacek@codeweavers.com
And use it in HTMLRectCollection instead of get_name. --- dlls/mshtml/dispex.c | 26 ++++++++++++++++++++++++++ dlls/mshtml/htmlelem.c | 17 +---------------- dlls/mshtml/mshtml_private.h | 2 ++ 3 files changed, 29 insertions(+), 16 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index c1087d37ab4..cacf79322d8 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -2169,6 +2169,20 @@ HRESULT dispex_prop_name(DispatchEx *dispex, DISPID id, BSTR *ret) HRESULT hres;
if(is_custom_dispid(id)) { + if(dispex->info->desc->vtbl->get_prop_desc) { + struct property_info desc; + WCHAR buf[12]; + + hres = dispex->info->desc->vtbl->get_prop_desc(dispex, id, &desc); + if(FAILED(hres)) + return hres; + if(!desc.name) { + swprintf(buf, ARRAYSIZE(buf), L"%u", desc.index); + desc.name = buf; + } + *ret = SysAllocString(desc.name); + return *ret ? S_OK : E_OUTOFMEMORY; + } if(dispex->info->desc->vtbl->get_name) return dispex->info->desc->vtbl->get_name(dispex, id, ret); return DISP_E_MEMBERNOTFOUND; @@ -2299,6 +2313,18 @@ static HRESULT WINAPI JSDispatchHost_GetJSDispatch(IWineJSDispatchHost *iface, I return S_OK; }
+HRESULT dispex_index_prop_desc(DispatchEx *dispex, DISPID id, struct property_info *desc) +{ + desc->id = id; + desc->flags = PROPF_WRITABLE | PROPF_CONFIGURABLE; + if(dispex->info->desc->vtbl->next_dispid) + desc->flags |= PROPF_ENUMERABLE; + desc->name = NULL; + desc->index = id - MSHTML_DISPID_CUSTOM_MIN; + desc->func_iid = 0; + return S_OK; +} + static HRESULT get_host_property_descriptor(DispatchEx *This, DISPID id, struct property_info *desc) { HRESULT hres; diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 3e45ab5cb0e..24d3302275e 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -1073,21 +1073,6 @@ static HRESULT HTMLRectCollection_get_dispid(DispatchEx *dispex, const WCHAR *na return S_OK; }
-static HRESULT HTMLRectCollection_get_name(DispatchEx *dispex, DISPID id, BSTR *name) -{ - HTMLRectCollection *This = HTMLRectCollection_from_DispatchEx(dispex); - DWORD idx = id - MSHTML_DISPID_CUSTOM_MIN; - UINT32 len = 0; - WCHAR buf[11]; - - nsIDOMClientRectList_GetLength(This->rect_list, &len); - if(idx >= len) - return DISP_E_MEMBERNOTFOUND; - - len = swprintf(buf, ARRAY_SIZE(buf), L"%u", idx); - return (*name = SysAllocStringLen(buf, len)) ? S_OK : E_OUTOFMEMORY; -} - static HRESULT HTMLRectCollection_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) { @@ -1132,7 +1117,7 @@ static const dispex_static_data_vtbl_t HTMLRectCollection_dispex_vtbl = { .traverse = HTMLRectCollection_traverse, .unlink = HTMLRectCollection_unlink, .get_dispid = HTMLRectCollection_get_dispid, - .get_name = HTMLRectCollection_get_name, + .get_prop_desc = dispex_index_prop_desc, .invoke = HTMLRectCollection_invoke, }; static const tid_t HTMLRectCollection_iface_tids[] = { diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index a7a6a2ed0a2..4e6a79108bb 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -392,6 +392,7 @@ typedef struct { HRESULT (*invoke)(DispatchEx*,DISPID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*); HRESULT (*delete)(DispatchEx*,DISPID); HRESULT (*next_dispid)(DispatchEx*,DISPID,DISPID*); + HRESULT (*get_prop_desc)(DispatchEx*,DISPID,struct property_info*);
/* Similar to invoke, but allows overriding all dispids */ HRESULT (*disp_invoke)(DispatchEx*,DISPID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*); @@ -515,6 +516,7 @@ HRESULT dispex_prop_put(DispatchEx *dispex, DISPID id, LCID lcid, VARIANT *v, EX HRESULT dispex_get_id(DispatchEx *dispex, const WCHAR *name, DWORD flags, DISPID *pid); HRESULT dispex_next_id(DispatchEx *dispex, DISPID id, DISPID *ret); HRESULT dispex_prop_name(DispatchEx *dispex, DISPID id, BSTR *ret); +HRESULT dispex_index_prop_desc(DispatchEx*,DISPID,struct property_info*);
typedef enum { DISPEXPROP_CUSTOM,