[PATCH 5/5] mshtml: Use the private interface to expose onload for XMLHttpRequest.

Gabriel Ivăncescu wine at gitlab.winehq.org
Thu Jul 7 09:18:20 CDT 2022


From: Gabriel Ivăncescu <gabrielopcode at gmail.com>

Rather than hacking a custom prop.

Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
 dlls/mshtml/mshtml_private_iface.idl | 20 +++++--
 dlls/mshtml/xmlhttprequest.c         | 86 ++++++++++++----------------
 2 files changed, 51 insertions(+), 55 deletions(-)

diff --git a/dlls/mshtml/mshtml_private_iface.idl b/dlls/mshtml/mshtml_private_iface.idl
index 972f9b30c90..8e9e3860b13 100644
--- a/dlls/mshtml/mshtml_private_iface.idl
+++ b/dlls/mshtml/mshtml_private_iface.idl
@@ -139,6 +139,10 @@ interface IWineDOMTokenList : IDispatch
     HRESULT toString([retval, out] BSTR *String);
 }
 
+const long DISPID_IWINEXMLHTTPREQUESTPRIVATE_RESPONSE = 1;
+const long DISPID_IWINEXMLHTTPREQUESTPRIVATE_RESPONSETYPE = 2;
+const long DISPID_IWINEXMLHTTPREQUESTPRIVATE_UPLOAD = 3;
+const long DISPID_IWINEXMLHTTPREQUESTPRIVATE_WITHCREDENTIALS = 4;
 const long DISPID_IWINEXMLHTTPREQUESTPRIVATE_OVERRIDEMIMETYPE = 5;
 [
     odl,
@@ -149,17 +153,17 @@ const long DISPID_IWINEXMLHTTPREQUESTPRIVATE_OVERRIDEMIMETYPE = 5;
 ]
 interface IWineXMLHttpRequestPrivate : IDispatch
 {
-    [propget, id(1)]
+    [propget, id(DISPID_IWINEXMLHTTPREQUESTPRIVATE_RESPONSE)]
     HRESULT response([retval, out] VARIANT *p);
-    [propput, id(2)]
+    [propput, id(DISPID_IWINEXMLHTTPREQUESTPRIVATE_RESPONSETYPE)]
     HRESULT responseType([in] BSTR v);
-    [propget, id(2)]
+    [propget, id(DISPID_IWINEXMLHTTPREQUESTPRIVATE_RESPONSETYPE)]
     HRESULT responseType([retval, out] BSTR *p);
-    [propget, id(3)]
+    [propget, id(DISPID_IWINEXMLHTTPREQUESTPRIVATE_UPLOAD)]
     HRESULT upload([retval, out] IDispatch **p);
-    [propput, id(4)]
+    [propput, id(DISPID_IWINEXMLHTTPREQUESTPRIVATE_WITHCREDENTIALS)]
     HRESULT withCredentials([in] VARIANT_BOOL v);
-    [propget, id(4)]
+    [propget, id(DISPID_IWINEXMLHTTPREQUESTPRIVATE_WITHCREDENTIALS)]
     HRESULT withCredentials([retval, out] VARIANT_BOOL *p);
     [id(DISPID_IWINEXMLHTTPREQUESTPRIVATE_OVERRIDEMIMETYPE)]
     HRESULT overrideMimeType([in] BSTR mimeType);
@@ -183,6 +187,10 @@ interface IWineXMLHttpRequestPrivate : IDispatch
     HRESULT onloadend([in] VARIANT v);
     [propget, id(DISPID_EVPROP_LOADEND)]
     HRESULT onloadend([retval, out] VARIANT *p);
+    [propput, id(DISPID_EVPROP_ONLOAD)]
+    HRESULT onload([in] VARIANT v);
+    [propget, id(DISPID_EVPROP_ONLOAD)]
+    HRESULT onload([retval, out] VARIANT *p);
 }
 
 } /* library MSHTML_private */
diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c
index f21114abcac..b17fa418c6c 100644
--- a/dlls/mshtml/xmlhttprequest.c
+++ b/dlls/mshtml/xmlhttprequest.c
@@ -36,8 +36,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 
-#define MSHTML_DISPID_HTMLXMLHTTPREQUEST_ONLOAD MSHTML_DISPID_CUSTOM_MIN
-
 static HRESULT bstr_to_nsacstr(BSTR bstr, nsACString *str)
 {
     char *cstr = heap_strdupWtoU(bstr);
@@ -1093,6 +1091,24 @@ static HRESULT WINAPI HTMLXMLHttpRequest_private_get_onloadend(IWineXMLHttpReque
     return get_event_handler(&This->event_target, EVENTID_LOADEND, p);
 }
 
+static HRESULT WINAPI HTMLXMLHttpRequest_private_put_onload(IWineXMLHttpRequestPrivate *iface, VARIANT v)
+{
+    HTMLXMLHttpRequest *This = impl_from_IWineXMLHttpRequestPrivate(iface);
+
+    TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
+
+    return set_event_handler(&This->event_target, EVENTID_LOAD, &v);
+}
+
+static HRESULT WINAPI HTMLXMLHttpRequest_private_get_onload(IWineXMLHttpRequestPrivate *iface, VARIANT *p)
+{
+    HTMLXMLHttpRequest *This = impl_from_IWineXMLHttpRequestPrivate(iface);
+
+    TRACE("(%p)->(%p)\n", This, p);
+
+    return get_event_handler(&This->event_target, EVENTID_LOAD, p);
+}
+
 static const IWineXMLHttpRequestPrivateVtbl WineXMLHttpRequestPrivateVtbl = {
     HTMLXMLHttpRequest_private_QueryInterface,
     HTMLXMLHttpRequest_private_AddRef,
@@ -1117,7 +1133,9 @@ static const IWineXMLHttpRequestPrivateVtbl WineXMLHttpRequestPrivateVtbl = {
     HTMLXMLHttpRequest_private_put_onloadstart,
     HTMLXMLHttpRequest_private_get_onloadstart,
     HTMLXMLHttpRequest_private_put_onloadend,
-    HTMLXMLHttpRequest_private_get_onloadend
+    HTMLXMLHttpRequest_private_get_onloadend,
+    HTMLXMLHttpRequest_private_put_onload,
+    HTMLXMLHttpRequest_private_get_onload
 };
 
 static inline HTMLXMLHttpRequest *impl_from_IProvideClassInfo2(IProvideClassInfo2 *iface)
@@ -1170,47 +1188,6 @@ static inline HTMLXMLHttpRequest *impl_from_DispatchEx(DispatchEx *iface)
     return CONTAINING_RECORD(iface, HTMLXMLHttpRequest, event_target.dispex);
 }
 
-static HRESULT HTMLXMLHttpRequest_get_dispid(DispatchEx *dispex, BSTR name, DWORD flags, DISPID *dispid)
-{
-    /* onload event handler property is supported, but not exposed by any interface. We implement as a custom property. */
-    if(!wcscmp(L"onload", name)) {
-        *dispid = MSHTML_DISPID_HTMLXMLHTTPREQUEST_ONLOAD;
-        return S_OK;
-    }
-
-    return DISP_E_UNKNOWNNAME;
-}
-
-static HRESULT HTMLXMLHttpRequest_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params,
-        VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
-{
-    HTMLXMLHttpRequest *This = impl_from_DispatchEx(dispex);
-
-    if(id == MSHTML_DISPID_HTMLXMLHTTPREQUEST_ONLOAD) {
-        switch(flags) {
-        case DISPATCH_PROPERTYGET:
-            TRACE("(%p) get onload\n", This);
-            return get_event_handler(&This->event_target, EVENTID_LOAD, res);
-
-        case DISPATCH_PROPERTYPUT:
-            if(params->cArgs != 1 || (params->cNamedArgs == 1 && *params->rgdispidNamedArgs != DISPID_PROPERTYPUT)
-               || params->cNamedArgs > 1) {
-                FIXME("invalid args\n");
-                return E_INVALIDARG;
-            }
-
-            TRACE("(%p)->(%p) set onload\n", This, params->rgvarg);
-            return set_event_handler(&This->event_target, EVENTID_LOAD, params->rgvarg);
-
-        default:
-            FIXME("Unimplemented flags %x\n", flags);
-            return E_NOTIMPL;
-        }
-    }
-
-    return DISP_E_UNKNOWNNAME;
-}
-
 static nsISupports *HTMLXMLHttpRequest_get_gecko_target(DispatchEx *dispex)
 {
     HTMLXMLHttpRequest *This = impl_from_DispatchEx(dispex);
@@ -1266,22 +1243,33 @@ static void HTMLXMLHttpRequest_init_dispex_info(dispex_data_t *info, compat_mode
         {DISPID_IHTMLXMLHTTPREQUEST_OPEN, HTMLXMLHttpRequest_open_hook},
         {DISPID_UNKNOWN}
     };
-    static const dispex_hook_t private_ie10_hooks[] = {
+    static const dispex_hook_t private_hooks[] = {
+        {DISPID_IWINEXMLHTTPREQUESTPRIVATE_RESPONSE},
+        {DISPID_IWINEXMLHTTPREQUESTPRIVATE_RESPONSETYPE},
+        {DISPID_IWINEXMLHTTPREQUESTPRIVATE_UPLOAD},
+        {DISPID_IWINEXMLHTTPREQUESTPRIVATE_WITHCREDENTIALS},
+        {DISPID_EVPROP_ONERROR},
+        {DISPID_EVPROP_ONABORT},
+        {DISPID_EVPROP_PROGRESS},
+        {DISPID_EVPROP_LOADSTART},
+        {DISPID_EVPROP_LOADEND},
+
+        /* IE10 only */
         {DISPID_IWINEXMLHTTPREQUESTPRIVATE_OVERRIDEMIMETYPE},
         {DISPID_UNKNOWN}
     };
+    const dispex_hook_t *const private_ie10_hooks = private_hooks + ARRAY_SIZE(private_hooks) - 2;
 
     EventTarget_init_dispex_info(info, compat_mode);
     dispex_info_add_interface(info, IHTMLXMLHttpRequest_tid, compat_mode >= COMPAT_MODE_IE10 ? xhr_hooks : NULL);
-    if(compat_mode >= COMPAT_MODE_IE10)
-        dispex_info_add_interface(info, IWineXMLHttpRequestPrivate_tid, compat_mode == COMPAT_MODE_IE10 ? private_ie10_hooks : NULL);
+    dispex_info_add_interface(info, IWineXMLHttpRequestPrivate_tid,
+        compat_mode < COMPAT_MODE_IE10 ? private_hooks :
+        compat_mode < COMPAT_MODE_IE11 ? private_ie10_hooks : NULL);
 }
 
 static event_target_vtbl_t HTMLXMLHttpRequest_event_target_vtbl = {
     {
         NULL,
-        HTMLXMLHttpRequest_get_dispid,
-        HTMLXMLHttpRequest_invoke
     },
     HTMLXMLHttpRequest_get_gecko_target,
     HTMLXMLHttpRequest_bind_event
-- 
GitLab

https://gitlab.winehq.org/wine/wine/-/merge_requests/399



More information about the wine-devel mailing list