From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmldoc.c | 47 ++++++++++++++++++++++++------------ dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/tests/xhr.js | 11 +++++++-- 3 files changed, 41 insertions(+), 18 deletions(-)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index cbb668ad81f..821edb40a26 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -1265,10 +1265,10 @@ static HRESULT WINAPI HTMLDocument_get_defaultCharset(IHTMLDocument2 *iface, BST static HRESULT WINAPI HTMLDocument_get_mimeType(IHTMLDocument2 *iface, BSTR *p) { HTMLDocumentNode *This = impl_from_IHTMLDocument2(iface); - const PRUnichar *content_type; + const WCHAR *content_type; + const PRUnichar *str; nsAString nsstr; nsresult nsres; - HRESULT hres;
TRACE("(%p)->(%p)\n", This, p);
@@ -1277,15 +1277,21 @@ static HRESULT WINAPI HTMLDocument_get_mimeType(IHTMLDocument2 *iface, BSTR *p) if(This->window && !This->window->navigation_start_time) return (*p = SysAllocString(L"")) ? S_OK : E_FAIL;
- nsAString_InitDepend(&nsstr, NULL); - nsres = nsIDOMDocument_GetContentType(This->dom_document, &nsstr); - if(NS_FAILED(nsres)) - return map_nsresult(nsres); + if(This->is_xhtml) + content_type = L"application/xhtml+xml"; + else if(This->html_document) + content_type = L"text/html"; + else { + nsAString_Init(&nsstr, NULL); + nsres = nsIDOMDocument_GetContentType(This->dom_document, &nsstr); + if(NS_FAILED(nsres)) + return map_nsresult(nsres);
- nsAString_GetData(&nsstr, &content_type); - hres = get_mime_type_display_name(content_type, p); - nsAString_Finish(&nsstr); - return hres; + nsAString_GetData(&nsstr, &str); + content_type = !wcscmp(str, L"image/svg+xml") ? L"image/svg+xml" : L"text/xml"; + nsAString_Finish(&nsstr); + } + return get_mime_type_display_name(content_type, p); }
static HRESULT WINAPI HTMLDocument_get_fileSize(IHTMLDocument2 *iface, BSTR *p) @@ -5935,11 +5941,23 @@ HRESULT create_document_node(nsIDOMDocument *nsdoc, GeckoBrowser *browser, HTMLI dispex_static_data_t *dispex = &XMLDocument_dispex; HTMLDocumentObj *doc_obj = browser->doc; HTMLDocumentNode *doc; + const PRUnichar *str; + nsAString nsstr; + nsresult nsres;
doc = alloc_doc_node(doc_obj, window, script_global); if(!doc) return E_OUTOFMEMORY;
+ nsAString_Init(&nsstr, NULL); + nsres = nsIDOMDocument_GetContentType(nsdoc, &nsstr); + if(NS_FAILED(nsres)) + return map_nsresult(nsres); + nsAString_GetData(&nsstr, &str); + if(!wcscmp(str, L"application/xhtml+xml")) + doc->is_xhtml = TRUE; + nsAString_Finish(&nsstr); + if(parent_mode >= COMPAT_MODE_IE9) { TRACE("using parent mode %u\n", parent_mode); doc->document_mode = parent_mode; @@ -5970,12 +5988,9 @@ HRESULT create_document_node(nsIDOMDocument *nsdoc, GeckoBrowser *browser, HTMLI doc->browser = browser;
if(browser->usermode == EDITMODE && doc->html_document) { - nsAString mode_str; - nsresult nsres; - - nsAString_InitDepend(&mode_str, L"on"); - nsres = nsIDOMHTMLDocument_SetDesignMode(doc->html_document, &mode_str); - nsAString_Finish(&mode_str); + nsAString_InitDepend(&nsstr, L"on"); + nsres = nsIDOMHTMLDocument_SetDesignMode(doc->html_document, &nsstr); + nsAString_Finish(&nsstr); if(NS_FAILED(nsres)) ERR("SetDesignMode failed: %08lx\n", nsres); } diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index c561517eaf2..89276ffa22f 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -1149,6 +1149,7 @@ struct HTMLDocumentNode { unsigned int emulate_mode : 1; unsigned int content_ready : 1; unsigned int unload_sent : 1; + unsigned int is_xhtml : 1;
IHTMLDOMImplementation *dom_implementation; IHTMLNamespaceCollection *namespaces; 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) {