Module: wine Branch: master Commit: 321526713442f94afab1a9d72f47b69ab106cdf3 URL: https://gitlab.winehq.org/wine/wine/-/commit/321526713442f94afab1a9d72f47b69...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Jul 8 11:54:59 2024 +0200
mshtml: Allow external properties to have arbitrary names.
---
dlls/jscript/dispex.c | 20 ++++++++++++++------ dlls/jscript/engine.c | 2 +- dlls/jscript/function.c | 2 +- dlls/jscript/jscript.h | 2 +- dlls/jscript/jsdisp.idl | 2 ++ dlls/jscript/string.c | 2 +- 6 files changed, 20 insertions(+), 10 deletions(-)
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index 895e72e041d..911b3ab1d73 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -276,12 +276,13 @@ static HRESULT find_external_prop(jsdisp_t *This, const WCHAR *name, BOOL case_i struct property_info desc; HRESULT hres;
- hres = This->builtin_info->lookup_prop(This, name, &desc); + hres = This->builtin_info->lookup_prop(This, name, + case_insens ? fdexNameCaseInsensitive : fdexNameCaseSensitive, &desc); if(hres != DISP_E_UNKNOWNNAME) { if(FAILED(hres)) return hres;
- prop = alloc_prop(This, name, PROP_EXTERN, desc.flags); + prop = alloc_prop(This, desc.name ? desc.name : name, PROP_EXTERN, desc.flags); if(!prop) return E_OUTOFMEMORY;
@@ -424,6 +425,8 @@ HRESULT jsdisp_index_lookup(jsdisp_t *obj, const WCHAR *name, unsigned length, s desc->flags = PROPF_ENUMERABLE; if(obj->builtin_info->prop_put) desc->flags |= PROPF_WRITABLE; + desc->name = NULL; + desc->index = idx; return S_OK; }
@@ -435,6 +438,8 @@ HRESULT jsdisp_next_index(jsdisp_t *obj, unsigned length, unsigned id, struct pr desc->flags = PROPF_ENUMERABLE; if(obj->builtin_info->prop_put) desc->flags |= PROPF_WRITABLE; + desc->name = NULL; + desc->index = desc->id; return S_OK; }
@@ -664,7 +669,7 @@ static HRESULT fill_props(jsdisp_t *obj) if(obj->builtin_info->next_prop) { struct property_info desc; unsigned id = ~0; - WCHAR name[12]; + WCHAR buf[12];
for(;;) { hres = obj->builtin_info->next_prop(obj, id, &desc); @@ -673,11 +678,14 @@ static HRESULT fill_props(jsdisp_t *obj) if(hres == S_FALSE) break;
- swprintf(name, ARRAYSIZE(name), L"%u", desc.id); + if(!desc.name) { + swprintf(buf, ARRAYSIZE(buf), L"%u", desc.index); + desc.name = buf; + }
- prop = lookup_dispex_prop(obj, string_hash(name), name, FALSE); + prop = lookup_dispex_prop(obj, string_hash(desc.name), desc.name, FALSE); if(!prop) { - prop = alloc_prop(obj, name, PROP_EXTERN, desc.flags); + prop = alloc_prop(obj, desc.name, PROP_EXTERN, desc.flags); if(!prop) return E_OUTOFMEMORY; prop->u.id = desc.id; diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index e84d2f9b2d8..2be22a9b526 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -478,7 +478,7 @@ static void scope_destructor(jsdisp_t *dispex) IDispatch_Release(scope->obj); }
-static HRESULT scope_lookup_prop(jsdisp_t *jsdisp, const WCHAR *name, struct property_info *desc) +static HRESULT scope_lookup_prop(jsdisp_t *jsdisp, const WCHAR *name, unsigned flags, struct property_info *desc) { scope_chain_t *scope = scope_from_dispex(jsdisp);
diff --git a/dlls/jscript/function.c b/dlls/jscript/function.c index 654bf12c7e9..27678fc167c 100644 --- a/dlls/jscript/function.c +++ b/dlls/jscript/function.c @@ -117,7 +117,7 @@ static void Arguments_destructor(jsdisp_t *jsdisp) scope_release(arguments->scope); }
-static HRESULT Arguments_lookup_prop(jsdisp_t *jsdisp, const WCHAR *name, struct property_info *desc) +static HRESULT Arguments_lookup_prop(jsdisp_t *jsdisp, const WCHAR *name, unsigned flags, struct property_info *desc) { ArgumentsInstance *arguments = arguments_from_jsdisp(jsdisp); return jsdisp_index_lookup(&arguments->jsdisp, name, arguments->argc, desc); diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index 3113c0d5a8c..9454d9e3beb 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -185,7 +185,7 @@ typedef struct { ULONG (*addref)(jsdisp_t*); ULONG (*release)(jsdisp_t*); void (*on_put)(jsdisp_t*,const WCHAR*); - HRESULT (*lookup_prop)(jsdisp_t*,const WCHAR*,struct property_info*); + HRESULT (*lookup_prop)(jsdisp_t*,const WCHAR*,unsigned,struct property_info*); HRESULT (*next_prop)(jsdisp_t*,unsigned,struct property_info*); HRESULT (*prop_get)(jsdisp_t*,unsigned,jsval_t*); HRESULT (*prop_put)(jsdisp_t*,unsigned,jsval_t); diff --git a/dlls/jscript/jsdisp.idl b/dlls/jscript/jsdisp.idl index b7cb27a585b..f053149c144 100644 --- a/dlls/jscript/jsdisp.idl +++ b/dlls/jscript/jsdisp.idl @@ -25,6 +25,8 @@ struct property_info { UINT32 id; UINT32 flags; + const WCHAR *name; + UINT32 index; };
const unsigned int PROPF_ENUMERABLE = 0x0400; diff --git a/dlls/jscript/string.c b/dlls/jscript/string.c index 3cad5c55a79..968b74f9602 100644 --- a/dlls/jscript/string.c +++ b/dlls/jscript/string.c @@ -1501,7 +1501,7 @@ static void String_destructor(jsdisp_t *dispex) jsstr_release(This->str); }
-static HRESULT String_lookup_prop(jsdisp_t *jsdisp, const WCHAR *name, struct property_info *desc) +static HRESULT String_lookup_prop(jsdisp_t *jsdisp, const WCHAR *name, unsigned flags, struct property_info *desc) { StringInstance *string = string_from_jsdisp(jsdisp);