mshtml: Better removeAttribute implementation.
This commit is contained in:
parent
275a231fbb
commit
5f913d5afb
|
@ -1261,41 +1261,75 @@ static HRESULT invoke_builtin_prop(DispatchEx *This, DISPID id, LCID lcid, WORD
|
||||||
return hres;
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT remove_prop(DispatchEx *This, BSTR name, VARIANT_BOOL *success)
|
HRESULT remove_attribute(DispatchEx *This, DISPID id, VARIANT_BOOL *success)
|
||||||
{
|
{
|
||||||
dynamic_prop_t *prop;
|
switch(get_dispid_type(id)) {
|
||||||
DISPID id;
|
case DISPEXPROP_CUSTOM:
|
||||||
HRESULT hres;
|
FIXME("DISPEXPROP_CUSTOM not supported\n");
|
||||||
|
return E_NOTIMPL;
|
||||||
|
|
||||||
hres = get_builtin_id(This, name, 0, &id);
|
case DISPEXPROP_DYNAMIC: {
|
||||||
if(hres == S_OK) {
|
DWORD idx = id - DISPID_DYNPROP_0;
|
||||||
DISPID named_id = DISPID_PROPERTYPUT;
|
dynamic_prop_t *prop;
|
||||||
|
|
||||||
|
prop = This->dynamic_data->props+idx;
|
||||||
|
VariantClear(&prop->var);
|
||||||
|
prop->flags |= DYNPROP_DELETED;
|
||||||
|
*success = VARIANT_TRUE;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
case DISPEXPROP_BUILTIN: {
|
||||||
VARIANT var;
|
VARIANT var;
|
||||||
DISPPARAMS dp = {&var,&named_id,1,1};
|
DISPPARAMS dp = {&var,NULL,1,0};
|
||||||
EXCEPINFO ei;
|
dispex_data_t *data;
|
||||||
|
func_info_t *func;
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
data = get_dispex_data(This);
|
||||||
|
if(!data)
|
||||||
|
return E_FAIL;
|
||||||
|
|
||||||
|
hres = get_builtin_func(data, id, &func);
|
||||||
|
if(FAILED(hres))
|
||||||
|
return hres;
|
||||||
|
|
||||||
|
/* For builtin functions, we set their value to the original function. */
|
||||||
|
if(func->func_disp_idx != -1) {
|
||||||
|
func_obj_entry_t *entry;
|
||||||
|
|
||||||
|
if(!This->dynamic_data || !This->dynamic_data->func_disps
|
||||||
|
|| !This->dynamic_data->func_disps[func->func_disp_idx].func_obj) {
|
||||||
|
*success = VARIANT_FALSE;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
entry = This->dynamic_data->func_disps + func->func_disp_idx;
|
||||||
|
if(V_VT(&entry->val) == VT_DISPATCH
|
||||||
|
&& V_DISPATCH(&entry->val) == (IDispatch*)&entry->func_obj->dispex.IDispatchEx_iface) {
|
||||||
|
*success = VARIANT_FALSE;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
VariantClear(&entry->val);
|
||||||
|
V_VT(&entry->val) = VT_DISPATCH;
|
||||||
|
V_DISPATCH(&entry->val) = (IDispatch*)&entry->func_obj->dispex.IDispatchEx_iface;
|
||||||
|
IDispatch_AddRef(V_DISPATCH(&entry->val));
|
||||||
|
*success = VARIANT_TRUE;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
V_VT(&var) = VT_EMPTY;
|
V_VT(&var) = VT_EMPTY;
|
||||||
memset(&ei, 0, sizeof(ei));
|
hres = builtin_propput(This, func, &dp, NULL);
|
||||||
hres = invoke_builtin_prop(This, id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL);
|
|
||||||
if(FAILED(hres))
|
if(FAILED(hres))
|
||||||
return hres;
|
return hres;
|
||||||
|
|
||||||
*success = VARIANT_TRUE;
|
*success = VARIANT_TRUE;
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
default:
|
||||||
hres = get_dynamic_prop(This, name, 0, &prop);
|
assert(0);
|
||||||
if(FAILED(hres)) {
|
return E_FAIL;
|
||||||
if(hres != DISP_E_UNKNOWNNAME)
|
|
||||||
return hres;
|
|
||||||
*success = VARIANT_FALSE;
|
|
||||||
return S_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VariantClear(&prop->var);
|
|
||||||
prop->flags |= DYNPROP_DELETED;
|
|
||||||
*success = VARIANT_TRUE;
|
|
||||||
return S_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline DispatchEx *impl_from_IDispatchEx(IDispatchEx *iface)
|
static inline DispatchEx *impl_from_IDispatchEx(IDispatchEx *iface)
|
||||||
|
|
|
@ -664,10 +664,21 @@ static HRESULT WINAPI HTMLElement_removeAttribute(IHTMLElement *iface, BSTR strA
|
||||||
LONG lFlags, VARIANT_BOOL *pfSuccess)
|
LONG lFlags, VARIANT_BOOL *pfSuccess)
|
||||||
{
|
{
|
||||||
HTMLElement *This = impl_from_IHTMLElement(iface);
|
HTMLElement *This = impl_from_IHTMLElement(iface);
|
||||||
|
DISPID id;
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(strAttributeName), lFlags, pfSuccess);
|
TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(strAttributeName), lFlags, pfSuccess);
|
||||||
|
|
||||||
return remove_prop(&This->node.dispex, strAttributeName, pfSuccess);
|
hres = IDispatchEx_GetDispID(&This->node.dispex.IDispatchEx_iface, strAttributeName,
|
||||||
|
lFlags&1 ? fdexNameCaseSensitive : fdexNameCaseInsensitive, &id);
|
||||||
|
if(hres == DISP_E_UNKNOWNNAME) {
|
||||||
|
*pfSuccess = VARIANT_FALSE;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
if(FAILED(hres))
|
||||||
|
return hres;
|
||||||
|
|
||||||
|
return remove_attribute(&This->node.dispex, id, pfSuccess);
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI HTMLElement_put_className(IHTMLElement *iface, BSTR v)
|
static HRESULT WINAPI HTMLElement_put_className(IHTMLElement *iface, BSTR v)
|
||||||
|
|
|
@ -2915,7 +2915,7 @@ static HRESULT WINAPI HTMLStyle_removeAttribute(IHTMLStyle *iface, BSTR strAttri
|
||||||
}
|
}
|
||||||
|
|
||||||
if(i == sizeof(style_tbl)/sizeof(*style_tbl))
|
if(i == sizeof(style_tbl)/sizeof(*style_tbl))
|
||||||
return remove_prop(&This->dispex, strAttributeName, pfSuccess);
|
return remove_attribute(&This->dispex, dispid, pfSuccess);
|
||||||
style_entry = style_tbl+i;
|
style_entry = style_tbl+i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -278,7 +278,7 @@ void release_dispex(DispatchEx*) DECLSPEC_HIDDEN;
|
||||||
BOOL dispex_query_interface(DispatchEx*,REFIID,void**) DECLSPEC_HIDDEN;
|
BOOL dispex_query_interface(DispatchEx*,REFIID,void**) DECLSPEC_HIDDEN;
|
||||||
HRESULT dispex_get_dprop_ref(DispatchEx*,const WCHAR*,BOOL,VARIANT**) DECLSPEC_HIDDEN;
|
HRESULT dispex_get_dprop_ref(DispatchEx*,const WCHAR*,BOOL,VARIANT**) DECLSPEC_HIDDEN;
|
||||||
HRESULT get_dispids(tid_t,DWORD*,DISPID**) DECLSPEC_HIDDEN;
|
HRESULT get_dispids(tid_t,DWORD*,DISPID**) DECLSPEC_HIDDEN;
|
||||||
HRESULT remove_prop(DispatchEx*,BSTR,VARIANT_BOOL*) DECLSPEC_HIDDEN;
|
HRESULT remove_attribute(DispatchEx*,DISPID,VARIANT_BOOL*) DECLSPEC_HIDDEN;
|
||||||
HRESULT dispex_get_dynid(DispatchEx*,const WCHAR*,DISPID*) DECLSPEC_HIDDEN;
|
HRESULT dispex_get_dynid(DispatchEx*,const WCHAR*,DISPID*) DECLSPEC_HIDDEN;
|
||||||
void dispex_traverse(DispatchEx*,nsCycleCollectionTraversalCallback*) DECLSPEC_HIDDEN;
|
void dispex_traverse(DispatchEx*,nsCycleCollectionTraversalCallback*) DECLSPEC_HIDDEN;
|
||||||
void dispex_unlink(DispatchEx*) DECLSPEC_HIDDEN;
|
void dispex_unlink(DispatchEx*) DECLSPEC_HIDDEN;
|
||||||
|
|
Loading…
Reference in New Issue