[PATCH v3 08/12] mshtml: Set dispatch values to "[object]" for builtin attributes in IE8 and IE9 modes.

Gabriel Ivăncescu gabrielopcode at gmail.com
Thu Nov 18 10:44:47 CST 2021


Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
 dlls/mshtml/dispex.c              |  2 +-
 dlls/mshtml/htmlelem.c            | 29 ++++++++++++++++++++++++-----
 dlls/mshtml/mshtml_private.h      |  1 +
 dlls/mshtml/tests/documentmode.js |  2 --
 4 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index c30a44e..e626f70 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -1007,7 +1007,7 @@ static HRESULT get_builtin_func(dispex_data_t *data, DISPID id, func_info_t **re
     return DISP_E_UNKNOWNNAME;
 }
 
-static HRESULT get_builtin_id(DispatchEx *This, BSTR name, DWORD grfdex, DISPID *ret)
+HRESULT get_builtin_id(DispatchEx *This, BSTR name, DWORD grfdex, DISPID *ret)
 {
     int min, max, n, c;
 
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index a45b991..03bcbb7 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -1110,15 +1110,34 @@ static HRESULT WINAPI HTMLElement_setAttribute(IHTMLElement *iface, BSTR strAttr
     }
 
     if(stringify) {
-        hres = variant_to_nsstr(&AttributeValue, VARIANT_TO_NSSTR_BSTR_DEPEND, &value_str);
-        if(FAILED(hres))
-            return hres;
+        BOOL object_str = FALSE;
+
+        if(V_VT(&AttributeValue) == VT_DISPATCH) {
+            if(compat_mode < COMPAT_MODE_IE9)
+                object_str = TRUE;
+            else if(compat_mode < COMPAT_MODE_IE10) {
+                DISPID tmp;
+                object_str = get_builtin_id(&This->node.event_target.dispex, strAttributeName,
+                                            fdexNameCaseInsensitive, &tmp) == S_OK;
+            }
+        }
 
-        if((V_VT(&AttributeValue) & ~VT_BYREF) != VT_BSTR)
+        if(object_str) {
+            if(!(V_BSTR(&AttributeValue) = SysAllocString(L"[object]")))
+                return E_OUTOFMEMORY;
+            nsAString_InitDepend(&value_str, V_BSTR(&AttributeValue));
             needs_free = TRUE;
+        }else {
+            hres = variant_to_nsstr(&AttributeValue, VARIANT_TO_NSSTR_BSTR_DEPEND, &value_str);
+            if(FAILED(hres))
+                return hres;
 
+            if((V_VT(&AttributeValue) & ~VT_BYREF) != VT_BSTR)
+                needs_free = TRUE;
+
+            nsAString_GetData(&value_str, (const WCHAR**)&V_BSTR(&AttributeValue));
+        }
         V_VT(&AttributeValue) = VT_BSTR;
-        nsAString_GetData(&value_str, (const WCHAR**)&V_BSTR(&AttributeValue));
 
         if(!V_BSTR(&AttributeValue)) {
             V_VT(&AttributeValue) = VT_NULL;
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 9f10d68..444a4c0 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -384,6 +384,7 @@ extern void (__cdecl *note_cc_edge)(nsISupports*,const char*,nsCycleCollectionTr
 void init_dispatch(DispatchEx*,IUnknown*,dispex_static_data_t*,compat_mode_t) DECLSPEC_HIDDEN;
 void release_dispex(DispatchEx*) DECLSPEC_HIDDEN;
 BOOL dispex_query_interface(DispatchEx*,REFIID,void**) DECLSPEC_HIDDEN;
+HRESULT get_builtin_id(DispatchEx*,BSTR,DWORD,DISPID*) DECLSPEC_HIDDEN;
 HRESULT dispex_get_dprop_ref(DispatchEx*,const WCHAR*,BOOL,VARIANT**) DECLSPEC_HIDDEN;
 HRESULT get_dispids(tid_t,DWORD*,DISPID**) DECLSPEC_HIDDEN;
 HRESULT remove_attribute(DispatchEx*,DISPID,VARIANT_BOOL*) DECLSPEC_HIDDEN;
diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js
index 81af28b..d01680b 100644
--- a/dlls/mshtml/tests/documentmode.js
+++ b/dlls/mshtml/tests/documentmode.js
@@ -1171,7 +1171,6 @@ sync_test("elem_attr", function() {
 
     elem.setAttribute("id", arr);
     r = elem.getAttribute("id");
-    todo_wine_if(v >= 8 && v < 10).
     ok(r === (v < 8 || v >= 10 ? "3" : "[object]"), "id = " + r);
     r = elem.removeAttribute("id");
     ok(r === (v < 9 ? true : undefined), "id removeAttribute returned " + r);
@@ -1224,7 +1223,6 @@ sync_test("elem_attr", function() {
 
     elem.setAttribute("ondblclick", arr);
     r = elem.getAttribute("ondblclick");
-    todo_wine_if(v >= 8 && v < 10).
     ok(r === (v < 8 ? arr : (v < 10 ? "[object]" : "3")), "ondblclick = " + r);
     r = elem.removeAttribute("ondblclick");
     ok(r === (v < 8 ? false : (v < 9 ? true : undefined)), "ondblclick removeAttribute returned " + r);
-- 
2.31.1




More information about the wine-devel mailing list