Gabriel Ivăncescu : mshtml: Implement "text" type response for XMLHttpRequest.
Alexandre Julliard
julliard at winehq.org
Thu Jul 28 16:01:12 CDT 2022
Module: wine
Branch: master
Commit: c82900e207cd92fdfa3e75eca193ff3070e154dd
URL: https://gitlab.winehq.org/wine/wine/-/commit/c82900e207cd92fdfa3e75eca193ff3070e154dd
Author: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Date: Thu Jul 28 16:05:35 2022 +0300
mshtml: Implement "text" type response for XMLHttpRequest.
Also basic implementation of arraybuffer/blob with invalid state, mostly
to show how the tests will look.
Signed-off-by: Gabriel Ivăncescu <gabrielopcode at 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)
More information about the wine-cvs
mailing list