Jacek Caban : mshtml: Set SCRIPTPROP_INVOKEVERSIONING based on document mode value.

Alexandre Julliard julliard at winehq.org
Thu Feb 22 15:07:48 CST 2018


Module: wine
Branch: master
Commit: dd78fd09663fa4183989fdf29dca53732bd07386
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=dd78fd09663fa4183989fdf29dca53732bd07386

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Feb 22 19:48:18 2018 +0100

mshtml: Set SCRIPTPROP_INVOKEVERSIONING based on document mode value.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mshtml/htmldoc.c        |  5 ++---
 dlls/mshtml/htmlwindow.c     |  4 +---
 dlls/mshtml/mshtml_private.h |  2 ++
 dlls/mshtml/mutation.c       | 19 +++++++++++++++----
 dlls/mshtml/script.c         | 22 +---------------------
 5 files changed, 21 insertions(+), 31 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 1f458fc..7c8455c 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -5035,8 +5035,7 @@ static compat_mode_t HTMLDocumentNode_get_compat_mode(DispatchEx *dispex)
 
     TRACE("(%p) returning %u\n", This, This->document_mode);
 
-    This->document_mode_locked = TRUE;
-    return This->document_mode;
+    return lock_document_mode(This);
 }
 
 static nsISupports *HTMLDocumentNode_get_gecko_target(DispatchEx *dispex)
@@ -5173,8 +5172,8 @@ HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_ob
         compat_mode_t parent_mode = window->base.outer_window->parent->base.inner_window->doc->document_mode;
         TRACE("parent mode %u\n", parent_mode);
         if(parent_mode >= COMPAT_MODE_IE9) {
-            doc->document_mode_locked = TRUE;
             doc->document_mode = parent_mode;
+            lock_document_mode(doc);
         }
     }
 
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index 80cc7ec..93df314 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -3019,9 +3019,7 @@ static HRESULT HTMLWindow_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD
 static compat_mode_t HTMLWindow_get_compat_mode(DispatchEx *dispex)
 {
     HTMLInnerWindow *This = impl_from_DispatchEx(dispex);
-
-    This->doc->document_mode_locked = TRUE;
-    return This->doc->document_mode;
+    return lock_document_mode(This->doc);
 }
 
 static nsISupports *HTMLWindow_get_gecko_target(DispatchEx *dispex)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 551ee12..1c9e26a 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -898,6 +898,8 @@ void ConnectionPointContainer_Destroy(ConnectionPointContainer*) DECLSPEC_HIDDEN
 HRESULT create_nscontainer(HTMLDocumentObj*,NSContainer**) DECLSPEC_HIDDEN;
 void NSContainer_Release(NSContainer*) DECLSPEC_HIDDEN;
 
+compat_mode_t lock_document_mode(HTMLDocumentNode*) DECLSPEC_HIDDEN;
+
 void init_mutation(nsIComponentManager*) DECLSPEC_HIDDEN;
 void init_document_mutation(HTMLDocumentNode*) DECLSPEC_HIDDEN;
 void release_document_mutation(HTMLDocumentNode*) DECLSPEC_HIDDEN;
diff --git a/dlls/mshtml/mutation.c b/dlls/mshtml/mutation.c
index 95a0694..4e1e053 100644
--- a/dlls/mshtml/mutation.c
+++ b/dlls/mshtml/mutation.c
@@ -362,6 +362,18 @@ static nsresult run_insert_script(HTMLDocumentNode *doc, nsISupports *script_ifa
     return NS_OK;
 }
 
+/*
+ * We may change document mode only in early stage of document lifetime.
+ * Later attempts will not have an effect.
+ */
+compat_mode_t lock_document_mode(HTMLDocumentNode *doc)
+{
+    TRACE("%p: %d\n", doc, doc->document_mode);
+
+    doc->document_mode_locked = TRUE;
+    return doc->document_mode;
+}
+
 static void set_document_mode(HTMLDocumentNode *doc, compat_mode_t document_mode, BOOL lock)
 {
     if(doc->document_mode_locked) {
@@ -371,9 +383,9 @@ static void set_document_mode(HTMLDocumentNode *doc, compat_mode_t document_mode
 
     TRACE("%p: %d\n", doc, document_mode);
 
-    if(lock)
-        doc->document_mode_locked = TRUE;
     doc->document_mode = document_mode;
+    if(lock)
+        lock_document_mode(doc);
 }
 
 static BOOL parse_ua_compatible(const WCHAR *p, compat_mode_t *r)
@@ -816,8 +828,7 @@ static void NSAPI nsDocumentObserver_AttemptToExecuteScript(nsIDocumentObserver
     if(NS_SUCCEEDED(nsres)) {
         TRACE("script node\n");
 
-        This->document_mode_locked = TRUE;
-
+        lock_document_mode(This);
         add_script_runner(This, run_insert_script, (nsISupports*)nsscript, (nsISupports*)aParser);
         nsIDOMHTMLScriptElement_Release(nsscript);
     }
diff --git a/dlls/mshtml/script.c b/dlls/mshtml/script.c
index acc1b39..d4bf123 100644
--- a/dlls/mshtml/script.c
+++ b/dlls/mshtml/script.c
@@ -112,26 +112,6 @@ static void set_script_prop(ScriptHost *script_host, DWORD property, VARIANT *va
         WARN("SetProperty(%x) failed: %08x\n", property, hres);
 }
 
-static BOOL is_quirks_mode(HTMLDocumentNode *doc)
-{
-    const WCHAR *compat_mode;
-    nsAString nsstr;
-    nsresult nsres;
-    BOOL ret = FALSE;
-
-    static const WCHAR BackCompatW[] = {'B','a','c','k','C','o','m','p','a','t',0};
-
-    nsAString_Init(&nsstr, NULL);
-    nsres = nsIDOMHTMLDocument_GetCompatMode(doc->nsdoc, &nsstr);
-    if(NS_SUCCEEDED(nsres)) {
-        nsAString_GetData(&nsstr, &compat_mode);
-        if(!strcmpW(compat_mode, BackCompatW))
-            ret = TRUE;
-    }
-    nsAString_Finish(&nsstr);
-    return ret;
-}
-
 static BOOL init_script_engine(ScriptHost *script_host)
 {
     IObjectSafety *safety;
@@ -170,7 +150,7 @@ static BOOL init_script_engine(ScriptHost *script_host)
         return FALSE;
 
     V_VT(&var) = VT_I4;
-    V_I4(&var) = is_quirks_mode(script_host->window->doc) ? 1 : 2;
+    V_I4(&var) = lock_document_mode(script_host->window->doc) == COMPAT_MODE_QUIRKS ? 1 : 2;
     set_script_prop(script_host, SCRIPTPROP_INVOKEVERSIONING, &var);
 
     V_VT(&var) = VT_BOOL;




More information about the wine-cvs mailing list