[PATCH 8/8] mshtml: Implement overrideMimeType for XMLHttpRequest.

Gabriel Ivăncescu gabrielopcode at gmail.com
Mon Jun 6 07:24:16 CDT 2022


Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
 dlls/mshtml/tests/xhr.js     | 14 +++++++++++-
 dlls/mshtml/xmlhttprequest.c | 43 ++++++++++++++++++++++++++++--------
 2 files changed, 47 insertions(+), 10 deletions(-)

diff --git a/dlls/mshtml/tests/xhr.js b/dlls/mshtml/tests/xhr.js
index 303c4ad..3ae86e6 100644
--- a/dlls/mshtml/tests/xhr.js
+++ b/dlls/mshtml/tests/xhr.js
@@ -71,7 +71,7 @@ function test_xhr() {
 }
 
 function test_content_types() {
-    var xhr = new XMLHttpRequest(), types, i = 0;
+    var xhr = new XMLHttpRequest(), types, i = 0, override = false;
     var v = document.documentMode;
 
     var types = [
@@ -97,6 +97,18 @@ function test_content_types() {
         else
             ok(xhr.responseXML === null, "unexpected non-null responseXML for " + types[i]);
 
+        if(("overrideMimeType" in xhr) && !override) {
+            override = true;
+            xhr = new XMLHttpRequest();
+            xhr.onload = onload;
+            xhr.open("POST", "echo.php", true);
+            xhr.setRequestHeader("X-Test", "True");
+            xhr.overrideMimeType(types[i]);
+            xhr.send(xml);
+            return;
+        }
+        override = false;
+
         if(++i >= types.length) {
             if(types === xml_types) {
                 next_test();
diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c
index 0fadc10..ee1549a 100644
--- a/dlls/mshtml/xmlhttprequest.c
+++ b/dlls/mshtml/xmlhttprequest.c
@@ -121,6 +121,7 @@ struct HTMLXMLHttpRequest {
     LONG ref;
     nsIXMLHttpRequest *nsxhr;
     XMLHttpReqEventListener *event_listener;
+    char *type_override;
 };
 
 static void detach_xhr_event_listener(XMLHttpReqEventListener *event_listener)
@@ -283,6 +284,7 @@ static ULONG WINAPI HTMLXMLHttpRequest_Release(IHTMLXMLHttpRequest *iface)
         release_event_target(&This->event_target);
         release_dispex(&This->event_target.dispex);
         nsIXMLHttpRequest_Release(This->nsxhr);
+        heap_free(This->type_override);
         heap_free(This);
     }
 
@@ -380,16 +382,20 @@ static HRESULT WINAPI HTMLXMLHttpRequest_get_responseXML(IHTMLXMLHttpRequest *if
         const char *type;
         nsresult nsres;
 
-        nsACString_InitDepend(&header, "Content-Type");
         nsACString_InitDepend(&nscstr, NULL);
-        nsres = nsIXMLHttpRequest_GetResponseHeader(This->nsxhr, &header, &nscstr);
-        nsACString_Finish(&header);
-        if(NS_FAILED(nsres))
-            type = NULL;
+        if(This->type_override)
+            type = This->type_override;
         else {
-            nsACString_GetData(&nscstr, &type);
-            if(!type[0])
+            nsACString_InitDepend(&header, "Content-Type");
+            nsres = nsIXMLHttpRequest_GetResponseHeader(This->nsxhr, &header, &nscstr);
+            nsACString_Finish(&header);
+            if(NS_FAILED(nsres))
                 type = NULL;
+            else {
+                nsACString_GetData(&nscstr, &type);
+                if(!type[0])
+                    type = NULL;
+            }
         }
         if(type && stricmp(type, "text/xml") && stricmp(type, "application/xml")) {
             size_t len = strlen(type);
@@ -993,10 +999,29 @@ static HRESULT WINAPI HTMLXMLHttpRequest_private_get_withCredentials(IWineXMLHtt
 static HRESULT WINAPI HTMLXMLHttpRequest_private_overrideMimeType(IWineXMLHttpRequestPrivate *iface, BSTR mimeType)
 {
     HTMLXMLHttpRequest *This = impl_from_IWineXMLHttpRequestPrivate(iface);
+    WCHAR *lowercase = NULL;
+    char *type = NULL;
+    nsAString nsstr;
 
-    FIXME("(%p)->(%s)\n", This, debugstr_w(mimeType));
+    TRACE("(%p)->(%s)\n", This, debugstr_w(mimeType));
 
-    return E_NOTIMPL;
+    if(mimeType) {
+        if(!(lowercase = heap_strdupW(mimeType)))
+            return E_OUTOFMEMORY;
+        _wcslwr(lowercase);
+        if(!(type = heap_strdupWtoA(lowercase))) {
+            heap_free(lowercase);
+            return E_OUTOFMEMORY;
+        }
+    }
+    heap_free(This->type_override);
+    This->type_override = type;
+
+    nsAString_InitDepend(&nsstr, lowercase);
+    nsIXMLHttpRequest_SlowOverrideMimeType(This->nsxhr, &nsstr);
+    nsAString_Finish(&nsstr);
+    heap_free(lowercase);
+    return S_OK;
 }
 
 static HRESULT WINAPI HTMLXMLHttpRequest_private_put_onerror(IWineXMLHttpRequestPrivate *iface, VARIANT v)
-- 
2.34.1




More information about the wine-devel mailing list