static HRESULT WINAPI HTMLElement4_getAttributeNode(IHTMLElement4 *iface, BSTR bstrname, IHTMLDOMAttribute **ppAttribute) { HTMLElement *This = impl_from_IHTMLElement4(iface); HTMLAttributeCollection *attrs; HRESULT hres; TRACE("(%p)->(%s %p)\n", This, debugstr_w(bstrname), ppAttribute); hres = HTMLElement_get_attr_col(&This->node, &attrs); if(FAILED(hres)) return hres; hres = IHTMLAttributeCollection2_getNamedItem(&attrs->IHTMLAttributeCollection2_iface, bstrname, ppAttribute); IHTMLAttributeCollection_Release(&attrs->IHTMLAttributeCollection_iface); return hres; }
HRESULT HTMLDOMAttribute_Create(const WCHAR *name, HTMLElement *elem, DISPID dispid, HTMLDOMAttribute **attr) { HTMLAttributeCollection *col; HTMLDOMAttribute *ret; HRESULT hres; ret = heap_alloc_zero(sizeof(*ret)); if(!ret) return E_OUTOFMEMORY; ret->IHTMLDOMAttribute_iface.lpVtbl = &HTMLDOMAttributeVtbl; ret->IHTMLDOMAttribute2_iface.lpVtbl = &HTMLDOMAttribute2Vtbl; ret->ref = 1; ret->dispid = dispid; ret->elem = elem; init_dispex(&ret->dispex, (IUnknown*)&ret->IHTMLDOMAttribute_iface, &HTMLDOMAttribute_dispex); /* For attributes attached to an element, (elem,dispid) pair should be valid used for its operation. */ if(elem) { hres = HTMLElement_get_attr_col(&elem->node, &col); if(FAILED(hres)) { IHTMLDOMAttribute_Release(&ret->IHTMLDOMAttribute_iface); return hres; } IHTMLAttributeCollection_Release(&col->IHTMLAttributeCollection_iface); list_add_tail(&elem->attrs->attrs, &ret->entry); } /* For detached attributes we may still do most operations if we have its name available. */ if(name) { ret->name = heap_strdupW(name); if(!ret->name) { IHTMLDOMAttribute_Release(&ret->IHTMLDOMAttribute_iface); return E_OUTOFMEMORY; } } *attr = ret; return S_OK; }