Commit 7ff50883 authored by Gabriel Ivăncescu's avatar Gabriel Ivăncescu Committed by Alexandre Julliard

mshtml: Use the private interface to expose onload for XMLHttpRequest.

Rather than hacking a custom prop. Signed-off-by: 's avatarGabriel Ivăncescu <gabrielopcode@gmail.com>
parent cbd1ad05
...@@ -139,6 +139,10 @@ interface IWineDOMTokenList : IDispatch ...@@ -139,6 +139,10 @@ interface IWineDOMTokenList : IDispatch
HRESULT toString([retval, out] BSTR *String); 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; const long DISPID_IWINEXMLHTTPREQUESTPRIVATE_OVERRIDEMIMETYPE = 5;
[ [
odl, odl,
...@@ -149,17 +153,17 @@ const long DISPID_IWINEXMLHTTPREQUESTPRIVATE_OVERRIDEMIMETYPE = 5; ...@@ -149,17 +153,17 @@ const long DISPID_IWINEXMLHTTPREQUESTPRIVATE_OVERRIDEMIMETYPE = 5;
] ]
interface IWineXMLHttpRequestPrivate : IDispatch interface IWineXMLHttpRequestPrivate : IDispatch
{ {
[propget, id(1)] [propget, id(DISPID_IWINEXMLHTTPREQUESTPRIVATE_RESPONSE)]
HRESULT response([retval, out] VARIANT *p); HRESULT response([retval, out] VARIANT *p);
[propput, id(2)] [propput, id(DISPID_IWINEXMLHTTPREQUESTPRIVATE_RESPONSETYPE)]
HRESULT responseType([in] BSTR v); HRESULT responseType([in] BSTR v);
[propget, id(2)] [propget, id(DISPID_IWINEXMLHTTPREQUESTPRIVATE_RESPONSETYPE)]
HRESULT responseType([retval, out] BSTR *p); HRESULT responseType([retval, out] BSTR *p);
[propget, id(3)] [propget, id(DISPID_IWINEXMLHTTPREQUESTPRIVATE_UPLOAD)]
HRESULT upload([retval, out] IDispatch **p); HRESULT upload([retval, out] IDispatch **p);
[propput, id(4)] [propput, id(DISPID_IWINEXMLHTTPREQUESTPRIVATE_WITHCREDENTIALS)]
HRESULT withCredentials([in] VARIANT_BOOL v); HRESULT withCredentials([in] VARIANT_BOOL v);
[propget, id(4)] [propget, id(DISPID_IWINEXMLHTTPREQUESTPRIVATE_WITHCREDENTIALS)]
HRESULT withCredentials([retval, out] VARIANT_BOOL *p); HRESULT withCredentials([retval, out] VARIANT_BOOL *p);
[id(DISPID_IWINEXMLHTTPREQUESTPRIVATE_OVERRIDEMIMETYPE)] [id(DISPID_IWINEXMLHTTPREQUESTPRIVATE_OVERRIDEMIMETYPE)]
HRESULT overrideMimeType([in] BSTR mimeType); HRESULT overrideMimeType([in] BSTR mimeType);
...@@ -183,6 +187,10 @@ interface IWineXMLHttpRequestPrivate : IDispatch ...@@ -183,6 +187,10 @@ interface IWineXMLHttpRequestPrivate : IDispatch
HRESULT onloadend([in] VARIANT v); HRESULT onloadend([in] VARIANT v);
[propget, id(DISPID_EVPROP_LOADEND)] [propget, id(DISPID_EVPROP_LOADEND)]
HRESULT onloadend([retval, out] VARIANT *p); 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 */ } /* library MSHTML_private */
...@@ -36,8 +36,6 @@ ...@@ -36,8 +36,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(mshtml); WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
#define MSHTML_DISPID_HTMLXMLHTTPREQUEST_ONLOAD MSHTML_DISPID_CUSTOM_MIN
static HRESULT bstr_to_nsacstr(BSTR bstr, nsACString *str) static HRESULT bstr_to_nsacstr(BSTR bstr, nsACString *str)
{ {
char *cstr = heap_strdupWtoU(bstr); char *cstr = heap_strdupWtoU(bstr);
...@@ -1093,6 +1091,24 @@ static HRESULT WINAPI HTMLXMLHttpRequest_private_get_onloadend(IWineXMLHttpReque ...@@ -1093,6 +1091,24 @@ static HRESULT WINAPI HTMLXMLHttpRequest_private_get_onloadend(IWineXMLHttpReque
return get_event_handler(&This->event_target, EVENTID_LOADEND, p); 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 = { static const IWineXMLHttpRequestPrivateVtbl WineXMLHttpRequestPrivateVtbl = {
HTMLXMLHttpRequest_private_QueryInterface, HTMLXMLHttpRequest_private_QueryInterface,
HTMLXMLHttpRequest_private_AddRef, HTMLXMLHttpRequest_private_AddRef,
...@@ -1117,7 +1133,9 @@ static const IWineXMLHttpRequestPrivateVtbl WineXMLHttpRequestPrivateVtbl = { ...@@ -1117,7 +1133,9 @@ static const IWineXMLHttpRequestPrivateVtbl WineXMLHttpRequestPrivateVtbl = {
HTMLXMLHttpRequest_private_put_onloadstart, HTMLXMLHttpRequest_private_put_onloadstart,
HTMLXMLHttpRequest_private_get_onloadstart, HTMLXMLHttpRequest_private_get_onloadstart,
HTMLXMLHttpRequest_private_put_onloadend, 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) static inline HTMLXMLHttpRequest *impl_from_IProvideClassInfo2(IProvideClassInfo2 *iface)
...@@ -1170,47 +1188,6 @@ static inline HTMLXMLHttpRequest *impl_from_DispatchEx(DispatchEx *iface) ...@@ -1170,47 +1188,6 @@ static inline HTMLXMLHttpRequest *impl_from_DispatchEx(DispatchEx *iface)
return CONTAINING_RECORD(iface, HTMLXMLHttpRequest, event_target.dispex); 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) static nsISupports *HTMLXMLHttpRequest_get_gecko_target(DispatchEx *dispex)
{ {
HTMLXMLHttpRequest *This = impl_from_DispatchEx(dispex); HTMLXMLHttpRequest *This = impl_from_DispatchEx(dispex);
...@@ -1266,22 +1243,33 @@ static void HTMLXMLHttpRequest_init_dispex_info(dispex_data_t *info, compat_mode ...@@ -1266,22 +1243,33 @@ static void HTMLXMLHttpRequest_init_dispex_info(dispex_data_t *info, compat_mode
{DISPID_IHTMLXMLHTTPREQUEST_OPEN, HTMLXMLHttpRequest_open_hook}, {DISPID_IHTMLXMLHTTPREQUEST_OPEN, HTMLXMLHttpRequest_open_hook},
{DISPID_UNKNOWN} {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_IWINEXMLHTTPREQUESTPRIVATE_OVERRIDEMIMETYPE},
{DISPID_UNKNOWN} {DISPID_UNKNOWN}
}; };
const dispex_hook_t *const private_ie10_hooks = private_hooks + ARRAY_SIZE(private_hooks) - 2;
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); 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,
dispex_info_add_interface(info, IWineXMLHttpRequestPrivate_tid, compat_mode == COMPAT_MODE_IE10 ? private_ie10_hooks : NULL); 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 = { static event_target_vtbl_t HTMLXMLHttpRequest_event_target_vtbl = {
{ {
NULL, NULL,
HTMLXMLHttpRequest_get_dispid,
HTMLXMLHttpRequest_invoke
}, },
HTMLXMLHttpRequest_get_gecko_target, HTMLXMLHttpRequest_get_gecko_target,
HTMLXMLHttpRequest_bind_event HTMLXMLHttpRequest_bind_event
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment