From: Gabriel Ivăncescu gabrielopcode@gmail.com
For documents exposing a <!DOCTYPE> node but no specific X-UA-Compatible, mshtml defaults to IE7 compat mode, unless the app is Internet Explorer and is in Internet URL Zone. This checking for the `iexplore.exe` app name seems hardcoded into mshtml; the FeatureControl registry keys do not affect this directly, and none are set by default for iexplore.exe that would affect this, anyway.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/mutation.c | 23 ++++++++++++++++++++++- dlls/mshtml/tests/dom.c | 3 +++ dlls/mshtml/tests/script.c | 23 +++++++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-)
diff --git a/dlls/mshtml/mutation.c b/dlls/mshtml/mutation.c index 3355139ad31..79918278b3d 100644 --- a/dlls/mshtml/mutation.c +++ b/dlls/mshtml/mutation.c @@ -27,6 +27,7 @@ #include "ole2.h" #include "shlguid.h" #include "wininet.h" +#include "winternl.h"
#include "mshtml_private.h" #include "htmlscript.h" @@ -52,6 +53,20 @@ static const IID NS_ICONTENTUTILS_CID =
static nsIContentUtils *content_utils;
+static BOOL is_iexplore(void) +{ + static volatile char cache = -1; + BOOL ret = cache; + if(ret == -1) { + const WCHAR *p, *name = NtCurrentTeb()->Peb->ProcessParameters->ImagePathName.Buffer; + if((p = wcsrchr(name, '/'))) name = p + 1; + if((p = wcsrchr(name, '\'))) name = p + 1; + ret = !wcsicmp(name, L"iexplore.exe"); + cache = ret; + } + return ret; +} + static PRUnichar *handle_insert_comment(HTMLDocumentNode *doc, const PRUnichar *comment) { unsigned majorv = 0, minorv = 0, compat_version; @@ -823,7 +838,13 @@ static void NSAPI nsDocumentObserver_BindToDocument(nsIDocumentObserver *iface,
TRACE("doctype node\n");
- if(This->window && This->window->base.outer_window) { + /* Native mshtml hardcodes special behavior for iexplore.exe here. The feature control registry + keys under HKLM or HKCU\Software\Microsoft\Internet Explorer\Main\FeatureControl are not used + in this case (neither in Wow6432Node), although FEATURE_BROWSER_EMULATION does override this, + but it is not set by default on native, and the behavior is still different. This was tested + by removing all iexplore.exe values from any FeatureControl subkeys, and renaming the test + executable to iexplore.exe, which changed its default compat mode in such cases. */ + if(This->window && This->window->base.outer_window && is_iexplore()) { HTMLOuterWindow *window = This->window->base.outer_window; DWORD zone; HRESULT hres; diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 8f78c8da17f..cd4daa84e0a 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -11449,6 +11449,9 @@ static void test_quirks_mode(void) expected_document_mode = 5; run_domtest("<html><body></body></html>", test_document_mode);
+ expected_document_mode = 7; + run_domtest("<!DOCTYPE html>\n<html></html>", test_document_mode); + if(!is_ie9plus) return;
diff --git a/dlls/mshtml/tests/script.c b/dlls/mshtml/tests/script.c index a92d18fb454..660f62759c9 100644 --- a/dlls/mshtml/tests/script.c +++ b/dlls/mshtml/tests/script.c @@ -3734,6 +3734,28 @@ static void run_script_as_http_with_mode(const char *script, const char *opt, co run_from_path(L"/index.html", opt ? opt : script); }
+static void test_strict_mode(void) +{ + sprintf(index_html_data, + "<!DOCTYPE html>\n" + "<html>\n" + " <head>\n" + " <script src="winetest.js" type="text/javascript"></script>\n" + " <script type="text/javascript">\n" + " function test() {\n" + " ok(document.documentMode === 7, 'document mode = ' + document.documentMode);\n" + " next_test();\n" + " }\n" + " var tests = [ test ];\n" + " </script>\n" + " </head>\n" + " <body onload="run_tests();">\n" + " </body>\n" + "</html>\n"); + + run_from_path(L"/index.html", "test_strict_mode"); +} + static void init_protocol_handler(void) { IInternetSession *internet_session; @@ -3767,6 +3789,7 @@ static void run_js_tests(void)
init_protocol_handler();
+ test_strict_mode(); run_script_as_http_with_mode("xhr.js", NULL, "9"); run_script_as_http_with_mode("xhr.js", NULL, "10"); run_script_as_http_with_mode("xhr.js", NULL, "11");