Gabriel Ivăncescu : mshtml: Check for valid XML Content-Type for responseXML in IE10+ modes.

Alexandre Julliard julliard at winehq.org
Wed Jul 13 16:56:08 CDT 2022


Module: wine
Branch: master
Commit: 764c1bdb76b66b0ab6052d298f07ef029767edc0
URL:    https://gitlab.winehq.org/wine/wine/-/commit/764c1bdb76b66b0ab6052d298f07ef029767edc0

Author: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Date:   Wed Jul 13 20:07:32 2022 +0300

mshtml: Check for valid XML Content-Type for responseXML in IE10+ modes.

Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>

---

 dlls/mshtml/tests/xhr.js     | 57 ++++++++++++++++++++++++++++++++++++++++++--
 dlls/mshtml/xmlhttprequest.c | 14 +++++++++++
 2 files changed, 69 insertions(+), 2 deletions(-)

diff --git a/dlls/mshtml/tests/xhr.js b/dlls/mshtml/tests/xhr.js
index c450384e931..303c4add7b4 100644
--- a/dlls/mshtml/tests/xhr.js
+++ b/dlls/mshtml/tests/xhr.js
@@ -16,6 +16,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
+var xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<a name=\"test\">wine</a>";
+
 function test_xhr() {
     var xhr = new XMLHttpRequest();
     var complete_cnt = 0, loadstart = false;
@@ -24,7 +26,9 @@ function test_xhr() {
         if(xhr.readyState != 4)
             return;
 
-        ok(xhr.responseText === "Testing...", "unexpected responseText " + xhr.responseText);
+        ok(xhr.responseText === xml, "unexpected responseText " + xhr.responseText);
+        ok(xhr.responseXML !== null, "unexpected null responseXML");
+
         if(complete_cnt++ && !("onloadend" in xhr))
             next_test();
     }
@@ -63,7 +67,55 @@ function test_xhr() {
         ok(xhr.withCredentials === true, "withCredentials = " + xhr.withCredentials);
         xhr.withCredentials = false;
     }
-    xhr.send("Testing...");
+    xhr.send(xml);
+}
+
+function test_content_types() {
+    var xhr = new XMLHttpRequest(), types, i = 0;
+    var v = document.documentMode;
+
+    var types = [
+        "",
+        "text/plain",
+        "text/html",
+        "wine/xml",
+        "xml"
+    ];
+    var xml_types = [
+        "text/xmL",
+        "apPliCation/xml",
+        "image/SvG+xml",
+        "Wine/Test+xml",
+        "++Xml",
+        "+xMl"
+    ];
+
+    function onload() {
+        ok(xhr.responseText === xml, "unexpected responseText " + xhr.responseText);
+        if(v < 10 || types === xml_types)
+            ok(xhr.responseXML !== null, "unexpected null responseXML for " + types[i]);
+        else
+            ok(xhr.responseXML === null, "unexpected non-null responseXML for " + types[i]);
+
+        if(++i >= types.length) {
+            if(types === xml_types) {
+                next_test();
+                return;
+            }
+            types = xml_types;
+            i = 0;
+        }
+        xhr = new XMLHttpRequest();
+        xhr.onload = onload;
+        xhr.open("POST", "echo.php?content-type=" + types[i], true);
+        xhr.setRequestHeader("X-Test", "True");
+        xhr.send(xml);
+    }
+
+    xhr.onload = onload;
+    xhr.open("POST", "echo.php?content-type=" + types[i], true);
+    xhr.setRequestHeader("X-Test", "True");
+    xhr.send(xml);
 }
 
 function test_abort() {
@@ -118,6 +170,7 @@ function test_timeout() {
 
 var tests = [
     test_xhr,
+    test_content_types,
     test_abort,
     test_timeout
 ];
diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c
index 8fa91e9960b..c165218bdef 100644
--- a/dlls/mshtml/xmlhttprequest.c
+++ b/dlls/mshtml/xmlhttprequest.c
@@ -374,6 +374,20 @@ static HRESULT WINAPI HTMLXMLHttpRequest_get_responseXML(IHTMLXMLHttpRequest *if
 
     TRACE("(%p)->(%p)\n", This, p);
 
+    if(dispex_compat_mode(&This->event_target.dispex) >= COMPAT_MODE_IE10) {
+        nsIDOMDocument *nsdoc;
+        nsresult nsres;
+
+        nsres = nsIXMLHttpRequest_GetResponseXML(This->nsxhr, &nsdoc);
+        if(NS_FAILED(nsres))
+            return map_nsresult(nsres);
+        if(!nsdoc) {
+            *p = NULL;
+            return S_OK;
+        }
+        nsIDOMDocument_Release(nsdoc);
+    }
+
     hres = CoCreateInstance(&CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void**)&xmldoc);
     if(FAILED(hres)) {
         ERR("CoCreateInstance failed: %08lx\n", hres);




More information about the wine-cvs mailing list