From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/dispex.c | 14 ++++++++++++++ dlls/mshtml/htmlelem.c | 5 +++++ dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/tests/documentmode.js | 16 ++++++++++++++++ 4 files changed, 36 insertions(+)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index b7284c8b935..eee1c851cf4 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -2018,6 +2018,20 @@ BOOL dispex_builtin_is_noattr(DispatchEx *dispex, DISPID id) return func->noattr; }
+BOOL dispex_prop_is_noattr(DispatchEx *dispex, DISPID id) +{ + func_info_t *func; + HRESULT hres; + + if(get_dispid_type(id) != DISPEXPROP_BUILTIN) + return FALSE; + + hres = get_builtin_func(dispex->info, id, &func); + assert(SUCCEEDED(hres)); + + return func->func_disp_idx < 0 && func->noattr; +} + static inline DispatchEx *impl_from_IWineJSDispatchHost(IWineJSDispatchHost *iface) { return CONTAINING_RECORD(iface, DispatchEx, IWineJSDispatchHost_iface); diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index fe57bc0dfef..dd7962de2a1 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -1169,6 +1169,11 @@ static HRESULT set_elem_attr_value_by_dispid(HTMLElement *elem, DISPID dispid, V return S_OK; }
+ if(dispid != DISPID_IHTMLELEMENT_CLASSNAME && dispex_prop_is_noattr(&elem->node.event_target.dispex, dispid)) { + /* Unimplemented in IE < 8 */ + return E_NOTIMPL; + } + return dispex_prop_put(&elem->node.event_target.dispex, dispid, LOCALE_SYSTEM_DEFAULT, v, &ei, NULL); }
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 3dc41bae967..b002c94a2f2 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -637,6 +637,7 @@ const void *dispex_get_vtbl(DispatchEx*); void dispex_info_add_interface(dispex_data_t*,tid_t,const dispex_hook_t*); void dispex_info_add_dispids(dispex_data_t*,tid_t,const DISPID*); compat_mode_t dispex_compat_mode(DispatchEx*); +BOOL dispex_prop_is_noattr(DispatchEx*,DISPID); HRESULT dispex_to_string(DispatchEx*,BSTR*); HRESULT dispex_call_builtin(DispatchEx *dispex, DISPID id, DISPPARAMS *dp, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller); diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index f6d61ec01d4..06f5d588a4a 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -644,6 +644,15 @@ sync_test("attr_props", function() { elem.setAttribute("z-index", "foobar"); elem.setAttribute("removeAttribute", "funcattr");
+ try { + elem.setAttribute("offsetLeft", "0"); + ok(v >= 8, "setAttribute(offsetLeft) didn't throw"); + }catch(e) { + todo_wine_if(v === 8). + ok(v < 8, "setAttribute(offsetLeft) threw"); + ok(e.number === 0x04001 - 0x80000000, "setAttribute(offsetLeft) threw " + e.number); + } + attr = elem.getAttributeNode("test"); test_attr(true, true);
@@ -653,6 +662,13 @@ sync_test("attr_props", function() { attr = elem.getAttributeNode("removeAttribute"); ok(attr !== null, "removeAttribute attr = null");
+ attr = elem.getAttributeNode("offsetLeft"); + if(v < 8) + ok(attr === null, "offsetLeft attr != null"); + else + todo_wine_if(v === 8). + ok(attr !== null, "offsetLeft attr = null"); + attr = elem.getAttributeNode("tabIndex"); if(v < 8) test_attr(false, false);