[PATCH v6 08/12] mshtml: Set dispatch values to "[object]" for builtin attributes in IE8 and IE9 modes.
Gabriel Ivăncescu
gabrielopcode at gmail.com
Tue Nov 23 07:59:13 CST 2021
Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
dlls/mshtml/dispex.c | 2 +-
dlls/mshtml/htmlelem.c | 15 +++++++++++++--
dlls/mshtml/mshtml_private.h | 1 +
dlls/mshtml/tests/documentmode.js | 2 --
4 files changed, 15 insertions(+), 5 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 cff6e4b..bf899cd 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -1087,8 +1087,8 @@ static HRESULT WINAPI HTMLElement_setAttribute(IHTMLElement *iface, BSTR strAttr
{
HTMLElement *This = impl_from_IHTMLElement(iface);
compat_mode_t compat_mode = dispex_compat_mode(&This->node.event_target.dispex);
+ BOOL needs_free = FALSE, object_str = FALSE;
VARIANT val = AttributeValue;
- BOOL needs_free = FALSE;
DISPID dispid;
HRESULT hres;
@@ -1106,7 +1106,9 @@ static HRESULT WINAPI HTMLElement_setAttribute(IHTMLElement *iface, BSTR strAttr
return hres;
if(compat_mode >= COMPAT_MODE_IE8 && get_dispid_type(dispid) == DISPEXPROP_BUILTIN) {
- if(V_VT(&val) != VT_BSTR && V_VT(&val) != VT_NULL) {
+ if(V_VT(&val) == VT_DISPATCH && compat_mode < COMPAT_MODE_IE10) {
+ object_str = TRUE;
+ }else if(V_VT(&val) != VT_BSTR && V_VT(&val) != VT_NULL) {
LCID lcid = MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT);
V_VT(&val) = VT_EMPTY;
@@ -1124,6 +1126,15 @@ static HRESULT WINAPI HTMLElement_setAttribute(IHTMLElement *iface, BSTR strAttr
/* style is special case */
if(compat_mode == COMPAT_MODE_IE8 && dispid == DISPID_IHTMLELEMENT_STYLE)
compat_mode = COMPAT_MODE_IE9;
+ }else if(V_VT(&val) == VT_DISPATCH && compat_mode < COMPAT_MODE_IE10) {
+ object_str = get_builtin_id(&This->node.event_target.dispex, strAttributeName, fdexNameCaseInsensitive, &dispid) == S_OK;
+ }
+
+ if(object_str) {
+ if(!(V_BSTR(&val) = SysAllocString(L"[object]")))
+ return E_OUTOFMEMORY;
+ V_VT(&val) = VT_BSTR;
+ needs_free = TRUE;
}
if(compat_mode < COMPAT_MODE_IE9 || !This->dom_element) {
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 101f005..cc5779b 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 27e6431..dc1f1bb 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