From: Jacek Caban jacek@codeweavers.com
--- include/mshtmdid.h | 10 ++++++ include/mshtml.idl | 76 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+)
diff --git a/include/mshtmdid.h b/include/mshtmdid.h index 8bb1252c50f..45b22f6349f 100644 --- a/include/mshtmdid.h +++ b/include/mshtmdid.h @@ -1792,6 +1792,16 @@ #define DISPID_IHTMLATTRIBUTECOLLECTION3_IE8_ITEM DISPID_IE8_NAMEDNODEMAP+4 #define DISPID_IHTMLATTRIBUTECOLLECTION3_IE8_LENGTH DISPID_IE8_NAMEDNODEMAP+3
+/* IHTMLAttributeCollection4 */ +#define DISPID_IHTMLATTRIBUTECOLLECTION4_GETNAMEDITEMNS DISPID_IE8_NAMEDNODEMAP+5 +#define DISPID_IHTMLATTRIBUTECOLLECTION4_SETNAMEDITEMNS DISPID_IE8_NAMEDNODEMAP+6 +#define DISPID_IHTMLATTRIBUTECOLLECTION4_REMOVENAMEDITEMNS DISPID_IE8_NAMEDNODEMAP+7 +#define DISPID_IHTMLATTRIBUTECOLLECTION4_IE9_GETNAMEDITEM DISPID_IE8_NAMEDNODEMAP+8 +#define DISPID_IHTMLATTRIBUTECOLLECTION4_IE9_SETNAMEDITEM DISPID_IE8_NAMEDNODEMAP+9 +#define DISPID_IHTMLATTRIBUTECOLLECTION4_IE9_REMOVENAMEDITEM DISPID_IE8_NAMEDNODEMAP+10 +#define DISPID_IHTMLATTRIBUTECOLLECTION4_IE9_ITEM DISPID_IE8_NAMEDNODEMAP+11 +#define DISPID_IHTMLATTRIBUTECOLLECTION4_IE9_LENGTH DISPID_IE8_NAMEDNODEMAP+12 + /* IHTMLDOMChildrenCollection */ #define DISPID_IHTMLDOMCHILDRENCOLLECTION_LENGTH DISPID_COLLECTION #define DISPID_IHTMLDOMCHILDRENCOLLECTION__NEWENUM DISPID_NEWENUM diff --git a/include/mshtml.idl b/include/mshtml.idl index 68e49a0f012..1d2896f88b8 100644 --- a/include/mshtml.idl +++ b/include/mshtml.idl @@ -8958,6 +8958,58 @@ interface IHTMLAttributeCollection3 : IDispatch HRESULT length([retval, out] long *p); }
+/***************************************************************************** + * IHTMLAttributeCollection4 interface + */ +[ + odl, + oleautomation, + dual, + uuid(305106fa-98b5-11cf-bb82-00aa00bdce0b) +] +interface IHTMLAttributeCollection4 : IDispatch +{ + [id(DISPID_IHTMLATTRIBUTECOLLECTION4_GETNAMEDITEMNS)] + HRESULT getNamedItemNS( + [in] VARIANT *pvarNS, + [in] BSTR bstrName, + [out, retval] IHTMLDOMAttribute2 **ppNodeOut); + + [id(DISPID_IHTMLATTRIBUTECOLLECTION4_SETNAMEDITEMNS)] + HRESULT setNamedItemNS( + [in] IHTMLDOMAttribute2 *pNodeIn, + [out, retval] IHTMLDOMAttribute2 **ppNodeOut); + + [id(DISPID_IHTMLATTRIBUTECOLLECTION4_REMOVENAMEDITEMNS)] + HRESULT removeNamedItemNS( + [in] VARIANT *pvarNS, + [in] BSTR bstrName, + [out, retval] IHTMLDOMAttribute2 **ppNodeOut); + + [id(DISPID_IHTMLATTRIBUTECOLLECTION4_IE9_GETNAMEDITEM)] + HRESULT getNamedItem( + [in] BSTR bstrName, + [out, retval] IHTMLDOMAttribute2 **ppNodeOut); + + [id(DISPID_IHTMLATTRIBUTECOLLECTION4_IE9_SETNAMEDITEM)] + HRESULT setNamedItem( + [in] IHTMLDOMAttribute2 *pNodeIn, + [out, retval] IHTMLDOMAttribute2 **ppNodeOut); + + [id(DISPID_IHTMLATTRIBUTECOLLECTION4_IE9_REMOVENAMEDITEM)] + HRESULT removeNamedItem( + [in] BSTR bstrName, + [out, retval] IHTMLDOMAttribute2 **ppNodeOut); + + [id(DISPID_IHTMLATTRIBUTECOLLECTION4_IE9_ITEM)] + HRESULT item( + [in] long index, + [out, retval] IHTMLDOMAttribute2 **ppNodeOut); + + [propget, id(DISPID_IHTMLATTRIBUTECOLLECTION4_IE9_LENGTH)] + HRESULT length([out, retval] long *p); +} + /***************************************************************************** * DispHTMLAttributeCollection dispinterface */ @@ -9002,6 +9054,30 @@ methods: [propget, id(DISPID_IHTMLATTRIBUTECOLLECTION3_IE8_LENGTH)] long ie8_length();
+ [id(DISPID_IHTMLATTRIBUTECOLLECTION4_GETNAMEDITEMNS)] + IHTMLDOMAttribute2 *getNamedItemNS([in] VARIANT *pvarNS, [in] BSTR bstrName); + + [id(DISPID_IHTMLATTRIBUTECOLLECTION4_SETNAMEDITEMNS)] + IHTMLDOMAttribute2 *setNamedItemNS([in] IHTMLDOMAttribute2 *pNodeIn); + + [id(DISPID_IHTMLATTRIBUTECOLLECTION4_REMOVENAMEDITEMNS)] + IHTMLDOMAttribute2 *removeNamedItemNS([in] VARIANT *pvarNS, [in] BSTR bstrName); + + [id(DISPID_IHTMLATTRIBUTECOLLECTION4_IE9_GETNAMEDITEM)] + IHTMLDOMAttribute2 *ie9_getNamedItem([in] BSTR bstrName); + + [id(DISPID_IHTMLATTRIBUTECOLLECTION4_IE9_SETNAMEDITEM)] + IHTMLDOMAttribute2 *ie9_setNamedItem([in] IHTMLDOMAttribute2 *pNodeIn); + + [id(DISPID_IHTMLATTRIBUTECOLLECTION4_IE9_REMOVENAMEDITEM)] + IHTMLDOMAttribute2 *ie9_removeNamedItem([in] BSTR bstrName); + + [id(DISPID_IHTMLATTRIBUTECOLLECTION4_IE9_ITEM)] + IHTMLDOMAttribute2 *ie9_item([in] long index); + + [propget, id(DISPID_IHTMLATTRIBUTECOLLECTION4_IE9_LENGTH)] + long ie9_length(); + [propget, id(DISPID_IHTMLDOMCONSTRUCTOR_CONSTRUCTOR), hidden] IDispatch *constructor(); }
From: Jacek Caban jacek@codeweavers.com
--- dlls/mshtml/htmlelem.c | 91 ++++++++++++++++++++++++++++++++++++ dlls/mshtml/mshtml_private.h | 2 + dlls/mshtml/tests/dom.c | 12 +++++ 3 files changed, 105 insertions(+)
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index a46a71755d9..22ac9fec0dc 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -8231,6 +8231,94 @@ static const IHTMLAttributeCollection3Vtbl HTMLAttributeCollection3Vtbl = { HTMLAttributeCollection3_get_length };
+static inline HTMLAttributeCollection *impl_from_IHTMLAttributeCollection4(IHTMLAttributeCollection4 *iface) +{ + return CONTAINING_RECORD(iface, HTMLAttributeCollection, IHTMLAttributeCollection4_iface); +} + +DISPEX_IDISPATCH_IMPL(HTMLAttributeCollection4, IHTMLAttributeCollection4, + impl_from_IHTMLAttributeCollection4(iface)->dispex) + +static HRESULT WINAPI HTMLAttributeCollection4_getNamedItemNS(IHTMLAttributeCollection4 *iface, VARIANT *ns, + BSTR name, IHTMLDOMAttribute2 **p) +{ + HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection4(iface); + FIXME("(%p)->(%s %p)\n", This, debugstr_w(name), p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLAttributeCollection4_setNamedItemNS(IHTMLAttributeCollection4 *iface, + IHTMLDOMAttribute2 *node, IHTMLDOMAttribute2 **p) +{ + HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection4(iface); + FIXME("(%p)->(%p %p)\n", This, node, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLAttributeCollection4_removeNamedItemNS(IHTMLAttributeCollection4 *iface, VARIANT *ns, + BSTR name, IHTMLDOMAttribute2 **p) +{ + HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection4(iface); + FIXME("(%p)->(%s %p)\n", This, debugstr_w(name), p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLAttributeCollection4_getNamedItem(IHTMLAttributeCollection4 *iface, BSTR name, + IHTMLDOMAttribute2 **p) +{ + HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection4(iface); + FIXME("(%p)->(%s %p)\n", This, debugstr_w(name), p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLAttributeCollection4_setNamedItem(IHTMLAttributeCollection4 *iface, + IHTMLDOMAttribute2 *node, IHTMLDOMAttribute2 **p) +{ + HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection4(iface); + FIXME("(%p)->(%p %p)\n", This, node, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLAttributeCollection4_removeNamedItem(IHTMLAttributeCollection4 *iface, + BSTR name, IHTMLDOMAttribute2 **p) +{ + HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection4(iface); + FIXME("(%p)->(%s %p)\n", This, debugstr_w(name), p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLAttributeCollection4_item(IHTMLAttributeCollection4 *iface, LONG index, IHTMLDOMAttribute2 **p) +{ + HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection4(iface); + FIXME("(%p)->(%ld %p)\n", This, index, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLAttributeCollection4_get_length(IHTMLAttributeCollection4 *iface, LONG *p) +{ + HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection4(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static const IHTMLAttributeCollection4Vtbl HTMLAttributeCollection4Vtbl = { + HTMLAttributeCollection4_QueryInterface, + HTMLAttributeCollection4_AddRef, + HTMLAttributeCollection4_Release, + HTMLAttributeCollection4_GetTypeInfoCount, + HTMLAttributeCollection4_GetTypeInfo, + HTMLAttributeCollection4_GetIDsOfNames, + HTMLAttributeCollection4_Invoke, + HTMLAttributeCollection4_getNamedItemNS, + HTMLAttributeCollection4_setNamedItemNS, + HTMLAttributeCollection4_removeNamedItemNS, + HTMLAttributeCollection4_getNamedItem, + HTMLAttributeCollection4_setNamedItem, + HTMLAttributeCollection4_removeNamedItem, + HTMLAttributeCollection4_item, + HTMLAttributeCollection4_get_length +}; + static inline HTMLAttributeCollection *HTMLAttributeCollection_from_DispatchEx(DispatchEx *iface) { return CONTAINING_RECORD(iface, HTMLAttributeCollection, dispex); @@ -8246,6 +8334,8 @@ static void *HTMLAttributeCollection_query_interface(DispatchEx *dispex, REFIID return &This->IHTMLAttributeCollection2_iface; if(IsEqualGUID(&IID_IHTMLAttributeCollection3, riid)) return &This->IHTMLAttributeCollection3_iface; + if(IsEqualGUID(&IID_IHTMLAttributeCollection4, riid)) + return &This->IHTMLAttributeCollection4_iface;
return NULL; } @@ -8382,6 +8472,7 @@ HRESULT HTMLElement_get_attr_col(HTMLDOMNode *iface, HTMLAttributeCollection **a This->attrs->IHTMLAttributeCollection_iface.lpVtbl = &HTMLAttributeCollectionVtbl; This->attrs->IHTMLAttributeCollection2_iface.lpVtbl = &HTMLAttributeCollection2Vtbl; This->attrs->IHTMLAttributeCollection3_iface.lpVtbl = &HTMLAttributeCollection3Vtbl; + This->attrs->IHTMLAttributeCollection4_iface.lpVtbl = &HTMLAttributeCollection4Vtbl;
IHTMLDOMNode_AddRef(&This->node.IHTMLDOMNode_iface); This->attrs->elem = This; diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index fe18f01e553..5a067967a8b 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -183,6 +183,7 @@ struct constructor; XIID(IHTMLAttributeCollection) \ XIID(IHTMLAttributeCollection2) \ XIID(IHTMLAttributeCollection3) \ + XIID(IHTMLAttributeCollection4) \ XIID(IHTMLBodyElement) \ XIID(IHTMLBodyElement2) \ XIID(IHTMLButtonElement) \ @@ -1329,6 +1330,7 @@ struct HTMLAttributeCollection { IHTMLAttributeCollection IHTMLAttributeCollection_iface; IHTMLAttributeCollection2 IHTMLAttributeCollection2_iface; IHTMLAttributeCollection3 IHTMLAttributeCollection3_iface; + IHTMLAttributeCollection4 IHTMLAttributeCollection4_iface;
HTMLElement *elem; struct list attrs; diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 914267c67a1..cd13f73ba17 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -510,6 +510,17 @@ static const IID * const computed_style_iids[] = { NULL };
+static const IID * const attr_col_iids[] = { + &IID_IUnknown, + &IID_IDispatch, + &IID_IDispatchEx, + &IID_IHTMLAttributeCollection, + &IID_IHTMLAttributeCollection2, + &IID_IHTMLAttributeCollection3, + &IID_IHTMLAttributeCollection4, + NULL +}; + static const IID * const img_factory_iids[] = { &IID_IUnknown, &IID_IDispatch, @@ -3883,6 +3894,7 @@ static void test_attr_collection(IHTMLElement *elem) hres = IHTMLDOMNode_get_attributes(node, &attr); ok(hres == S_OK, "get_attributes failed: %08lx\n", hres); ok(iface_cmp((IUnknown*)disp, (IUnknown*)attr), "disp != attr\n"); + test_ifaces((IUnknown *)attr, attr_col_iids); IDispatch_Release(attr); IHTMLDOMNode_Release(node);