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