From c82900e207cd92fdfa3e75eca193ff3070e154dd Mon Sep 17 00:00:00 2001 From: =?utf8?q?Gabriel=20Iv=C4=83ncescu?= Date: Thu, 28 Jul 2022 16:05:35 +0300 Subject: [PATCH] mshtml: Implement "text" type response for XMLHttpRequest. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Also basic implementation of arraybuffer/blob with invalid state, mostly to show how the tests will look. Signed-off-by: Gabriel Ivăncescu --- 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) -- 2.11.4.GIT