From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmldoc.c | 12 +++++++++++- dlls/mshtml/tests/xhr.js | 11 +++++++++-- dlls/mshtml/xmlhttprequest.c | 35 +++++++++++++++++++++++++++++++++-- 3 files changed, 53 insertions(+), 5 deletions(-)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index b99686dd3a5..0e94c186c3e 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -39,6 +39,13 @@
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
+static const WCHAR *const content_type_from_document_type[] = { + [DOCTYPE_HTML] = L"text/html", + [DOCTYPE_XHTML] = L"application/xhtml+xml", + [DOCTYPE_XML] = L"text/xml", + [DOCTYPE_SVG] = L"image/svg+xml", +}; + static dispex_static_data_t *const dispex_from_document_type[] = { [DOCTYPE_HTML] = &HTMLDocument_dispex, [DOCTYPE_XHTML] = &XMLDocument_dispex, @@ -1281,7 +1288,10 @@ static HRESULT WINAPI HTMLDocument_get_mimeType(IHTMLDocument2 *iface, BSTR *p)
*p = NULL;
- if(This->window && !This->window->navigation_start_time) + if(!This->window) + return get_mime_type_display_name(content_type_from_document_type[This->doc_type], p); + + if(!This->window->navigation_start_time) return (*p = SysAllocString(L"")) ? S_OK : E_FAIL;
nsAString_InitDepend(&nsstr, NULL); diff --git a/dlls/mshtml/tests/xhr.js b/dlls/mshtml/tests/xhr.js index 46aed46624c..7c553dc25ea 100644 --- a/dlls/mshtml/tests/xhr.js +++ b/dlls/mshtml/tests/xhr.js @@ -259,9 +259,16 @@ async_test("content_types", function() {
function onload() { ok(xhr.responseText === xml, "unexpected responseText " + xhr.responseText); - if(v < 10 || types === xml_types) + if(v < 10 || types === xml_types) { ok(xhr.responseXML !== null, "unexpected null responseXML for " + types[i]); - else + if(v >= 10) { + var r = xhr.responseXML.mimeType, e = "text/xml"; + if(types[i] === "application/xHtml+xml" || types[i] === "image/SvG+xml") + e = types[i].toLowerCase(); + e = external.getExpectedMimeType(e); + ok(r === e, "XML document mimeType for " + types[i] + " = " + r + ", expected " + e); + } + }else ok(xhr.responseXML === null, "unexpected non-null responseXML for " + (override ? "overridden " : "") + types[i]);
if(("overrideMimeType" in xhr) && !override) { diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c index 23e5db46070..3b396714b7a 100644 --- a/dlls/mshtml/xmlhttprequest.c +++ b/dlls/mshtml/xmlhttprequest.c @@ -138,6 +138,7 @@ struct HTMLXMLHttpRequest { IProvideClassInfo2 IProvideClassInfo2_iface; LONG task_magic; LONG ready_state; + document_type_t doctype_override; response_type_t response_type; BOOLEAN synchronous; DWORD magic; @@ -576,8 +577,11 @@ static HRESULT WINAPI HTMLXMLHttpRequest_get_responseXML(IHTMLXMLHttpRequest *if }
if(dispex_compat_mode(&This->event_target.dispex) >= COMPAT_MODE_IE10) { + nsACString header, nscstr; + document_type_t doctype; HTMLDocumentNode *doc; nsIDOMDocument *nsdoc; + const char *type; nsresult nsres;
nsres = nsIXMLHttpRequest_GetResponseXML(This->nsxhr, &nsdoc); @@ -590,9 +594,27 @@ static HRESULT WINAPI HTMLXMLHttpRequest_get_responseXML(IHTMLXMLHttpRequest *if
if(!This->window->base.outer_window || !This->window->base.outer_window->browser) hres = E_UNEXPECTED; - else + else { + if(This->doctype_override != DOCTYPE_INVALID) + doctype = This->doctype_override; + else { + doctype = DOCTYPE_XML; + nsACString_InitDepend(&header, "Content-Type"); + nsACString_InitDepend(&nscstr, NULL); + nsres = nsIXMLHttpRequest_GetResponseHeader(This->nsxhr, &header, &nscstr); + nsACString_Finish(&header); + if(NS_SUCCEEDED(nsres)) { + nsACString_GetData(&nscstr, &type); + if(!stricmp(type, "application/xhtml+xml")) + doctype = DOCTYPE_XHTML; + else if(!stricmp(type, "image/svg+xml")) + doctype = DOCTYPE_SVG; + } + nsACString_Finish(&nscstr); + } hres = create_document_node(nsdoc, This->window->base.outer_window->browser, NULL, This->window, - DOCTYPE_XML, dispex_compat_mode(&This->window->event_target.dispex), &doc); + doctype, dispex_compat_mode(&This->window->event_target.dispex), &doc); + } nsIDOMDocument_Release(nsdoc); if(FAILED(hres)) return hres; @@ -1167,6 +1189,7 @@ static HRESULT WINAPI HTMLXMLHttpRequest_private_overrideMimeType(IWineXMLHttpRe { HTMLXMLHttpRequest *This = impl_from_IWineXMLHttpRequestPrivate(iface); static const WCHAR generic_type[] = L"application/octet-stream"; + document_type_t doctype = DOCTYPE_XML; const WCHAR *type = NULL; WCHAR *lowercase = NULL; nsAString nsstr; @@ -1180,6 +1203,11 @@ static HRESULT WINAPI HTMLXMLHttpRequest_private_overrideMimeType(IWineXMLHttpRe return E_OUTOFMEMORY; _wcslwr(lowercase); type = lowercase; + + if(!wcscmp(type, L"application/xhtml+xml")) + doctype = DOCTYPE_XHTML; + else if(!wcscmp(type, L"image/svg+xml")) + doctype = DOCTYPE_SVG; }else type = generic_type; } @@ -1188,6 +1216,8 @@ static HRESULT WINAPI HTMLXMLHttpRequest_private_overrideMimeType(IWineXMLHttpRe nsres = nsIXMLHttpRequest_SlowOverrideMimeType(This->nsxhr, &nsstr); nsAString_Finish(&nsstr); free(lowercase); + if(NS_SUCCEEDED(nsres)) + This->doctype_override = doctype; return map_nsresult(nsres); }
@@ -1536,6 +1566,7 @@ static HRESULT WINAPI HTMLXMLHttpRequestFactory_create(IHTMLXMLHttpRequestFactor
ret->nsxhr = nsxhr; ret->window = This->window; + ret->doctype_override = DOCTYPE_INVALID; ret->task_magic = get_task_target_magic(); IHTMLWindow2_AddRef(&This->window->base.IHTMLWindow2_iface);