ReactOS  0.4.14-dev-554-g2f8d847
xmlhttprequest.c File Reference
#include "precomp.h"
Include dependency graph for xmlhttprequest.c:

Go to the source code of this file.

Classes

struct  HEADER_TYPE
 

Macros

#define DEFINE_EXPECT(func)   static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
 
#define SET_EXPECT(func)   do { called_ ## func = FALSE; expect_ ## func = TRUE; } while(0)
 
#define CHECK_EXPECT2(func)
 
#define CHECK_EXPECT(func)
 
#define CHECK_CALLED(func)
 
#define test_disp(u, id)   _test_disp(__LINE__,u,id)
 
#define test_event_args(a, b, c, d, e, f, g)   _test_event_args(__LINE__,a,b,c,d,e,f,g)
 

Functions

static BSTR a2bstr (const char *str)
 
static int strcmp_wa (LPCWSTR strw, const char *stra)
 
 DEFINE_EXPECT (xmlhttprequest_onreadystatechange_opened)
 
 DEFINE_EXPECT (xmlhttprequest_onreadystatechange_headers_received)
 
 DEFINE_EXPECT (xmlhttprequest_onreadystatechange_loading)
 
 DEFINE_EXPECT (xmlhttprequest_onreadystatechange_done)
 
static void _test_disp (unsigned line, IUnknown *unk, const IID *diid)
 
