diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index ff8d02253cd..8b5b7f0111d 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -2269,9 +2269,10 @@ static inline HRESULT get_attr_dispid_by_name(HTMLAttributeCollection *This, BST return hres; } -static inline HRESULT get_domattr(HTMLAttributeCollection *This, DISPID id, HTMLDOMAttribute **attr) +static inline HRESULT get_domattr(HTMLAttributeCollection *This, DISPID id, LONG *list_pos, HTMLDOMAttribute **attr) { HTMLDOMAttribute *iter; + LONG pos = 0; HRESULT hres; *attr = NULL; @@ -2280,6 +2281,7 @@ static inline HRESULT get_domattr(HTMLAttributeCollection *This, DISPID id, HTML *attr = iter; break; } + pos++; } if(!*attr) { @@ -2288,12 +2290,15 @@ static inline HRESULT get_domattr(HTMLAttributeCollection *This, DISPID id, HTML return E_UNEXPECTED; } + pos++; hres = HTMLDOMAttribute_Create(This->elem, id, attr); if(FAILED(hres)) return hres; } IHTMLDOMAttribute_AddRef(&(*attr)->IHTMLDOMAttribute_iface); + if(list_pos) + *list_pos = pos; return S_OK; } @@ -2341,7 +2346,7 @@ static HRESULT WINAPI HTMLAttributeCollection_item(IHTMLAttributeCollection *ifa if(FAILED(hres)) return hres; - hres = get_domattr(This, id, &attr); + hres = get_domattr(This, id, NULL, &attr); if(FAILED(hres)) return hres; @@ -2433,7 +2438,7 @@ static HRESULT WINAPI HTMLAttributeCollection2_getNamedItem(IHTMLAttributeCollec return hres; } - hres = get_domattr(This, id, &attr); + hres = get_domattr(This, id, NULL, &attr); if(FAILED(hres)) return hres; @@ -2561,7 +2566,7 @@ static HRESULT WINAPI HTMLAttributeCollection3_item(IHTMLAttributeCollection3 *i if(FAILED(hres)) return hres; - hres = get_domattr(This, id, &attr); + hres = get_domattr(This, id, NULL, &attr); if(FAILED(hres)) return hres; @@ -2598,8 +2603,23 @@ static inline HTMLAttributeCollection *HTMLAttributeCollection_from_DispatchEx(D static HRESULT HTMLAttributeCollection_get_dispid(DispatchEx *dispex, BSTR name, DWORD flags, DISPID *dispid) { HTMLAttributeCollection *This = HTMLAttributeCollection_from_DispatchEx(dispex); - FIXME("(%p)->(%s %x %p)\n", This, debugstr_w(name), flags, dispid); - return E_NOTIMPL; + HTMLDOMAttribute *attr; + LONG pos; + HRESULT hres; + + TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(name), flags, dispid); + + hres = get_attr_dispid_by_name(This, name, dispid); + if(FAILED(hres)) + return hres; + + hres = get_domattr(This, *dispid, &pos, &attr); + if(FAILED(hres)) + return hres; + IHTMLDOMAttribute_Release(&attr->IHTMLDOMAttribute_iface); + + *dispid = MSHTML_DISPID_CUSTOM_MIN+pos; + return S_OK; } static HRESULT HTMLAttributeCollection_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params,