mirror of
https://gitlab.winehq.org/wine/wine.git
synced 2024-11-19 17:06:04 -07:00
mshtml: Use actual referenced prop flags for window script props.
Signed-off-by: Gabriel Ivăncescu <gabrielopcode@gmail.com>
This commit is contained in:
parent
c4630993fb
commit
67c1c3c255
Notes:
Alexandre Julliard
2024-11-18 23:19:10 +01:00
Approved-by: Jacek Caban (@jacek) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/wine/merge_requests/6678
6 changed files with 44 additions and 12 deletions
|
@ -2388,7 +2388,19 @@ static void WINAPI WineJSDispatch_Free(IWineJSDispatch *iface)
|
||||||
{
|
{
|
||||||
jsdisp_t *This = impl_from_IWineJSDispatch(iface);
|
jsdisp_t *This = impl_from_IWineJSDispatch(iface);
|
||||||
jsdisp_free(This);
|
jsdisp_free(This);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI WineJSDispatch_GetPropertyFlags(IWineJSDispatch *iface, DISPID id, UINT32 *ret)
|
||||||
|
{
|
||||||
|
jsdisp_t *This = impl_from_IWineJSDispatch(iface);
|
||||||
|
dispex_prop_t *prop = get_prop(This, id);
|
||||||
|
|
||||||
|
if(!prop || prop->type == PROP_DELETED || prop->type == PROP_PROTREF)
|
||||||
|
return DISP_E_MEMBERNOTFOUND;
|
||||||
|
|
||||||
|
*ret = prop->flags & PROPF_PUBLIC_MASK;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI WineJSDispatch_GetScriptGlobal(IWineJSDispatch *iface, IWineJSDispatchHost **ret)
|
static HRESULT WINAPI WineJSDispatch_GetScriptGlobal(IWineJSDispatch *iface, IWineJSDispatchHost **ret)
|
||||||
{
|
{
|
||||||
|
@ -2422,6 +2434,7 @@ static IWineJSDispatchVtbl DispatchExVtbl = {
|
||||||
DispatchEx_GetNextDispID,
|
DispatchEx_GetNextDispID,
|
||||||
DispatchEx_GetNameSpaceParent,
|
DispatchEx_GetNameSpaceParent,
|
||||||
WineJSDispatch_Free,
|
WineJSDispatch_Free,
|
||||||
|
WineJSDispatch_GetPropertyFlags,
|
||||||
WineJSDispatch_GetScriptGlobal,
|
WineJSDispatch_GetScriptGlobal,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,7 @@ interface IWineJSDispatchHost;
|
||||||
interface IWineJSDispatch : IDispatchEx
|
interface IWineJSDispatch : IDispatchEx
|
||||||
{
|
{
|
||||||
void Free();
|
void Free();
|
||||||
|
HRESULT GetPropertyFlags(DISPID id, UINT32 *ret);
|
||||||
HRESULT GetScriptGlobal(IWineJSDispatchHost **ret);
|
HRESULT GetScriptGlobal(IWineJSDispatchHost **ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,5 +50,6 @@ void update_browser_script_mode(GeckoBrowser*,IUri*);
|
||||||
BOOL find_global_prop(HTMLInnerWindow*,const WCHAR*,DWORD,ScriptHost**,DISPID*);
|
BOOL find_global_prop(HTMLInnerWindow*,const WCHAR*,DWORD,ScriptHost**,DISPID*);
|
||||||
HRESULT global_prop_still_exists(HTMLInnerWindow*,global_prop_t*);
|
HRESULT global_prop_still_exists(HTMLInnerWindow*,global_prop_t*);
|
||||||
IDispatch *get_script_disp(ScriptHost*);
|
IDispatch *get_script_disp(ScriptHost*);
|
||||||
|
IWineJSDispatch *get_script_jsdisp(ScriptHost*);
|
||||||
IActiveScriptSite *get_first_script_site(HTMLInnerWindow*);
|
IActiveScriptSite *get_first_script_site(HTMLInnerWindow*);
|
||||||
void initialize_script_global(HTMLInnerWindow*);
|
void initialize_script_global(HTMLInnerWindow*);
|
||||||
|
|
|
@ -4029,7 +4029,9 @@ static HRESULT HTMLWindow_next_dispid(DispatchEx *dispex, DISPID id, DISPID *pid
|
||||||
HRESULT HTMLWindow_get_prop_desc(DispatchEx *dispex, DISPID id, struct property_info *desc)
|
HRESULT HTMLWindow_get_prop_desc(DispatchEx *dispex, DISPID id, struct property_info *desc)
|
||||||
{
|
{
|
||||||
HTMLInnerWindow *This = impl_from_DispatchEx(dispex);
|
HTMLInnerWindow *This = impl_from_DispatchEx(dispex);
|
||||||
|
IWineJSDispatch *jsdisp;
|
||||||
global_prop_t *prop;
|
global_prop_t *prop;
|
||||||
|
HRESULT hres = S_OK;
|
||||||
|
|
||||||
if(id - MSHTML_DISPID_CUSTOM_MIN >= This->global_prop_cnt)
|
if(id - MSHTML_DISPID_CUSTOM_MIN >= This->global_prop_cnt)
|
||||||
return DISP_E_MEMBERNOTFOUND;
|
return DISP_E_MEMBERNOTFOUND;
|
||||||
|
@ -4038,10 +4040,22 @@ HRESULT HTMLWindow_get_prop_desc(DispatchEx *dispex, DISPID id, struct property_
|
||||||
desc->name = prop->name;
|
desc->name = prop->name;
|
||||||
desc->id = id;
|
desc->id = id;
|
||||||
desc->flags = PROPF_WRITABLE | PROPF_CONFIGURABLE;
|
desc->flags = PROPF_WRITABLE | PROPF_CONFIGURABLE;
|
||||||
if(prop->type == GLOBAL_DISPEXVAR)
|
|
||||||
desc->flags |= PROPF_ENUMERABLE;
|
|
||||||
desc->iid = 0;
|
desc->iid = 0;
|
||||||
return S_OK;
|
|
||||||
|
switch(prop->type) {
|
||||||
|
case GLOBAL_SCRIPTVAR: {
|
||||||
|
if((jsdisp = get_script_jsdisp(prop->script_host)))
|
||||||
|
hres = IWineJSDispatch_GetPropertyFlags(jsdisp, prop->id, &desc->flags);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GLOBAL_DISPEXVAR:
|
||||||
|
desc->flags |= PROPF_ENUMERABLE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HTMLInnerWindow *HTMLWindow_get_script_global(DispatchEx *dispex)
|
static HTMLInnerWindow *HTMLWindow_get_script_global(DispatchEx *dispex)
|
||||||
|
|
|
@ -85,7 +85,7 @@ struct ScriptHost {
|
||||||
SCRIPTSTATE script_state;
|
SCRIPTSTATE script_state;
|
||||||
|
|
||||||
HTMLInnerWindow *window;
|
HTMLInnerWindow *window;
|
||||||
IDispatchEx *script_dispex;
|
IWineJSDispatch *script_jsdisp;
|
||||||
|
|
||||||
GUID guid;
|
GUID guid;
|
||||||
struct list entry;
|
struct list entry;
|
||||||
|
@ -264,7 +264,7 @@ static BOOL init_script_engine(ScriptHost *script_host, IActiveScript *script)
|
||||||
if(FAILED(hres))
|
if(FAILED(hres))
|
||||||
WARN("GetScriptDispatch failed: %08lx\n", hres);
|
WARN("GetScriptDispatch failed: %08lx\n", hres);
|
||||||
else {
|
else {
|
||||||
IDispatch_QueryInterface(script_disp, &IID_IDispatchEx, (void**)&script_host->script_dispex);
|
IDispatch_QueryInterface(script_disp, &IID_IWineJSDispatch, (void**)&script_host->script_jsdisp);
|
||||||
IDispatch_Release(script_disp);
|
IDispatch_Release(script_disp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -301,8 +301,8 @@ static void release_script_engine(ScriptHost *This)
|
||||||
unlink_ref(&This->parse);
|
unlink_ref(&This->parse);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(This->script_dispex)
|
if(This->script_jsdisp)
|
||||||
IDispatchEx_Release(This->script_dispex);
|
IWineJSDispatch_Release(This->script_jsdisp);
|
||||||
IActiveScript_Release(This->script);
|
IActiveScript_Release(This->script);
|
||||||
This->script = NULL;
|
This->script = NULL;
|
||||||
This->script_state = SCRIPTSTATE_UNINITIALIZED;
|
This->script_state = SCRIPTSTATE_UNINITIALIZED;
|
||||||
|
@ -1588,6 +1588,11 @@ IDispatch *get_script_disp(ScriptHost *script_host)
|
||||||
return disp;
|
return disp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IWineJSDispatch *get_script_jsdisp(ScriptHost *script_host)
|
||||||
|
{
|
||||||
|
return script_host->script_jsdisp;
|
||||||
|
}
|
||||||
|
|
||||||
IActiveScriptSite *get_first_script_site(HTMLInnerWindow *window)
|
IActiveScriptSite *get_first_script_site(HTMLInnerWindow *window)
|
||||||
{
|
{
|
||||||
if(list_empty(&window->script_hosts)) {
|
if(list_empty(&window->script_hosts)) {
|
||||||
|
@ -1850,9 +1855,9 @@ HRESULT global_prop_still_exists(HTMLInnerWindow *window, global_prop_t *prop)
|
||||||
|
|
||||||
if(!prop->script_host->script)
|
if(!prop->script_host->script)
|
||||||
return E_UNEXPECTED;
|
return E_UNEXPECTED;
|
||||||
if(!prop->script_host->script_dispex)
|
if(!prop->script_host->script_jsdisp)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
return IDispatchEx_GetMemberProperties(prop->script_host->script_dispex, prop->id, 0, &properties);
|
return IWineJSDispatch_GetMemberProperties(prop->script_host->script_jsdisp, prop->id, 0, &properties);
|
||||||
}
|
}
|
||||||
case GLOBAL_ELEMENTVAR: {
|
case GLOBAL_ELEMENTVAR: {
|
||||||
IHTMLElement *elem;
|
IHTMLElement *elem;
|
||||||
|
|
|
@ -2251,10 +2251,8 @@ sync_test("globals override", function() {
|
||||||
for(i = 0; i < builtins.length; i++) {
|
for(i = 0; i < builtins.length; i++) {
|
||||||
desc = Object.getOwnPropertyDescriptor(window, builtins[i]);
|
desc = Object.getOwnPropertyDescriptor(window, builtins[i]);
|
||||||
ok(desc !== undefined, "getOwnPropertyDescriptor('" + builtins[i] + "' returned undefined");
|
ok(desc !== undefined, "getOwnPropertyDescriptor('" + builtins[i] + "' returned undefined");
|
||||||
todo_wine.
|
|
||||||
ok(desc.configurable === false, builtins[i] + " is configurable");
|
ok(desc.configurable === false, builtins[i] + " is configurable");
|
||||||
ok(desc.enumerable === false, builtins[i] + " is enumerable");
|
ok(desc.enumerable === false, builtins[i] + " is enumerable");
|
||||||
todo_wine.
|
|
||||||
ok(desc.writable === false, builtins[i] + " is writable");
|
ok(desc.writable === false, builtins[i] + " is writable");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue