Gabriel Ivăncescu : mshtml: Only default to IE11 mode for Internet URL Zones when the app is IE.

Alexandre Julliard julliard at winehq.org
Fri Jul 15 14:45:54 CDT 2022


Module: wine
Branch: master
Commit: 3301a8e3128b1828493b450207fa6a2a2125807e
URL:    https://gitlab.winehq.org/wine/wine/-/commit/3301a8e3128b1828493b450207fa6a2a2125807e

Author: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Date:   Thu Jul 14 21:18:06 2022 +0300

mshtml: Only default to IE11 mode for Internet URL Zones when the app is IE.

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 at 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");




More information about the wine-cvs mailing list