mshtml: Added IHTMLElement3::[get|put]_implementation.

This commit is contained in:
Jacek Caban 2008-10-09 15:30:51 -05:00 committed by Alexandre Julliard
parent cd345c10ba
commit f462e4140f
4 changed files with 105 additions and 52 deletions

View File

@ -333,6 +333,70 @@ static inline BOOL is_dynamic_dispid(DISPID id)
return DISPID_DYNPROP_0 <= id && id <= DISPID_DYNPROP_MAX; return DISPID_DYNPROP_0 <= id && id <= DISPID_DYNPROP_MAX;
} }
static HRESULT get_dynamic_prop(DispatchEx *This, const WCHAR *name, BOOL alloc, dynamic_prop_t **ret)
{
dispex_dynamic_data_t *data = This->dynamic_data;
if(data) {
unsigned i;
for(i=0; i < data->prop_cnt; i++) {
if(!strcmpW(data->props[i].name, name)) {
*ret = data->props+i;
return S_OK;
}
}
}
if(alloc) {
TRACE("creating dynamic prop %s\n", debugstr_w(name));
if(!data) {
data = This->dynamic_data = heap_alloc_zero(sizeof(dispex_dynamic_data_t));
if(!data)
return E_OUTOFMEMORY;
}
if(!data->buf_size) {
data->props = heap_alloc(sizeof(dynamic_prop_t)*4);
if(!data->props)
return E_OUTOFMEMORY;
data->buf_size = 4;
}else if(data->buf_size == data->prop_cnt) {
dynamic_prop_t *new_props;
new_props = heap_realloc(data->props, sizeof(dynamic_prop_t)*(data->buf_size<<1));
if(!new_props)
return E_OUTOFMEMORY;
data->props = new_props;
data->buf_size <<= 1;
}
data->props[data->prop_cnt].name = heap_strdupW(name);
VariantInit(&data->props[data->prop_cnt].var);
*ret = data->props + data->prop_cnt++;
return S_OK;
}
TRACE("not found %s\n", debugstr_w(name));
return DISP_E_UNKNOWNNAME;
}
HRESULT dispex_get_dprop_ref(DispatchEx *This, const WCHAR *name, BOOL alloc, VARIANT **ret)
{
dynamic_prop_t *prop;
HRESULT hres;
hres = get_dynamic_prop(This, name, alloc, &prop);
if(FAILED(hres))
return hres;
*ret = &prop->var;
return S_OK;
}
#define DISPATCHEX_THIS(iface) DEFINE_THIS(DispatchEx, IDispatchEx, iface) #define DISPATCHEX_THIS(iface) DEFINE_THIS(DispatchEx, IDispatchEx, iface)
static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv) static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
@ -418,8 +482,10 @@ static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
{ {
DispatchEx *This = DISPATCHEX_THIS(iface); DispatchEx *This = DISPATCHEX_THIS(iface);
dynamic_prop_t *dprop;
dispex_data_t *data; dispex_data_t *data;
int min, max, n, c; int min, max, n, c;
HRESULT hres;
TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid); TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid);
@ -451,17 +517,6 @@ static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DW
min = n+1; min = n+1;
} }
if(This->dynamic_data) {
unsigned i;
for(i=0; i < This->dynamic_data->prop_cnt; i++) {
if(!strcmpW(This->dynamic_data->props[i].name, bstrName)) {
*pid = DISPID_DYNPROP_0 + i;
return S_OK;
}
}
}
if(This->data->vtbl && This->data->vtbl->get_dispid) { if(This->data->vtbl && This->data->vtbl->get_dispid) {
HRESULT hres; HRESULT hres;
@ -470,46 +525,14 @@ static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DW
return hres; return hres;
} }
if(grfdex & fdexNameEnsure) { hres = get_dynamic_prop(This, bstrName, grfdex&fdexNameEnsure, &dprop);
dispex_dynamic_data_t *dynamic_data; if(FAILED(hres))
return hres;
TRACE("creating dynamic prop %s\n", debugstr_w(bstrName));
if(This->dynamic_data) {
dynamic_data = This->dynamic_data;
}else {
dynamic_data = This->dynamic_data = heap_alloc_zero(sizeof(dispex_dynamic_data_t));
if(!dynamic_data)
return E_OUTOFMEMORY;
}
if(!dynamic_data->buf_size) {
dynamic_data->props = heap_alloc(sizeof(dynamic_prop_t)*4);
if(!dynamic_data->props)
return E_OUTOFMEMORY;
dynamic_data->buf_size = 4;
}else if(dynamic_data->buf_size == dynamic_data->prop_cnt) {
dynamic_prop_t *new_props;
new_props = heap_realloc(dynamic_data->props, sizeof(dynamic_prop_t)*(dynamic_data->buf_size<<1));
if(!new_props)
return E_OUTOFMEMORY;
dynamic_data->props = new_props;
dynamic_data->buf_size <<= 1;
}
dynamic_data->props[dynamic_data->prop_cnt].name = heap_strdupW(bstrName);
VariantInit(&dynamic_data->props[dynamic_data->prop_cnt].var);
*pid = DISPID_DYNPROP_0 + dynamic_data->prop_cnt++;
*pid = DISPID_DYNPROP_0 + (dprop - This->dynamic_data->props);
return S_OK; return S_OK;
} }
TRACE("not found %s\n", debugstr_w(bstrName));
return DISP_E_UNKNOWNNAME;
}
static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
{ {

View File

@ -202,32 +202,57 @@ static HRESULT WINAPI HTMLElement3_get_hideFocus(IHTMLElement3 *iface, VARIANT_B
return E_NOTIMPL; return E_NOTIMPL;
} }
static const WCHAR disabledW[] = {'d','i','s','a','b','l','e','d',0};
static HRESULT WINAPI HTMLElement3_put_disabled(IHTMLElement3 *iface, VARIANT_BOOL v) static HRESULT WINAPI HTMLElement3_put_disabled(IHTMLElement3 *iface, VARIANT_BOOL v)
{ {
HTMLElement *This = HTMLELEM3_THIS(iface); HTMLElement *This = HTMLELEM3_THIS(iface);
VARIANT *var;
HRESULT hres;
TRACE("(%p)->(%x)\n", This, v); TRACE("(%p)->(%x)\n", This, v);
if(This->node.vtbl->put_disabled) if(This->node.vtbl->put_disabled)
return This->node.vtbl->put_disabled(&This->node, v); return This->node.vtbl->put_disabled(&This->node, v);
FIXME("No implementation for element\n"); hres = dispex_get_dprop_ref(&This->node.dispex, disabledW, TRUE, &var);
return E_NOTIMPL; if(FAILED(hres))
return hres;
VariantClear(var);
V_VT(var) = VT_BOOL;
V_BOOL(var) = v;
return S_OK;
} }
static HRESULT WINAPI HTMLElement3_get_disabled(IHTMLElement3 *iface, VARIANT_BOOL *p) static HRESULT WINAPI HTMLElement3_get_disabled(IHTMLElement3 *iface, VARIANT_BOOL *p)
{ {
HTMLElement *This = HTMLELEM3_THIS(iface); HTMLElement *This = HTMLELEM3_THIS(iface);
VARIANT *var;
HRESULT hres;
TRACE("(%p)->(%p)\n", This, p); TRACE("(%p)->(%p)\n", This, p);
if(This->node.vtbl->get_disabled) if(This->node.vtbl->get_disabled)
return This->node.vtbl->get_disabled(&This->node, p); return This->node.vtbl->get_disabled(&This->node, p);
FIXME("No implementation for element\n"); hres = dispex_get_dprop_ref(&This->node.dispex, disabledW, FALSE, &var);
if(hres == DISP_E_UNKNOWNNAME) {
*p = VARIANT_FALSE;
return S_OK;
}
if(FAILED(hres))
return hres;
if(V_VT(var) != VT_BOOL) {
FIXME("vt %d\n", V_VT(var));
return E_NOTIMPL; return E_NOTIMPL;
} }
*p = V_BOOL(var);
return S_OK;
}
static HRESULT WINAPI HTMLElement3_get_isDisabled(IHTMLElement3 *iface, VARIANT_BOOL *p) static HRESULT WINAPI HTMLElement3_get_isDisabled(IHTMLElement3 *iface, VARIANT_BOOL *p)
{ {
HTMLElement *This = HTMLELEM3_THIS(iface); HTMLElement *This = HTMLELEM3_THIS(iface);

View File

@ -151,6 +151,7 @@ typedef struct {
void init_dispex(DispatchEx*,IUnknown*,dispex_static_data_t*); void init_dispex(DispatchEx*,IUnknown*,dispex_static_data_t*);
BOOL dispex_query_interface(DispatchEx*,REFIID,void**); BOOL dispex_query_interface(DispatchEx*,REFIID,void**);
HRESULT dispex_get_dprop_ref(DispatchEx*,const WCHAR*,BOOL,VARIANT**);
typedef struct { typedef struct {
DispatchEx dispex; DispatchEx dispex;

View File

@ -2986,6 +2986,10 @@ static void test_elems(IHTMLDocument2 *doc)
IHTMLDOMChildrenCollection_Release(child_col); IHTMLDOMChildrenCollection_Release(child_col);
} }
test_elem3_get_disabled((IUnknown*)elem, VARIANT_FALSE);
test_elem3_set_disabled((IUnknown*)elem, VARIANT_TRUE);
test_elem3_set_disabled((IUnknown*)elem, VARIANT_FALSE);
IHTMLElement_Release(elem); IHTMLElement_Release(elem);
test_stylesheets(doc); test_stylesheets(doc);