mirror of
https://gitlab.winehq.org/wine/wine.git
synced 2024-11-19 17:06:04 -07:00
mshtml: Override window's element prop directly rather than using GLOBAL_DISPEXVAR.
When GLOBAL_DISPEXVAR is used, we store the id of the dynamic prop and invoke it using the same id. But this is not the case if we have a jsdisp, which is redirected from InvokeEx and results in an invalid id. The actual way this works on native (in IE9+) is that element/frame props are special and not part of the window object at all. They're actually looked up after the prototype is, in a special way, but that requires a revamp. Storing over it just creates an actual prop on the window (which is what we are doing here). Signed-off-by: Gabriel Ivăncescu <gabrielopcode@gmail.com>
This commit is contained in:
parent
18aefb5dcf
commit
055bf9f5a2
Notes:
Alexandre Julliard
2024-11-14 23:12:21 +01:00
Approved-by: Jacek Caban (@jacek) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/wine/merge_requests/6721
2 changed files with 10 additions and 1 deletions
|
@ -656,7 +656,13 @@ static HRESULT prop_put(jsdisp_t *This, dispex_prop_t *prop, jsval_t val)
|
||||||
TRACE("no prop_put\n");
|
TRACE("no prop_put\n");
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
return This->builtin_info->prop_put(This, prop->u.id, val);
|
hres = This->builtin_info->prop_put(This, prop->u.id, val);
|
||||||
|
if(hres != S_FALSE)
|
||||||
|
return hres;
|
||||||
|
prop->type = PROP_JSVAL;
|
||||||
|
prop->flags = PROPF_ENUMERABLE | PROPF_CONFIGURABLE | PROPF_WRITABLE;
|
||||||
|
prop->u.val = jsval_undefined();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
ERR("type %d\n", prop->type);
|
ERR("type %d\n", prop->type);
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
|
|
@ -3926,6 +3926,9 @@ HRESULT HTMLWindow_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags,
|
||||||
case DISPATCH_PROPERTYPUT: {
|
case DISPATCH_PROPERTYPUT: {
|
||||||
DISPID dispex_id;
|
DISPID dispex_id;
|
||||||
|
|
||||||
|
if(This->event_target.dispex.jsdisp)
|
||||||
|
return S_FALSE;
|
||||||
|
|
||||||
hres = dispex_get_dynid(&This->event_target.dispex, prop->name, TRUE, &dispex_id);
|
hres = dispex_get_dynid(&This->event_target.dispex, prop->name, TRUE, &dispex_id);
|
||||||
if(FAILED(hres))
|
if(FAILED(hres))
|
||||||
return hres;
|
return hres;
|
||||||
|
|
Loading…
Reference in a new issue