Commit 13d25529 authored by Gabriel Ivăncescu's avatar Gabriel Ivăncescu Committed by Alexandre Julliard

mshtml: Track readyState in XHRs and report it manually.

So it can be forced to specific values during synchronous XHRs. Signed-off-by: 's avatarGabriel Ivăncescu <gabrielopcode@gmail.com>
parent 06b1679e
...@@ -137,6 +137,7 @@ struct HTMLXMLHttpRequest { ...@@ -137,6 +137,7 @@ struct HTMLXMLHttpRequest {
IWineXMLHttpRequestPrivate IWineXMLHttpRequestPrivate_iface; IWineXMLHttpRequestPrivate IWineXMLHttpRequestPrivate_iface;
IProvideClassInfo2 IProvideClassInfo2_iface; IProvideClassInfo2 IProvideClassInfo2_iface;
LONG ref; LONG ref;
LONG ready_state;
response_type_t response_type; response_type_t response_type;
nsIXMLHttpRequest *nsxhr; nsIXMLHttpRequest *nsxhr;
XMLHttpReqEventListener *event_listener; XMLHttpReqEventListener *event_listener;
...@@ -220,6 +221,7 @@ static nsrefcnt NSAPI XMLHttpReqEventListener_Release(nsIDOMEventListener *iface ...@@ -220,6 +221,7 @@ static nsrefcnt NSAPI XMLHttpReqEventListener_Release(nsIDOMEventListener *iface
static nsresult NSAPI XMLHttpReqEventListener_HandleEvent(nsIDOMEventListener *iface, nsIDOMEvent *nsevent) static nsresult NSAPI XMLHttpReqEventListener_HandleEvent(nsIDOMEventListener *iface, nsIDOMEvent *nsevent)
{ {
XMLHttpReqEventListener *This = impl_from_nsIDOMEventListener(iface); XMLHttpReqEventListener *This = impl_from_nsIDOMEventListener(iface);
UINT16 ready_state;
DOMEvent *event; DOMEvent *event;
HRESULT hres; HRESULT hres;
...@@ -228,6 +230,9 @@ static nsresult NSAPI XMLHttpReqEventListener_HandleEvent(nsIDOMEventListener *i ...@@ -228,6 +230,9 @@ static nsresult NSAPI XMLHttpReqEventListener_HandleEvent(nsIDOMEventListener *i
if(!This->xhr) if(!This->xhr)
return NS_OK; return NS_OK;
if(NS_SUCCEEDED(nsIXMLHttpRequest_GetReadyState(This->xhr->nsxhr, &ready_state)))
This->xhr->ready_state = ready_state;
hres = create_event_from_nsevent(nsevent, dispex_compat_mode(&This->xhr->event_target.dispex), &event); hres = create_event_from_nsevent(nsevent, dispex_compat_mode(&This->xhr->event_target.dispex), &event);
if(SUCCEEDED(hres) ){ if(SUCCEEDED(hres) ){
dispatch_event(&This->xhr->event_target, event); dispatch_event(&This->xhr->event_target, event);
...@@ -339,19 +344,12 @@ static HRESULT WINAPI HTMLXMLHttpRequest_Invoke(IHTMLXMLHttpRequest *iface, DISP ...@@ -339,19 +344,12 @@ static HRESULT WINAPI HTMLXMLHttpRequest_Invoke(IHTMLXMLHttpRequest *iface, DISP
static HRESULT WINAPI HTMLXMLHttpRequest_get_readyState(IHTMLXMLHttpRequest *iface, LONG *p) static HRESULT WINAPI HTMLXMLHttpRequest_get_readyState(IHTMLXMLHttpRequest *iface, LONG *p)
{ {
HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface);
UINT16 val;
nsresult nsres;
TRACE("(%p)->(%p)\n", This, p); TRACE("(%p)->(%p)\n", This, p);
if(!p) if(!p)
return E_POINTER; return E_POINTER;
nsres = nsIXMLHttpRequest_GetReadyState(This->nsxhr, &val); *p = This->ready_state;
if(NS_FAILED(nsres)) {
ERR("nsIXMLHttpRequest_GetReadyState failed: %08lx\n", nsres);
return E_FAIL;
}
*p = val;
return S_OK; return S_OK;
} }
...@@ -373,6 +371,11 @@ static HRESULT WINAPI HTMLXMLHttpRequest_get_responseText(IHTMLXMLHttpRequest *i ...@@ -373,6 +371,11 @@ static HRESULT WINAPI HTMLXMLHttpRequest_get_responseText(IHTMLXMLHttpRequest *i
if(!p) if(!p)
return E_POINTER; return E_POINTER;
if(This->ready_state < READYSTATE_INTERACTIVE) {
*p = NULL;
return S_OK;
}
nsAString_Init(&nsstr, NULL); nsAString_Init(&nsstr, NULL);
nsres = nsIXMLHttpRequest_GetResponseText(This->nsxhr, &nsstr); nsres = nsIXMLHttpRequest_GetResponseText(This->nsxhr, &nsstr);
return return_nsstr(nsres, &nsstr, p); return return_nsstr(nsres, &nsstr, p);
...@@ -389,6 +392,11 @@ static HRESULT WINAPI HTMLXMLHttpRequest_get_responseXML(IHTMLXMLHttpRequest *if ...@@ -389,6 +392,11 @@ static HRESULT WINAPI HTMLXMLHttpRequest_get_responseXML(IHTMLXMLHttpRequest *if
TRACE("(%p)->(%p)\n", This, p); TRACE("(%p)->(%p)\n", This, p);
if(This->ready_state < READYSTATE_COMPLETE) {
*p = NULL;
return S_OK;
}
if(dispex_compat_mode(&This->event_target.dispex) >= COMPAT_MODE_IE10) { if(dispex_compat_mode(&This->event_target.dispex) >= COMPAT_MODE_IE10) {
nsIDOMDocument *nsdoc; nsIDOMDocument *nsdoc;
nsresult nsres; nsresult nsres;
...@@ -443,6 +451,11 @@ static HRESULT WINAPI HTMLXMLHttpRequest_get_status(IHTMLXMLHttpRequest *iface, ...@@ -443,6 +451,11 @@ static HRESULT WINAPI HTMLXMLHttpRequest_get_status(IHTMLXMLHttpRequest *iface,
if(!p) if(!p)
return E_POINTER; return E_POINTER;
if(This->ready_state < READYSTATE_LOADED) {
*p = 0;
return E_FAIL;
}
nsres = nsIXMLHttpRequest_GetStatus(This->nsxhr, &val); nsres = nsIXMLHttpRequest_GetStatus(This->nsxhr, &val);
if(NS_FAILED(nsres)) { if(NS_FAILED(nsres)) {
ERR("nsIXMLHttpRequest_GetStatus failed: %08lx\n", nsres); ERR("nsIXMLHttpRequest_GetStatus failed: %08lx\n", nsres);
...@@ -460,19 +473,13 @@ static HRESULT WINAPI HTMLXMLHttpRequest_get_statusText(IHTMLXMLHttpRequest *ifa ...@@ -460,19 +473,13 @@ static HRESULT WINAPI HTMLXMLHttpRequest_get_statusText(IHTMLXMLHttpRequest *ifa
HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface);
nsACString nscstr; nsACString nscstr;
nsresult nsres; nsresult nsres;
HRESULT hres;
LONG state;
TRACE("(%p)->(%p)\n", This, p); TRACE("(%p)->(%p)\n", This, p);
if(!p) if(!p)
return E_POINTER; return E_POINTER;
hres = IHTMLXMLHttpRequest_get_readyState(iface, &state); if(This->ready_state < READYSTATE_LOADED) {
if(FAILED(hres))
return hres;
if(state < 2) {
*p = NULL; *p = NULL;
return E_FAIL; return E_FAIL;
} }
...@@ -503,6 +510,7 @@ static HRESULT WINAPI HTMLXMLHttpRequest_get_onreadystatechange(IHTMLXMLHttpRequ ...@@ -503,6 +510,7 @@ static HRESULT WINAPI HTMLXMLHttpRequest_get_onreadystatechange(IHTMLXMLHttpRequ
static HRESULT WINAPI HTMLXMLHttpRequest_abort(IHTMLXMLHttpRequest *iface) static HRESULT WINAPI HTMLXMLHttpRequest_abort(IHTMLXMLHttpRequest *iface)
{ {
HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface);
UINT16 ready_state;
nsresult nsres; nsresult nsres;
TRACE("(%p)->()\n", This); TRACE("(%p)->()\n", This);
...@@ -513,6 +521,10 @@ static HRESULT WINAPI HTMLXMLHttpRequest_abort(IHTMLXMLHttpRequest *iface) ...@@ -513,6 +521,10 @@ static HRESULT WINAPI HTMLXMLHttpRequest_abort(IHTMLXMLHttpRequest *iface)
return E_FAIL; return E_FAIL;
} }
/* Gecko changed to READYSTATE_UNINITIALIZED if it did abort */
nsres = nsIXMLHttpRequest_GetReadyState(This->nsxhr, &ready_state);
if(NS_SUCCEEDED(nsres))
This->ready_state = ready_state;
return S_OK; return S_OK;
} }
...@@ -656,19 +668,13 @@ static HRESULT WINAPI HTMLXMLHttpRequest_getAllResponseHeaders(IHTMLXMLHttpReque ...@@ -656,19 +668,13 @@ static HRESULT WINAPI HTMLXMLHttpRequest_getAllResponseHeaders(IHTMLXMLHttpReque
HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface);
nsACString nscstr; nsACString nscstr;
nsresult nsres; nsresult nsres;
HRESULT hres;
LONG state;
TRACE("(%p)->(%p)\n", This, p); TRACE("(%p)->(%p)\n", This, p);
if(!p) if(!p)
return E_POINTER; return E_POINTER;
hres = IHTMLXMLHttpRequest_get_readyState(iface, &state); if(This->ready_state < READYSTATE_LOADED) {
if(FAILED(hres))
return hres;
if(state < 2) {
*p = NULL; *p = NULL;
return E_FAIL; return E_FAIL;
} }
...@@ -684,8 +690,6 @@ static HRESULT WINAPI HTMLXMLHttpRequest_getResponseHeader(IHTMLXMLHttpRequest * ...@@ -684,8 +690,6 @@ static HRESULT WINAPI HTMLXMLHttpRequest_getResponseHeader(IHTMLXMLHttpRequest *
nsACString header, ret; nsACString header, ret;
char *cstr; char *cstr;
nsresult nsres; nsresult nsres;
HRESULT hres;
LONG state;
TRACE("(%p)->(%s %p)\n", This, debugstr_w(bstrHeader), p); TRACE("(%p)->(%s %p)\n", This, debugstr_w(bstrHeader), p);
if(!p) if(!p)
...@@ -693,11 +697,7 @@ static HRESULT WINAPI HTMLXMLHttpRequest_getResponseHeader(IHTMLXMLHttpRequest * ...@@ -693,11 +697,7 @@ static HRESULT WINAPI HTMLXMLHttpRequest_getResponseHeader(IHTMLXMLHttpRequest *
if(!bstrHeader) if(!bstrHeader)
return E_INVALIDARG; return E_INVALIDARG;
hres = IHTMLXMLHttpRequest_get_readyState(iface, &state); if(This->ready_state < READYSTATE_LOADED) {
if(FAILED(hres))
return hres;
if(state < 2) {
*p = NULL; *p = NULL;
return E_FAIL; return E_FAIL;
} }
...@@ -938,8 +938,6 @@ static HRESULT WINAPI HTMLXMLHttpRequest_private_get_response(IWineXMLHttpReques ...@@ -938,8 +938,6 @@ static HRESULT WINAPI HTMLXMLHttpRequest_private_get_response(IWineXMLHttpReques
{ {
HTMLXMLHttpRequest *This = impl_from_IWineXMLHttpRequestPrivate(iface); HTMLXMLHttpRequest *This = impl_from_IWineXMLHttpRequestPrivate(iface);
HRESULT hres = S_OK; HRESULT hres = S_OK;
nsresult nsres;
UINT16 state;
TRACE("(%p)->(%p)\n", This, p); TRACE("(%p)->(%p)\n", This, p);
...@@ -957,8 +955,7 @@ static HRESULT WINAPI HTMLXMLHttpRequest_private_get_response(IWineXMLHttpReques ...@@ -957,8 +955,7 @@ static HRESULT WINAPI HTMLXMLHttpRequest_private_get_response(IWineXMLHttpReques
case response_type_arraybuf: case response_type_arraybuf:
case response_type_blob: case response_type_blob:
nsres = nsIXMLHttpRequest_GetReadyState(This->nsxhr, &state); if(This->ready_state < READYSTATE_COMPLETE) {
if(NS_FAILED(nsres) || state < 4) {
V_VT(p) = VT_EMPTY; V_VT(p) = VT_EMPTY;
break; break;
} }
...@@ -985,17 +982,11 @@ static HRESULT WINAPI HTMLXMLHttpRequest_private_put_responseType(IWineXMLHttpRe ...@@ -985,17 +982,11 @@ static HRESULT WINAPI HTMLXMLHttpRequest_private_put_responseType(IWineXMLHttpRe
HTMLXMLHttpRequest *This = impl_from_IWineXMLHttpRequestPrivate(iface); HTMLXMLHttpRequest *This = impl_from_IWineXMLHttpRequestPrivate(iface);
nsAString nsstr; nsAString nsstr;
nsresult nsres; nsresult nsres;
HRESULT hres;
unsigned i; unsigned i;
LONG state;
TRACE("(%p)->(%s)\n", This, debugstr_w(v)); TRACE("(%p)->(%s)\n", This, debugstr_w(v));
hres = IHTMLXMLHttpRequest_get_readyState(&This->IHTMLXMLHttpRequest_iface, &state); if(This->ready_state < READYSTATE_LOADING || This->ready_state > READYSTATE_INTERACTIVE) {
if(FAILED(hres))
return hres;
if(state < 1 || state > 2) {
/* FIXME: Return InvalidStateError */ /* FIXME: Return InvalidStateError */
return E_FAIL; return E_FAIL;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment