From: Jacek Caban jacek@codeweavers.com
Based on patch by Gabriel Ivăncescu. --- dlls/mshtml/htmlframe.c | 16 +++++++--------- dlls/mshtml/htmlwindow.c | 22 ++++++++++++++++++++-- dlls/mshtml/mshtml_private.h | 4 ++++ dlls/mshtml/tests/documentmode.js | 2 +- 4 files changed, 32 insertions(+), 12 deletions(-)
diff --git a/dlls/mshtml/htmlframe.c b/dlls/mshtml/htmlframe.c index 78890b43e05..b9f92bb5563 100644 --- a/dlls/mshtml/htmlframe.c +++ b/dlls/mshtml/htmlframe.c @@ -870,17 +870,15 @@ static HRESULT HTMLFrameElement_get_dispid(DispatchEx *dispex, const WCHAR *name return search_window_props(This->framebase.content_window->base.inner_window, name, grfdex, dispid); }
-static HRESULT HTMLFrameElement_get_name(DispatchEx *dispex, DISPID id, BSTR *name) +static HRESULT HTMLFrameElement_get_prop_desc(DispatchEx *dispex, DISPID id, struct property_info *desc) { HTMLFrameElement *This = frame_from_DispatchEx(dispex); - DWORD idx = id - MSHTML_DISPID_CUSTOM_MIN;
- if(!This->framebase.content_window || - idx >= This->framebase.content_window->base.inner_window->global_prop_cnt) + if(!This->framebase.content_window) return DISP_E_MEMBERNOTFOUND;
- *name = SysAllocString(This->framebase.content_window->base.inner_window->global_props[idx].name); - return *name ? S_OK : E_OUTOFMEMORY; + return HTMLWindow_get_prop_desc(&This->framebase.content_window->base.inner_window->event_target.dispex, + id, desc); }
static HRESULT HTMLFrameElement_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params, @@ -893,8 +891,8 @@ static HRESULT HTMLFrameElement_invoke(DispatchEx *dispex, DISPID id, LCID lcid, return E_FAIL; }
- return IWineJSDispatchHost_InvokeEx(&This->framebase.content_window->IWineJSDispatchHost_iface, id, lcid, - flags, params, res, ei, caller); + return HTMLWindow_invoke(&This->framebase.content_window->base.inner_window->event_target.dispex, + id, lcid, flags, params, res, ei, caller); }
static const NodeImplVtbl HTMLFrameElementImplVtbl = { @@ -915,7 +913,7 @@ static const event_target_vtbl_t HTMLFrameElement_event_target_vtbl = { .traverse = HTMLFrameElement_traverse, .unlink = HTMLFrameElement_unlink, .get_dispid = HTMLFrameElement_get_dispid, - .get_name = HTMLFrameElement_get_name, + .get_prop_desc = HTMLFrameElement_get_prop_desc, .invoke = HTMLFrameElement_invoke }, HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES, diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index ceac07e4dd3..a7a6b0df383 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -3830,8 +3830,8 @@ static HRESULT HTMLWindow_find_dispid(DispatchEx *dispex, const WCHAR *name, DWO return DISP_E_UNKNOWNNAME; }
-static HRESULT HTMLWindow_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params, - VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) +HRESULT HTMLWindow_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params, + VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) { HTMLInnerWindow *This = impl_from_DispatchEx(dispex); global_prop_t *prop; @@ -3946,6 +3946,24 @@ static HRESULT HTMLWindow_next_dispid(DispatchEx *dispex, DISPID id, DISPID *pid return S_OK; }
+HRESULT HTMLWindow_get_prop_desc(DispatchEx *dispex, DISPID id, struct property_info *desc) +{ + HTMLInnerWindow *This = impl_from_DispatchEx(dispex); + global_prop_t *prop; + + if(id - MSHTML_DISPID_CUSTOM_MIN >= This->global_prop_cnt) + return DISP_E_MEMBERNOTFOUND; + + prop = &This->global_props[id - MSHTML_DISPID_CUSTOM_MIN]; + desc->name = prop->name; + desc->id = id; + desc->flags = PROPF_WRITABLE | PROPF_CONFIGURABLE; + if(prop->type == GLOBAL_DISPEXVAR) + desc->flags |= PROPF_ENUMERABLE; + desc->func_iid = 0; + return S_OK; +} + static compat_mode_t HTMLWindow_get_compat_mode(DispatchEx *dispex, HTMLInnerWindow **script_global) { HTMLInnerWindow *This = impl_from_DispatchEx(dispex); diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 04c51fb2503..9d84cbabe55 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -1069,6 +1069,10 @@ void HTMLDocumentObj_Service_Init(HTMLDocumentObj*); void HTMLDocumentObj_OleCmd_Init(HTMLDocumentObj*); void TargetContainer_Init(HTMLDocumentObj*);
+HRESULT HTMLWindow_get_prop_desc(DispatchEx *dispex, DISPID id, struct property_info *desc); +HRESULT HTMLWindow_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params, + VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller); + void HTMLDocumentNode_Persist_Init(HTMLDocumentNode*); void HTMLDocumentNode_Service_Init(HTMLDocumentNode*); void HTMLDocumentNode_OleCmd_Init(HTMLDocumentNode*); diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 3fb0fbab1d9..f608e573a34 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -150,7 +150,7 @@ sync_test("builtin_toString", function() { [ "font", "Font", -1 ], [ "footer", "" ], [ "form", "Form" ], - [ "frame", "Frame", -1 ], + [ "frame", "Frame" ], [ "frameset", "FrameSet", -1 ], [ "h1", "Heading", -1 ], [ "h2", "Heading", -1 ],