[PATCH v4 09/12] mshtml: Search attributes first when retrieving read-only builtin props in IE8 mode.

Gabriel Ivăncescu gabrielopcode at gmail.com
Thu Nov 18 12:43:35 CST 2021


If an attribute was set over a read-only builtin, reading the prop gives
the attribute's value string, until it is removed, at which point it reverts
back to retrieving the prop's value.

Hooks have to be used, though, because some builtins return non-string values
(such as clientWidth returning integer value), so we need to override them.

Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---

This extends the hook callbacks with name, as well as the init_info method
so that it optionally returns a structure that contains generic hooks for
all read-only builtin props (and in next patch, for read-write builtins).

 dlls/mshtml/dispex.c              | 26 +++++++++++++--
 dlls/mshtml/htmldoc.c             |  3 +-
 dlls/mshtml/htmlelem.c            | 54 ++++++++++++++++++++++++++++++-
 dlls/mshtml/htmlevent.c           | 11 ++++---
 dlls/mshtml/htmlnode.c            |  4 +--
 dlls/mshtml/htmlstyle.c           |  3 +-
 dlls/mshtml/htmlstyle.h           |  2 +-
 dlls/mshtml/htmlstyleelem.c       |  6 ++--
 dlls/mshtml/htmlstylesheet.c      |  3 +-
 dlls/mshtml/htmlwindow.c          |  4 +--
 dlls/mshtml/mshtml_private.h      | 20 ++++++++----
 dlls/mshtml/tests/documentmode.js |  2 --
 dlls/mshtml/xmlhttprequest.c      |  9 +++---
 13 files changed, 114 insertions(+), 33 deletions(-)

diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index e626f70..846a678 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -470,11 +470,12 @@ static int __cdecl func_name_cmp(const void *p1, const void *p2)
 
 static dispex_data_t *preprocess_dispex_data(dispex_static_data_t *desc, compat_mode_t compat_mode)
 {
+    const generic_prop_hooks_t *prop_hooks = NULL;
     const tid_t *tid;
     dispex_data_t *data;
-    DWORD i;
     ITypeInfo *dti;
     HRESULT hres;
+    DWORD i, j;
 
     if(desc->disp_tid) {
         hres = get_typeinfo(desc->disp_tid, &dti);
@@ -503,7 +504,7 @@ static dispex_data_t *preprocess_dispex_data(dispex_static_data_t *desc, compat_
     list_add_tail(&dispex_data_list, &data->entry);
 
     if(desc->init_info)
-        desc->init_info(data, compat_mode);
+        prop_hooks = desc->init_info(data, compat_mode);
 
     for(tid = desc->iface_tids; *tid; tid++) {
         hres = process_interface(data, *tid, dti, NULL);
@@ -519,6 +520,25 @@ static dispex_data_t *preprocess_dispex_data(dispex_static_data_t *desc, compat_
         return data;
     }
 
+    if(prop_hooks) {
+        for(i = 0; i < data->func_cnt; i++) {
+            func_info_t *func = &data->funcs[i];
+
+            if(func->hook || func->func_disp_idx != -1)
+                continue;
+
+            if(prop_hooks->exclude_list) {
+                for(j = 0; prop_hooks->exclude_list[j] != DISPID_UNKNOWN; j++)
+                    if(prop_hooks->exclude_list[j] == func->id)
+                        break;
+                if(prop_hooks->exclude_list[j] == func->id)
+                    continue;
+            }
+
+            func->hook = func->put_vtbl_off ? NULL : prop_hooks->ro_prop_hook;
+        }
+    }
+
 
     data->funcs = heap_realloc(data->funcs, data->func_cnt * sizeof(func_info_t));
     qsort(data->funcs, data->func_cnt, sizeof(func_info_t), dispid_cmp);
@@ -1365,7 +1385,7 @@ static HRESULT invoke_builtin_prop(DispatchEx *This, DISPID id, LCID lcid, WORD
         return hres;
 
     if(func->hook) {
-        hres = func->hook(This, lcid, flags, dp, res, ei, caller);
+        hres = func->hook(This, func->name, lcid, flags, dp, res, ei, caller);
         if(hres != S_FALSE)
             return hres;
     }
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index d2caaef..1a02fc7 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -5628,7 +5628,7 @@ static const tid_t HTMLDocumentNode_iface_tids[] = {
     0
 };
 
-static void HTMLDocumentNode_init_dispex_info(dispex_data_t *info, compat_mode_t mode)
+static const generic_prop_hooks_t *HTMLDocumentNode_init_dispex_info(dispex_data_t *info, compat_mode_t mode)
 {
     HTMLDOMNode_init_dispex_info(info, mode);
 
@@ -5646,6 +5646,7 @@ static void HTMLDocumentNode_init_dispex_info(dispex_data_t *info, compat_mode_t
         dispex_info_add_interface(info, IHTMLDocument6_tid, NULL);
         dispex_info_add_interface(info, IHTMLDocument3_tid, NULL);
     }
+    return NULL;
 }
 
 static dispex_static_data_t HTMLDocumentNode_dispex = {
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index 03bcbb7..f7fd9ed 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -1333,6 +1333,9 @@ static HRESULT WINAPI HTMLElement_removeAttribute(IHTMLElement *iface, BSTR strA
         if(FAILED(hres))
             return hres;
 
+        if(compat_mode >= COMPAT_MODE_IE8)
+            element_remove_attribute(This, strAttributeName);
+
         *pfSuccess = VARIANT_TRUE;
         return S_OK;
     }
@@ -6689,13 +6692,60 @@ static IHTMLEventObj *HTMLElement_set_current_event(DispatchEx *dispex, IHTMLEve
     return default_set_current_event(This->node.doc->window, event);
 }
 
-void HTMLElement_init_dispex_info(dispex_data_t *info, compat_mode_t mode)
+static HRESULT ie8_ro_prop_hook(DispatchEx *dispex, BSTR name, LCID lcid, WORD flags,
+        DISPPARAMS *dp, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
+{
+    HTMLElement *This = impl_from_DispatchEx(dispex);
+    nsAString name_str, val_str;
+    const PRUnichar *val;
+    nsresult nsres;
+    cpp_bool b;
+
+    if(flags != DISPATCH_PROPERTYGET || !res || !This->dom_element)
+        return S_FALSE;
+
+    nsAString_InitDepend(&name_str, name);
+    nsres = nsIDOMElement_HasAttribute(This->dom_element, &name_str, &b);
+    if(NS_FAILED(nsres) || !b) {
+        nsAString_Finish(&name_str);
+        return S_FALSE;
+    }
+
+    nsAString_Init(&val_str, NULL);
+    nsres = nsIDOMElement_GetAttribute(This->dom_element, &name_str, &val_str);
+    nsAString_Finish(&name_str);
+    if(NS_FAILED(nsres)) {
+        nsAString_Finish(&val_str);
+        return S_FALSE;
+    }
+
+    nsAString_GetData(&val_str, &val);
+    V_BSTR(res) = SysAllocString(val);
+    nsAString_Finish(&val_str);
+
+    if(!V_BSTR(res))
+        return E_OUTOFMEMORY;
+    V_VT(res) = VT_BSTR;
+
+    return S_OK;
+}
+
+const generic_prop_hooks_t *HTMLElement_init_dispex_info(dispex_data_t *info, compat_mode_t mode)
 {
     static const dispex_hook_t elem2_ie11_hooks[] = {
         {DISPID_IHTMLELEMENT2_DOSCROLL, NULL},
         {DISPID_IHTMLELEMENT2_READYSTATE, NULL},
         {DISPID_UNKNOWN}
     };
+    static const DISPID ie8_prop_hooks_exclude_list[] = {
+        DISPID_IHTMLELEMENT_CLASSNAME,
+        DISPID_IHTMLELEMENT_STYLE,
+        DISPID_UNKNOWN
+    };
+    static const generic_prop_hooks_t ie8_prop_hooks = {
+        ie8_ro_prop_hook,
+        ie8_prop_hooks_exclude_list
+    };
 
     HTMLDOMNode_init_dispex_info(info, mode);
 
@@ -6714,6 +6764,8 @@ void HTMLElement_init_dispex_info(dispex_data_t *info, compat_mode_t mode)
         dispex_info_add_interface(info, IHTMLElement7_tid, NULL);
         dispex_info_add_interface(info, IWineHTMLElementPrivate_tid, NULL);
     }
+
+    return (mode == COMPAT_MODE_IE8) ? &ie8_prop_hooks : NULL;
 }
 
 static const tid_t HTMLElement_iface_tids[] = {
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index 3f545bb..84cd0b1 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -3314,8 +3314,8 @@ static HRESULT WINAPI EventTarget_dispatchEvent(IEventTarget *iface, IDOMEvent *
     return dispatch_event_object(This, event, DISPATCH_STANDARD, result);
 }
 
-static HRESULT IEventTarget_addEventListener_hook(DispatchEx *dispex, LCID lcid, WORD flags,
-        DISPPARAMS *dp, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
+static HRESULT IEventTarget_addEventListener_hook(DispatchEx *dispex, BSTR name, LCID lcid,
+        WORD flags, DISPPARAMS *dp, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
 {
     /* If only two arguments were given, implicitly set capture to false */
     if((flags & DISPATCH_METHOD) && dp->cArgs == 2 && !dp->cNamedArgs) {
@@ -3335,8 +3335,8 @@ static HRESULT IEventTarget_addEventListener_hook(DispatchEx *dispex, LCID lcid,
     return S_FALSE; /* fallback to default */
 }
 
-static HRESULT IEventTarget_removeEventListener_hook(DispatchEx *dispex, LCID lcid, WORD flags,
-        DISPPARAMS *dp, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
+static HRESULT IEventTarget_removeEventListener_hook(DispatchEx *dispex, BSTR name, LCID lcid,
+        WORD flags, DISPPARAMS *dp, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
 {
     /* If only two arguments were given, implicitly set capture to false */
     if((flags & DISPATCH_METHOD) && dp->cArgs == 2 && !dp->cNamedArgs) {
@@ -3413,7 +3413,7 @@ HRESULT EventTarget_QI(EventTarget *event_target, REFIID riid, void **ppv)
     return E_NOINTERFACE;
 }
 
-void EventTarget_init_dispex_info(dispex_data_t *dispex_info, compat_mode_t compat_mode)
+const generic_prop_hooks_t *EventTarget_init_dispex_info(dispex_data_t *dispex_info, compat_mode_t compat_mode)
 {
     static const dispex_hook_t IEventTarget_hooks[] = {
         {DISPID_IEVENTTARGET_ADDEVENTLISTENER, IEventTarget_addEventListener_hook},
@@ -3423,6 +3423,7 @@ void EventTarget_init_dispex_info(dispex_data_t *dispex_info, compat_mode_t comp
 
     if(compat_mode >= COMPAT_MODE_IE9)
         dispex_info_add_interface(dispex_info, IEventTarget_tid, IEventTarget_hooks);
+    return NULL;
 }
 
 static int event_id_cmp(const void *key, const struct wine_rb_entry *entry)
diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c
index 418c958..3a2e746 100644
--- a/dlls/mshtml/htmlnode.c
+++ b/dlls/mshtml/htmlnode.c
@@ -1432,12 +1432,12 @@ static HRESULT HTMLDOMNode_clone(HTMLDOMNode *This, nsIDOMNode *nsnode, HTMLDOMN
     return create_node(This->doc, nsnode, ret);
 }
 
-void HTMLDOMNode_init_dispex_info(dispex_data_t *info, compat_mode_t mode)
+const generic_prop_hooks_t *HTMLDOMNode_init_dispex_info(dispex_data_t *info, compat_mode_t mode)
 {
     if(mode >= COMPAT_MODE_IE9)
         dispex_info_add_interface(info, IHTMLDOMNode3_tid, NULL);
 
-    EventTarget_init_dispex_info(info, mode);
+    return EventTarget_init_dispex_info(info, mode);
 }
 
 static const cpc_entry_t HTMLDOMNode_cpc[] = {{NULL}};
diff --git a/dlls/mshtml/htmlstyle.c b/dlls/mshtml/htmlstyle.c
index b00b9f8..7ca7367 100644
--- a/dlls/mshtml/htmlstyle.c
+++ b/dlls/mshtml/htmlstyle.c
@@ -9983,12 +9983,13 @@ static HRESULT CSSStyle_get_dispid(DispatchEx *dispex, BSTR name, DWORD flags, D
     return DISP_E_UNKNOWNNAME;
 }
 
-void CSSStyle_init_dispex_info(dispex_data_t *info, compat_mode_t mode)
+const generic_prop_hooks_t *CSSStyle_init_dispex_info(dispex_data_t *info, compat_mode_t mode)
 {
     if(mode >= COMPAT_MODE_IE9)
         dispex_info_add_interface(info, IHTMLCSSStyleDeclaration_tid, NULL);
     if(mode >= COMPAT_MODE_IE10)
         dispex_info_add_interface(info, IHTMLCSSStyleDeclaration2_tid, NULL);
+    return NULL;
 }
 
 const dispex_static_data_vtbl_t CSSStyle_dispex_vtbl = {
diff --git a/dlls/mshtml/htmlstyle.h b/dlls/mshtml/htmlstyle.h
index 25f87c8..59fc281 100644
--- a/dlls/mshtml/htmlstyle.h
+++ b/dlls/mshtml/htmlstyle.h
@@ -155,7 +155,7 @@ HRESULT create_computed_style(nsIDOMCSSStyleDeclaration*,compat_mode_t,IHTMLCSSS
 void init_css_style(CSSStyle*,nsIDOMCSSStyleDeclaration*,style_qi_t,
                     dispex_static_data_t*,compat_mode_t) DECLSPEC_HIDDEN;
 
-void CSSStyle_init_dispex_info(dispex_data_t *info, compat_mode_t mode) DECLSPEC_HIDDEN;
+const generic_prop_hooks_t *CSSStyle_init_dispex_info(dispex_data_t *info, compat_mode_t mode) DECLSPEC_HIDDEN;
 extern const dispex_static_data_vtbl_t CSSStyle_dispex_vtbl DECLSPEC_HIDDEN;
 
 HRESULT get_style_property(CSSStyle*,styleid_t,BSTR*) DECLSPEC_HIDDEN;
diff --git a/dlls/mshtml/htmlstyleelem.c b/dlls/mshtml/htmlstyleelem.c
index cf57547..82ef2d7 100644
--- a/dlls/mshtml/htmlstyleelem.c
+++ b/dlls/mshtml/htmlstyleelem.c
@@ -420,21 +420,21 @@ static void HTMLStyleElement_unlink(HTMLDOMNode *iface)
     }
 }
 
-static void HTMLStyleElement_init_dispex_info(dispex_data_t *info, compat_mode_t mode)
+static const generic_prop_hooks_t *HTMLStyleElement_init_dispex_info(dispex_data_t *info, compat_mode_t mode)
 {
     static const dispex_hook_t ie11_hooks[] = {
         {DISPID_IHTMLSTYLEELEMENT_READYSTATE, NULL},
         {DISPID_IHTMLSTYLEELEMENT_STYLESHEET, NULL},
         {DISPID_UNKNOWN}
     };
-
-    HTMLElement_init_dispex_info(info, mode);
+    const generic_prop_hooks_t *prop_hooks = HTMLElement_init_dispex_info(info, mode);
 
     dispex_info_add_interface(info, IHTMLStyleElement_tid,
                               mode >= COMPAT_MODE_IE11 ? ie11_hooks : NULL);
 
     if(mode >= COMPAT_MODE_IE9)
         dispex_info_add_interface(info, IHTMLStyleElement2_tid, NULL);
+    return prop_hooks;
 }
 
 static const NodeImplVtbl HTMLStyleElementImplVtbl = {
diff --git a/dlls/mshtml/htmlstylesheet.c b/dlls/mshtml/htmlstylesheet.c
index c31c780..4f38c12 100644
--- a/dlls/mshtml/htmlstylesheet.c
+++ b/dlls/mshtml/htmlstylesheet.c
@@ -1140,10 +1140,11 @@ static const IHTMLStyleSheet4Vtbl HTMLStyleSheet4Vtbl = {
     HTMLStyleSheet4_deleteRule,
 };
 
-static void HTMLStyleSheet_init_dispex_info(dispex_data_t *info, compat_mode_t mode)
+static const generic_prop_hooks_t *HTMLStyleSheet_init_dispex_info(dispex_data_t *info, compat_mode_t mode)
 {
     if(mode >= COMPAT_MODE_IE9)
         dispex_info_add_interface(info, IHTMLStyleSheet4_tid, NULL);
+    return NULL;
 }
 
 static const tid_t HTMLStyleSheet_iface_tids[] = {
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index 635b046..7298b03 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -3734,7 +3734,7 @@ static void HTMLWindow_bind_event(DispatchEx *dispex, eventid_t eid)
     ensure_doc_nsevent_handler(This->doc, NULL, eid);
 }
 
-static void HTMLWindow_init_dispex_info(dispex_data_t *info, compat_mode_t compat_mode)
+static const generic_prop_hooks_t *HTMLWindow_init_dispex_info(dispex_data_t *info, compat_mode_t compat_mode)
 {
     if(compat_mode >= COMPAT_MODE_IE9)
         dispex_info_add_interface(info, IHTMLWindow7_tid, NULL);
@@ -3744,7 +3744,7 @@ static void HTMLWindow_init_dispex_info(dispex_data_t *info, compat_mode_t compa
         dispex_info_add_interface(info, IWineHTMLWindowPrivate_tid, NULL);
 
     dispex_info_add_interface(info, IHTMLWindow5_tid, NULL);
-    EventTarget_init_dispex_info(info, compat_mode);
+    return EventTarget_init_dispex_info(info, compat_mode);
 }
 
 static IHTMLEventObj *HTMLWindow_set_current_event(DispatchEx *dispex, IHTMLEventObj *event)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 444a4c0..d30c2af 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -319,6 +319,9 @@ typedef struct dispex_dynamic_data_t dispex_dynamic_data_t;
 
 typedef struct DispatchEx DispatchEx;
 
+typedef HRESULT (*dispex_hook_invoke_t)(DispatchEx*,BSTR,LCID,WORD,DISPPARAMS*,
+                                        VARIANT*,EXCEPINFO*,IServiceProvider*);
+
 typedef struct {
     HRESULT (*value)(DispatchEx*,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*);
     HRESULT (*get_dispid)(DispatchEx*,BSTR,DWORD,DISPID*);
@@ -327,19 +330,22 @@ typedef struct {
     HRESULT (*populate_props)(DispatchEx*);
 } dispex_static_data_vtbl_t;
 
+typedef struct {
+    dispex_hook_invoke_t ro_prop_hook;
+
+    const DISPID *exclude_list;
+} generic_prop_hooks_t;
+
 typedef struct {
     const WCHAR *name;
     const dispex_static_data_vtbl_t *vtbl;
     const tid_t disp_tid;
     const tid_t* const iface_tids;
-    void (*init_info)(dispex_data_t*,compat_mode_t);
+    const generic_prop_hooks_t* (*init_info)(dispex_data_t*,compat_mode_t);
     dispex_data_t *info_cache[COMPAT_MODE_CNT];
     dispex_data_t *delayed_init_info;
 } dispex_static_data_t;
 
-typedef HRESULT (*dispex_hook_invoke_t)(DispatchEx*,LCID,WORD,DISPPARAMS*,VARIANT*,
-                                        EXCEPINFO*,IServiceProvider*);
-
 typedef struct {
     DISPID dispid;
     dispex_hook_invoke_t invoke;
@@ -1135,18 +1141,18 @@ void HTMLElement_Init(HTMLElement*,HTMLDocumentNode*,nsIDOMElement*,dispex_stati
 
 void EventTarget_Init(EventTarget*,IUnknown*,dispex_static_data_t*,compat_mode_t) DECLSPEC_HIDDEN;
 HRESULT EventTarget_QI(EventTarget*,REFIID,void**) DECLSPEC_HIDDEN;
-void EventTarget_init_dispex_info(dispex_data_t*,compat_mode_t) DECLSPEC_HIDDEN;
+const generic_prop_hooks_t *EventTarget_init_dispex_info(dispex_data_t*,compat_mode_t) DECLSPEC_HIDDEN;
 
 HRESULT HTMLDOMNode_QI(HTMLDOMNode*,REFIID,void**) DECLSPEC_HIDDEN;
 void HTMLDOMNode_destructor(HTMLDOMNode*) DECLSPEC_HIDDEN;
-void HTMLDOMNode_init_dispex_info(dispex_data_t*,compat_mode_t) DECLSPEC_HIDDEN;
+const generic_prop_hooks_t *HTMLDOMNode_init_dispex_info(dispex_data_t*,compat_mode_t) DECLSPEC_HIDDEN;
 
 HRESULT HTMLElement_QI(HTMLDOMNode*,REFIID,void**) DECLSPEC_HIDDEN;
 void HTMLElement_destructor(HTMLDOMNode*) DECLSPEC_HIDDEN;
 HRESULT HTMLElement_clone(HTMLDOMNode*,nsIDOMNode*,HTMLDOMNode**) DECLSPEC_HIDDEN;
 HRESULT HTMLElement_get_attr_col(HTMLDOMNode*,HTMLAttributeCollection**) DECLSPEC_HIDDEN;
 HRESULT HTMLElement_handle_event(HTMLDOMNode*,DWORD,nsIDOMEvent*,BOOL*) DECLSPEC_HIDDEN;
-void HTMLElement_init_dispex_info(dispex_data_t*,compat_mode_t) DECLSPEC_HIDDEN;
+const generic_prop_hooks_t *HTMLElement_init_dispex_info(dispex_data_t*,compat_mode_t) DECLSPEC_HIDDEN;
 
 HRESULT get_node(nsIDOMNode*,BOOL,HTMLDOMNode**) DECLSPEC_HIDDEN;
 HRESULT get_element(nsIDOMElement*,HTMLElement**) DECLSPEC_HIDDEN;
diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js
index d01680b..9d2d71a 100644
--- a/dlls/mshtml/tests/documentmode.js
+++ b/dlls/mshtml/tests/documentmode.js
@@ -1359,7 +1359,6 @@ sync_test("elem_attr", function() {
                 r = elem.getAttribute(name);
                 ok(r === "string", name + " attr after setAttribute = " + r);
                 eval("r = elem." + name + ";");
-                todo_wine.
                 ok(r === "string", "elem." + name + " after setAttribute = " + r);
 
                 r = elem.removeAttribute(name);
@@ -1383,7 +1382,6 @@ sync_test("elem_attr", function() {
         r = elem.style;
         ok(r === style, "removed elem.style = " + r);
         r = elem.getAttribute("style");
-        todo_wine_if(v === 8).
         ok(r === (v < 8 ? style : null), "style attr after removal = " + r);
         elem.setAttribute("style", "opacity: 1.0");
         r = elem.getAttribute("style");
diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c
index 56e18d0..8b9cdde 100644
--- a/dlls/mshtml/xmlhttprequest.c
+++ b/dlls/mshtml/xmlhttprequest.c
@@ -475,8 +475,8 @@ static HRESULT WINAPI HTMLXMLHttpRequest_abort(IHTMLXMLHttpRequest *iface)
     return S_OK;
 }
 
-static HRESULT HTMLXMLHttpRequest_open_hook(DispatchEx *dispex, LCID lcid, WORD flags,
-        DISPPARAMS *dp, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
+static HRESULT HTMLXMLHttpRequest_open_hook(DispatchEx *dispex, BSTR name, LCID lcid,
+        WORD flags, DISPPARAMS *dp, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
 {
     /* If only two arguments were given, implicitly set async to false */
     if((flags & DISPATCH_METHOD) && dp->cArgs == 2 && !dp->cNamedArgs) {
@@ -870,15 +870,16 @@ static void HTMLXMLHttpRequest_bind_event(DispatchEx *dispex, eventid_t eid)
         This->event_listener->load_event = TRUE;
 }
 
-static void HTMLXMLHttpRequest_init_dispex_info(dispex_data_t *info, compat_mode_t compat_mode)
+static const generic_prop_hooks_t *HTMLXMLHttpRequest_init_dispex_info(dispex_data_t *info, compat_mode_t compat_mode)
 {
     static const dispex_hook_t xhr_hooks[] = {
         {DISPID_IHTMLXMLHTTPREQUEST_OPEN, HTMLXMLHttpRequest_open_hook},
         {DISPID_UNKNOWN}
     };
+    const generic_prop_hooks_t *prop_hooks = EventTarget_init_dispex_info(info, compat_mode);
 
-    EventTarget_init_dispex_info(info, compat_mode);
     dispex_info_add_interface(info, IHTMLXMLHttpRequest_tid, compat_mode >= COMPAT_MODE_IE10 ? xhr_hooks : NULL);
+    return prop_hooks;
 }
 
 static event_target_vtbl_t HTMLXMLHttpRequest_event_target_vtbl = {
-- 
2.31.1




More information about the wine-devel mailing list