mshtml: Added HTMLAttributeCollection_item implementation.

This commit is contained in:
Piotr Caban 2011-08-25 15:25:26 +02:00 committed by Alexandre Julliard
parent 7b37a1bd00
commit e1dcafc6be
1 changed files with 99 additions and 4 deletions

View File

@ -2262,11 +2262,90 @@ static HRESULT WINAPI HTMLAttributeCollection__newEnum(IHTMLAttributeCollection
return E_NOTIMPL; return E_NOTIMPL;
} }
static inline HRESULT get_attr_dispid_by_idx(HTMLAttributeCollection *This, LONG index, DISPID *id)
{
if(index<0 || index>=This->size)
return DISP_E_UNKNOWNNAME;
*id = This->collection[index];
return S_OK;
}
static inline HRESULT get_attr_dispid_by_name(HTMLAttributeCollection *This, BSTR name, DISPID *id)
{
HRESULT hres;
if(name[0]>='0' && name[0]<='9') {
WCHAR *end_ptr;
LONG idx;
idx = strtoulW(name, &end_ptr, 10);
if(!*end_ptr) {
hres = get_attr_dispid_by_idx(This, idx, id);
if(SUCCEEDED(hres))
return hres;
}
}
hres = IDispatchEx_GetDispID(&This->elem->node.dispex.IDispatchEx_iface,
name, fdexNameCaseInsensitive, id);
return hres;
}
static inline HRESULT get_domattr(HTMLElement *elem, DISPID id, HTMLDOMAttribute **attr)
{
HTMLDOMAttribute *iter;
HRESULT hres;
*attr = NULL;
LIST_FOR_EACH_ENTRY(iter, &elem->attrs, HTMLDOMAttribute, entry) {
if(iter->dispid == id) {
*attr = iter;
break;
}
}
if(!*attr) {
hres = HTMLDOMAttribute_Create(elem, id, attr);
if(FAILED(hres))
return hres;
}
IHTMLDOMAttribute_AddRef(&(*attr)->IHTMLDOMAttribute_iface);
return S_OK;
}
static HRESULT WINAPI HTMLAttributeCollection_item(IHTMLAttributeCollection *iface, VARIANT *name, IDispatch **ppItem) static HRESULT WINAPI HTMLAttributeCollection_item(IHTMLAttributeCollection *iface, VARIANT *name, IDispatch **ppItem)
{ {
HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection(iface); HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection(iface);
FIXME("(%p)->(%s, %p)\n", This, debugstr_variant(name), ppItem); HTMLDOMAttribute *attr;
return E_NOTIMPL; DISPID id;
HRESULT hres;
TRACE("(%p)->(%s %p)\n", This, debugstr_variant(name), ppItem);
switch(V_VT(name)) {
case VT_I4:
hres = get_attr_dispid_by_idx(This, V_I4(name), &id);
break;
case VT_BSTR:
hres = get_attr_dispid_by_name(This, V_BSTR(name), &id);
break;
default:
FIXME("unsupported vt %x\n", V_VT(name));
hres = E_NOTIMPL;
}
if(hres == DISP_E_UNKNOWNNAME)
return E_INVALIDARG;
if(FAILED(hres))
return hres;
hres = get_domattr(This->elem, id, &attr);
if(FAILED(hres))
return hres;
*ppItem = (IDispatch*)&attr->IHTMLDOMAttribute_iface;
return S_OK;
} }
static const IHTMLAttributeCollectionVtbl HTMLAttributeCollectionVtbl = { static const IHTMLAttributeCollectionVtbl HTMLAttributeCollectionVtbl = {
@ -2452,8 +2531,24 @@ static HRESULT WINAPI HTMLAttributeCollection3_removeNamedItem(IHTMLAttributeCol
static HRESULT WINAPI HTMLAttributeCollection3_item(IHTMLAttributeCollection3 *iface, LONG index, IHTMLDOMAttribute **ppNodeOut) static HRESULT WINAPI HTMLAttributeCollection3_item(IHTMLAttributeCollection3 *iface, LONG index, IHTMLDOMAttribute **ppNodeOut)
{ {
HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection3(iface); HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection3(iface);
FIXME("(%p)->(%d %p)\n", This, index, ppNodeOut); HTMLDOMAttribute *attr;
return E_NOTIMPL; DISPID id;
HRESULT hres;
TRACE("(%p)->(%d %p)\n", This, index, ppNodeOut);
hres = get_attr_dispid_by_idx(This, index, &id);
if(hres == DISP_E_UNKNOWNNAME)
return E_INVALIDARG;
if(FAILED(hres))
return hres;
hres = get_domattr(This->elem, id, &attr);
if(FAILED(hres))
return hres;
*ppNodeOut = &attr->IHTMLDOMAttribute_iface;
return S_OK;
} }
static HRESULT WINAPI HTMLAttributeCollection3_get_length(IHTMLAttributeCollection3 *iface, LONG *p) static HRESULT WINAPI HTMLAttributeCollection3_get_length(IHTMLAttributeCollection3 *iface, LONG *p)