static void _test_event_args (unsigned line, const IID *dispiid, DISPID id, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
 
static HRESULT WINAPI DispatchEx_QueryInterface (IDispatchEx *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI DispatchEx_AddRef (IDispatchEx *iface)
 
static ULONG WINAPI DispatchEx_Release (IDispatchEx *iface)
 
static HRESULT WINAPI DispatchEx_GetTypeInfoCount (IDispatchEx *iface, UINT *pctinfo)
 
static HRESULT WINAPI DispatchEx_GetTypeInfo (IDispatchEx *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
 
static HRESULT WINAPI DispatchEx_GetIDsOfNames (IDispatchEx *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
 
static HRESULT WINAPI DispatchEx_Invoke (IDispatchEx *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
 
static HRESULT WINAPI DispatchEx_GetDispID (IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
 
static HRESULT WINAPI DispatchEx_DeleteMemberByName (IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
 
static HRESULT WINAPI DispatchEx_DeleteMemberByDispID (IDispatchEx *iface, DISPID id)
 
static HRESULT WINAPI DispatchEx_GetMemberProperties (IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
 
static HRESULT WINAPI DispatchEx_GetMemberName (IDispatchEx *iface, DISPID id, BSTR *pbstrName)
 
static HRESULT WINAPI DispatchEx_GetNextDispID (IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
 
static HRESULT WINAPI DispatchEx_GetNameSpaceParent (IDispatchEx *iface, IUnknown **ppunk)
 
static HRESULT WINAPI xmlhttprequest_onreadystatechange (IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
 
static HRESULT WINAPI PropertyNotifySink_QueryInterface (IPropertyNotifySink *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI PropertyNotifySink_AddRef (IPropertyNotifySink *iface)
 
static ULONG WINAPI PropertyNotifySink_Release (IPropertyNotifySink *iface)
 
static HRESULT WINAPI PropertyNotifySink_OnChanged (IPropertyNotifySink *iface, DISPID dispID)
 
static HRESULT WINAPI PropertyNotifySink_OnRequestEdit (IPropertyNotifySink *iface, DISPID dispID)
 
static void do_advise (IUnknown *unk, REFIID riid, IUnknown *unk_advise)
 
static void pump_msgs (BOOL *b)
 
static void create_xmlhttprequest (IHTMLDocument2 *doc)
 
static void test_header (const struct HEADER_TYPE expect[], int num)
 
static void test_sync_xhr (IHTMLDocument2 *doc, const char *xml_url, const char *expect_text)
 
static void test_async_xhr (IHTMLDocument2 *doc, const char *xml_url, const char *expect_text)
 
static void test_async_xhr_abort (IHTMLDocument2 *doc, const char *xml_url)
 
static IHTMLDocument2 * create_doc_from_url (const char *start_url)
 
 START_TEST (xmlhttprequest)
 

Variables

static IHTMLXMLHttpRequest * xhr = NULL
 
static BSTR content_type = NULL
 
static int loading_cnt = 0
 
static int readystatechange_cnt = 0
 
static IDispatchExVtbl xmlhttprequest_onreadystatechangeFuncVtbl
 
static IDispatchEx xmlhttprequest_onreadystatechange_obj = { &xmlhttprequest_onreadystatechangeFuncVtbl }
 
static BOOL doc_complete
 
static IHTMLDocument2 * notif_doc
 
static IPropertyNotifySinkVtbl PropertyNotifySinkVtbl
 
static IPropertyNotifySink PropertyNotifySink = { &PropertyNotifySinkVtbl }
 

Macro Definition Documentation

◆ CHECK_CALLED

#define CHECK_CALLED (   func)
Value:
do { \
ok(called_ ## func, "expected " #func "\n"); \
expect_ ## func = called_ ## func = FALSE; \
}while(0)
GLenum func
Definition: glext.h:6028

Definition at line 59 of file xmlhttprequest.c.

◆ CHECK_EXPECT

#define CHECK_EXPECT (   func)
Value:
do { \
CHECK_EXPECT2(func); \
expect_ ## func = FALSE; \
}while(0)
GLenum func
Definition: glext.h:6028

Definition at line 53 of file xmlhttprequest.c.

◆ CHECK_EXPECT2

#define CHECK_EXPECT2 (   func)
Value:
do { \
trace(#func "\n"); \
ok(expect_ ##func, "unexpected call " #func "\n"); \
called_ ## func = TRUE; \
}while(0)
GLenum func
Definition: glext.h:6028
#define TRUE
Definition: types.h:120
#define expect_(expected, got, precision)
Definition: font.c:29

Definition at line 46 of file xmlhttprequest.c.

◆ DEFINE_EXPECT

#define DEFINE_EXPECT (   func)    static BOOL expect_ ## func = FALSE, called_ ## func = FALSE

Definition at line 40 of file xmlhttprequest.c.

◆ SET_EXPECT

#define SET_EXPECT (   func)    do { called_ ## func = FALSE; expect_ ## func = TRUE; } while(0)

Definition at line 43 of file xmlhttprequest.c.

◆ test_disp

#define test_disp (   u,
  id 
)    _test_disp(__LINE__,u,id)

Definition at line 75 of file xmlhttprequest.c.

◆ test_event_args

#define test_event_args (   a,
  b,
  c,
  d,
  e,
  f,
  g 
)    _test_event_args(__LINE__,a,b,c,d,e,f,g)

Definition at line 111 of file xmlhttprequest.c.

Function Documentation

◆ _test_disp()

static void _test_disp ( unsigned  line,
IUnknown unk,
const IID diid 
)
static

Definition at line 76 of file xmlhttprequest.c.

77 {
78  IDispatchEx *dispex;
80  UINT ticnt;
81  HRESULT hres;
82 
83  hres = IUnknown_QueryInterface(unk, &IID_IDispatchEx, (void**)&dispex);
84  ok_(__FILE__,line) (hres == S_OK, "Could not get IDispatch: %08x\n", hres);
85  if(FAILED(hres))
86  return;
87 
88  ticnt = 0xdeadbeef;
89  hres = IDispatchEx_GetTypeInfoCount(dispex, &ticnt);
90  ok_(__FILE__,line) (hres == S_OK, "GetTypeInfoCount failed: %08x\n", hres);
91  ok_(__FILE__,line) (ticnt == 1, "ticnt=%u\n", ticnt);
92 
93  hres = IDispatchEx_GetTypeInfo(dispex, 0, 0, &typeinfo);
94  ok_(__FILE__,line) (hres == S_OK, "GetTypeInfo failed: %08x\n", hres);
95 
96  if(SUCCEEDED(hres)) {
97  TYPEATTR *type_attr;
98 
99  hres = ITypeInfo_GetTypeAttr(typeinfo, &type_attr);
100  ok_(__FILE__,line) (hres == S_OK, "GetTypeAttr failed: %08x\n", hres);
101  ok_(__FILE__,line) (IsEqualGUID(&type_attr->guid, diid), "unexpected guid %s\n",
102  wine_dbgstr_guid(&type_attr->guid));
103 
104  ITypeInfo_ReleaseTypeAttr(typeinfo, type_attr);
105  ITypeInfo_Release(typeinfo);
106  }
107 
108  IDispatchEx_Release(dispex);
109 }
const char * wine_dbgstr_guid(const GUID *guid)
Definition: parser.c:48
HRESULT hres
Definition: protocol.c:465
LONG HRESULT
Definition: typedefs.h:77
static ITypeInfo * typeinfo[last_tid]
Definition: apps.c:109
#define S_OK
Definition: intsafe.h:59
unsigned int UINT
Definition: ndis.h:50
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
#define SUCCEEDED(hr)
Definition: intsafe.h:57
#define ok_(x1, x2)
Definition: atltest.h:61

Referenced by _test_event_args().

◆ _test_event_args()

static void _test_event_args ( unsigned  line,
const IID dispiid,
DISPID  id,
WORD  wFlags,
DISPPARAMS *  pdp,
VARIANT pvarRes,
EXCEPINFO *  pei,
IServiceProvider pspCaller 
)
static

Definition at line 112 of file xmlhttprequest.c.

114 {
115  ok_(__FILE__,line) (id == DISPID_VALUE, "id = %d\n", id);
116  ok_(__FILE__,line) (wFlags == DISPATCH_METHOD, "wFlags = %x\n", wFlags);
117  ok_(__FILE__,line) (pdp != NULL, "pdp == NULL\n");
118  ok_(__FILE__,line) (pdp->cArgs == 1, "pdp->cArgs = %d\n", pdp->cArgs);
119  ok_(__FILE__,line) (pdp->cNamedArgs == 1, "pdp->cNamedArgs = %d\n", pdp->cNamedArgs);
120  ok_(__FILE__,line) (pdp->rgdispidNamedArgs[0] == DISPID_THIS, "pdp->rgdispidNamedArgs[0] = %d\n",
121  pdp->rgdispidNamedArgs[0]);
122  ok_(__FILE__,line) (V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(rgvarg) = %d\n", V_VT(pdp->rgvarg));
123  ok_(__FILE__,line) (pvarRes != NULL, "pvarRes == NULL\n");
124  ok_(__FILE__,line) (pei != NULL, "pei == NULL");
125  ok_(__FILE__,line) (!pspCaller, "pspCaller != NULL\n");
126 
127  if(dispiid)
128  _test_disp(line, (IUnknown*)V_DISPATCH(pdp->rgvarg), dispiid);
129 }
#define DISPATCH_METHOD
Definition: oleauto.h:1006
#define V_DISPATCH(A)
Definition: oleauto.h:239
smooth NULL
Definition: ftsmooth.c:416
Definition: parser.c:48
#define V_VT(A)
Definition: oleauto.h:211
_In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon.h:519
#define DISPID_THIS
Definition: olectl.h:395
GLenum GLuint id
Definition: glext.h:5579
static void _test_disp(unsigned line, IUnknown *unk, const IID *diid)
#define ok_(x1, x2)
Definition: atltest.h:61

◆ a2bstr()

static BSTR a2bstr ( const char str)
static

Definition at line 21 of file xmlhttprequest.c.

22 {
23  BSTR ret;
24  int len;
25 
26  len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
29 
30  return ret;
31 }
BSTR WINAPI SysAllocStringLen(const OLECHAR *str, unsigned int len)
Definition: oleaut.c:339
#define CP_ACP
Definition: compat.h:99
OLECHAR * BSTR
Definition: compat.h:1942
const WCHAR * str
smooth NULL
Definition: ftsmooth.c:416
int ret
GLenum GLsizei len
Definition: glext.h:6722
#define MultiByteToWideChar
Definition: compat.h:100

Referenced by create_doc_from_url(), START_TEST(), test_async_xhr(), test_async_xhr_abort(), test_header(), and test_sync_xhr().

◆ create_doc_from_url()

static IHTMLDocument2* create_doc_from_url ( const char start_url)
static

Definition at line 870 of file xmlhttprequest.c.

871 {
872  BSTR url;
873  IBindCtx *bc;
874  IMoniker *url_mon;
875  IPersistMoniker *persist_mon;
876  IHTMLDocument2 *doc;
877  HRESULT hres;
878 
879  hres = CreateBindCtx(0, &bc);
880  ok(hres == S_OK, "CreateBindCtx failed: 0x%08x\n", hres);
881 
882  url = a2bstr(start_url);
883  hres = CreateURLMoniker(NULL, url, &url_mon);
884  ok(hres == S_OK, "CreateURLMoniker failed: 0x%08x\n", hres);
885 
886  hres = CoCreateInstance(&CLSID_HTMLDocument, NULL,
887  CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER, &IID_IHTMLDocument2,
888  (void**)&doc);
889  ok(hres == S_OK, "CoCreateInstance failed: 0x%08x\n", hres);
890 
891  hres = IHTMLDocument2_QueryInterface(doc, &IID_IPersistMoniker,
892  (void**)&persist_mon);
893  ok(hres == S_OK, "IHTMLDocument2_QueryInterface failed: 0x%08x\n", hres);
894 
895  hres = IPersistMoniker_Load(persist_mon, FALSE, url_mon, bc,
897  ok(hres == S_OK, "IPersistMoniker_Load failed: 0x%08x\n", hres);
898 
899  IPersistMoniker_Release(persist_mon);
900  IMoniker_Release(url_mon);
901  IBindCtx_Release(bc);
903 
905  notif_doc = doc;
908 
909  return doc;
910 }
#define STGM_SHARE_EXCLUSIVE
Definition: objbase.h:922
LPBATCH_CONTEXT bc
Definition: batch.c:66
OLECHAR * BSTR
Definition: compat.h:1942
static IHTMLDocument2 * notif_doc
smooth NULL
Definition: ftsmooth.c:416
HRESULT hres
Definition: protocol.c:465
HRESULT WINAPI CreateBindCtx(DWORD reserved, LPBC *ppbc)
Definition: bindctx.c:556
static BOOL doc_complete
static void pump_msgs(BOOL *b)
LONG HRESULT
Definition: typedefs.h:77
static const WCHAR url[]
Definition: encode.c:1432
#define STGM_READWRITE
Definition: objbase.h:918
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
#define S_OK
Definition: intsafe.h:59
#define ok(value,...)
Definition: atltest.h:57
const GUID IID_IPropertyNotifySink
static BSTR a2bstr(const char *str)
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
HRESULT WINAPI CreateURLMoniker(IMoniker *pmkContext, LPCWSTR szURL, IMoniker **ppmk)
Definition: umon.c:732
static void do_advise(IUnknown *unk, REFIID riid, IUnknown *unk_advise)
static IPropertyNotifySink PropertyNotifySink

Referenced by START_TEST().

◆ create_xmlhttprequest()

static void create_xmlhttprequest ( IHTMLDocument2 *  doc)
static

Definition at line 383 of file xmlhttprequest.c.

384 {
386  IHTMLWindow5 *window5;
387  VARIANT var;
388  IHTMLXMLHttpRequestFactory *factory;
389  HRESULT hres;
390 
391  hres = IHTMLDocument2_get_parentWindow(doc, &window);
392  ok(hres == S_OK, "get_parentWindow failed: %08x\n", hres);
393  ok(window != NULL, "window == NULL\n");
394 
395  hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow5, (void**)&window5);
396  IHTMLWindow2_Release(window);
397  if(FAILED(hres)) {
398  win_skip("IHTMLWindow5 not supported\n");
399  return;
400  }
401 
402  VariantInit(&var);
403  hres = IHTMLWindow5_get_XMLHttpRequest(window5, &var);
404  IHTMLWindow5_Release(window5);
405  ok(hres == S_OK, "get_XMLHttpRequest failed: %08x\n", hres);
406  ok(V_VT(&var) == VT_DISPATCH, "V_VT(&var) is %08x, expected VT_DISPATCH\n", V_VT(&var));
407 
408  hres = IDispatch_QueryInterface(V_DISPATCH(&var), &IID_IHTMLXMLHttpRequestFactory, (void**)&factory);
409  VariantClear(&var);
410  ok(hres == S_OK, "QueryInterface(IID_IHTMLXMLHttpRequestFactory) failed: %08x\n", hres);
411  ok(factory != NULL, "factory == NULL\n");
412 
413  hres = IHTMLXMLHttpRequestFactory_create(factory, &xhr);
414  IHTMLXMLHttpRequestFactory_Release(factory);
415  ok(hres == S_OK, "create failed: %08x\n", hres);
416  ok(xhr != NULL, "xhr == NULL\n");
417 }
static IHTMLXMLHttpRequest * xhr
__IHTMLWindow2_FWD_DEFINED__ typedef interface IHTMLWindow2 IHTMLWindow2
Definition: mshtmhst.idl:64
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:568
#define V_DISPATCH(A)
Definition: oleauto.h:239
Definition: main.c:438
smooth NULL
Definition: ftsmooth.c:416
HRESULT hres
Definition: protocol.c:465
LONG HRESULT
Definition: typedefs.h:77
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648
#define V_VT(A)
Definition: oleauto.h:211
static IHTMLWindow2 * window
Definition: events.c:77
#define S_OK
Definition: intsafe.h:59
#define ok(value,...)
Definition: atltest.h:57
static ClassFactoryImpl factory
Definition: ole_server.c:234
#define win_skip
Definition: test.h:150

Referenced by test_async_xhr(), test_async_xhr_abort(), and test_sync_xhr().

◆ DEFINE_EXPECT() [1/4]

DEFINE_EXPECT ( xmlhttprequest_onreadystatechange_opened  )

◆ DEFINE_EXPECT() [2/4]

DEFINE_EXPECT ( xmlhttprequest_onreadystatechange_headers_received  )

◆ DEFINE_EXPECT() [3/4]

DEFINE_EXPECT ( xmlhttprequest_onreadystatechange_loading  )

◆ DEFINE_EXPECT() [4/4]

DEFINE_EXPECT ( xmlhttprequest_onreadystatechange_done  )

◆ DispatchEx_AddRef()

static ULONG WINAPI DispatchEx_AddRef ( IDispatchEx *  iface)
static

Definition at line 147 of file xmlhttprequest.c.

148 {
149  return 2;
150 }

◆ DispatchEx_DeleteMemberByDispID()

static HRESULT WINAPI DispatchEx_DeleteMemberByDispID ( IDispatchEx *  iface,
DISPID  id 
)
static

Definition at line 198 of file xmlhttprequest.c.

199 {
200  ok(0, "unexpected call\n");
201  return E_NOTIMPL;
202 }
#define ok(value,...)
Definition: atltest.h:57
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ DispatchEx_DeleteMemberByName()

static HRESULT WINAPI DispatchEx_DeleteMemberByName ( IDispatchEx *  iface,
BSTR  bstrName,
DWORD  grfdex 
)
static

Definition at line 192 of file xmlhttprequest.c.

193 {
194  ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
195  return E_NOTIMPL;
196 }
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
#define ok(value,...)
Definition: atltest.h:57
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ DispatchEx_GetDispID()

static HRESULT WINAPI DispatchEx_GetDispID ( IDispatchEx *  iface,
BSTR  bstrName,
DWORD  grfdex,
DISPID pid 
)
static

Definition at line 186 of file xmlhttprequest.c.

187 {
188  ok(0, "unexpected call\n");
189  return E_NOTIMPL;
190 }
#define ok(value,...)
Definition: atltest.h:57
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ DispatchEx_GetIDsOfNames()

static HRESULT WINAPI DispatchEx_GetIDsOfNames ( IDispatchEx *  iface,
REFIID  riid,
LPOLESTR rgszNames,
UINT  cNames,
LCID  lcid,
DISPID rgDispId 
)
static

Definition at line 170 of file xmlhttprequest.c.

173 {
174  ok(0, "unexpected call\n");
175  return E_NOTIMPL;
176 }
#define ok(value,...)
Definition: atltest.h:57
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ DispatchEx_GetMemberName()

static HRESULT WINAPI DispatchEx_GetMemberName ( IDispatchEx *  iface,
DISPID  id,
BSTR pbstrName 
)
static

Definition at line 210 of file xmlhttprequest.c.

211 {
212  ok(0, "unexpected call\n");
213  return E_NOTIMPL;
214 }
#define ok(value,...)
Definition: atltest.h:57
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ DispatchEx_GetMemberProperties()

static HRESULT WINAPI DispatchEx_GetMemberProperties ( IDispatchEx *  iface,
DISPID  id,
DWORD  grfdexFetch,
DWORD pgrfdex 
)
static

Definition at line 204 of file xmlhttprequest.c.

205 {
206  ok(0, "unexpected call\n");
207  return E_NOTIMPL;
208 }
#define ok(value,...)
Definition: atltest.h:57
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ DispatchEx_GetNameSpaceParent()

static HRESULT WINAPI DispatchEx_GetNameSpaceParent ( IDispatchEx *  iface,
IUnknown **  ppunk 
)
static

Definition at line 222 of file xmlhttprequest.c.

223 {
224  ok(0, "unexpected call\n");
225  return E_NOTIMPL;
226 }
#define ok(value,...)
Definition: atltest.h:57
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ DispatchEx_GetNextDispID()

static HRESULT WINAPI DispatchEx_GetNextDispID ( IDispatchEx *  iface,
DWORD  grfdex,
DISPID  id,
DISPID pid 
)
static

Definition at line 216 of file xmlhttprequest.c.

217 {
218  ok(0, "unexpected call\n");
219  return E_NOTIMPL;
220 }
#define ok(value,...)
Definition: atltest.h:57
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ DispatchEx_GetTypeInfo()

static HRESULT WINAPI DispatchEx_GetTypeInfo ( IDispatchEx *  iface,
UINT  iTInfo,
LCID  lcid,
ITypeInfo **  ppTInfo 
)
static

Definition at line 163 of file xmlhttprequest.c.

165 {
166  ok(0, "unexpected call\n");
167  return E_NOTIMPL;
168 }
#define ok(value,...)
Definition: atltest.h:57
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ DispatchEx_GetTypeInfoCount()

static HRESULT WINAPI DispatchEx_GetTypeInfoCount ( IDispatchEx *  iface,
UINT pctinfo 
)
static

Definition at line 157 of file xmlhttprequest.c.

158 {
159  ok(0, "unexpected call\n");
160  return E_NOTIMPL;
161 }
#define ok(value,...)
Definition: atltest.h:57
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ DispatchEx_Invoke()

static HRESULT WINAPI DispatchEx_Invoke ( IDispatchEx *  iface,
DISPID  dispIdMember,
REFIID  riid,
LCID  lcid,
WORD  wFlags,
DISPPARAMS *  pDispParams,
VARIANT pVarResult,
EXCEPINFO *  pExcepInfo,
UINT puArgErr 
)
static

Definition at line 178 of file xmlhttprequest.c.

181 {
182  ok(0, "unexpected call\n");
183  return E_NOTIMPL;
184 }
#define ok(value,...)
Definition: atltest.h:57
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ DispatchEx_QueryInterface()

static HRESULT WINAPI DispatchEx_QueryInterface ( IDispatchEx *  iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 131 of file xmlhttprequest.c.

132 {
133  *ppv = NULL;
134 
137  || IsEqualGUID(riid, &IID_IDispatchEx))
138  *ppv = iface;
139  else {
140  ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid));
141  return E_NOINTERFACE;
142  }
143 
144  return S_OK;
145 }
#define E_NOINTERFACE
Definition: winerror.h:2364
REFIID riid
Definition: precomp.h:44
REFIID LPVOID * ppv
Definition: atlbase.h:39
const char * wine_dbgstr_guid(const GUID *guid)
smooth NULL
Definition: ftsmooth.c:416
const GUID IID_IUnknown
const GUID IID_IDispatch
#define S_OK
Definition: intsafe.h:59
#define ok(value,...)
Definition: atltest.h:57
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112

◆ DispatchEx_Release()

static ULONG WINAPI DispatchEx_Release ( IDispatchEx *  iface)
static

Definition at line 152 of file xmlhttprequest.c.

153 {
154  return 1;
155 }

◆ do_advise()

static void do_advise ( IUnknown unk,
REFIID  riid,
IUnknown unk_advise 
)
static

Definition at line 341 of file xmlhttprequest.c.

342 {
345  DWORD cookie;
346  HRESULT hres;
347 
348  hres = IUnknown_QueryInterface(unk, &IID_IConnectionPointContainer, (void**)&container);
349  ok(hres == S_OK, "QueryInterface(IID_IConnectionPointContainer) failed: %08x\n", hres);
350 
351  hres = IConnectionPointContainer_FindConnectionPoint(container, riid, &cp);
352  IConnectionPointContainer_Release(container);
353  ok(hres == S_OK, "FindConnectionPoint failed: %08x\n", hres);
354 
355  hres = IConnectionPoint_Advise(cp, unk_advise, &cookie);
356  IConnectionPoint_Release(cp);
357  ok(hres == S_OK, "Advise failed: %08x\n", hres);
358 }
REFIID riid
Definition: precomp.h:44
const GUID IID_IConnectionPointContainer
struct container container
HRESULT hres
Definition: protocol.c:465
LONG HRESULT
Definition: typedefs.h:77
unsigned long DWORD
Definition: ntddk_ex.h:95
#define S_OK
Definition: intsafe.h:59
#define ok(value,...)
Definition: atltest.h:57
POINT cp
Definition: magnifier.c:59

Referenced by create_doc_from_url().

◆ PropertyNotifySink_AddRef()

static ULONG WINAPI PropertyNotifySink_AddRef ( IPropertyNotifySink iface)
static

Definition at line 297 of file xmlhttprequest.c.

298 {
299  return 2;
300 }

◆ PropertyNotifySink_OnChanged()

static HRESULT WINAPI PropertyNotifySink_OnChanged ( IPropertyNotifySink iface,
DISPID  dispID 
)
static

Definition at line 307 of file xmlhttprequest.c.

308 {
309  if(dispID == DISPID_READYSTATE){
310  BSTR state;
311  HRESULT hres;
312 
313  hres = IHTMLDocument2_get_readyState(notif_doc, &state);
314  ok(hres == S_OK, "get_readyState failed: %08x\n", hres);
315 
316  if(!strcmp_wa(state, "complete"))
317  doc_complete = TRUE;
318 
320  }
321 
322  return S_OK;
323 }
#define TRUE
Definition: types.h:120
OLECHAR * BSTR
Definition: compat.h:1942
static IHTMLDocument2 * notif_doc
HRESULT hres
Definition: protocol.c:465
static BOOL doc_complete
LONG HRESULT
Definition: typedefs.h:77
static int strcmp_wa(LPCWSTR strw, const char *stra)
static int state
Definition: maze.c:121
#define S_OK
Definition: intsafe.h:59
#define ok(value,...)
Definition: atltest.h:57
#define DISPID_READYSTATE
Definition: idispids.h:22
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271

◆ PropertyNotifySink_OnRequestEdit()

static HRESULT WINAPI PropertyNotifySink_OnRequestEdit ( IPropertyNotifySink iface,
DISPID  dispID 
)
static

Definition at line 325 of file xmlhttprequest.c.

326 {
327  ok(0, "unexpected call\n");
328  return E_NOTIMPL;
329 }
#define ok(value,...)
Definition: atltest.h:57
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ PropertyNotifySink_QueryInterface()

static HRESULT WINAPI PropertyNotifySink_QueryInterface ( IPropertyNotifySink iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 285 of file xmlhttprequest.c.

287 {
289  *ppv = iface;
290  return S_OK;
291  }
292 
293  ok(0, "unexpected call\n");
294  return E_NOINTERFACE;
295 }
#define E_NOINTERFACE
Definition: winerror.h:2364
REFIID riid
Definition: precomp.h:44
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:59
#define ok(value,...)
Definition: atltest.h:57
const GUID IID_IPropertyNotifySink
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112

◆ PropertyNotifySink_Release()

static ULONG WINAPI PropertyNotifySink_Release ( IPropertyNotifySink iface)
static

Definition at line 302 of file xmlhttprequest.c.

303 {
304  return 1;
305 }

◆ pump_msgs()

static void pump_msgs ( BOOL b)
static

Definition at line 360 of file xmlhttprequest.c.

361 {
362  MSG msg;
363 
364  if(b) {
365  while(!*b && GetMessageW(&msg, NULL, 0, 0)) {
368  }
369  }else {
370  while(PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE)) {
373  }
374  }
375 }
BOOL WINAPI TranslateMessage(_In_ const MSG *)
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
LRESULT WINAPI DispatchMessageW(_In_ const MSG *)
smooth NULL
Definition: ftsmooth.c:416
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
BOOL WINAPI GetMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
#define msg(x)
Definition: auth_time.c:54
BOOL WINAPI PeekMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT, _In_ UINT)
#define PM_REMOVE
Definition: winuser.h:1182

Referenced by create_doc_from_url(), and test_async_xhr().

◆ START_TEST()

START_TEST ( xmlhttprequest  )

Definition at line 912 of file xmlhttprequest.c.

913 {
914  IHTMLDocument2 *doc;
915  static const char start_url[] = "http://test.winehq.org/tests/hello.html";
916  static const char xml_url[] = "http://test.winehq.org/tests/xmltest.xml";
917  static const char large_page_url[] = "http://test.winehq.org/tests/data.php";
918  static const char expect_response_text[] = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<a>TEST</a>\n";
919 
921 
922  content_type = a2bstr("Content-Type");
923  doc = create_doc_from_url(start_url);
924  if(doc) {
925  test_sync_xhr(doc, xml_url, expect_response_text);
926  test_sync_xhr(doc, large_page_url, NULL);
927  test_async_xhr(doc, xml_url, expect_response_text);
928  test_async_xhr(doc, large_page_url, NULL);
929  test_async_xhr_abort(doc, large_page_url);
930  IHTMLDocument2_Release(doc);
931  }
933 
934  CoUninitialize();
935 }
static IHTMLDocument2 * create_doc_from_url(const char *start_url)
static void test_async_xhr(IHTMLDocument2 *doc, const char *xml_url, const char *expect_text)
static void test_sync_xhr(IHTMLDocument2 *doc, const char *xml_url, const char *expect_text)
smooth NULL
Definition: ftsmooth.c:416
static BSTR content_type
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
static BSTR a2bstr(const char *str)
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
static void test_async_xhr_abort(IHTMLDocument2 *doc, const char *xml_url)

◆ strcmp_wa()

static int strcmp_wa ( LPCWSTR  strw,
const char stra 
)
static

Definition at line 33 of file xmlhttprequest.c.

34 {
35  CHAR buf[512];
36  WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL);
37  return lstrcmpA(stra, buf);
38 }
#define WideCharToMultiByte
Definition: compat.h:101
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define CP_ACP
Definition: compat.h:99
char CHAR
Definition: xmlstorage.h:175
int WINAPI lstrcmpA(LPCSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:18
smooth NULL
Definition: ftsmooth.c:416
static const char * strw(LPCWSTR x)
Definition: actctx.c:49

Referenced by PropertyNotifySink_OnChanged(), test_async_xhr(), test_header(), and test_sync_xhr().

◆ test_async_xhr()

static void test_async_xhr ( IHTMLDocument2 *  doc,
const char xml_url,
const char expect_text 
)
static

Definition at line 614 of file xmlhttprequest.c.

615 {
616  VARIANT vbool, vempty, var;
617  BSTR method, url;
618  BSTR text;
619  LONG val;
620  HRESULT hres;
621  static const struct HEADER_TYPE expect_headers[] = {
622  {"Content-Length", "51"},
623  {"Content-Type", "application/xml"}
624  };
625 
627  if(!xhr)
628  return;
629 
630  V_VT(&var) = VT_DISPATCH;
632  hres = IHTMLXMLHttpRequest_put_onreadystatechange(xhr, var);
633  ok(hres == S_OK, "put_onreadystatechange failed: %08x\n", hres);
634 
635  V_VT(&var) = VT_EMPTY;
636  hres = IHTMLXMLHttpRequest_get_onreadystatechange(xhr, &var);
637  ok(hres == S_OK, "get_onreadystatechange failed: %08x\n", hres);
638  ok(V_VT(&var) == VT_DISPATCH, "V_VT(onreadystatechange) = %d\n", V_VT(&var));
639  ok(V_DISPATCH(&var) == (IDispatch*)&xmlhttprequest_onreadystatechange_obj, "unexpected onreadystatechange value\n");
640 
641  hres = IHTMLXMLHttpRequest_getResponseHeader(xhr, NULL, &text);
642  ok(hres == E_INVALIDARG, "Expect E_INVALIDARG, got %08x\n", hres);
643 
644  hres = IHTMLXMLHttpRequest_getResponseHeader(xhr, content_type, NULL);
645  ok(hres == E_POINTER, "Expect E_POINTER, got %08x\n", hres);
646 
647  hres = IHTMLXMLHttpRequest_getResponseHeader(xhr, NULL, NULL);
648  ok(hres == E_POINTER || broken(hres == E_INVALIDARG), /* Vista and before */
649  "Expect E_POINTER, got %08x\n", hres);
650 
651  text = (BSTR)0xdeadbeef;
652  hres = IHTMLXMLHttpRequest_getResponseHeader(xhr, content_type, &text);
653  ok(hres == E_FAIL, "got %08x\n", hres);
654  ok(text == NULL, "text = %p\n", text);
655 
656  hres = IHTMLXMLHttpRequest_getAllResponseHeaders(xhr, NULL);
657  ok(hres == E_POINTER, "Expect E_POINTER, got %08x\n", hres);
658 
659  text = (BSTR)0xdeadbeef;
660  hres = IHTMLXMLHttpRequest_getAllResponseHeaders(xhr, &text);
661  ok(hres == E_FAIL, "got %08x\n", hres);
662  ok(text == NULL, "text = %p\n", text);
663 
664  val = 0xdeadbeef;
665  hres = IHTMLXMLHttpRequest_get_status(xhr, &val);
666  ok(hres == E_FAIL, "Expect E_FAIL, got: %08x\n", hres);
667  ok(val == 0, "Expect 0, got %d\n", val);
668 
669  text = (BSTR)0xdeadbeef;
670  hres = IHTMLXMLHttpRequest_get_statusText(xhr, &text);
671  ok(hres == E_FAIL, "Expect E_FAIL, got: %08x\n", hres);
672  ok(text == NULL, "Expect NULL, got %p\n", text);
673 
674  val = 0xdeadbeef;
675  hres = IHTMLXMLHttpRequest_get_readyState(xhr, &val);
676  ok(hres == S_OK, "get_readyState failed: %08x\n", hres);
677  ok(val == 0, "Expect UNSENT, got %d\n", val);
678 
679  method = a2bstr("GET");
680  url = a2bstr(xml_url);
681  V_VT(&vbool) = VT_BOOL;
682  V_BOOL(&vbool) = VARIANT_TRUE;
683  V_VT(&vempty) = VT_EMPTY;
684 
685  SET_EXPECT(xmlhttprequest_onreadystatechange_opened);
686  hres = IHTMLXMLHttpRequest_open(xhr, method, url, vbool, vempty, vempty);
687  ok(hres == S_OK, "open failed: %08x\n", hres);
688  CHECK_CALLED(xmlhttprequest_onreadystatechange_opened);
689 
692 
693  if(FAILED(hres)) {
694  IHTMLXMLHttpRequest_Release(xhr);
695  xhr = NULL;
696  return;
697  }
698 
699  text = (BSTR)0xdeadbeef;
700  hres = IHTMLXMLHttpRequest_getAllResponseHeaders(xhr, &text);
701  ok(hres == E_FAIL, "got %08x\n", hres);
702  ok(text == NULL, "text = %p\n", text);
703 
704  text = (BSTR)0xdeadbeef;
705  hres = IHTMLXMLHttpRequest_getResponseHeader(xhr, content_type, &text);
706  ok(hres == E_FAIL, "got %08x\n", hres);
707  ok(text == NULL, "text = %p\n", text);
708 
709  val = 0xdeadbeef;
710  hres = IHTMLXMLHttpRequest_get_status(xhr, &val);
711  ok(hres == E_FAIL, "Expect E_FAIL, got: %08x\n", hres);
712  ok(val == 0, "Expect 0, got %d\n", val);
713 
714  hres = IHTMLXMLHttpRequest_get_statusText(xhr, &text);
715  ok(hres == E_FAIL, "Expect E_FAIL, got: %08x\n", hres);
716  ok(text == NULL, "Expect NULL, got %p\n", text);
717 
718  val = 0xdeadbeef;
719  hres = IHTMLXMLHttpRequest_get_readyState(xhr, &val);
720  ok(hres == S_OK, "get_readyState failed: %08x\n", hres);
721  ok(val == 1, "Expect OPENED, got %d\n", val);
722 
723  SET_EXPECT(xmlhttprequest_onreadystatechange_opened);
724  SET_EXPECT(xmlhttprequest_onreadystatechange_headers_received);
725  SET_EXPECT(xmlhttprequest_onreadystatechange_loading);
726  SET_EXPECT(xmlhttprequest_onreadystatechange_done);
727  loading_cnt = 0;
728  hres = IHTMLXMLHttpRequest_send(xhr, vempty);
729 
730  ok(hres == S_OK, "send failed: %08x\n", hres);
731  if(SUCCEEDED(hres))
732  pump_msgs(&called_xmlhttprequest_onreadystatechange_done);
733  todo_wine CHECK_CALLED(xmlhttprequest_onreadystatechange_opened);
734  CHECK_CALLED(xmlhttprequest_onreadystatechange_headers_received);
735  CHECK_CALLED(xmlhttprequest_onreadystatechange_loading);
736  CHECK_CALLED(xmlhttprequest_onreadystatechange_done);
737  /* Workaround for loading large files */
738  if(expect_text)
739  ok(loading_cnt == 1, "loading_cnt = %d\n", loading_cnt);
740  else
741  todo_wine ok(loading_cnt == 1, "loading_cnt = %d\n", loading_cnt);
742 
743  if(FAILED(hres)) {
744  IHTMLXMLHttpRequest_Release(xhr);
745  xhr = NULL;
746  return;
747  }
748 
749  text = NULL;
750  hres = IHTMLXMLHttpRequest_getAllResponseHeaders(xhr, &text);
751  ok(hres == S_OK, "getAllResponseHeader failed, got %08x\n", hres);
752  ok(text != NULL, "text == NULL\n");
754 
755  if(expect_text)
756  test_header(expect_headers, sizeof(expect_headers)/sizeof(expect_headers[0]));
757 
758  val = 0xdeadbeef;
759  hres = IHTMLXMLHttpRequest_get_status(xhr, &val);
760  ok(hres == S_OK, "get_status failed: %08x\n", hres);
761  ok(val == 200, "Expect 200, got %d\n", val);
762 
763  text = NULL;
764  hres = IHTMLXMLHttpRequest_get_statusText(xhr, &text);
765  ok(hres == S_OK, "get_statusText failed: %08x\n", hres);
766  ok(text != NULL, "text == NULL\n");
767  ok(!strcmp_wa(text, "OK"), "Expected \"OK\", got %s\n", wine_dbgstr_w(text));
769 
770  val = 0xdeadbeef;
771  hres = IHTMLXMLHttpRequest_get_readyState(xhr, &val);
772  ok(hres == S_OK, "get_readyState failed: %08x\n", hres);
773  ok(val == 4, "Expect DONE, got %d\n", val);
774 
775  text = NULL;
776  hres = IHTMLXMLHttpRequest_get_responseText(xhr, &text);
777  ok(hres == S_OK, "get_responseText failed: %08x\n", hres);
778  ok(text != NULL, "test == NULL\n");
779  if(expect_text)
780  ok(!strcmp_wa(text, expect_text), "expect %s, got %s\n",
781  expect_text, wine_dbgstr_w(text));
783 
784  IHTMLXMLHttpRequest_Release(xhr);
785  xhr = NULL;
786 }
static IHTMLXMLHttpRequest * xhr
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
const WCHAR * text
Definition: package.c:1827
OLECHAR * BSTR
Definition: compat.h:1942
#define CHECK_CALLED(func)
#define E_FAIL
Definition: ddrawi.h:102
static int loading_cnt
#define V_DISPATCH(A)
Definition: oleauto.h:239
long LONG
Definition: pedump.c:60
#define E_INVALIDARG
Definition: ddrawi.h:101
#define SET_EXPECT(func)
smooth NULL
Definition: ftsmooth.c:416
static void create_xmlhttprequest(IHTMLDocument2 *doc)
GLuint GLfloat * val
Definition: glext.h:7180
HRESULT hres
Definition: protocol.c:465
static void pump_msgs(BOOL *b)
LONG HRESULT
Definition: typedefs.h:77
static const WCHAR url[]
Definition: encode.c:1432
static int strcmp_wa(LPCWSTR strw, const char *stra)
#define V_BOOL(A)
Definition: oleauto.h:224
method
Definition: dragdrop.c:53
#define todo_wine
Definition: test.h:163
#define V_VT(A)
Definition: oleauto.h:211
static IDispatchEx xmlhttprequest_onreadystatechange_obj
static BSTR content_type
#define broken(x)
Definition: _sntprintf.h:21
#define S_OK
Definition: intsafe.h:59
#define ok(value,...)
Definition: atltest.h:57
static BSTR a2bstr(const char *str)
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
static void test_header(const struct HEADER_TYPE expect[], int num)
#define E_POINTER
Definition: winerror.h:2365
#define SUCCEEDED(hr)
Definition: intsafe.h:57

Referenced by START_TEST().

◆ test_async_xhr_abort()

static void test_async_xhr_abort ( IHTMLDocument2 *  doc,
const char xml_url 
)
static

Definition at line 788 of file xmlhttprequest.c.

789 {
790  VARIANT vbool, vempty, var;
791  BSTR method, url;
792  LONG val;
793  HRESULT hres;
794 
795  method = a2bstr("GET");
796  url = a2bstr(xml_url);
797  V_VT(&vbool) = VT_BOOL;
798  V_BOOL(&vbool) = VARIANT_TRUE;
799  V_VT(&vempty) = VT_EMPTY;
800 
801  trace("abort before send() is fired\n");
803  if(!xhr)
804  return;
805 
806  V_VT(&var) = VT_DISPATCH;
808  hres = IHTMLXMLHttpRequest_put_onreadystatechange(xhr, var);
809 
810  SET_EXPECT(xmlhttprequest_onreadystatechange_opened);
811  hres = IHTMLXMLHttpRequest_open(xhr, method, url, vbool, vempty, vempty);
812  ok(hres == S_OK, "open failed: %08x\n", hres);
813  CHECK_CALLED(xmlhttprequest_onreadystatechange_opened);
814 
815  hres = IHTMLXMLHttpRequest_abort(xhr);
816  ok(hres == S_OK, "abort failed: %08x\n", hres);
817 
818  hres = IHTMLXMLHttpRequest_get_status(xhr, &val);
819  ok(hres == E_FAIL, "Expect E_FAIL, got: %08x\n", hres);
820  ok(val == 0, "Expect 0, got %d\n", val);
821 
822  hres = IHTMLXMLHttpRequest_get_readyState(xhr, &val);
823  ok(hres == S_OK, "get_readyState failed: %08x\n", hres);
824  ok(val == 0, "Expect UNSENT, got %d\n", val);
825 
826  IHTMLXMLHttpRequest_Release(xhr);
827  xhr = NULL;
828 
829  trace("abort after send() is fired\n");
831  V_VT(&var) = VT_DISPATCH;
833  hres = IHTMLXMLHttpRequest_put_onreadystatechange(xhr, var);
834 
835  SET_EXPECT(xmlhttprequest_onreadystatechange_opened);
836  hres = IHTMLXMLHttpRequest_open(xhr, method, url, vbool, vempty, vempty);
837  ok(hres == S_OK, "open failed: %08x\n", hres);
838  CHECK_CALLED(xmlhttprequest_onreadystatechange_opened);
839 
840  loading_cnt = 0;
842  SET_EXPECT(xmlhttprequest_onreadystatechange_opened);
843  SET_EXPECT(xmlhttprequest_onreadystatechange_done);
844  hres = IHTMLXMLHttpRequest_send(xhr, vempty);
845  ok(hres == S_OK, "send failed: %08x\n", hres);
846  todo_wine CHECK_CALLED(xmlhttprequest_onreadystatechange_opened);
847 
848  hres = IHTMLXMLHttpRequest_abort(xhr);
849  ok(hres == S_OK, "abort failed: %08x\n", hres);
850  CHECK_CALLED(xmlhttprequest_onreadystatechange_done);
851 
852  hres = IHTMLXMLHttpRequest_get_readyState(xhr, &val);
853  ok(hres == S_OK, "get_readyState failed: %08x\n", hres);
854  ok(val == 0, "Expect UNSENT, got %d\n", val);
855 
856  hres = IHTMLXMLHttpRequest_get_status(xhr, &val);
857  ok(hres == E_FAIL, "Expect E_FAIL, got: %08x\n", hres);
858  ok(val == 0, "Expect 0, got %d\n", val);
859 
860  ok(loading_cnt == 0, "loading_cnt = %d, expect 0, loading_cnt\n", loading_cnt);
861  todo_wine ok(readystatechange_cnt == 2, "readystatechange_cnt = %d, expect 2\n", readystatechange_cnt);
862 
863  IHTMLXMLHttpRequest_Release(xhr);
864  xhr = NULL;
865 
868 }
static IHTMLXMLHttpRequest * xhr
static int readystatechange_cnt
OLECHAR * BSTR
Definition: compat.h:1942
#define CHECK_CALLED(func)
#define E_FAIL
Definition: ddrawi.h:102
static int loading_cnt
#define V_DISPATCH(A)
Definition: oleauto.h:239
long LONG
Definition: pedump.c:60
#define SET_EXPECT(func)
smooth NULL
Definition: ftsmooth.c:416
static void create_xmlhttprequest(IHTMLDocument2 *doc)
GLuint GLfloat * val
Definition: glext.h:7180
HRESULT hres
Definition: protocol.c:465
#define trace
Definition: atltest.h:70
LONG HRESULT
Definition: typedefs.h:77
static const WCHAR url[]
Definition: encode.c:1432
#define V_BOOL(A)
Definition: oleauto.h:224
method
Definition: dragdrop.c:53
#define todo_wine
Definition: test.h:163
#define V_VT(A)
Definition: oleauto.h:211
static IDispatchEx xmlhttprequest_onreadystatechange_obj
#define S_OK
Definition: intsafe.h:59
#define ok(value,...)
Definition: atltest.h:57
static BSTR a2bstr(const char *str)
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271

Referenced by START_TEST().

◆ test_header()

static void test_header ( const struct HEADER_TYPE  expect[],
int  num 
)
static

Definition at line 419 of file xmlhttprequest.c.

420 {
421  int i;
422  BSTR key, text, all_header;
423  HRESULT hres;
424  char all[4096], buf[512];
425 
426  all_header = NULL;
427  hres = IHTMLXMLHttpRequest_getAllResponseHeaders(xhr, &all_header);
428  ok(hres == S_OK, "getAllResponseHeader failed: %08x\n", hres);
429  ok(all_header != NULL, "all_header == NULL\n");
430 
431  WideCharToMultiByte(CP_UTF8, 0, all_header, -1, all, sizeof(all), NULL, NULL);
432  SysFreeString(all_header);
433 
434  for(i = 0; i < num; ++i) {
435  text = NULL;
436  key = a2bstr(expect[i].key);
437  hres = IHTMLXMLHttpRequest_getResponseHeader(xhr, key, &text);
438  ok(hres == S_OK, "getResponseHeader failed, got %08x\n", hres);
439  ok(text != NULL, "text == NULL\n");
441  "Expect %s: %s, got %s\n", expect[i].key, expect[i].value, wine_dbgstr_w(text));
444 
445  strcpy(buf, expect[i].key);
446  strcat(buf, ": ");
447  strcat(buf, expect[i].value);
448  ok(strstr(all, buf) != NULL, "AllResponseHeaders(%s) don't have expected substr(%s)\n", all, buf);
449  }
450 }
static IHTMLXMLHttpRequest * xhr
#define WideCharToMultiByte
Definition: compat.h:101
char * strcat(char *DstString, const char *SrcString)
Definition: utclib.c:568
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
char * strstr(char *String1, char *String2)
Definition: utclib.c:653
const WCHAR * text
Definition: package.c:1827
OLECHAR * BSTR
Definition: compat.h:1942
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define CP_UTF8
Definition: nls.h:20
smooth NULL
Definition: ftsmooth.c:416
HRESULT hres
Definition: protocol.c:465
LONG HRESULT
Definition: typedefs.h:77
static int strcmp_wa(LPCWSTR strw, const char *stra)
GLuint GLuint num
Definition: glext.h:9618
HKEY key
Definition: reg.c:42
#define S_OK
Definition: intsafe.h:59
#define ok(value,...)
Definition: atltest.h:57
#define expect(expected, got)
Definition: combo.c:36
static BSTR a2bstr(const char *str)
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
Definition: path.c:42

Referenced by test_async_xhr(), and test_sync_xhr().

◆ test_sync_xhr()

static void test_sync_xhr ( IHTMLDocument2 *  doc,
const char xml_url,
const char expect_text 
)
static

Definition at line 452 of file xmlhttprequest.c.

453 {
454  VARIANT vbool, vempty, var;
455  BSTR method, url;
456  BSTR text;
457  LONG val;
458  HRESULT hres;
459  static const struct HEADER_TYPE expect_headers[] = {
460  {"Server", "Apache"},
461  {"Accept-Ranges", "bytes"},
462  {"Content-Length", "51"},
463  {"Content-Type", "application/xml"}
464  };
465 
467  if(!xhr)
468  return;
469 
470  V_VT(&var) = VT_EMPTY;
471  hres = IHTMLXMLHttpRequest_get_onreadystatechange(xhr, &var);
472  ok(hres == S_OK, "get_onreadystatechange failed: %08x\n", hres);
473  ok(V_VT(&var) == VT_NULL, "V_VT(onreadystatechange) = %d\n", V_VT(&var));
474 
475  V_VT(&var) = VT_DISPATCH;
477  hres = IHTMLXMLHttpRequest_put_onreadystatechange(xhr, var);
478  ok(hres == S_OK, "put_onreadystatechange failed: %08x\n", hres);
479 
480  V_VT(&var) = VT_EMPTY;
481  hres = IHTMLXMLHttpRequest_get_onreadystatechange(xhr, &var);
482  ok(hres == S_OK, "get_onreadystatechange failed: %08x\n", hres);
483  ok(V_VT(&var) == VT_DISPATCH, "V_VT(onreadystatechange) = %d\n", V_VT(&var));
484  ok(V_DISPATCH(&var) == (IDispatch*)&xmlhttprequest_onreadystatechange_obj, "unexpected onreadystatechange value\n");
485 
486  hres = IHTMLXMLHttpRequest_get_readyState(xhr, NULL);
487  ok(hres == E_POINTER, "Expect E_POINTER, got %08x\n", hres);
488 
489  val = 0xdeadbeef;
490  hres = IHTMLXMLHttpRequest_get_readyState(xhr, &val);
491  ok(hres == S_OK, "get_readyState failed: %08x\n", hres);
492  ok(val == 0, "Expect UNSENT, got %d\n", val);
493 
494  hres = IHTMLXMLHttpRequest_get_status(xhr, NULL);
495  ok(hres == E_POINTER, "Expect E_POINTER, got %08x\n", hres);
496 
497  val = 0xdeadbeef;
498  hres = IHTMLXMLHttpRequest_get_status(xhr, &val);
499  ok(hres == E_FAIL, "Expect E_FAIL, got: %08x\n", hres);
500  ok(val == 0, "Expect 0, got %d\n", val);
501 
502  hres = IHTMLXMLHttpRequest_get_statusText(xhr, NULL);
503  ok(hres == E_POINTER, "Expect E_POINTER, got %08x\n", hres);
504 
505  hres = IHTMLXMLHttpRequest_get_statusText(xhr, &text);
506  ok(hres == E_FAIL, "Expect E_FAIL, got: %08x\n", hres);
507  ok(text == NULL, "Expect NULL, got %p\n", text);
508 
509  text = (BSTR)0xdeadbeef;
510  hres = IHTMLXMLHttpRequest_getAllResponseHeaders(xhr, &text);
511  ok(hres == E_FAIL, "got %08x\n", hres);
512  ok(text == NULL, "text = %p\n", text);
513 
514  text = (BSTR)0xdeadbeef;
515  hres = IHTMLXMLHttpRequest_getResponseHeader(xhr, content_type, &text);
516  ok(hres == E_FAIL, "got %08x\n", hres);
517  ok(text == NULL, "text = %p\n", text);
518 
519  method = a2bstr("GET");
520  url = a2bstr(xml_url);
521  V_VT(&vbool) = VT_BOOL;
522  V_BOOL(&vbool) = VARIANT_FALSE;
523  V_VT(&vempty) = VT_EMPTY;
524 
525  SET_EXPECT(xmlhttprequest_onreadystatechange_opened);
526  hres = IHTMLXMLHttpRequest_open(xhr, method, url, vbool, vempty, vempty);
527  todo_wine ok(hres == S_OK, "open failed: %08x\n", hres); /* Gecko 30+ only supports async */
528  todo_wine CHECK_CALLED(xmlhttprequest_onreadystatechange_opened);
529 
532 
533  if(FAILED(hres)) {
534  IHTMLXMLHttpRequest_Release(xhr);
535  xhr = NULL;
536  return;
537  }
538 
539  text = (BSTR)0xdeadbeef;
540  hres = IHTMLXMLHttpRequest_getAllResponseHeaders(xhr, &text);
541  ok(hres == E_FAIL, "got %08x\n", hres);
542  ok(text == NULL, "text = %p\n", text);
543 
544  text = (BSTR)0xdeadbeef;
545  hres = IHTMLXMLHttpRequest_getResponseHeader(xhr, content_type, &text);
546  ok(hres == E_FAIL, "got %08x\n", hres);
547  ok(text == NULL, "text = %p\n", text);
548 
549  val = 0xdeadbeef;
550  hres = IHTMLXMLHttpRequest_get_status(xhr, &val);
551  ok(hres == E_FAIL, "Expect E_FAIL, got: %08x\n", hres);
552  ok(val == 0, "Expect 0, got %d\n", val);
553 
554  hres = IHTMLXMLHttpRequest_get_statusText(xhr, &text);
555  ok(hres == E_FAIL, "Expect E_FAIL, got: %08x\n", hres);
556  ok(text == NULL, "Expect NULL, got %p\n", text);
557 
558  val = 0xdeadbeef;
559  hres = IHTMLXMLHttpRequest_get_readyState(xhr, &val);
560  ok(hres == S_OK, "get_readyState failed: %08x\n", hres);
561  ok(val == 1, "Expect OPENED, got %d\n", val);
562 
563  SET_EXPECT(xmlhttprequest_onreadystatechange_opened);
564  SET_EXPECT(xmlhttprequest_onreadystatechange_headers_received);
565  SET_EXPECT(xmlhttprequest_onreadystatechange_loading);
566  SET_EXPECT(xmlhttprequest_onreadystatechange_done);
567  loading_cnt = 0;
568  hres = IHTMLXMLHttpRequest_send(xhr, vempty);
569  ok(hres == S_OK, "send failed: %08x\n", hres);
570  CHECK_CALLED(xmlhttprequest_onreadystatechange_opened);
571  CHECK_CALLED(xmlhttprequest_onreadystatechange_headers_received);
572  CHECK_CALLED(xmlhttprequest_onreadystatechange_loading);
573  CHECK_CALLED(xmlhttprequest_onreadystatechange_done);
574  ok(loading_cnt == 1, "loading_cnt = %d\n", loading_cnt);
575 
576  text = NULL;
577  hres = IHTMLXMLHttpRequest_getResponseHeader(xhr, content_type, &text);
578  ok(hres == S_OK, "getResponseHeader failed, got %08x\n", hres);
579  ok(text != NULL, "text == NULL\n");
581 
582  if(expect_text)
583  test_header(expect_headers, sizeof(expect_headers)/sizeof(expect_headers[0]));
584 
585  val = 0xdeadbeef;
586  hres = IHTMLXMLHttpRequest_get_status(xhr, &val);
587  ok(hres == S_OK, "get_status failed: %08x\n", hres);
588  ok(val == 200, "Expect 200, got %d\n", val);
589 
590  hres = IHTMLXMLHttpRequest_get_statusText(xhr, &text);
591  ok(hres == S_OK, "get_statusText failed: %08x\n", hres);
592  ok(text != NULL, "text == NULL\n");
593  ok(!strcmp_wa(text, "OK"),
594  "Expected \"OK\", got %s\n", wine_dbgstr_w(text));
596 
597  val = 0xdeadbeef;
598  hres = IHTMLXMLHttpRequest_get_readyState(xhr, &val);
599  ok(hres == S_OK, "get_readyState failed: %08x\n", hres);
600  ok(val == 4, "Expect DONE, got %d\n", val);
601 
602  hres = IHTMLXMLHttpRequest_get_responseText(xhr, &text);
603  ok(hres == S_OK, "get_responseText failed: %08x\n", hres);
604  ok(text != NULL, "test == NULL\n");
605  if(expect_text)
606  ok(!strcmp_wa(text, expect_text), "expect %s, got %s\n",
607  expect_text, wine_dbgstr_w(text));
609 
610  IHTMLXMLHttpRequest_Release(xhr);
611  xhr = NULL;
612 }
static IHTMLXMLHttpRequest * xhr
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
const WCHAR * text
Definition: package.c:1827
OLECHAR * BSTR
Definition: compat.h:1942
#define CHECK_CALLED(func)
#define E_FAIL
Definition: ddrawi.h:102
static int loading_cnt
#define V_DISPATCH(A)
Definition: oleauto.h:239
long LONG
Definition: pedump.c:60
#define SET_EXPECT(func)
smooth NULL
Definition: ftsmooth.c:416
static void create_xmlhttprequest(IHTMLDocument2 *doc)
GLuint GLfloat * val
Definition: glext.h:7180
HRESULT hres
Definition: protocol.c:465
LONG HRESULT
Definition: typedefs.h:77
static const WCHAR url[]
Definition: encode.c:1432
static int strcmp_wa(LPCWSTR strw, const char *stra)
#define V_BOOL(A)
Definition: oleauto.h:224
method
Definition: dragdrop.c:53
#define todo_wine
Definition: test.h:163
#define V_VT(A)
Definition: oleauto.h:211
static IDispatchEx xmlhttprequest_onreadystatechange_obj
static BSTR content_type
#define S_OK
Definition: intsafe.h:59
#define ok(value,...)
Definition: atltest.h:57
static BSTR a2bstr(const char *str)
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
static void test_header(const struct HEADER_TYPE expect[], int num)
#define E_POINTER
Definition: winerror.h:2365

Referenced by START_TEST().

◆ xmlhttprequest_onreadystatechange()

static HRESULT WINAPI xmlhttprequest_onreadystatechange ( IDispatchEx *  iface,
DISPID  id,
LCID  lcid,
WORD  wFlags,
DISPPARAMS *  pdp,
VARIANT pvarRes,
EXCEPINFO *  pei,
IServiceProvider pspCaller 
)
static

Definition at line 228 of file xmlhttprequest.c.

230 {
231  LONG val;
232  HRESULT hres;
233 
234  if (!expect_xmlhttprequest_onreadystatechange_loading)
235  test_event_args(&DIID_DispHTMLXMLHttpRequest, id, wFlags, pdp, pvarRes, pei, pspCaller);
236 
237  hres = IHTMLXMLHttpRequest_get_readyState(xhr, &val);
239  ok(hres == S_OK, "get_readyState failed: %08x\n", hres);
241 
242  switch(val) {
243  case 1:
244  CHECK_EXPECT(xmlhttprequest_onreadystatechange_opened);
245  break;
246  case 2:
247  CHECK_EXPECT(xmlhttprequest_onreadystatechange_headers_received);
248  break;
249  case 3:
250  loading_cnt++;
252  CHECK_EXPECT2(xmlhttprequest_onreadystatechange_loading);
253  break;
254  case 4:
255  CHECK_EXPECT(xmlhttprequest_onreadystatechange_done);
256  break;
257  default:
258  ok(0, "unexpected readyState: %d\n", val);
259  }
260  return S_OK;
261 }
static IHTMLXMLHttpRequest * xhr
static int readystatechange_cnt
static int loading_cnt
long LONG
Definition: pedump.c:60
GLuint GLfloat * val
Definition: glext.h:7180
HRESULT hres
Definition: protocol.c:465
LONG HRESULT
Definition: typedefs.h:77
#define disable_success_count
Definition: test.h:169
_In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon.h:519
#define S_OK
Definition: intsafe.h:59
#define ok(value,...)
Definition: atltest.h:57
#define CHECK_EXPECT(func)
#define test_event_args(a, b, c, d, e, f, g)
#define CHECK_EXPECT2(func)

Variable Documentation

◆ content_type

◆ doc_complete

BOOL doc_complete
static

Definition at line 282 of file xmlhttprequest.c.

Referenced by create_doc_from_url(), and PropertyNotifySink_OnChanged().

◆ loading_cnt

int loading_cnt = 0
static

◆ notif_doc

IHTMLDocument2* notif_doc
static

Definition at line 283 of file xmlhttprequest.c.

Referenced by create_doc_from_url(), and PropertyNotifySink_OnChanged().

◆ PropertyNotifySink

IPropertyNotifySink PropertyNotifySink = { &PropertyNotifySinkVtbl }
static

Definition at line 339 of file xmlhttprequest.c.

Referenced by create_doc_from_url().

◆ PropertyNotifySinkVtbl

IPropertyNotifySinkVtbl PropertyNotifySinkVtbl
static
Initial value:
= {
}
static HRESULT WINAPI PropertyNotifySink_OnRequestEdit(IPropertyNotifySink *iface, DISPID dispID)
static ULONG WINAPI PropertyNotifySink_Release(IPropertyNotifySink *iface)
static ULONG WINAPI PropertyNotifySink_AddRef(IPropertyNotifySink *iface)
static HRESULT WINAPI PropertyNotifySink_QueryInterface(IPropertyNotifySink *iface, REFIID riid, void **ppv)
static HRESULT WINAPI PropertyNotifySink_OnChanged(IPropertyNotifySink *iface, DISPID dispID)

Definition at line 331 of file xmlhttprequest.c.

◆ readystatechange_cnt

int readystatechange_cnt = 0
static

Definition at line 68 of file xmlhttprequest.c.

Referenced by test_async_xhr_abort(), and xmlhttprequest_onreadystatechange().

◆ xhr

◆ xmlhttprequest_onreadystatechange_obj

IDispatchEx xmlhttprequest_onreadystatechange_obj = { &xmlhttprequest_onreadystatechangeFuncVtbl }
static

Definition at line 280 of file xmlhttprequest.c.

Referenced by test_async_xhr(), test_async_xhr_abort(), and test_sync_xhr().

◆ xmlhttprequest_onreadystatechangeFuncVtbl

IDispatchExVtbl xmlhttprequest_onreadystatechangeFuncVtbl
static
Initial value:
= {
}
static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
static HRESULT WINAPI xmlhttprequest_onreadystatechange(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)

Definition at line 263 of file xmlhttprequest.c.