Jacek Caban : mshtml: Don't expose doScroll in IE11 document mode.

Alexandre Julliard julliard at winehq.org
Tue May 9 17:21:01 CDT 2017


Module: wine
Branch: master
Commit: 97e260060769558493ed99787f27fe96081d5dee
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=97e260060769558493ed99787f27fe96081d5dee

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue May  9 17:32:33 2017 +0200

mshtml: Don't expose doScroll in IE11 document mode.

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

---

 dlls/mshtml/dispex.c              | 22 ++++++++++++++++------
 dlls/mshtml/htmlelem.c            |  6 +++++-
 dlls/mshtml/htmlwindow.c          |  2 +-
 dlls/mshtml/mshtml_private.h      |  3 +--
 dlls/mshtml/tests/documentmode.js |  1 +
 5 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index 6e7f1be..baf251a 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -325,9 +325,10 @@ static void add_func_info(dispex_data_t *data, tid_t tid, const FUNCDESC *desc,
     }
 }
 
-static HRESULT process_interface(dispex_data_t *data, tid_t tid, ITypeInfo *disp_typeinfo)
+static HRESULT process_interface(dispex_data_t *data, tid_t tid, ITypeInfo *disp_typeinfo, const DISPID *blacklist_dispids)
 {
     unsigned i = 7; /* skip IDispatch functions */
+    const DISPID *blacklist_iter;
     ITypeInfo *typeinfo;
     FUNCDESC *funcdesc;
     HRESULT hres;
@@ -341,20 +342,29 @@ static HRESULT process_interface(dispex_data_t *data, tid_t tid, ITypeInfo *disp
         if(FAILED(hres))
             break;
 
-        TRACE("adding...\n");
+        if(blacklist_dispids) {
+            for(blacklist_iter = blacklist_dispids; *blacklist_iter != DISPID_UNKNOWN; blacklist_iter++) {
+                if(*blacklist_iter == funcdesc->memid)
+                    break;
+            }
+        }
+
+        if(!blacklist_dispids || *blacklist_iter == DISPID_UNKNOWN) {
+            TRACE("adding...\n");
+            add_func_info(data, tid, funcdesc, disp_typeinfo ? disp_typeinfo : typeinfo);
+        }
 
-        add_func_info(data, tid, funcdesc, disp_typeinfo ? disp_typeinfo : typeinfo);
         ITypeInfo_ReleaseFuncDesc(typeinfo, funcdesc);
     }
 
     return S_OK;
 }
 
-void dispex_info_add_interface(dispex_data_t *info, tid_t tid)
+void dispex_info_add_interface(dispex_data_t *info, tid_t tid, const DISPID *blacklist_dispids)
 {
     HRESULT hres;
 
-    hres = process_interface(info, tid, NULL);
+    hres = process_interface(info, tid, NULL, blacklist_dispids);
     if(FAILED(hres))
         ERR("process_interface failed: %08x\n", hres);
 }
@@ -406,7 +416,7 @@ static dispex_data_t *preprocess_dispex_data(const dispex_static_data_t *desc, c
         desc->init_info(data, compat_mode);
 
     for(tid = desc->iface_tids; *tid; tid++) {
-        hres = process_interface(data, *tid, dti);
+        hres = process_interface(data, *tid, dti, NULL);
         if(FAILED(hres))
             break;
     }
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index ccad114..4f7a383 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -5174,8 +5174,12 @@ static void HTMLElement_bind_event(DispatchEx *dispex, int eid)
 
 void HTMLElement_init_dispex_info(dispex_data_t *info, compat_mode_t mode)
 {
+    static const DISPID elem2_ie11_blacklist[] = {DISPID_IHTMLELEMENT2_DOSCROLL, DISPID_UNKNOWN};
+
+    dispex_info_add_interface(info, IHTMLElement2_tid, mode >= COMPAT_MODE_IE11 ? elem2_ie11_blacklist : NULL);
+
     if(mode >= COMPAT_MODE_IE8)
-        dispex_info_add_interface(info, IElementSelector_tid);
+        dispex_info_add_interface(info, IElementSelector_tid, NULL);
 }
 
 static const tid_t HTMLElement_iface_tids[] = {
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index b68579b..2914073 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -3029,7 +3029,7 @@ static void HTMLWindow_bind_event(DispatchEx *dispex, int eid)
 
 static void HTMLWindow_init_dispex_info(dispex_data_t *info, compat_mode_t compat_mode)
 {
-    dispex_info_add_interface(info, IHTMLWindow5_tid);
+    dispex_info_add_interface(info, IHTMLWindow5_tid, NULL);
 }
 
 static const dispex_static_data_vtbl_t HTMLWindow_dispex_vtbl = {
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index a927d69..d68816d 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -318,7 +318,7 @@ void dispex_unlink(DispatchEx*) DECLSPEC_HIDDEN;
 void release_typelib(void) DECLSPEC_HIDDEN;
 HRESULT get_class_typeinfo(const CLSID*,ITypeInfo**) DECLSPEC_HIDDEN;
 const dispex_static_data_vtbl_t *dispex_get_vtbl(DispatchEx*) DECLSPEC_HIDDEN;
-void dispex_info_add_interface(dispex_data_t*,tid_t) DECLSPEC_HIDDEN;
+void dispex_info_add_interface(dispex_data_t*,tid_t,const DISPID*) DECLSPEC_HIDDEN;
 
 static inline void init_dispex(DispatchEx *dispex, IUnknown *outer, dispex_static_data_t *desc)
 {
@@ -760,7 +760,6 @@ typedef struct {
     IHTMLDOMNode_tid,       \
     IHTMLDOMNode2_tid,      \
     IHTMLElement_tid,       \
-    IHTMLElement2_tid,      \
     IHTMLElement3_tid,      \
     IHTMLElement4_tid,      \
     IHTMLUniqueName_tid
diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js
index 96688ba..292955a 100644
--- a/dlls/mshtml/tests/documentmode.js
+++ b/dlls/mshtml/tests/documentmode.js
@@ -28,6 +28,7 @@ function test_elem_props() {
 
     var v = document.documentMode;
 
+    test_exposed("doScroll", v < 11);
     test_exposed("querySelectorAll", v >= 8);
 
     next_test();




More information about the wine-cvs mailing list