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