From: Gabriel Ivăncescu gabrielopcode@gmail.com
Also basic implementation of arraybuffer/blob with invalid state, mostly to show how the tests will look.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/tests/xhr.js | 47 +++++++++++++++++++++++++++++++++++- dlls/mshtml/xmlhttprequest.c | 41 +++++++++++++++++++++++++++++-- 2 files changed, 85 insertions(+), 3 deletions(-)
diff --git a/dlls/mshtml/tests/xhr.js b/dlls/mshtml/tests/xhr.js index 68f3a68caee..d60a449678b 100644 --- a/dlls/mshtml/tests/xhr.js +++ b/dlls/mshtml/tests/xhr.js @@ -245,10 +245,55 @@ function test_responseType() { xhr.send("responseType test"); }
+function test_response() { + var xhr = new XMLHttpRequest(), i = 0; + if(!("response" in xhr)) { next_test(); return; } + + var types = [ + [ "text", "application/octet-stream", function() { + if(xhr.readyState < 3) + ok(xhr.response === "", "response for text with state " + state + " = " + xhr.response); + else if(xhr.readyState === 4) + ok(xhr.response === xml, "response for text = " + xhr.response); + }], + [ "arraybuffer", "image/png", function() { + if(xhr.readyState < 4) + ok(xhr.response === undefined, "response for arraybuffer with state " + state + " = " + xhr.response); + }], + [ "blob", "wine/test", function() { + if(xhr.readyState < 4) + ok(xhr.response === undefined, "response for blob with state " + state + " = " + xhr.response); + }] + ]; + + function onreadystatechange() { + types[i][2](); + if(xhr.readyState < 4) + return; + if(++i >= types.length) { + next_test(); + return; + } + xhr = new XMLHttpRequest(); + xhr.open("POST", "echo.php?content-type=" + types[i][1], true); + xhr.onreadystatechange = onreadystatechange; + xhr.setRequestHeader("X-Test", "True"); + xhr.responseType = types[i][0]; + xhr.send(xml); + } + + xhr.open("POST", "echo.php?content-type=" + types[i][1], true); + xhr.onreadystatechange = onreadystatechange; + xhr.setRequestHeader("X-Test", "True"); + xhr.responseType = types[i][0]; + xhr.send(xml); +} + var tests = [ test_xhr, test_content_types, test_abort, test_timeout, - test_responseType + test_responseType, + test_response ]; diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c index 6f639d3b821..e01c9791f6f 100644 --- a/dlls/mshtml/xmlhttprequest.c +++ b/dlls/mshtml/xmlhttprequest.c @@ -938,10 +938,47 @@ static HRESULT WINAPI HTMLXMLHttpRequest_private_Invoke(IWineXMLHttpRequestPriva static HRESULT WINAPI HTMLXMLHttpRequest_private_get_response(IWineXMLHttpRequestPrivate *iface, VARIANT *p) { HTMLXMLHttpRequest *This = impl_from_IWineXMLHttpRequestPrivate(iface); + HRESULT hres = S_OK; + nsresult nsres; + UINT16 state;
- FIXME("(%p)->(%p)\n", This, p); + TRACE("(%p)->(%p)\n", This, p);
- return E_NOTIMPL; + switch(This->response_type) { + case response_type_empty: + case response_type_text: + hres = IHTMLXMLHttpRequest_get_responseText(&This->IHTMLXMLHttpRequest_iface, &V_BSTR(p)); + if(SUCCEEDED(hres)) + V_VT(p) = VT_BSTR; + break; + + case response_type_doc: + FIXME("response_type_doc\n"); + return E_NOTIMPL; + + case response_type_arraybuf: + case response_type_blob: + nsres = nsIXMLHttpRequest_GetReadyState(This->nsxhr, &state); + if(NS_FAILED(nsres) || state < 4) { + V_VT(p) = VT_EMPTY; + break; + } + if(This->response_type == response_type_arraybuf) { + FIXME("response_type_arraybuf\n"); + return E_NOTIMPL; + } + FIXME("response_type_blob\n"); + return E_NOTIMPL; + + case response_type_stream: + FIXME("response_type_stream\n"); + return E_NOTIMPL; + + default: + assert(0); + } + + return hres; }
static HRESULT WINAPI HTMLXMLHttpRequest_private_put_responseType(IWineXMLHttpRequestPrivate *iface, BSTR v)