diff --git a/dlls/mshtml/htmlattr.c b/dlls/mshtml/htmlattr.c
index ae9bbfeb95d..b52f9f9e60a 100644
--- a/dlls/mshtml/htmlattr.c
+++ b/dlls/mshtml/htmlattr.c
@@ -49,6 +49,8 @@ static HRESULT WINAPI HTMLDOMAttribute_QueryInterface(IHTMLDOMAttribute *iface,
*ppv = &This->IHTMLDOMAttribute_iface;
}else if(IsEqualGUID(&IID_IHTMLDOMAttribute, riid)) {
*ppv = &This->IHTMLDOMAttribute_iface;
+ }else if(IsEqualGUID(&IID_IHTMLDOMAttribute2, riid)) {
+ *ppv = &This->IHTMLDOMAttribute2_iface;
}else if(dispex_query_interface(&This->dispex, riid, ppv)) {
return *ppv ? S_OK : E_NOINTERFACE;
}else {
@@ -235,8 +237,229 @@ static const IHTMLDOMAttributeVtbl HTMLDOMAttributeVtbl = {
HTMLDOMAttribute_get_specified
};
+static inline HTMLDOMAttribute *impl_from_IHTMLDOMAttribute2(IHTMLDOMAttribute2 *iface)
+{
+ return CONTAINING_RECORD(iface, HTMLDOMAttribute, IHTMLDOMAttribute2_iface);
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_QueryInterface(IHTMLDOMAttribute2 *iface, REFIID riid, void **ppv)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ return IHTMLDOMAttribute_QueryInterface(&This->IHTMLDOMAttribute_iface, riid, ppv);
+}
+
+static ULONG WINAPI HTMLDOMAttribute2_AddRef(IHTMLDOMAttribute2 *iface)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ return IHTMLDOMAttribute_AddRef(&This->IHTMLDOMAttribute_iface);
+}
+
+static ULONG WINAPI HTMLDOMAttribute2_Release(IHTMLDOMAttribute2 *iface)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ return IHTMLDOMAttribute_Release(&This->IHTMLDOMAttribute_iface);
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_GetTypeInfoCount(IHTMLDOMAttribute2 *iface, UINT *pctinfo)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo);
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_GetTypeInfo(IHTMLDOMAttribute2 *iface, UINT iTInfo,
+ LCID lcid, ITypeInfo **ppTInfo)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_GetIDsOfNames(IHTMLDOMAttribute2 *iface, REFIID riid,
+ LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames, cNames,
+ lcid, rgDispId);
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_Invoke(IHTMLDOMAttribute2 *iface, DISPID dispIdMember,
+ REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
+ VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, lcid,
+ wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_get_name(IHTMLDOMAttribute2 *iface, BSTR *p)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ FIXME("(%p)->(%p)\n", This, p);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_put_value(IHTMLDOMAttribute2 *iface, BSTR v)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ FIXME("(%p)->(%s)\n", This, debugstr_w(v));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_get_value(IHTMLDOMAttribute2 *iface, BSTR *p)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ FIXME("(%p)->(%p)\n", This, p);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_get_expando(IHTMLDOMAttribute2 *iface, VARIANT_BOOL *p)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ FIXME("(%p)->(%p)\n", This, p);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_get_nodeType(IHTMLDOMAttribute2 *iface, LONG *p)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ FIXME("(%p)->(%p)\n", This, p);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_get_parentNode(IHTMLDOMAttribute2 *iface, IHTMLDOMNode **p)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ FIXME("(%p)->(%p)\n", This, p);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_get_childNodes(IHTMLDOMAttribute2 *iface, IDispatch **p)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ FIXME("(%p)->(%p)\n", This, p);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_get_firstChild(IHTMLDOMAttribute2 *iface, IHTMLDOMNode **p)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ FIXME("(%p)->(%p)\n", This, p);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_get_lastChild(IHTMLDOMAttribute2 *iface, IHTMLDOMNode **p)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ FIXME("(%p)->(%p)\n", This, p);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_get_previousSibling(IHTMLDOMAttribute2 *iface, IHTMLDOMNode **p)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ FIXME("(%p)->(%p)\n", This, p);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_get_nextSibling(IHTMLDOMAttribute2 *iface, IHTMLDOMNode **p)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ FIXME("(%p)->(%p)\n", This, p);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_get_attributes(IHTMLDOMAttribute2 *iface, IDispatch **p)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ FIXME("(%p)->(%p)\n", This, p);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_get_ownerDocument(IHTMLDOMAttribute2 *iface, IDispatch **p)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ FIXME("(%p)->(%p)\n", This, p);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_insertBefore(IHTMLDOMAttribute2 *iface, IHTMLDOMNode *newChild,
+ VARIANT refChild, IHTMLDOMNode **node)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ FIXME("(%p)->(%p %s %p)\n", This, newChild, debugstr_variant(&refChild), node);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_replaceChild(IHTMLDOMAttribute2 *iface, IHTMLDOMNode *newChild,
+ IHTMLDOMNode *oldChild, IHTMLDOMNode **node)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ FIXME("(%p)->(%p %p %p)\n", This, newChild, oldChild, node);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_removeChild(IHTMLDOMAttribute2 *iface, IHTMLDOMNode *oldChild,
+ IHTMLDOMNode **node)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ FIXME("(%p)->(%p %p)\n", This, oldChild, node);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_appendChild(IHTMLDOMAttribute2 *iface, IHTMLDOMNode *newChild,
+ IHTMLDOMNode **node)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ FIXME("(%p)->(%p %p)\n", This, newChild, node);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_hasChildNodes(IHTMLDOMAttribute2 *iface, VARIANT_BOOL *fChildren)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ FIXME("(%p)->(%p)\n", This, fChildren);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMAttribute2_cloneNode(IHTMLDOMAttribute2 *iface, VARIANT_BOOL fDeep,
+ IHTMLDOMAttribute **clonedNode)
+{
+ HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface);
+ FIXME("(%p)->(%x %p)\n", This, fDeep, clonedNode);
+ return E_NOTIMPL;
+}
+
+static const IHTMLDOMAttribute2Vtbl HTMLDOMAttribute2Vtbl = {
+ HTMLDOMAttribute2_QueryInterface,
+ HTMLDOMAttribute2_AddRef,
+ HTMLDOMAttribute2_Release,
+ HTMLDOMAttribute2_GetTypeInfoCount,
+ HTMLDOMAttribute2_GetTypeInfo,
+ HTMLDOMAttribute2_GetIDsOfNames,
+ HTMLDOMAttribute2_Invoke,
+ HTMLDOMAttribute2_get_name,
+ HTMLDOMAttribute2_put_value,
+ HTMLDOMAttribute2_get_value,
+ HTMLDOMAttribute2_get_expando,
+ HTMLDOMAttribute2_get_nodeType,
+ HTMLDOMAttribute2_get_parentNode,
+ HTMLDOMAttribute2_get_childNodes,
+ HTMLDOMAttribute2_get_firstChild,
+ HTMLDOMAttribute2_get_lastChild,
+ HTMLDOMAttribute2_get_previousSibling,
+ HTMLDOMAttribute2_get_nextSibling,
+ HTMLDOMAttribute2_get_attributes,
+ HTMLDOMAttribute2_get_ownerDocument,
+ HTMLDOMAttribute2_insertBefore,
+ HTMLDOMAttribute2_replaceChild,
+ HTMLDOMAttribute2_removeChild,
+ HTMLDOMAttribute2_appendChild,
+ HTMLDOMAttribute2_hasChildNodes,
+ HTMLDOMAttribute2_cloneNode
+};
+
static const tid_t HTMLDOMAttribute_iface_tids[] = {
IHTMLDOMAttribute_tid,
+ IHTMLDOMAttribute2_tid,
0
};
static dispex_static_data_t HTMLDOMAttribute_dispex = {
@@ -257,6 +480,7 @@ HRESULT HTMLDOMAttribute_Create(const WCHAR *name, HTMLElement *elem, DISPID dis
return E_OUTOFMEMORY;
ret->IHTMLDOMAttribute_iface.lpVtbl = &HTMLDOMAttributeVtbl;
+ ret->IHTMLDOMAttribute2_iface.lpVtbl = &HTMLDOMAttribute2Vtbl;
ret->ref = 1;
ret->dispid = dispid;
ret->elem = elem;
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index fac3c64676d..2156d90d344 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -135,6 +135,7 @@ typedef struct event_target_t event_target_t;
XIID(IHTMLDocument4) \
XIID(IHTMLDocument5) \
XIID(IHTMLDOMAttribute) \
+ XIID(IHTMLDOMAttribute2) \
XIID(IHTMLDOMChildrenCollection) \
XIID(IHTMLDOMImplementation) \
XIID(IHTMLDOMNode) \
@@ -902,6 +903,7 @@ struct HTMLAttributeCollection {
typedef struct {
DispatchEx dispex;
IHTMLDOMAttribute IHTMLDOMAttribute_iface;
+ IHTMLDOMAttribute2 IHTMLDOMAttribute2_iface;
LONG ref;
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index 37749a0e3b3..7ddfb77a96e 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -270,6 +270,7 @@ static const IID * const text_iids[] = {
static const IID * const attr_iids[] = {
&IID_IHTMLDOMAttribute,
+ &IID_IHTMLDOMAttribute2,
&IID_IDispatchEx,
NULL
};