Module: wine Branch: master Commit: 0d7b1d9c1f4c07ae75428a66b4ebbede52620221 URL: https://gitlab.winehq.org/wine/wine/-/commit/0d7b1d9c1f4c07ae75428a66b4ebbed...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Jul 15 20:03:10 2024 +0200
mshtml: Factor out dispex_next_id.
And use it in get_attr_dispid_by_relative_idx.
---
dlls/mshtml/dispex.c | 45 ++++++++++++++++++++++++-------------------- dlls/mshtml/htmlelem.c | 3 +-- dlls/mshtml/mshtml_private.h | 1 + 3 files changed, 27 insertions(+), 22 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index ccba451507b..75738455d10 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -2215,41 +2215,33 @@ static HRESULT next_dynamic_id(DispatchEx *dispex, DWORD idx, DISPID *ret_id) return S_OK; }
-static HRESULT WINAPI DispatchEx_GetNextDispID(IWineJSDispatchHost *iface, DWORD grfdex, DISPID id, DISPID *pid) +HRESULT dispex_next_id(DispatchEx *dispex, DISPID id, DISPID *ret) { - DispatchEx *This = impl_from_IWineJSDispatchHost(iface); func_info_t *func; HRESULT hres;
- TRACE("%s (%p)->(%lx %lx %p)\n", This->info->desc->name, This, grfdex, id, pid); - - if(!ensure_real_info(This)) - return E_OUTOFMEMORY; - if(This->jsdisp) - return IWineJSDispatch_GetNextDispID(This->jsdisp, grfdex, id, pid); - if(is_dynamic_dispid(id)) { DWORD idx = id - DISPID_DYNPROP_0;
- 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;
- return next_dynamic_id(This, idx+1, pid); + return next_dynamic_id(dispex, idx+1, ret); }
if(!is_custom_dispid(id)) { if(id == DISPID_STARTENUM) { - func = This->info->funcs; + func = dispex->info->funcs; }else { - hres = get_builtin_func(This->info, id, &func); + hres = get_builtin_func(dispex->info, id, &func); if(FAILED(hres)) return hres; func++; }
- while(func < This->info->funcs + This->info->func_cnt) { + while(func < dispex->info->funcs + dispex->info->func_cnt) { if(func->func_disp_idx == -1) { - *pid = func->id; + *ret = func->id; return S_OK; } func++; @@ -2258,19 +2250,32 @@ static HRESULT WINAPI DispatchEx_GetNextDispID(IWineJSDispatchHost *iface, DWORD id = DISPID_STARTENUM; }
- if(This->info->desc->vtbl->next_dispid) { - hres = This->info->desc->vtbl->next_dispid(This, id, pid); + if(dispex->info->desc->vtbl->next_dispid) { + hres = dispex->info->desc->vtbl->next_dispid(dispex, id, ret); if(hres != S_FALSE) return hres; }
- if(get_dynamic_data(This) && This->dynamic_data->prop_cnt) - return next_dynamic_id(This, 0, pid); + if(get_dynamic_data(dispex) && dispex->dynamic_data->prop_cnt) + return next_dynamic_id(dispex, 0, ret);
- *pid = DISPID_STARTENUM; + *ret = DISPID_STARTENUM; return S_FALSE; }
+static HRESULT WINAPI DispatchEx_GetNextDispID(IWineJSDispatchHost *iface, DWORD grfdex, DISPID id, DISPID *pid) +{ + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); + + TRACE("%s (%p)->(%lx %lx %p)\n", This->info->desc->name, This, grfdex, id, pid); + + if(!ensure_real_info(This)) + return E_OUTOFMEMORY; + if(This->jsdisp) + return IWineJSDispatch_GetNextDispID(This->jsdisp, grfdex, id, pid); + return dispex_next_id(This, id, pid); +} + static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IWineJSDispatchHost *iface, IUnknown **ppunk) { DispatchEx *This = impl_from_IWineJSDispatchHost(iface); diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 750bc8f2428..b26b8eac40e 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -7538,7 +7538,6 @@ static HRESULT create_filters_collection(compat_mode_t compat_mode, IHTMLFilters
static HRESULT get_attr_dispid_by_relative_idx(HTMLAttributeCollection *This, LONG *idx, DISPID start, DISPID *dispid) { - IWineJSDispatchHost *dispex = &This->elem->node.event_target.dispex.IWineJSDispatchHost_iface; DISPID id = start; LONG len = -1; HRESULT hres; @@ -7546,7 +7545,7 @@ static HRESULT get_attr_dispid_by_relative_idx(HTMLAttributeCollection *This, LO FIXME("filter non-enumerable attributes out\n");
while(1) { - hres = IWineJSDispatchHost_GetNextDispID(dispex, fdexEnumAll, id, &id); + hres = dispex_next_id(&This->elem->node.event_target.dispex, id, &id); if(FAILED(hres)) return hres; else if(hres == S_FALSE) diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index dffb191f13c..fd1eb9f4822 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -512,6 +512,7 @@ HRESULT dispex_prop_get(DispatchEx *dispex, DISPID id, LCID lcid, VARIANT *r, EX IServiceProvider *caller); HRESULT dispex_prop_put(DispatchEx *dispex, DISPID id, LCID lcid, VARIANT *v, EXCEPINFO *ei, IServiceProvider *caller); +HRESULT dispex_next_id(DispatchEx *dispex, DISPID id, DISPID *ret);
typedef enum { DISPEXPROP_CUSTOM,