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

Gabriel Ivăncescu gabrielopcode at gmail.com
Tue Nov 16 08:29:29 CST 2021


Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
 dlls/mshtml/htmlelem.c            | 30 +++++++++++++++++++++++++-----
 dlls/mshtml/tests/documentmode.js |  2 --
 2 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index 77dc5c3..8ff4aee 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -1110,15 +1110,35 @@ 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) {
+                hres = IDispatchEx_GetDispID(&This->node.event_target.dispex.IDispatchEx_iface, strAttributeName,
+                        lFlags&ATTRFLAG_CASESENSITIVE ? fdexNameCaseSensitive : fdexNameCaseInsensitive, &dispid);
+                if(SUCCEEDED(hres) && get_dispid_type(dispid) == DISPEXPROP_BUILTIN)
+                    object_str = TRUE;
+            }
+        }
 
-        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/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js
index ee834b2..2ac8823 100644
--- a/dlls/mshtml/tests/documentmode.js
+++ b/dlls/mshtml/tests/documentmode.js
@@ -1145,7 +1145,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);
@@ -1196,7 +1195,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