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
29 #include "wine/debug.h"
31 #include "mshtml_private.h"
32 #include "htmlevent.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(mshtml
);
39 static HRESULT
bstr_to_nsacstr(BSTR bstr
, nsACString
*str
)
41 char *cstr
= heap_strdupWtoU(bstr
);
44 nsACString_Init(str
, cstr
);
49 static HRESULT
variant_to_nsastr(VARIANT var
, nsAString
*ret
)
55 nsAString_Init(ret
, NULL
);
58 nsAString_InitDepend(ret
, V_BSTR(&var
));
61 FIXME("Unsupported VARIANT: %s\n", debugstr_variant(&var
));
66 static HRESULT
return_nscstr(nsresult nsres
, nsACString
*nscstr
, BSTR
*p
)
71 if(NS_FAILED(nsres
)) {
72 ERR("failed: %08x\n", nsres
);
73 nsACString_Finish(nscstr
);
77 nsACString_GetData(nscstr
, &str
);
80 len
= MultiByteToWideChar(CP_UTF8
, 0, str
, -1, NULL
, 0);
81 *p
= SysAllocStringLen(NULL
, len
);
83 nsACString_Finish(nscstr
);
86 MultiByteToWideChar(CP_UTF8
, 0, str
, -1, *p
, len
);
91 nsACString_Finish(nscstr
);
95 typedef struct XMLHttpReqEventListener XMLHttpReqEventListener
;
98 EventTarget event_target
;
99 IHTMLXMLHttpRequest IHTMLXMLHttpRequest_iface
;
101 nsIXMLHttpRequest
*nsxhr
;
102 XMLHttpReqEventListener
*event_listener
;
103 } HTMLXMLHttpRequest
;
105 struct XMLHttpReqEventListener
{
106 nsIDOMEventListener nsIDOMEventListener_iface
;
108 HTMLXMLHttpRequest
*xhr
;
111 static void detach_xhr_event_listener(XMLHttpReqEventListener
*event_listener
)
113 nsIDOMEventTarget
*event_target
;
117 static const WCHAR readystatechangeW
[] =
118 {'o','n','r','e','a','d','y','s','t','a','t','e','c','h','a','n','g','e',0};
120 nsres
= nsIXMLHttpRequest_QueryInterface(event_listener
->xhr
->nsxhr
, &IID_nsIDOMEventTarget
, (void**)&event_target
);
121 assert(nsres
== NS_OK
);
123 nsAString_InitDepend(&str
, readystatechangeW
);
124 nsres
= nsIDOMEventTarget_RemoveEventListener(event_target
, &str
, &event_listener
->nsIDOMEventListener_iface
, FALSE
);
125 nsAString_Finish(&str
);
126 nsIDOMEventTarget_Release(event_target
);
128 event_listener
->xhr
->event_listener
= NULL
;
129 event_listener
->xhr
= NULL
;
130 nsIDOMEventListener_Release(&event_listener
->nsIDOMEventListener_iface
);
134 static inline XMLHttpReqEventListener
*impl_from_nsIDOMEventListener(nsIDOMEventListener
*iface
)
136 return CONTAINING_RECORD(iface
, XMLHttpReqEventListener
, nsIDOMEventListener_iface
);
139 static nsresult NSAPI
XMLHttpReqEventListener_QueryInterface(nsIDOMEventListener
*iface
,
140 nsIIDRef riid
, void **result
)
142 XMLHttpReqEventListener
*This
= impl_from_nsIDOMEventListener(iface
);
144 if(IsEqualGUID(&IID_nsISupports
, riid
)) {
145 TRACE("(%p)->(IID_nsISupports, %p)\n", This
, result
);
146 *result
= &This
->nsIDOMEventListener_iface
;
147 }else if(IsEqualGUID(&IID_nsIDOMEventListener
, riid
)) {
148 TRACE("(%p)->(IID_nsIDOMEventListener %p)\n", This
, result
);
149 *result
= &This
->nsIDOMEventListener_iface
;
152 TRACE("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), result
);
153 return NS_NOINTERFACE
;
156 nsIDOMEventListener_AddRef(&This
->nsIDOMEventListener_iface
);
160 static nsrefcnt NSAPI
XMLHttpReqEventListener_AddRef(nsIDOMEventListener
*iface
)
162 XMLHttpReqEventListener
*This
= impl_from_nsIDOMEventListener(iface
);
163 LONG ref
= InterlockedIncrement(&This
->ref
);
165 TRACE("(%p) ref=%d\n", This
, ref
);
170 static nsrefcnt NSAPI
XMLHttpReqEventListener_Release(nsIDOMEventListener
*iface
)
172 XMLHttpReqEventListener
*This
= impl_from_nsIDOMEventListener(iface
);
173 LONG ref
= InterlockedDecrement(&This
->ref
);
175 TRACE("(%p) ref=%d\n", This
, ref
);
185 static nsresult NSAPI
XMLHttpReqEventListener_HandleEvent(nsIDOMEventListener
*iface
, nsIDOMEvent
*event
)
187 XMLHttpReqEventListener
*This
= impl_from_nsIDOMEventListener(iface
);
189 TRACE("(%p)\n", This
);
194 call_event_handlers(NULL
, NULL
, &This
->xhr
->event_target
, NULL
, EVENTID_READYSTATECHANGE
,
195 (IDispatch
*)&This
->xhr
->IHTMLXMLHttpRequest_iface
);
199 static const nsIDOMEventListenerVtbl XMLHttpReqEventListenerVtbl
= {
200 XMLHttpReqEventListener_QueryInterface
,
201 XMLHttpReqEventListener_AddRef
,
202 XMLHttpReqEventListener_Release
,
203 XMLHttpReqEventListener_HandleEvent
206 static inline HTMLXMLHttpRequest
*impl_from_IHTMLXMLHttpRequest(IHTMLXMLHttpRequest
*iface
)
208 return CONTAINING_RECORD(iface
, HTMLXMLHttpRequest
, IHTMLXMLHttpRequest_iface
);
211 static HRESULT WINAPI
HTMLXMLHttpRequest_QueryInterface(IHTMLXMLHttpRequest
*iface
, REFIID riid
, void **ppv
)
213 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
215 TRACE("(%p)->(%s %p)\n", This
, debugstr_mshtml_guid(riid
), ppv
);
217 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
218 *ppv
= &This
->IHTMLXMLHttpRequest_iface
;
219 }else if(IsEqualGUID(&IID_IDispatch
, riid
)) {
220 *ppv
= &This
->IHTMLXMLHttpRequest_iface
;
221 }else if(IsEqualGUID(&IID_IHTMLXMLHttpRequest
, riid
)) {
222 *ppv
= &This
->IHTMLXMLHttpRequest_iface
;
223 }else if(dispex_query_interface(&This
->event_target
.dispex
, riid
, ppv
)) {
224 return *ppv
? S_OK
: E_NOINTERFACE
;
227 WARN("(%p)->(%s %p)\n", This
, debugstr_mshtml_guid(riid
), ppv
);
228 return E_NOINTERFACE
;
231 IUnknown_AddRef((IUnknown
*)*ppv
);
235 static ULONG WINAPI
HTMLXMLHttpRequest_AddRef(IHTMLXMLHttpRequest
*iface
)
237 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
238 LONG ref
= InterlockedIncrement(&This
->ref
);
240 TRACE("(%p) ref=%d\n", This
, ref
);
245 static ULONG WINAPI
HTMLXMLHttpRequest_Release(IHTMLXMLHttpRequest
*iface
)
247 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
248 LONG ref
= InterlockedDecrement(&This
->ref
);
250 TRACE("(%p) ref=%d\n", This
, ref
);
253 if(This
->event_listener
)
254 detach_xhr_event_listener(This
->event_listener
);
255 release_dispex(&This
->event_target
.dispex
);
256 nsIXMLHttpRequest_Release(This
->nsxhr
);
263 static HRESULT WINAPI
HTMLXMLHttpRequest_GetTypeInfoCount(IHTMLXMLHttpRequest
*iface
, UINT
*pctinfo
)
265 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
266 return IDispatchEx_GetTypeInfoCount(&This
->event_target
.dispex
.IDispatchEx_iface
, pctinfo
);
269 static HRESULT WINAPI
HTMLXMLHttpRequest_GetTypeInfo(IHTMLXMLHttpRequest
*iface
, UINT iTInfo
,
270 LCID lcid
, ITypeInfo
**ppTInfo
)
272 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
274 return IDispatchEx_GetTypeInfo(&This
->event_target
.dispex
.IDispatchEx_iface
, iTInfo
, lcid
, ppTInfo
);
277 static HRESULT WINAPI
HTMLXMLHttpRequest_GetIDsOfNames(IHTMLXMLHttpRequest
*iface
, REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
,
278 LCID lcid
, DISPID
*rgDispId
)
280 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
282 return IDispatchEx_GetIDsOfNames(&This
->event_target
.dispex
.IDispatchEx_iface
, riid
, rgszNames
, cNames
,
286 static HRESULT WINAPI
HTMLXMLHttpRequest_Invoke(IHTMLXMLHttpRequest
*iface
, DISPID dispIdMember
, REFIID riid
, LCID lcid
,
287 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
289 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
291 return IDispatchEx_Invoke(&This
->event_target
.dispex
.IDispatchEx_iface
, dispIdMember
, riid
, lcid
, wFlags
,
292 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
295 static HRESULT WINAPI
HTMLXMLHttpRequest_get_readyState(IHTMLXMLHttpRequest
*iface
, LONG
*p
)
297 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
301 TRACE("(%p)->(%p)\n", This
, p
);
305 nsres
= nsIXMLHttpRequest_GetReadyState(This
->nsxhr
, &val
);
306 if(NS_FAILED(nsres
)) {
307 ERR("nsIXMLHttpRequest_GetReadyState failed: %08x\n", nsres
);
314 static HRESULT WINAPI
HTMLXMLHttpRequest_get_responseBody(IHTMLXMLHttpRequest
*iface
, VARIANT
*p
)
316 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
317 FIXME("(%p)->(%p)\n", This
, p
);
321 static HRESULT WINAPI
HTMLXMLHttpRequest_get_responseText(IHTMLXMLHttpRequest
*iface
, BSTR
*p
)
323 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
327 TRACE("(%p)->(%p)\n", This
, p
);
332 nsAString_Init(&nsstr
, NULL
);
333 nsres
= nsIXMLHttpRequest_GetResponseText(This
->nsxhr
, &nsstr
);
334 return return_nsstr(nsres
, &nsstr
, p
);
337 static HRESULT WINAPI
HTMLXMLHttpRequest_get_responseXML(IHTMLXMLHttpRequest
*iface
, IDispatch
**p
)
339 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
340 IXMLDOMDocument
*xmldoc
= NULL
;
344 IObjectSafety
*safety
;
346 TRACE("(%p)->(%p)\n", This
, p
);
348 hres
= CoCreateInstance(&CLSID_DOMDocument
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IXMLDOMDocument
, (void**)&xmldoc
);
350 ERR("CoCreateInstance failed: %08x\n", hres
);
354 hres
= IHTMLXMLHttpRequest_get_responseText(iface
, &str
);
356 IXMLDOMDocument_Release(xmldoc
);
357 ERR("get_responseText failed: %08x\n", hres
);
361 hres
= IXMLDOMDocument_loadXML(xmldoc
, str
, &vbool
);
363 if(hres
!= S_OK
|| vbool
!= VARIANT_TRUE
)
364 WARN("loadXML failed: %08x, returning an empty xmldoc\n", hres
);
366 hres
= IXMLDOMDocument_QueryInterface(xmldoc
, &IID_IObjectSafety
, (void**)&safety
);
367 assert(SUCCEEDED(hres
));
368 hres
= IObjectSafety_SetInterfaceSafetyOptions(safety
, NULL
,
369 INTERFACESAFE_FOR_UNTRUSTED_CALLER
| INTERFACESAFE_FOR_UNTRUSTED_DATA
| INTERFACE_USES_SECURITY_MANAGER
,
370 INTERFACESAFE_FOR_UNTRUSTED_CALLER
| INTERFACESAFE_FOR_UNTRUSTED_DATA
| INTERFACE_USES_SECURITY_MANAGER
);
371 assert(SUCCEEDED(hres
));
372 IObjectSafety_Release(safety
);
374 *p
= (IDispatch
*)xmldoc
;
378 static HRESULT WINAPI
HTMLXMLHttpRequest_get_status(IHTMLXMLHttpRequest
*iface
, LONG
*p
)
380 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
383 TRACE("(%p)->(%p)\n", This
, p
);
388 nsres
= nsIXMLHttpRequest_GetStatus(This
->nsxhr
, &val
);
389 if(NS_FAILED(nsres
)) {
390 ERR("nsIXMLHttpRequest_GetStatus failed: %08x\n", nsres
);
395 return E_FAIL
; /* WinAPI thinks this is an error */
400 static HRESULT WINAPI
HTMLXMLHttpRequest_get_statusText(IHTMLXMLHttpRequest
*iface
, BSTR
*p
)
402 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
408 TRACE("(%p)->(%p)\n", This
, p
);
413 hres
= IHTMLXMLHttpRequest_get_readyState(iface
, &state
);
422 nsACString_Init(&nscstr
, NULL
);
423 nsres
= nsIXMLHttpRequest_GetStatusText(This
->nsxhr
, &nscstr
);
424 return return_nscstr(nsres
, &nscstr
, p
);
427 static HRESULT WINAPI
HTMLXMLHttpRequest_put_onreadystatechange(IHTMLXMLHttpRequest
*iface
, VARIANT v
)
429 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
431 TRACE("(%p)->(%s)\n", This
, debugstr_variant(&v
));
433 return set_event_handler(&This
->event_target
, EVENTID_READYSTATECHANGE
, &v
);
436 static HRESULT WINAPI
HTMLXMLHttpRequest_get_onreadystatechange(IHTMLXMLHttpRequest
*iface
, VARIANT
*p
)
438 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
440 TRACE("(%p)->(%p)\n", This
, p
);
442 return get_event_handler(&This
->event_target
, EVENTID_READYSTATECHANGE
, p
);
445 static HRESULT WINAPI
HTMLXMLHttpRequest_abort(IHTMLXMLHttpRequest
*iface
)
447 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
450 TRACE("(%p)->()\n", This
);
452 nsres
= nsIXMLHttpRequest_SlowAbort(This
->nsxhr
);
453 if(NS_FAILED(nsres
)) {
454 ERR("nsIXMLHttpRequest_SlowAbort failed: %08x\n", nsres
);
461 static HRESULT WINAPI
HTMLXMLHttpRequest_open(IHTMLXMLHttpRequest
*iface
, BSTR bstrMethod
, BSTR bstrUrl
, VARIANT varAsync
, VARIANT varUser
, VARIANT varPassword
)
463 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
464 nsACString method
, url
;
465 nsAString user
, password
;
469 TRACE("(%p)->(%s %s %s %s %s)\n", This
, debugstr_w(bstrMethod
), debugstr_w(bstrUrl
), debugstr_variant(&varAsync
), debugstr_variant(&varUser
), debugstr_variant(&varPassword
));
471 if(V_VT(&varAsync
) != VT_BOOL
) {
472 FIXME("varAsync not supported: %s\n", debugstr_variant(&varAsync
));
476 /* Note: Starting with Gecko 30.0 (Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27),
477 * synchronous requests on the main thread have been deprecated due to the negative
478 * effects to the user experience.
480 if(!V_BOOL(&varAsync
)) {
481 FIXME("Synchronous request is not supported yet\n");
485 hres
= variant_to_nsastr(varUser
, &user
);
488 hres
= variant_to_nsastr(varPassword
, &password
);
490 nsAString_Finish(&user
);
494 hres
= bstr_to_nsacstr(bstrMethod
, &method
);
496 nsAString_Finish(&user
);
497 nsAString_Finish(&password
);
500 hres
= bstr_to_nsacstr(bstrUrl
, &url
);
502 nsAString_Finish(&user
);
503 nsAString_Finish(&password
);
504 nsACString_Finish(&method
);
508 nsres
= nsIXMLHttpRequest_Open(This
->nsxhr
, &method
, &url
, TRUE
,
509 &user
, &password
, 0);
511 nsACString_Finish(&method
);
512 nsACString_Finish(&url
);
513 nsAString_Finish(&user
);
514 nsAString_Finish(&password
);
516 if(NS_FAILED(nsres
)) {
517 ERR("nsIXMLHttpRequest_Open failed: %08x\n", nsres
);
524 static HRESULT WINAPI
HTMLXMLHttpRequest_send(IHTMLXMLHttpRequest
*iface
, VARIANT varBody
)
526 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
529 TRACE("(%p)->(%s)\n", This
, debugstr_variant(&varBody
));
531 switch(V_VT(&varBody
)) {
537 FIXME("varBody(%s) unsupported\n", debugstr_variant(&varBody
));
541 nsres
= nsIXMLHttpRequest_Send(This
->nsxhr
, NULL
);
543 if(NS_FAILED(nsres
)) {
544 ERR("nsIXMLHttpRequest_Send failed: %08x\n", nsres
);
551 static HRESULT WINAPI
HTMLXMLHttpRequest_getAllResponseHeaders(IHTMLXMLHttpRequest
*iface
, BSTR
*p
)
553 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
559 TRACE("(%p)->(%p)\n", This
, p
);
564 hres
= IHTMLXMLHttpRequest_get_readyState(iface
, &state
);
573 nsACString_Init(&nscstr
, NULL
);
574 nsres
= nsIXMLHttpRequest_GetAllResponseHeaders(This
->nsxhr
, &nscstr
);
575 return return_nscstr(nsres
, &nscstr
, p
);
578 static HRESULT WINAPI
HTMLXMLHttpRequest_getResponseHeader(IHTMLXMLHttpRequest
*iface
, BSTR bstrHeader
, BSTR
*p
)
580 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
581 nsACString header
, ret
;
586 TRACE("(%p)->(%s %p)\n", This
, debugstr_w(bstrHeader
), p
);
593 hres
= IHTMLXMLHttpRequest_get_readyState(iface
, &state
);
602 cstr
= heap_strdupWtoU(bstrHeader
);
603 nsACString_InitDepend(&header
, cstr
);
604 nsACString_Init(&ret
, NULL
);
606 nsres
= nsIXMLHttpRequest_GetResponseHeader(This
->nsxhr
, &header
, &ret
);
608 nsACString_Finish(&header
);
610 return return_nscstr(nsres
, &ret
, p
);
613 static HRESULT WINAPI
HTMLXMLHttpRequest_setRequestHeader(IHTMLXMLHttpRequest
*iface
, BSTR bstrHeader
, BSTR bstrValue
)
615 HTMLXMLHttpRequest
*This
= impl_from_IHTMLXMLHttpRequest(iface
);
616 FIXME("(%p)->(%s %s)\n", This
, debugstr_w(bstrHeader
), debugstr_w(bstrValue
));
620 static const IHTMLXMLHttpRequestVtbl HTMLXMLHttpRequestVtbl
= {
621 HTMLXMLHttpRequest_QueryInterface
,
622 HTMLXMLHttpRequest_AddRef
,
623 HTMLXMLHttpRequest_Release
,
624 HTMLXMLHttpRequest_GetTypeInfoCount
,
625 HTMLXMLHttpRequest_GetTypeInfo
,
626 HTMLXMLHttpRequest_GetIDsOfNames
,
627 HTMLXMLHttpRequest_Invoke
,
628 HTMLXMLHttpRequest_get_readyState
,
629 HTMLXMLHttpRequest_get_responseBody
,
630 HTMLXMLHttpRequest_get_responseText
,
631 HTMLXMLHttpRequest_get_responseXML
,
632 HTMLXMLHttpRequest_get_status
,
633 HTMLXMLHttpRequest_get_statusText
,
634 HTMLXMLHttpRequest_put_onreadystatechange
,
635 HTMLXMLHttpRequest_get_onreadystatechange
,
636 HTMLXMLHttpRequest_abort
,
637 HTMLXMLHttpRequest_open
,
638 HTMLXMLHttpRequest_send
,
639 HTMLXMLHttpRequest_getAllResponseHeaders
,
640 HTMLXMLHttpRequest_getResponseHeader
,
641 HTMLXMLHttpRequest_setRequestHeader
644 static inline HTMLXMLHttpRequest
*impl_from_DispatchEx(DispatchEx
*iface
)
646 return CONTAINING_RECORD(iface
, HTMLXMLHttpRequest
, event_target
.dispex
);
649 static void HTMLXMLHttpRequest_bind_event(DispatchEx
*dispex
, int eid
)
651 HTMLXMLHttpRequest
*This
= impl_from_DispatchEx(dispex
);
652 nsIDOMEventTarget
*nstarget
;
656 static const WCHAR readystatechangeW
[] = {'r','e','a','d','y','s','t','a','t','e','c','h','a','n','g','e',0};
658 TRACE("(%p)\n", This
);
660 assert(eid
== EVENTID_READYSTATECHANGE
);
662 if(This
->event_listener
)
665 This
->event_listener
= heap_alloc(sizeof(*This
->event_listener
));
666 if(!This
->event_listener
)
669 This
->event_listener
->nsIDOMEventListener_iface
.lpVtbl
= &XMLHttpReqEventListenerVtbl
;
670 This
->event_listener
->ref
= 1;
671 This
->event_listener
->xhr
= This
;
673 nsres
= nsIXMLHttpRequest_QueryInterface(This
->nsxhr
, &IID_nsIDOMEventTarget
, (void**)&nstarget
);
674 assert(nsres
== NS_OK
);
676 nsAString_InitDepend(&type_str
, readystatechangeW
);
677 nsres
= nsIDOMEventTarget_AddEventListener(nstarget
, &type_str
, &This
->event_listener
->nsIDOMEventListener_iface
, FALSE
, TRUE
, 2);
678 nsAString_Finish(&type_str
);
679 nsIDOMEventTarget_Release(nstarget
);
681 ERR("AddEventListener failed: %08x\n", nsres
);
684 static dispex_static_data_vtbl_t HTMLXMLHttpRequest_dispex_vtbl
= {
690 HTMLXMLHttpRequest_bind_event
693 static const tid_t HTMLXMLHttpRequest_iface_tids
[] = {
694 IHTMLXMLHttpRequest_tid
,
697 static dispex_static_data_t HTMLXMLHttpRequest_dispex
= {
698 &HTMLXMLHttpRequest_dispex_vtbl
,
699 DispHTMLXMLHttpRequest_tid
,
701 HTMLXMLHttpRequest_iface_tids
705 /* IHTMLXMLHttpRequestFactory */
706 static inline HTMLXMLHttpRequestFactory
*impl_from_IHTMLXMLHttpRequestFactory(IHTMLXMLHttpRequestFactory
*iface
)
708 return CONTAINING_RECORD(iface
, HTMLXMLHttpRequestFactory
, IHTMLXMLHttpRequestFactory_iface
);
711 static HRESULT WINAPI
HTMLXMLHttpRequestFactory_QueryInterface(IHTMLXMLHttpRequestFactory
*iface
, REFIID riid
, void **ppv
)
713 HTMLXMLHttpRequestFactory
*This
= impl_from_IHTMLXMLHttpRequestFactory(iface
);
715 TRACE("(%p)->(%s %p)\n", This
, debugstr_mshtml_guid(riid
), ppv
);
717 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
718 *ppv
= &This
->IHTMLXMLHttpRequestFactory_iface
;
719 }else if(IsEqualGUID(&IID_IDispatch
, riid
)) {
720 *ppv
= &This
->IHTMLXMLHttpRequestFactory_iface
;
721 }else if(IsEqualGUID(&IID_IHTMLXMLHttpRequestFactory
, riid
)) {
722 *ppv
= &This
->IHTMLXMLHttpRequestFactory_iface
;
723 }else if(dispex_query_interface(&This
->dispex
, riid
, ppv
)) {
724 return *ppv
? S_OK
: E_NOINTERFACE
;
727 WARN("(%p)->(%s %p)\n", This
, debugstr_mshtml_guid(riid
), ppv
);
728 return E_NOINTERFACE
;
731 IUnknown_AddRef((IUnknown
*)*ppv
);
735 static ULONG WINAPI
HTMLXMLHttpRequestFactory_AddRef(IHTMLXMLHttpRequestFactory
*iface
)
737 HTMLXMLHttpRequestFactory
*This
= impl_from_IHTMLXMLHttpRequestFactory(iface
);
738 LONG ref
= InterlockedIncrement(&This
->ref
);
740 TRACE("(%p) ref=%d\n", This
, ref
);
745 static ULONG WINAPI
HTMLXMLHttpRequestFactory_Release(IHTMLXMLHttpRequestFactory
*iface
)
747 HTMLXMLHttpRequestFactory
*This
= impl_from_IHTMLXMLHttpRequestFactory(iface
);
748 LONG ref
= InterlockedDecrement(&This
->ref
);
750 TRACE("(%p) ref=%d\n", This
, ref
);
753 release_dispex(&This
->dispex
);
760 static HRESULT WINAPI
HTMLXMLHttpRequestFactory_GetTypeInfoCount(IHTMLXMLHttpRequestFactory
*iface
, UINT
*pctinfo
)
762 HTMLXMLHttpRequestFactory
*This
= impl_from_IHTMLXMLHttpRequestFactory(iface
);
763 return IDispatchEx_GetTypeInfoCount(&This
->dispex
.IDispatchEx_iface
, pctinfo
);
766 static HRESULT WINAPI
HTMLXMLHttpRequestFactory_GetTypeInfo(IHTMLXMLHttpRequestFactory
*iface
, UINT iTInfo
,
767 LCID lcid
, ITypeInfo
**ppTInfo
)
769 HTMLXMLHttpRequestFactory
*This
= impl_from_IHTMLXMLHttpRequestFactory(iface
);
771 return IDispatchEx_GetTypeInfo(&This
->dispex
.IDispatchEx_iface
, iTInfo
, lcid
, ppTInfo
);
774 static HRESULT WINAPI
HTMLXMLHttpRequestFactory_GetIDsOfNames(IHTMLXMLHttpRequestFactory
*iface
, REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
,
775 LCID lcid
, DISPID
*rgDispId
)
777 HTMLXMLHttpRequestFactory
*This
= impl_from_IHTMLXMLHttpRequestFactory(iface
);
779 return IDispatchEx_GetIDsOfNames(&This
->dispex
.IDispatchEx_iface
, riid
, rgszNames
, cNames
,
783 static HRESULT WINAPI
HTMLXMLHttpRequestFactory_Invoke(IHTMLXMLHttpRequestFactory
*iface
, DISPID dispIdMember
, REFIID riid
, LCID lcid
,
784 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
786 HTMLXMLHttpRequestFactory
*This
= impl_from_IHTMLXMLHttpRequestFactory(iface
);
788 return IDispatchEx_Invoke(&This
->dispex
.IDispatchEx_iface
, dispIdMember
, riid
, lcid
, wFlags
,
789 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
792 static HRESULT WINAPI
HTMLXMLHttpRequestFactory_create(IHTMLXMLHttpRequestFactory
*iface
, IHTMLXMLHttpRequest
**p
)
794 HTMLXMLHttpRequestFactory
*This
= impl_from_IHTMLXMLHttpRequestFactory(iface
);
795 HTMLXMLHttpRequest
*ret
;
796 nsIXMLHttpRequest
*nsxhr
;
798 TRACE("(%p)->(%p)\n", This
, p
);
800 nsxhr
= create_nsxhr(This
->window
->base
.outer_window
->nswindow
);
804 ret
= heap_alloc_zero(sizeof(*ret
));
806 nsIXMLHttpRequest_Release(nsxhr
);
807 return E_OUTOFMEMORY
;
811 ret
->IHTMLXMLHttpRequest_iface
.lpVtbl
= &HTMLXMLHttpRequestVtbl
;
812 init_dispex(&ret
->event_target
.dispex
, (IUnknown
*)&ret
->IHTMLXMLHttpRequest_iface
,
813 &HTMLXMLHttpRequest_dispex
);
816 *p
= &ret
->IHTMLXMLHttpRequest_iface
;
820 static const IHTMLXMLHttpRequestFactoryVtbl HTMLXMLHttpRequestFactoryVtbl
= {
821 HTMLXMLHttpRequestFactory_QueryInterface
,
822 HTMLXMLHttpRequestFactory_AddRef
,
823 HTMLXMLHttpRequestFactory_Release
,
824 HTMLXMLHttpRequestFactory_GetTypeInfoCount
,
825 HTMLXMLHttpRequestFactory_GetTypeInfo
,
826 HTMLXMLHttpRequestFactory_GetIDsOfNames
,
827 HTMLXMLHttpRequestFactory_Invoke
,
828 HTMLXMLHttpRequestFactory_create
831 static inline HTMLXMLHttpRequestFactory
*factory_from_DispatchEx(DispatchEx
*iface
)
833 return CONTAINING_RECORD(iface
, HTMLXMLHttpRequestFactory
, dispex
);
836 static HRESULT
HTMLXMLHttpRequestFactory_value(DispatchEx
*iface
, LCID lcid
, WORD flags
, DISPPARAMS
*params
,
837 VARIANT
*res
, EXCEPINFO
*ei
, IServiceProvider
*caller
)
839 HTMLXMLHttpRequestFactory
*This
= factory_from_DispatchEx(iface
);
840 IHTMLXMLHttpRequest
*xhr
;
845 if(flags
!= DISPATCH_CONSTRUCT
) {
846 FIXME("flags %x not supported\n", flags
);
850 hres
= IHTMLXMLHttpRequestFactory_create(&This
->IHTMLXMLHttpRequestFactory_iface
, &xhr
);
854 V_VT(res
) = VT_DISPATCH
;
855 V_DISPATCH(res
) = (IDispatch
*)xhr
;
859 static const dispex_static_data_vtbl_t HTMLXMLHttpRequestFactory_dispex_vtbl
= {
860 HTMLXMLHttpRequestFactory_value
863 static const tid_t HTMLXMLHttpRequestFactory_iface_tids
[] = {
864 IHTMLXMLHttpRequestFactory_tid
,
867 static dispex_static_data_t HTMLXMLHttpRequestFactory_dispex
= {
868 &HTMLXMLHttpRequestFactory_dispex_vtbl
,
869 IHTMLXMLHttpRequestFactory_tid
,
871 HTMLXMLHttpRequestFactory_iface_tids
874 HRESULT
HTMLXMLHttpRequestFactory_Create(HTMLInnerWindow
* window
, HTMLXMLHttpRequestFactory
**ret_ptr
)
876 HTMLXMLHttpRequestFactory
*ret
;
878 ret
= heap_alloc(sizeof(*ret
));
880 return E_OUTOFMEMORY
;
882 ret
->IHTMLXMLHttpRequestFactory_iface
.lpVtbl
= &HTMLXMLHttpRequestFactoryVtbl
;
884 ret
->window
= window
;
886 init_dispex(&ret
->dispex
, (IUnknown
*)&ret
->IHTMLXMLHttpRequestFactory_iface
,
887 &HTMLXMLHttpRequestFactory_dispex
);