2 * Copyright 2015 Zhenbo Li
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
28 #include "wine/debug.h"
30 #include "mshtml_private.h"
31 #include "htmlevent.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(mshtml
);
39 #define MSHTML_DISPID_HTMLXMLHTTPREQUEST_ONLOAD MSHTML_DISPID_CUSTOM_MIN
41 static HRESULT
bstr_to_nsacstr(BSTR bstr
, nsACString
*str
)
43 char *cstr
= heap_strdupWtoU(bstr
);
46 nsACString_Init(str
, cstr
);
51 static HRESULT
variant_to_nsastr(VARIANT var
, nsAString
*ret
)
57 nsAString_Init(ret
, NULL
);
60 nsAString_InitDepend(ret
, V_BSTR(&var
));
63 FIXME("Unsupported VARIANT: %s\n", debugstr_variant(&var
));
68 static HRESULT
return_nscstr(nsresult nsres
, nsACString
*nscstr
, BSTR
*p
)
73 if(NS_FAILED(nsres
)) {
74 ERR("failed: %08lx\n", nsres
);
75 nsACString_Finish(nscstr
);
79 nsACString_GetData(nscstr
, &str
);
82 len
= MultiByteToWideChar(CP_UTF8
, 0, str
, -1, NULL
, 0);
83 *p
= SysAllocStringLen(NULL
, len
- 1);
85 nsACString_Finish(nscstr
);
88 MultiByteToWideChar(CP_UTF8
, 0, str
, -1, *p
, len
);
93 nsACString_Finish(nscstr
);
97 static const eventid_t events
[] = {
98 EVENTID_READYSTATECHANGE
,
109 nsIDOMEventListener nsIDOMEventListener_iface
;
111 HTMLXMLHttpRequest
*xhr
;
113 } XMLHttpReqEventListener
;
115 struct HTMLXMLHttpRequest
{
116 EventTarget event_target
;
117 IHTMLXMLHttpRequest IHTMLXMLHttpRequest_iface
;
118 IHTMLXMLHttpRequest2 IHTMLXMLHttpRequest2_iface
;
119 IWineXMLHttpRequestPrivate IWineXMLHttpRequestPrivate_iface
;
120 IProvideClassInfo2 IProvideClassInfo2_iface
;
122 nsIXMLHttpRequest
*nsxhr
;
123 XMLHttpReqEventListener
*event_listener
;
126 static void detach_xhr_event_listener(XMLHttpReqEventListener
*event_listener
)
128 nsIDOMEventTarget
*event_target
;
129 DWORD events_mask
, i
;
133 nsres
= nsIXMLHttpRequest_QueryInterface(event_listener
->xhr
->nsxhr
, &IID_nsIDOMEventTarget
, (void**)&event_target
);
134 assert(nsres
== NS_OK
);
136 for(events_mask
= event_listener
->events_mask
, i
= 0; events_mask
; events_mask
>>= 1, i
++) {
137 if(!(events_mask
& 1))
139 nsAString_InitDepend(&str
, get_event_name(events
[i
]));
140 nsres
= nsIDOMEventTarget_RemoveEventListener(event_target
, &str
, &event_listener
->nsIDOMEventListener_iface
, FALSE
);
141 nsAString_Finish(&str
);
142 assert(nsres
== NS_OK
);
145 nsIDOMEventTarget_Release(event_target
);
147 event_listener
->xhr
->event_listener
= NULL
;
148 event_listener
->xhr
= NULL
;
149 nsIDOMEventListener_Release(&event_listener
->nsIDOMEventListener_iface
);
153 static inline XMLHttpReqEventListener
*impl_from_nsIDOMEventListener(nsIDOMEventListener
*iface
)
155 return CONTAINING_RECORD(iface
, XMLHttpReqEventListener
, nsIDOMEventListener_iface
);
158 static nsresult NSAPI
XMLHttpReqEventListener_QueryInterface(nsIDOMEventListener
*iface
,
159 nsIIDRef riid
, void **result
)
161 XMLHttpReqEventListener
*This
= impl_from_nsIDOMEventListener(iface
);
163 if(IsEqualGUID(&IID_nsISupports
, riid
)) {
164 TRACE("(%p)->(IID_nsISupports, %p)\n", This
, result
);
165 *result
= &This
->nsIDOMEventListener_iface
;
166 }else if(IsEqualGUID(&IID_nsIDOMEventListener
, riid
)) {
167 TRACE("(%p)->(IID_nsIDOMEventListener %p)\n", This
, result
);
168 *result
= &This
->nsIDOMEventListener_iface
;
171 TRACE("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), result
);
172 return NS_NOINTERFACE
;
175 nsIDOMEventListener_AddRef(&This
->nsIDOMEventListener_iface
);
179 static nsrefcnt NSAPI
XMLHttpReqEventListener_AddRef(nsIDOMEventListener
*iface
)
181 XMLHttpReqEventListener
*This
= impl_from_nsIDOMEventListener(iface
);
182 LONG ref
= InterlockedIncrement(&This
->ref
);
184 TRACE("(%p) ref=%ld\n", This
, ref
);
189 static nsrefcnt NSAPI
XMLHttpReqEventListener_Release(nsIDOMEventListener
*iface
)
191 XMLHttpReqEventListener
*This
= impl_from_nsIDOMEventListener(iface
);
192 LONG ref
= InterlockedDecrement(&This
->ref
);
194 TRACE("(%p) ref=%ld\n", This
, ref
);
204 static nsresult NSAPI
XMLHttpReqEventListener_HandleEvent(nsIDOMEventListener
*iface
, nsIDOMEvent
*nsevent
)
206 XMLHttpReqEventListener
*This
= impl_from_nsIDOMEventListener(iface
);
210 TRACE("(%p)\n", This
);
215 hres
= create_event_from_nsevent(nsevent
, dispex_compat_mode(&This
->xhr
->event_target
.dispex
), &event
);
216 if(SUCCEEDED(hres
) ){
217 dispatch_event(&This
->xhr
->event_target
, event
);
218 IDOMEvent_Release(&event
->IDOMEvent_iface
);
223 static const nsIDOMEventListenerVtbl XMLHttpReqEventListenerVtbl
= {
224 XMLHttpReqEventListener_QueryInterface
,
225 XMLHttpReqEventListener_AddRef
,
226 XMLHttpReqEventListener_Release
,
227 XMLHttpReqEventListener_HandleEvent
230 static inline HTMLXMLHttpRequest
*impl_from_IHTMLXMLHttpRequest(IHTMLXMLHttpRequest
*iface
)
232 return CONTAINING_RECORD(iface
, HTMLXMLHttpRequest
, IHTMLXMLHttpRequest_iface
);
235 static HRESULT WINAPI
HTMLXMLHttpRequest_QueryInterface(IHTMLXMLHttpRequest
*iface
, REFIID riid
, void **ppv
)
237 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
239 TRACE("(%p)->(%s %p)\n", This
, debugstr_mshtml_guid(riid
), ppv
);
241 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
242 *ppv
= &This
->IHTMLXMLHttpRequest_iface
;
243 }else if(IsEqualGUID(&IID_IDispatch
, riid
)) {
244 *ppv
= &This
->IHTMLXMLHttpRequest_iface
;
245 }else if(IsEqualGUID(&IID_IHTMLXMLHttpRequest
, riid
)) {
246 *ppv
= &This
->IHTMLXMLHttpRequest_iface
;
247 }else if(IsEqualGUID(&IID_IHTMLXMLHttpRequest2
, riid
)) {
248 *ppv
= &This
->IHTMLXMLHttpRequest2_iface
;
249 }else if(IsEqualGUID(&IID_IWineXMLHttpRequestPrivate
, riid
)) {
250 *ppv
= &This
->IWineXMLHttpRequestPrivate_iface
;
251 }else if(IsEqualGUID(&IID_IProvideClassInfo
, riid
)) {
252 *ppv
= &This
->IProvideClassInfo2_iface
;
253 }else if(IsEqualGUID(&IID_IProvideClassInfo2
, riid
)) {
254 *ppv
= &This
->IProvideClassInfo2_iface
;
256 return EventTarget_QI(&This
->event_target
, riid
, ppv
);
259 IUnknown_AddRef((IUnknown
*)*ppv
);
263 static ULONG WINAPI
HTMLXMLHttpRequest_AddRef(IHTMLXMLHttpRequest
*iface
)
265 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
266 LONG ref
= InterlockedIncrement(&This
->ref
);
268 TRACE("(%p) ref=%ld\n", This
, ref
);
273 static ULONG WINAPI
HTMLXMLHttpRequest_Release(IHTMLXMLHttpRequest
*iface
)
275 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
276 LONG ref
= InterlockedDecrement(&This
->ref
);
278 TRACE("(%p) ref=%ld\n", This
, ref
);
281 if(This
->event_listener
)
282 detach_xhr_event_listener(This
->event_listener
);
283 release_event_target(&This
->event_target
);
284 release_dispex(&This
->event_target
.dispex
);
285 nsIXMLHttpRequest_Release(This
->nsxhr
);
292 static HRESULT WINAPI
HTMLXMLHttpRequest_GetTypeInfoCount(IHTMLXMLHttpRequest
*iface
, UINT
*pctinfo
)
294 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
295 return IDispatchEx_GetTypeInfoCount(&This
->event_target
.dispex
.IDispatchEx_iface
, pctinfo
);
298 static HRESULT WINAPI
HTMLXMLHttpRequest_GetTypeInfo(IHTMLXMLHttpRequest
*iface
, UINT iTInfo
,
299 LCID lcid
, ITypeInfo
**ppTInfo
)
301 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
303 return IDispatchEx_GetTypeInfo(&This
->event_target
.dispex
.IDispatchEx_iface
, iTInfo
, lcid
, ppTInfo
);
306 static HRESULT WINAPI
HTMLXMLHttpRequest_GetIDsOfNames(IHTMLXMLHttpRequest
*iface
, REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
,
307 LCID lcid
, DISPID
*rgDispId
)
309 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
311 return IDispatchEx_GetIDsOfNames(&This
->event_target
.dispex
.IDispatchEx_iface
, riid
, rgszNames
, cNames
,
315 static HRESULT WINAPI
HTMLXMLHttpRequest_Invoke(IHTMLXMLHttpRequest
*iface
, DISPID dispIdMember
, REFIID riid
, LCID lcid
,
316 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
318 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
320 return IDispatchEx_Invoke(&This
->event_target
.dispex
.IDispatchEx_iface
, dispIdMember
, riid
, lcid
, wFlags
,
321 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
324 static HRESULT WINAPI
HTMLXMLHttpRequest_get_readyState(IHTMLXMLHttpRequest
*iface
, LONG
*p
)
326 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
330 TRACE("(%p)->(%p)\n", This
, p
);
334 nsres
= nsIXMLHttpRequest_GetReadyState(This
->nsxhr
, &val
);
335 if(NS_FAILED(nsres
)) {
336 ERR("nsIXMLHttpRequest_GetReadyState failed: %08lx\n", nsres
);
343 static HRESULT WINAPI
HTMLXMLHttpRequest_get_responseBody(IHTMLXMLHttpRequest
*iface
, VARIANT
*p
)
345 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
346 FIXME("(%p)->(%p)\n", This
, p
);
350 static HRESULT WINAPI
HTMLXMLHttpRequest_get_responseText(IHTMLXMLHttpRequest
*iface
, BSTR
*p
)
352 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
356 TRACE("(%p)->(%p)\n", This
, p
);
361 nsAString_Init(&nsstr
, NULL
);
362 nsres
= nsIXMLHttpRequest_GetResponseText(This
->nsxhr
, &nsstr
);
363 return return_nsstr(nsres
, &nsstr
, p
);
366 static HRESULT WINAPI
HTMLXMLHttpRequest_get_responseXML(IHTMLXMLHttpRequest
*iface
, IDispatch
**p
)
368 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
369 IXMLDOMDocument
*xmldoc
= NULL
;
373 IObjectSafety
*safety
;
375 TRACE("(%p)->(%p)\n", This
, p
);
377 hres
= CoCreateInstance(&CLSID_DOMDocument
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IXMLDOMDocument
, (void**)&xmldoc
);
379 ERR("CoCreateInstance failed: %08lx\n", hres
);
383 hres
= IHTMLXMLHttpRequest_get_responseText(iface
, &str
);
385 IXMLDOMDocument_Release(xmldoc
);
386 ERR("get_responseText failed: %08lx\n", hres
);
390 hres
= IXMLDOMDocument_loadXML(xmldoc
, str
, &vbool
);
392 if(hres
!= S_OK
|| vbool
!= VARIANT_TRUE
)
393 WARN("loadXML failed: %08lx, returning an empty xmldoc\n", hres
);
395 hres
= IXMLDOMDocument_QueryInterface(xmldoc
, &IID_IObjectSafety
, (void**)&safety
);
396 assert(SUCCEEDED(hres
));
397 hres
= IObjectSafety_SetInterfaceSafetyOptions(safety
, NULL
,
398 INTERFACESAFE_FOR_UNTRUSTED_CALLER
| INTERFACESAFE_FOR_UNTRUSTED_DATA
| INTERFACE_USES_SECURITY_MANAGER
,
399 INTERFACESAFE_FOR_UNTRUSTED_CALLER
| INTERFACESAFE_FOR_UNTRUSTED_DATA
| INTERFACE_USES_SECURITY_MANAGER
);
400 assert(SUCCEEDED(hres
));
401 IObjectSafety_Release(safety
);
403 *p
= (IDispatch
*)xmldoc
;
407 static HRESULT WINAPI
HTMLXMLHttpRequest_get_status(IHTMLXMLHttpRequest
*iface
, LONG
*p
)
409 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
412 TRACE("(%p)->(%p)\n", This
, p
);
417 nsres
= nsIXMLHttpRequest_GetStatus(This
->nsxhr
, &val
);
418 if(NS_FAILED(nsres
)) {
419 ERR("nsIXMLHttpRequest_GetStatus failed: %08lx\n", nsres
);
424 return E_FAIL
; /* WinAPI thinks this is an error */
429 static HRESULT WINAPI
HTMLXMLHttpRequest_get_statusText(IHTMLXMLHttpRequest
*iface
, BSTR
*p
)
431 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
437 TRACE("(%p)->(%p)\n", This
, p
);
442 hres
= IHTMLXMLHttpRequest_get_readyState(iface
, &state
);
451 nsACString_Init(&nscstr
, NULL
);
452 nsres
= nsIXMLHttpRequest_GetStatusText(This
->nsxhr
, &nscstr
);
453 return return_nscstr(nsres
, &nscstr
, p
);
456 static HRESULT WINAPI
HTMLXMLHttpRequest_put_onreadystatechange(IHTMLXMLHttpRequest
*iface
, VARIANT v
)
458 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
460 TRACE("(%p)->(%s)\n", This
, debugstr_variant(&v
));
462 return set_event_handler(&This
->event_target
, EVENTID_READYSTATECHANGE
, &v
);
465 static HRESULT WINAPI
HTMLXMLHttpRequest_get_onreadystatechange(IHTMLXMLHttpRequest
*iface
, VARIANT
*p
)
467 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
469 TRACE("(%p)->(%p)\n", This
, p
);
471 return get_event_handler(&This
->event_target
, EVENTID_READYSTATECHANGE
, p
);
474 static HRESULT WINAPI
HTMLXMLHttpRequest_abort(IHTMLXMLHttpRequest
*iface
)
476 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
479 TRACE("(%p)->()\n", This
);
481 nsres
= nsIXMLHttpRequest_SlowAbort(This
->nsxhr
);
482 if(NS_FAILED(nsres
)) {
483 ERR("nsIXMLHttpRequest_SlowAbort failed: %08lx\n", nsres
);
490 static HRESULT
HTMLXMLHttpRequest_open_hook(DispatchEx
*dispex
, WORD flags
,
491 DISPPARAMS
*dp
, VARIANT
*res
, EXCEPINFO
*ei
, IServiceProvider
*caller
)
493 /* If only two arguments were given, implicitly set async to false */
494 if((flags
& DISPATCH_METHOD
) && dp
->cArgs
== 2 && !dp
->cNamedArgs
) {
496 DISPPARAMS new_dp
= {args
, NULL
, ARRAY_SIZE(args
), 0};
497 V_VT(args
) = VT_EMPTY
;
498 V_VT(args
+1) = VT_EMPTY
;
499 V_VT(args
+2) = VT_BOOL
;
500 V_BOOL(args
+2) = VARIANT_TRUE
;
501 args
[3] = dp
->rgvarg
[0];
502 args
[4] = dp
->rgvarg
[1];
504 TRACE("implicit async\n");
506 return dispex_call_builtin(dispex
, DISPID_IHTMLXMLHTTPREQUEST_OPEN
, &new_dp
, res
, ei
, caller
);
509 return S_FALSE
; /* fallback to default */
512 static HRESULT WINAPI
HTMLXMLHttpRequest_open(IHTMLXMLHttpRequest
*iface
, BSTR bstrMethod
, BSTR bstrUrl
, VARIANT varAsync
, VARIANT varUser
, VARIANT varPassword
)
514 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
515 nsACString method
, url
;
516 nsAString user
, password
;
520 TRACE("(%p)->(%s %s %s %s %s)\n", This
, debugstr_w(bstrMethod
), debugstr_w(bstrUrl
), debugstr_variant(&varAsync
), debugstr_variant(&varUser
), debugstr_variant(&varPassword
));
522 if(V_VT(&varAsync
) != VT_BOOL
) {
523 LCID lcid
= MAKELCID(MAKELANGID(LANG_ENGLISH
,SUBLANG_ENGLISH_US
),SORT_DEFAULT
);
524 hres
= VariantChangeTypeEx(&varAsync
, &varAsync
, lcid
, 0, VT_BOOL
);
526 WARN("Failed to convert varAsync to BOOL: %#lx\n", hres
);
531 /* Note: Starting with Gecko 30.0 (Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27),
532 * synchronous requests on the main thread have been deprecated due to the negative
533 * effects to the user experience.
535 if(!V_BOOL(&varAsync
)) {
536 FIXME("Synchronous request is not supported yet\n");
540 hres
= variant_to_nsastr(varUser
, &user
);
543 hres
= variant_to_nsastr(varPassword
, &password
);
545 nsAString_Finish(&user
);
549 hres
= bstr_to_nsacstr(bstrMethod
, &method
);
551 nsAString_Finish(&user
);
552 nsAString_Finish(&password
);
555 hres
= bstr_to_nsacstr(bstrUrl
, &url
);
557 nsAString_Finish(&user
);
558 nsAString_Finish(&password
);
559 nsACString_Finish(&method
);
563 nsres
= nsIXMLHttpRequest_Open(This
->nsxhr
, &method
, &url
, TRUE
,
564 &user
, &password
, 0);
566 nsACString_Finish(&method
);
567 nsACString_Finish(&url
);
568 nsAString_Finish(&user
);
569 nsAString_Finish(&password
);
571 if(NS_FAILED(nsres
)) {
572 ERR("nsIXMLHttpRequest_Open failed: %08lx\n", nsres
);
579 static HRESULT WINAPI
HTMLXMLHttpRequest_send(IHTMLXMLHttpRequest
*iface
, VARIANT varBody
)
581 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
582 nsIWritableVariant
*nsbody
= NULL
;
583 nsresult nsres
= NS_OK
;
585 TRACE("(%p)->(%s)\n", This
, debugstr_variant(&varBody
));
587 switch(V_VT(&varBody
)) {
595 nsbody
= create_nsvariant();
597 return E_OUTOFMEMORY
;
599 nsAString_InitDepend(&nsstr
, V_BSTR(&varBody
));
600 nsres
= nsIWritableVariant_SetAsAString(nsbody
, &nsstr
);
601 nsAString_Finish(&nsstr
);
605 FIXME("unsupported body type %s\n", debugstr_variant(&varBody
));
609 if(NS_SUCCEEDED(nsres
))
610 nsres
= nsIXMLHttpRequest_Send(This
->nsxhr
, (nsIVariant
*)nsbody
);
612 nsIWritableVariant_Release(nsbody
);
613 if(NS_FAILED(nsres
)) {
614 ERR("nsIXMLHttpRequest_Send failed: %08lx\n", nsres
);
621 static HRESULT WINAPI
HTMLXMLHttpRequest_getAllResponseHeaders(IHTMLXMLHttpRequest
*iface
, BSTR
*p
)
623 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
629 TRACE("(%p)->(%p)\n", This
, p
);
634 hres
= IHTMLXMLHttpRequest_get_readyState(iface
, &state
);
643 nsACString_Init(&nscstr
, NULL
);
644 nsres
= nsIXMLHttpRequest_GetAllResponseHeaders(This
->nsxhr
, &nscstr
);
645 return return_nscstr(nsres
, &nscstr
, p
);
648 static HRESULT WINAPI
HTMLXMLHttpRequest_getResponseHeader(IHTMLXMLHttpRequest
*iface
, BSTR bstrHeader
, BSTR
*p
)
650 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
651 nsACString header
, ret
;
656 TRACE("(%p)->(%s %p)\n", This
, debugstr_w(bstrHeader
), p
);
663 hres
= IHTMLXMLHttpRequest_get_readyState(iface
, &state
);
672 cstr
= heap_strdupWtoU(bstrHeader
);
673 nsACString_InitDepend(&header
, cstr
);
674 nsACString_Init(&ret
, NULL
);
676 nsres
= nsIXMLHttpRequest_GetResponseHeader(This
->nsxhr
, &header
, &ret
);
678 nsACString_Finish(&header
);
680 return return_nscstr(nsres
, &ret
, p
);
683 static HRESULT WINAPI
HTMLXMLHttpRequest_setRequestHeader(IHTMLXMLHttpRequest
*iface
, BSTR bstrHeader
, BSTR bstrValue
)
685 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
686 char *header_u
, *value_u
;
687 nsACString header
, value
;
690 TRACE("(%p)->(%s %s)\n", This
, debugstr_w(bstrHeader
), debugstr_w(bstrValue
));
692 header_u
= heap_strdupWtoU(bstrHeader
);
693 if(bstrHeader
&& !header_u
)
694 return E_OUTOFMEMORY
;
696 value_u
= heap_strdupWtoU(bstrValue
);
697 if(bstrValue
&& !value_u
) {
699 return E_OUTOFMEMORY
;
702 nsACString_InitDepend(&header
, header_u
);
703 nsACString_InitDepend(&value
, value_u
);
704 nsres
= nsIXMLHttpRequest_SetRequestHeader(This
->nsxhr
, &header
, &value
);
705 nsACString_Finish(&header
);
706 nsACString_Finish(&value
);
709 if(NS_FAILED(nsres
)) {
710 ERR("SetRequestHeader failed: %08lx\n", nsres
);
717 static const IHTMLXMLHttpRequestVtbl HTMLXMLHttpRequestVtbl
= {
718 HTMLXMLHttpRequest_QueryInterface
,
719 HTMLXMLHttpRequest_AddRef
,
720 HTMLXMLHttpRequest_Release
,
721 HTMLXMLHttpRequest_GetTypeInfoCount
,
722 HTMLXMLHttpRequest_GetTypeInfo
,
723 HTMLXMLHttpRequest_GetIDsOfNames
,
724 HTMLXMLHttpRequest_Invoke
,
725 HTMLXMLHttpRequest_get_readyState
,
726 HTMLXMLHttpRequest_get_responseBody
,
727 HTMLXMLHttpRequest_get_responseText
,
728 HTMLXMLHttpRequest_get_responseXML
,
729 HTMLXMLHttpRequest_get_status
,
730 HTMLXMLHttpRequest_get_statusText
,
731 HTMLXMLHttpRequest_put_onreadystatechange
,
732 HTMLXMLHttpRequest_get_onreadystatechange
,
733 HTMLXMLHttpRequest_abort
,
734 HTMLXMLHttpRequest_open
,
735 HTMLXMLHttpRequest_send
,
736 HTMLXMLHttpRequest_getAllResponseHeaders
,
737 HTMLXMLHttpRequest_getResponseHeader
,
738 HTMLXMLHttpRequest_setRequestHeader
741 static inline HTMLXMLHttpRequest
*impl_from_IHTMLXMLHttpRequest2(IHTMLXMLHttpRequest2
*iface
)
743 return CONTAINING_RECORD(iface
, HTMLXMLHttpRequest
, IHTMLXMLHttpRequest2_iface
);
746 static HRESULT WINAPI
HTMLXMLHttpRequest2_QueryInterface(IHTMLXMLHttpRequest2
*iface
, REFIID riid
, void **ppv
)
748 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest2(iface
);
749 return IHTMLXMLHttpRequest_QueryInterface(&This
->IHTMLXMLHttpRequest_iface
, riid
, ppv
);
752 static ULONG WINAPI
HTMLXMLHttpRequest2_AddRef(IHTMLXMLHttpRequest2
*iface
)
754 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest2(iface
);
755 return IHTMLXMLHttpRequest_AddRef(&This
->IHTMLXMLHttpRequest_iface
);
758 static ULONG WINAPI
HTMLXMLHttpRequest2_Release(IHTMLXMLHttpRequest2
*iface
)
760 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest2(iface
);
761 return IHTMLXMLHttpRequest_Release(&This
->IHTMLXMLHttpRequest_iface
);
764 static HRESULT WINAPI
HTMLXMLHttpRequest2_GetTypeInfoCount(IHTMLXMLHttpRequest2
*iface
, UINT
*pctinfo
)
766 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest2(iface
);
767 return IDispatchEx_GetTypeInfoCount(&This
->event_target
.dispex
.IDispatchEx_iface
, pctinfo
);
770 static HRESULT WINAPI
HTMLXMLHttpRequest2_GetTypeInfo(IHTMLXMLHttpRequest2
*iface
, UINT iTInfo
,
771 LCID lcid
, ITypeInfo
**ppTInfo
)
773 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest2(iface
);
774 return IDispatchEx_GetTypeInfo(&This
->event_target
.dispex
.IDispatchEx_iface
, iTInfo
, lcid
, ppTInfo
);
777 static HRESULT WINAPI
HTMLXMLHttpRequest2_GetIDsOfNames(IHTMLXMLHttpRequest2
*iface
, REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
,
778 LCID lcid
, DISPID
*rgDispId
)
780 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest2(iface
);
781 return IDispatchEx_GetIDsOfNames(&This
->event_target
.dispex
.IDispatchEx_iface
, riid
, rgszNames
, cNames
,
785 static HRESULT WINAPI
HTMLXMLHttpRequest2_Invoke(IHTMLXMLHttpRequest2
*iface
, DISPID dispIdMember
, REFIID riid
, LCID lcid
,
786 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
788 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest2(iface
);
789 return IDispatchEx_Invoke(&This
->event_target
.dispex
.IDispatchEx_iface
, dispIdMember
, riid
, lcid
, wFlags
,
790 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
793 static HRESULT WINAPI
HTMLXMLHttpRequest2_put_timeout(IHTMLXMLHttpRequest2
*iface
, LONG v
)
795 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest2(iface
);
797 TRACE("(%p)->(%ld)\n", This
, v
);
801 return map_nsresult(nsIXMLHttpRequest_SetTimeout(This
->nsxhr
, v
));
804 static HRESULT WINAPI
HTMLXMLHttpRequest2_get_timeout(IHTMLXMLHttpRequest2
*iface
, LONG
*p
)
806 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest2(iface
);
810 TRACE("(%p)->(%p)\n", This
, p
);
815 nsres
= nsIXMLHttpRequest_GetTimeout(This
->nsxhr
, &timeout
);
817 return map_nsresult(nsres
);
820 static HRESULT WINAPI
HTMLXMLHttpRequest2_put_ontimeout(IHTMLXMLHttpRequest2
*iface
, VARIANT v
)
822 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest2(iface
);
824 TRACE("(%p)->(%s)\n", This
, debugstr_variant(&v
));
826 return set_event_handler(&This
->event_target
, EVENTID_TIMEOUT
, &v
);
829 static HRESULT WINAPI
HTMLXMLHttpRequest2_get_ontimeout(IHTMLXMLHttpRequest2
*iface
, VARIANT
*p
)
831 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest2(iface
);
833 TRACE("(%p)->(%p)\n", This
, p
);
835 return get_event_handler(&This
->event_target
, EVENTID_TIMEOUT
, p
);
838 static const IHTMLXMLHttpRequest2Vtbl HTMLXMLHttpRequest2Vtbl
= {
839 HTMLXMLHttpRequest2_QueryInterface
,
840 HTMLXMLHttpRequest2_AddRef
,
841 HTMLXMLHttpRequest2_Release
,
842 HTMLXMLHttpRequest2_GetTypeInfoCount
,
843 HTMLXMLHttpRequest2_GetTypeInfo
,
844 HTMLXMLHttpRequest2_GetIDsOfNames
,
845 HTMLXMLHttpRequest2_Invoke
,
846 HTMLXMLHttpRequest2_put_timeout
,
847 HTMLXMLHttpRequest2_get_timeout
,
848 HTMLXMLHttpRequest2_put_ontimeout
,
849 HTMLXMLHttpRequest2_get_ontimeout
852 static inline HTMLXMLHttpRequest
*impl_from_IWineXMLHttpRequestPrivate(IWineXMLHttpRequestPrivate
*iface
)
854 return CONTAINING_RECORD(iface
, HTMLXMLHttpRequest
, IWineXMLHttpRequestPrivate_iface
);
857 static HRESULT WINAPI
HTMLXMLHttpRequest_private_QueryInterface(IWineXMLHttpRequestPrivate
*iface
, REFIID riid
, void **ppv
)
859 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
860 return IHTMLXMLHttpRequest_QueryInterface(&This
->IHTMLXMLHttpRequest_iface
, riid
, ppv
);
863 static ULONG WINAPI
HTMLXMLHttpRequest_private_AddRef(IWineXMLHttpRequestPrivate
*iface
)
865 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
866 return IHTMLXMLHttpRequest_AddRef(&This
->IHTMLXMLHttpRequest_iface
);
869 static ULONG WINAPI
HTMLXMLHttpRequest_private_Release(IWineXMLHttpRequestPrivate
*iface
)
871 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
872 return IHTMLXMLHttpRequest_Release(&This
->IHTMLXMLHttpRequest_iface
);
875 static HRESULT WINAPI
HTMLXMLHttpRequest_private_GetTypeInfoCount(IWineXMLHttpRequestPrivate
*iface
, UINT
*pctinfo
)
877 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
878 return IDispatchEx_GetTypeInfoCount(&This
->event_target
.dispex
.IDispatchEx_iface
, pctinfo
);
881 static HRESULT WINAPI
HTMLXMLHttpRequest_private_GetTypeInfo(IWineXMLHttpRequestPrivate
*iface
, UINT iTInfo
,
882 LCID lcid
, ITypeInfo
**ppTInfo
)
884 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
885 return IDispatchEx_GetTypeInfo(&This
->event_target
.dispex
.IDispatchEx_iface
, iTInfo
, lcid
, ppTInfo
);
888 static HRESULT WINAPI
HTMLXMLHttpRequest_private_GetIDsOfNames(IWineXMLHttpRequestPrivate
*iface
, REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
,
889 LCID lcid
, DISPID
*rgDispId
)
891 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
892 return IDispatchEx_GetIDsOfNames(&This
->event_target
.dispex
.IDispatchEx_iface
, riid
, rgszNames
, cNames
,
896 static HRESULT WINAPI
HTMLXMLHttpRequest_private_Invoke(IWineXMLHttpRequestPrivate
*iface
, DISPID dispIdMember
, REFIID riid
, LCID lcid
,
897 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
899 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
900 return IDispatchEx_Invoke(&This
->event_target
.dispex
.IDispatchEx_iface
, dispIdMember
, riid
, lcid
, wFlags
,
901 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
904 static HRESULT WINAPI
HTMLXMLHttpRequest_private_get_response(IWineXMLHttpRequestPrivate
*iface
, VARIANT
*p
)
906 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
908 FIXME("(%p)->(%p)\n", This
, p
);
913 static HRESULT WINAPI
HTMLXMLHttpRequest_private_put_responseType(IWineXMLHttpRequestPrivate
*iface
, BSTR v
)
915 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
917 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
922 static HRESULT WINAPI
HTMLXMLHttpRequest_private_get_responseType(IWineXMLHttpRequestPrivate
*iface
, BSTR
*p
)
924 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
926 FIXME("(%p)->(%p)\n", This
, p
);
931 static HRESULT WINAPI
HTMLXMLHttpRequest_private_get_upload(IWineXMLHttpRequestPrivate
*iface
, IDispatch
**p
)
933 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
935 FIXME("(%p)->(%p)\n", This
, p
);
940 static HRESULT WINAPI
HTMLXMLHttpRequest_private_put_withCredentials(IWineXMLHttpRequestPrivate
*iface
, VARIANT_BOOL v
)
942 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
944 TRACE("(%p)->(%x)\n", This
, v
);
946 return map_nsresult(nsIXMLHttpRequest_SetWithCredentials(This
->nsxhr
, !!v
));
949 static HRESULT WINAPI
HTMLXMLHttpRequest_private_get_withCredentials(IWineXMLHttpRequestPrivate
*iface
, VARIANT_BOOL
*p
)
951 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
955 TRACE("(%p)->(%p)\n", This
, p
);
957 nsres
= nsIXMLHttpRequest_GetWithCredentials(This
->nsxhr
, &b
);
959 return map_nsresult(nsres
);
960 *p
= b
? VARIANT_TRUE
: VARIANT_FALSE
;
964 static HRESULT WINAPI
HTMLXMLHttpRequest_private_overrideMimeType(IWineXMLHttpRequestPrivate
*iface
, BSTR mimeType
)
966 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
968 FIXME("(%p)->(%s)\n", This
, debugstr_w(mimeType
));
973 static HRESULT WINAPI
HTMLXMLHttpRequest_private_put_onerror(IWineXMLHttpRequestPrivate
*iface
, VARIANT v
)
975 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
977 TRACE("(%p)->(%s)\n", This
, debugstr_variant(&v
));
979 return set_event_handler(&This
->event_target
, EVENTID_ERROR
, &v
);
982 static HRESULT WINAPI
HTMLXMLHttpRequest_private_get_onerror(IWineXMLHttpRequestPrivate
*iface
, VARIANT
*p
)
984 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
986 TRACE("(%p)->(%p)\n", This
, p
);
988 return get_event_handler(&This
->event_target
, EVENTID_ERROR
, p
);
991 static HRESULT WINAPI
HTMLXMLHttpRequest_private_put_onabort(IWineXMLHttpRequestPrivate
*iface
, VARIANT v
)
993 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
995 TRACE("(%p)->(%s)\n", This
, debugstr_variant(&v
));
997 return set_event_handler(&This
->event_target
, EVENTID_ABORT
, &v
);
1000 static HRESULT WINAPI
HTMLXMLHttpRequest_private_get_onabort(IWineXMLHttpRequestPrivate
*iface
, VARIANT
*p
)
1002 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
1004 TRACE("(%p)->(%p)\n", This
, p
);
1006 return get_event_handler(&This
->event_target
, EVENTID_ABORT
, p
);
1009 static HRESULT WINAPI
HTMLXMLHttpRequest_private_put_onprogress(IWineXMLHttpRequestPrivate
*iface
, VARIANT v
)
1011 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
1013 TRACE("(%p)->(%s)\n", This
, debugstr_variant(&v
));
1015 return set_event_handler(&This
->event_target
, EVENTID_PROGRESS
, &v
);
1018 static HRESULT WINAPI
HTMLXMLHttpRequest_private_get_onprogress(IWineXMLHttpRequestPrivate
*iface
, VARIANT
*p
)
1020 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
1022 TRACE("(%p)->(%p)\n", This
, p
);
1024 return get_event_handler(&This
->event_target
, EVENTID_PROGRESS
, p
);
1027 static HRESULT WINAPI
HTMLXMLHttpRequest_private_put_onloadstart(IWineXMLHttpRequestPrivate
*iface
, VARIANT v
)
1029 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
1031 TRACE("(%p)->(%s)\n", This
, debugstr_variant(&v
));
1033 return set_event_handler(&This
->event_target
, EVENTID_LOADSTART
, &v
);
1036 static HRESULT WINAPI
HTMLXMLHttpRequest_private_get_onloadstart(IWineXMLHttpRequestPrivate
*iface
, VARIANT
*p
)
1038 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
1040 TRACE("(%p)->(%p)\n", This
, p
);
1042 return get_event_handler(&This
->event_target
, EVENTID_LOADSTART
, p
);
1045 static HRESULT WINAPI
HTMLXMLHttpRequest_private_put_onloadend(IWineXMLHttpRequestPrivate
*iface
, VARIANT v
)
1047 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
1049 TRACE("(%p)->(%s)\n", This
, debugstr_variant(&v
));
1051 return set_event_handler(&This
->event_target
, EVENTID_LOADEND
, &v
);
1054 static HRESULT WINAPI
HTMLXMLHttpRequest_private_get_onloadend(IWineXMLHttpRequestPrivate
*iface
, VARIANT
*p
)
1056 HTMLXMLHttpRequest
*This
= impl_from_IWineXMLHttpRequestPrivate(iface
);
1058 TRACE("(%p)->(%p)\n", This
, p
);
1060 return get_event_handler(&This
->event_target
, EVENTID_LOADEND
, p
);
1063 static const IWineXMLHttpRequestPrivateVtbl WineXMLHttpRequestPrivateVtbl
= {
1064 HTMLXMLHttpRequest_private_QueryInterface
,
1065 HTMLXMLHttpRequest_private_AddRef
,
1066 HTMLXMLHttpRequest_private_Release
,
1067 HTMLXMLHttpRequest_private_GetTypeInfoCount
,
1068 HTMLXMLHttpRequest_private_GetTypeInfo
,
1069 HTMLXMLHttpRequest_private_GetIDsOfNames
,
1070 HTMLXMLHttpRequest_private_Invoke
,
1071 HTMLXMLHttpRequest_private_get_response
,
1072 HTMLXMLHttpRequest_private_put_responseType
,
1073 HTMLXMLHttpRequest_private_get_responseType
,
1074 HTMLXMLHttpRequest_private_get_upload
,
1075 HTMLXMLHttpRequest_private_put_withCredentials
,
1076 HTMLXMLHttpRequest_private_get_withCredentials
,
1077 HTMLXMLHttpRequest_private_overrideMimeType
,
1078 HTMLXMLHttpRequest_private_put_onerror
,
1079 HTMLXMLHttpRequest_private_get_onerror
,
1080 HTMLXMLHttpRequest_private_put_onabort
,
1081 HTMLXMLHttpRequest_private_get_onabort
,
1082 HTMLXMLHttpRequest_private_put_onprogress
,
1083 HTMLXMLHttpRequest_private_get_onprogress
,
1084 HTMLXMLHttpRequest_private_put_onloadstart
,
1085 HTMLXMLHttpRequest_private_get_onloadstart
,
1086 HTMLXMLHttpRequest_private_put_onloadend
,
1087 HTMLXMLHttpRequest_private_get_onloadend
1090 static inline HTMLXMLHttpRequest
*impl_from_IProvideClassInfo2(IProvideClassInfo2
*iface
)
1092 return CONTAINING_RECORD(iface
, HTMLXMLHttpRequest
, IProvideClassInfo2_iface
);
1095 static HRESULT WINAPI
ProvideClassInfo_QueryInterface(IProvideClassInfo2
*iface
, REFIID riid
, void **ppv
)
1097 HTMLXMLHttpRequest
*This
= impl_from_IProvideClassInfo2(iface
);
1098 return IHTMLXMLHttpRequest_QueryInterface(&This
->IHTMLXMLHttpRequest_iface
, riid
, ppv
);
1101 static ULONG WINAPI
ProvideClassInfo_AddRef(IProvideClassInfo2
*iface
)
1103 HTMLXMLHttpRequest
*This
= impl_from_IProvideClassInfo2(iface
);
1104 return IHTMLXMLHttpRequest_AddRef(&This
->IHTMLXMLHttpRequest_iface
);
1107 static ULONG WINAPI
ProvideClassInfo_Release(IProvideClassInfo2
*iface
)
1109 HTMLXMLHttpRequest
*This
= impl_from_IProvideClassInfo2(iface
);
1110 return IHTMLXMLHttpRequest_Release(&This
->IHTMLXMLHttpRequest_iface
);
1113 static HRESULT WINAPI
ProvideClassInfo_GetClassInfo(IProvideClassInfo2
*iface
, ITypeInfo
**ppTI
)
1115 HTMLXMLHttpRequest
*This
= impl_from_IProvideClassInfo2(iface
);
1116 TRACE("(%p)->(%p)\n", This
, ppTI
);
1117 return get_class_typeinfo(&CLSID_HTMLXMLHttpRequest
, ppTI
);
1120 static HRESULT WINAPI
ProvideClassInfo2_GetGUID(IProvideClassInfo2
*iface
, DWORD dwGuidKind
, GUID
*pGUID
)
1122 HTMLXMLHttpRequest
*This
= impl_from_IProvideClassInfo2(iface
);
1123 FIXME("(%p)->(%lu %p)\n", This
, dwGuidKind
, pGUID
);
1127 static const IProvideClassInfo2Vtbl ProvideClassInfo2Vtbl
= {
1128 ProvideClassInfo_QueryInterface
,
1129 ProvideClassInfo_AddRef
,
1130 ProvideClassInfo_Release
,
1131 ProvideClassInfo_GetClassInfo
,
1132 ProvideClassInfo2_GetGUID
,
1135 static inline HTMLXMLHttpRequest
*impl_from_DispatchEx(DispatchEx
*iface
)
1137 return CONTAINING_RECORD(iface
, HTMLXMLHttpRequest
, event_target
.dispex
);
1140 static HRESULT
HTMLXMLHttpRequest_get_dispid(DispatchEx
*dispex
, BSTR name
, DWORD flags
, DISPID
*dispid
)
1142 /* onload event handler property is supported, but not exposed by any interface. We implement as a custom property. */
1143 if(!wcscmp(L
"onload", name
)) {
1144 *dispid
= MSHTML_DISPID_HTMLXMLHTTPREQUEST_ONLOAD
;
1148 return DISP_E_UNKNOWNNAME
;
1151 static HRESULT
HTMLXMLHttpRequest_invoke(DispatchEx
*dispex
, DISPID id
, LCID lcid
, WORD flags
, DISPPARAMS
*params
,
1152 VARIANT
*res
, EXCEPINFO
*ei
, IServiceProvider
*caller
)
1154 HTMLXMLHttpRequest
*This
= impl_from_DispatchEx(dispex
);
1156 if(id
== MSHTML_DISPID_HTMLXMLHTTPREQUEST_ONLOAD
) {
1158 case DISPATCH_PROPERTYGET
:
1159 TRACE("(%p) get onload\n", This
);
1160 return get_event_handler(&This
->event_target
, EVENTID_LOAD
, res
);
1162 case DISPATCH_PROPERTYPUT
:
1163 if(params
->cArgs
!= 1 || (params
->cNamedArgs
== 1 && *params
->rgdispidNamedArgs
!= DISPID_PROPERTYPUT
)
1164 || params
->cNamedArgs
> 1) {
1165 FIXME("invalid args\n");
1166 return E_INVALIDARG
;
1169 TRACE("(%p)->(%p) set onload\n", This
, params
->rgvarg
);
1170 return set_event_handler(&This
->event_target
, EVENTID_LOAD
, params
->rgvarg
);
1173 FIXME("Unimplemented flags %x\n", flags
);
1178 return DISP_E_UNKNOWNNAME
;
1181 static nsISupports
*HTMLXMLHttpRequest_get_gecko_target(DispatchEx
*dispex
)
1183 HTMLXMLHttpRequest
*This
= impl_from_DispatchEx(dispex
);
1184 return (nsISupports
*)This
->nsxhr
;
1187 static void HTMLXMLHttpRequest_bind_event(DispatchEx
*dispex
, eventid_t eid
)
1189 HTMLXMLHttpRequest
*This
= impl_from_DispatchEx(dispex
);
1190 nsIDOMEventTarget
*nstarget
;
1196 TRACE("(%p)\n", This
);
1198 for(i
= 0; i
< ARRAY_SIZE(events
); i
++)
1199 if(eid
== events
[i
])
1201 if(i
>= ARRAY_SIZE(events
))
1204 if(!This
->event_listener
) {
1205 This
->event_listener
= heap_alloc(sizeof(*This
->event_listener
));
1206 if(!This
->event_listener
)
1209 This
->event_listener
->nsIDOMEventListener_iface
.lpVtbl
= &XMLHttpReqEventListenerVtbl
;
1210 This
->event_listener
->ref
= 1;
1211 This
->event_listener
->xhr
= This
;
1212 This
->event_listener
->events_mask
= 0;
1215 nsres
= nsIXMLHttpRequest_QueryInterface(This
->nsxhr
, &IID_nsIDOMEventTarget
, (void**)&nstarget
);
1216 assert(nsres
== NS_OK
);
1218 name
= get_event_name(events
[i
]);
1219 nsAString_InitDepend(&type_str
, name
);
1220 nsres
= nsIDOMEventTarget_AddEventListener(nstarget
, &type_str
, &This
->event_listener
->nsIDOMEventListener_iface
, FALSE
, TRUE
, 2);
1221 nsAString_Finish(&type_str
);
1222 if(NS_FAILED(nsres
))
1223 ERR("AddEventListener(%s) failed: %08lx\n", debugstr_w(name
), nsres
);
1225 nsIDOMEventTarget_Release(nstarget
);
1227 This
->event_listener
->events_mask
|= 1 << i
;
1230 static void HTMLXMLHttpRequest_init_dispex_info(dispex_data_t
*info
, compat_mode_t compat_mode
)
1232 static const dispex_hook_t xhr_hooks
[] = {
1233 {DISPID_IHTMLXMLHTTPREQUEST_OPEN
, HTMLXMLHttpRequest_open_hook
},
1236 static const dispex_hook_t private_ie10_hooks
[] = {
1237 {DISPID_IWINEXMLHTTPREQUESTPRIVATE_OVERRIDEMIMETYPE
},
1241 EventTarget_init_dispex_info(info
, compat_mode
);
1242 dispex_info_add_interface(info
, IHTMLXMLHttpRequest_tid
, compat_mode
>= COMPAT_MODE_IE10
? xhr_hooks
: NULL
);
1243 if(compat_mode
>= COMPAT_MODE_IE10
)
1244 dispex_info_add_interface(info
, IWineXMLHttpRequestPrivate_tid
, compat_mode
== COMPAT_MODE_IE10
? private_ie10_hooks
: NULL
);
1247 static event_target_vtbl_t HTMLXMLHttpRequest_event_target_vtbl
= {
1250 HTMLXMLHttpRequest_get_dispid
,
1251 HTMLXMLHttpRequest_invoke
1253 HTMLXMLHttpRequest_get_gecko_target
,
1254 HTMLXMLHttpRequest_bind_event
1257 static const tid_t HTMLXMLHttpRequest_iface_tids
[] = {
1258 IHTMLXMLHttpRequest2_tid
,
1261 static dispex_static_data_t HTMLXMLHttpRequest_dispex
= {
1263 &HTMLXMLHttpRequest_event_target_vtbl
.dispex_vtbl
,
1264 DispHTMLXMLHttpRequest_tid
,
1265 HTMLXMLHttpRequest_iface_tids
,
1266 HTMLXMLHttpRequest_init_dispex_info
1270 /* IHTMLXMLHttpRequestFactory */
1271 static inline HTMLXMLHttpRequestFactory
*impl_from_IHTMLXMLHttpRequestFactory(IHTMLXMLHttpRequestFactory
*iface
)
1273 return CONTAINING_RECORD(iface
, HTMLXMLHttpRequestFactory
, IHTMLXMLHttpRequestFactory_iface
);
1276 static HRESULT WINAPI
HTMLXMLHttpRequestFactory_QueryInterface(IHTMLXMLHttpRequestFactory
*iface
, REFIID riid
, void **ppv
)
1278 HTMLXMLHttpRequestFactory
*This
= impl_from_IHTMLXMLHttpRequestFactory(iface
);
1280 TRACE("(%p)->(%s %p)\n", This
, debugstr_mshtml_guid(riid
), ppv
);
1282 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
1283 *ppv
= &This
->IHTMLXMLHttpRequestFactory_iface
;
1284 }else if(IsEqualGUID(&IID_IDispatch
, riid
)) {
1285 *ppv
= &This
->IHTMLXMLHttpRequestFactory_iface
;
1286 }else if(IsEqualGUID(&IID_IHTMLXMLHttpRequestFactory
, riid
)) {
1287 *ppv
= &This
->IHTMLXMLHttpRequestFactory_iface
;
1288 }else if(dispex_query_interface(&This
->dispex
, riid
, ppv
)) {
1289 return *ppv
? S_OK
: E_NOINTERFACE
;
1292 WARN("(%p)->(%s %p)\n", This
, debugstr_mshtml_guid(riid
), ppv
);
1293 return E_NOINTERFACE
;
1296 IUnknown_AddRef((IUnknown
*)*ppv
);
1300 static ULONG WINAPI
HTMLXMLHttpRequestFactory_AddRef(IHTMLXMLHttpRequestFactory
*iface
)
1302 HTMLXMLHttpRequestFactory
*This
= impl_from_IHTMLXMLHttpRequestFactory(iface
);
1303 LONG ref
= InterlockedIncrement(&This
->ref
);
1305 TRACE("(%p) ref=%ld\n", This
, ref
);
1310 static ULONG WINAPI
HTMLXMLHttpRequestFactory_Release(IHTMLXMLHttpRequestFactory
*iface
)
1312 HTMLXMLHttpRequestFactory
*This
= impl_from_IHTMLXMLHttpRequestFactory(iface
);
1313 LONG ref
= InterlockedDecrement(&This
->ref
);
1315 TRACE("(%p) ref=%ld\n", This
, ref
);
1318 release_dispex(&This
->dispex
);
1325 static HRESULT WINAPI
HTMLXMLHttpRequestFactory_GetTypeInfoCount(IHTMLXMLHttpRequestFactory
*iface
, UINT
*pctinfo
)
1327 HTMLXMLHttpRequestFactory
*This
= impl_from_IHTMLXMLHttpRequestFactory(iface
);
1328 return IDispatchEx_GetTypeInfoCount(&This
->dispex
.IDispatchEx_iface
, pctinfo
);
1331 static HRESULT WINAPI
HTMLXMLHttpRequestFactory_GetTypeInfo(IHTMLXMLHttpRequestFactory
*iface
, UINT iTInfo
,
1332 LCID lcid
, ITypeInfo
**ppTInfo
)
1334 HTMLXMLHttpRequestFactory
*This
= impl_from_IHTMLXMLHttpRequestFactory(iface
);
1336 return IDispatchEx_GetTypeInfo(&This
->dispex
.IDispatchEx_iface
, iTInfo
, lcid
, ppTInfo
);
1339 static HRESULT WINAPI
HTMLXMLHttpRequestFactory_GetIDsOfNames(IHTMLXMLHttpRequestFactory
*iface
, REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
,
1340 LCID lcid
, DISPID
*rgDispId
)
1342 HTMLXMLHttpRequestFactory
*This
= impl_from_IHTMLXMLHttpRequestFactory(iface
);
1344 return IDispatchEx_GetIDsOfNames(&This
->dispex
.IDispatchEx_iface
, riid
, rgszNames
, cNames
,
1348 static HRESULT WINAPI
HTMLXMLHttpRequestFactory_Invoke(IHTMLXMLHttpRequestFactory
*iface
, DISPID dispIdMember
, REFIID riid
, LCID lcid
,
1349 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
1351 HTMLXMLHttpRequestFactory
*This
= impl_from_IHTMLXMLHttpRequestFactory(iface
);
1353 return IDispatchEx_Invoke(&This
->dispex
.IDispatchEx_iface
, dispIdMember
, riid
, lcid
, wFlags
,
1354 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
1357 static HRESULT WINAPI
HTMLXMLHttpRequestFactory_create(IHTMLXMLHttpRequestFactory
*iface
, IHTMLXMLHttpRequest
**p
)
1359 HTMLXMLHttpRequestFactory
*This
= impl_from_IHTMLXMLHttpRequestFactory(iface
);
1360 HTMLXMLHttpRequest
*ret
;
1361 nsIXMLHttpRequest
*nsxhr
;
1363 TRACE("(%p)->(%p)\n", This
, p
);
1365 nsxhr
= create_nsxhr(This
->window
->base
.outer_window
->nswindow
);
1369 ret
= heap_alloc_zero(sizeof(*ret
));
1371 nsIXMLHttpRequest_Release(nsxhr
);
1372 return E_OUTOFMEMORY
;
1376 ret
->IHTMLXMLHttpRequest_iface
.lpVtbl
= &HTMLXMLHttpRequestVtbl
;
1377 ret
->IHTMLXMLHttpRequest2_iface
.lpVtbl
= &HTMLXMLHttpRequest2Vtbl
;
1378 ret
->IWineXMLHttpRequestPrivate_iface
.lpVtbl
= &WineXMLHttpRequestPrivateVtbl
;
1379 ret
->IProvideClassInfo2_iface
.lpVtbl
= &ProvideClassInfo2Vtbl
;
1380 EventTarget_Init(&ret
->event_target
, (IUnknown
*)&ret
->IHTMLXMLHttpRequest_iface
,
1381 &HTMLXMLHttpRequest_dispex
, This
->window
->doc
->document_mode
);
1384 *p
= &ret
->IHTMLXMLHttpRequest_iface
;
1388 static const IHTMLXMLHttpRequestFactoryVtbl HTMLXMLHttpRequestFactoryVtbl
= {
1389 HTMLXMLHttpRequestFactory_QueryInterface
,
1390 HTMLXMLHttpRequestFactory_AddRef
,
1391 HTMLXMLHttpRequestFactory_Release
,
1392 HTMLXMLHttpRequestFactory_GetTypeInfoCount
,
1393 HTMLXMLHttpRequestFactory_GetTypeInfo
,
1394 HTMLXMLHttpRequestFactory_GetIDsOfNames
,
1395 HTMLXMLHttpRequestFactory_Invoke
,
1396 HTMLXMLHttpRequestFactory_create
1399 static inline HTMLXMLHttpRequestFactory
*factory_from_DispatchEx(DispatchEx
*iface
)
1401 return CONTAINING_RECORD(iface
, HTMLXMLHttpRequestFactory
, dispex
);
1404 static HRESULT
HTMLXMLHttpRequestFactory_value(DispatchEx
*iface
, LCID lcid
, WORD flags
, DISPPARAMS
*params
,
1405 VARIANT
*res
, EXCEPINFO
*ei
, IServiceProvider
*caller
)
1407 HTMLXMLHttpRequestFactory
*This
= factory_from_DispatchEx(iface
);
1408 IHTMLXMLHttpRequest
*xhr
;
1413 if(flags
!= DISPATCH_CONSTRUCT
) {
1414 FIXME("flags %x not supported\n", flags
);
1418 hres
= IHTMLXMLHttpRequestFactory_create(&This
->IHTMLXMLHttpRequestFactory_iface
, &xhr
);
1422 V_VT(res
) = VT_DISPATCH
;
1423 V_DISPATCH(res
) = (IDispatch
*)xhr
;
1427 static const dispex_static_data_vtbl_t HTMLXMLHttpRequestFactory_dispex_vtbl
= {
1428 HTMLXMLHttpRequestFactory_value
1431 static const tid_t HTMLXMLHttpRequestFactory_iface_tids
[] = {
1432 IHTMLXMLHttpRequestFactory_tid
,
1435 static dispex_static_data_t HTMLXMLHttpRequestFactory_dispex
= {
1437 &HTMLXMLHttpRequestFactory_dispex_vtbl
,
1438 IHTMLXMLHttpRequestFactory_tid
,
1439 HTMLXMLHttpRequestFactory_iface_tids
1442 HRESULT
HTMLXMLHttpRequestFactory_Create(HTMLInnerWindow
* window
, HTMLXMLHttpRequestFactory
**ret_ptr
)
1444 HTMLXMLHttpRequestFactory
*ret
;
1446 ret
= heap_alloc(sizeof(*ret
));
1448 return E_OUTOFMEMORY
;
1450 ret
->IHTMLXMLHttpRequestFactory_iface
.lpVtbl
= &HTMLXMLHttpRequestFactoryVtbl
;
1452 ret
->window
= window
;
1454 init_dispatch(&ret
->dispex
, (IUnknown
*)&ret
->IHTMLXMLHttpRequestFactory_iface
,
1455 &HTMLXMLHttpRequestFactory_dispex
, dispex_compat_mode(&window
->event_target
.dispex
));