diff --git a/dlls/mshtml/htmlanchor.c b/dlls/mshtml/htmlanchor.c
index 7422de7847a51a6658bab8809277978aac944093..a1dc8c35ff662d54e3b0dac5826476b6dfd950c1 100644
--- a/dlls/mshtml/htmlanchor.c
+++ b/dlls/mshtml/htmlanchor.c
@@ -598,6 +598,7 @@ static const NodeImplVtbl HTMLAnchorElementImplVtbl = {
     HTMLAnchorElement_QI,
     HTMLAnchorElement_destructor,
     HTMLElement_clone,
+    HTMLElement_get_attr_col,
     NULL,
     NULL,
     HTMLAnchorElement_handle_event
diff --git a/dlls/mshtml/htmlbody.c b/dlls/mshtml/htmlbody.c
index cbc9abf24dc0e247cd706e4d218a6e7ef520e1ad..bb3e85bd1080f23135562b186f8493fa44e110a6 100644
--- a/dlls/mshtml/htmlbody.c
+++ b/dlls/mshtml/htmlbody.c
@@ -786,6 +786,7 @@ static const NodeImplVtbl HTMLBodyElementImplVtbl = {
     HTMLBodyElement_QI,
     HTMLBodyElement_destructor,
     HTMLElement_clone,
+    HTMLElement_get_attr_col,
     HTMLBodyElement_get_event_target
 };
 
diff --git a/dlls/mshtml/htmlcomment.c b/dlls/mshtml/htmlcomment.c
index e97127e71a052a474a2c22bcb700b99b960042ed..525f0dbf7f75e36d5db9df71b8e79962ec173a37 100644
--- a/dlls/mshtml/htmlcomment.c
+++ b/dlls/mshtml/htmlcomment.c
@@ -172,7 +172,8 @@ static void HTMLCommentElement_destructor(HTMLDOMNode *iface)
 static const NodeImplVtbl HTMLCommentElementImplVtbl = {
     HTMLCommentElement_QI,
     HTMLCommentElement_destructor,
-    HTMLElement_clone
+    HTMLElement_clone,
+    HTMLElement_get_attr_col
 };
 
 static const tid_t HTMLCommentElement_iface_tids[] = {
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index bb0ac99adc2be23db8f191398186400fc7f286f9..5f77e6804e8ff8d2f6002dc2407a6d184bd5a572 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -1731,7 +1731,8 @@ HRESULT HTMLElement_clone(HTMLDOMNode *iface, nsIDOMNode *nsnode, HTMLDOMNode **
 static const NodeImplVtbl HTMLElementImplVtbl = {
     HTMLElement_QI,
     HTMLElement_destructor,
-    HTMLElement_clone
+    HTMLElement_clone,
+    HTMLElement_get_attr_col
 };
 
 static inline HTMLElement *impl_from_DispatchEx(DispatchEx *iface)
@@ -2113,3 +2114,190 @@ static IHTMLFiltersCollection *HTMLFiltersCollection_Create(void)
 
     return &ret->IHTMLFiltersCollection_iface;
 }
+
+/* interface IHTMLAttributeCollection */
+static inline HTMLAttributeCollection *impl_from_IHTMLAttributeCollection(IHTMLAttributeCollection *iface)
+{
+    return CONTAINING_RECORD(iface, HTMLAttributeCollection, IHTMLAttributeCollection_iface);
+}
+
+static HRESULT WINAPI HTMLAttributeCollection_QueryInterface(IHTMLAttributeCollection *iface, REFIID riid, void **ppv)
+{
+    HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection(iface);
+
+    *ppv = NULL;
+
+    if(IsEqualGUID(&IID_IUnknown, riid)) {
+        TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
+        *ppv = &This->IHTMLAttributeCollection_iface;
+    }else if(IsEqualGUID(&IID_IHTMLAttributeCollection, riid)) {
+        TRACE("(%p)->(IID_IHTMLAttributeCollection %p)\n", This, ppv);
+        *ppv = &This->IHTMLAttributeCollection_iface;
+    }else if(IsEqualGUID(&IID_IHTMLAttributeCollection2, riid)) {
+        FIXME("(%p)->(IID_IHTMLAttributeCollection2 %p)\n", This, ppv);
+    }else if(IsEqualGUID(&IID_IHTMLAttributeCollection3, riid)) {
+        FIXME("(%p)->(IID_IHTMLAttributeCollection3 %p)\n", This, ppv);
+    }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
+        return *ppv ? S_OK : E_NOINTERFACE;
+    }
+
+    if(*ppv) {
+        IUnknown_AddRef((IUnknown*)*ppv);
+        return S_OK;
+    }
+
+    WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI HTMLAttributeCollection_AddRef(IHTMLAttributeCollection *iface)
+{
+    HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection(iface);
+    LONG ref = InterlockedIncrement(&This->ref);
+
+    TRACE("(%p) ref=%d\n", This, ref);
+
+    return ref;
+}
+
+static ULONG WINAPI HTMLAttributeCollection_Release(IHTMLAttributeCollection *iface)
+{
+    HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection(iface);
+    LONG ref = InterlockedDecrement(&This->ref);
+
+    TRACE("(%p) ref=%d\n", This, ref);
+
+    if(!ref) {
+        IHTMLElement_Release(&This->elem->IHTMLElement_iface);
+        heap_free(This);
+    }
+
+    return ref;
+}
+
+static HRESULT WINAPI HTMLAttributeCollection_GetTypeInfoCount(IHTMLAttributeCollection *iface, UINT *pctinfo)
+{
+    HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection(iface);
+    return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo);
+}
+
+static HRESULT WINAPI HTMLAttributeCollection_GetTypeInfo(IHTMLAttributeCollection *iface, UINT iTInfo,
+        LCID lcid, ITypeInfo **ppTInfo)
+{
+    HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection(iface);
+    return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
+}
+
+static HRESULT WINAPI HTMLAttributeCollection_GetIDsOfNames(IHTMLAttributeCollection *iface, REFIID riid,
+        LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
+{
+    HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection(iface);
+    return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames, cNames,
+            lcid, rgDispId);
+}
+
+static HRESULT WINAPI HTMLAttributeCollection_Invoke(IHTMLAttributeCollection *iface, DISPID dispIdMember,
+        REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
+        VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
+{
+    HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection(iface);
+    return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, lcid,
+            wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+}
+
+static HRESULT WINAPI HTMLAttributeCollection_get_length(IHTMLAttributeCollection *iface, LONG *p)
+{
+    HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLAttributeCollection__newEnum(IHTMLAttributeCollection *iface, IUnknown **p)
+{
+    HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLAttributeCollection_item(IHTMLAttributeCollection *iface, VARIANT *name, IDispatch **ppItem)
+{
+    HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection(iface);
+    FIXME("(%p)->(%s, %p)\n", This, debugstr_variant(name), ppItem);
+    return E_NOTIMPL;
+}
+
+static const IHTMLAttributeCollectionVtbl HTMLAttributeCollectionVtbl = {
+    HTMLAttributeCollection_QueryInterface,
+    HTMLAttributeCollection_AddRef,
+    HTMLAttributeCollection_Release,
+    HTMLAttributeCollection_GetTypeInfoCount,
+    HTMLAttributeCollection_GetTypeInfo,
+    HTMLAttributeCollection_GetIDsOfNames,
+    HTMLAttributeCollection_Invoke,
+    HTMLAttributeCollection_get_length,
+    HTMLAttributeCollection__newEnum,
+    HTMLAttributeCollection_item
+};
+
+static inline HTMLAttributeCollection *HTMLAttributeCollection_from_DispatchEx(DispatchEx *iface)
+{
+    return CONTAINING_RECORD(iface, HTMLAttributeCollection, dispex);
+}
+
+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;
+}
+
+static HRESULT HTMLAttributeCollection_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params,
+        VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
+{
+    HTMLAttributeCollection *This = HTMLAttributeCollection_from_DispatchEx(dispex);
+    FIXME("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, flags, params, res, ei, caller);
+    return E_NOTIMPL;
+}
+
+static const dispex_static_data_vtbl_t HTMLAttributeCollection_dispex_vtbl = {
+    NULL,
+    HTMLAttributeCollection_get_dispid,
+    HTMLAttributeCollection_invoke,
+    NULL
+};
+
+static const tid_t HTMLAttributeCollection_iface_tids[] = {
+    IHTMLAttributeCollection_tid,
+    IHTMLAttributeCollection2_tid,
+    IHTMLAttributeCollection3_tid,
+    0
+};
+
+static dispex_static_data_t HTMLAttributeCollection_dispex = {
+    &HTMLAttributeCollection_dispex_vtbl,
+    DispHTMLAttributeCollection_tid,
+    NULL,
+    HTMLAttributeCollection_iface_tids
+};
+
+HRESULT HTMLElement_get_attr_col(HTMLDOMNode *iface, HTMLAttributeCollection **ac)
+{
+    HTMLElement *This = impl_from_HTMLDOMNode(iface);
+    HTMLAttributeCollection *ret;
+
+    ret = heap_alloc_zero(sizeof(*ret));
+    if(!ret)
+        return E_OUTOFMEMORY;
+
+    ret->IHTMLAttributeCollection_iface.lpVtbl = &HTMLAttributeCollectionVtbl;
+    ret->ref = 1;
+
+    IHTMLElement_AddRef(&This->IHTMLElement_iface);
+    ret->elem = This;
+
+    init_dispex(&ret->dispex, (IUnknown*)&ret->IHTMLAttributeCollection_iface,
+            &HTMLAttributeCollection_dispex);
+
+    *ac = ret;
+    return S_OK;
+}
diff --git a/dlls/mshtml/htmlembed.c b/dlls/mshtml/htmlembed.c
index aa1d2493ac6658196b5cf0e738456913d61ca405..50586901628fe48f5c4bef58e9df0b9e29413bcc 100644
--- a/dlls/mshtml/htmlembed.c
+++ b/dlls/mshtml/htmlembed.c
@@ -254,7 +254,8 @@ static void HTMLEmbedElement_destructor(HTMLDOMNode *iface)
 static const NodeImplVtbl HTMLEmbedElementImplVtbl = {
     HTMLEmbedElement_QI,
     HTMLEmbedElement_destructor,
-    HTMLElement_clone
+    HTMLElement_clone,
+    HTMLElement_get_attr_col
 };
 
 static const tid_t HTMLEmbedElement_iface_tids[] = {
diff --git a/dlls/mshtml/htmlform.c b/dlls/mshtml/htmlform.c
index ae84ac3a4c9e8d781561134bee02a4d625714fcc..8905208153b2f73852167e75688115e6e09ff073 100644
--- a/dlls/mshtml/htmlform.c
+++ b/dlls/mshtml/htmlform.c
@@ -633,6 +633,7 @@ static const NodeImplVtbl HTMLFormElementImplVtbl = {
     HTMLFormElement_QI,
     HTMLFormElement_destructor,
     HTMLElement_clone,
+    HTMLElement_get_attr_col,
     NULL,
     NULL,
     NULL,
diff --git a/dlls/mshtml/htmlframe.c b/dlls/mshtml/htmlframe.c
index 3b4126b664bd12c24bac4c398a6f276eb020482f..2663616d86bd60e2bd746db9a74c4652ede59dbc 100644
--- a/dlls/mshtml/htmlframe.c
+++ b/dlls/mshtml/htmlframe.c
@@ -270,6 +270,7 @@ static const NodeImplVtbl HTMLFrameElementImplVtbl = {
     HTMLFrameElement_QI,
     HTMLFrameElement_destructor,
     HTMLElement_clone,
+    HTMLElement_get_attr_col,
     NULL,
     NULL,
     NULL,
diff --git a/dlls/mshtml/htmlgeneric.c b/dlls/mshtml/htmlgeneric.c
index ffa9c4122fcddcb4e3e1cf89460b01f814d3d98a..703349d4fca2c21034072eec276f19bcf058d822 100644
--- a/dlls/mshtml/htmlgeneric.c
+++ b/dlls/mshtml/htmlgeneric.c
@@ -154,7 +154,8 @@ static void HTMLGenericElement_destructor(HTMLDOMNode *iface)
 static const NodeImplVtbl HTMLGenericElementImplVtbl = {
     HTMLGenericElement_QI,
     HTMLGenericElement_destructor,
-    HTMLElement_clone
+    HTMLElement_clone,
+    HTMLElement_get_attr_col
 };
 
 static const tid_t HTMLGenericElement_iface_tids[] = {
diff --git a/dlls/mshtml/htmlhead.c b/dlls/mshtml/htmlhead.c
index 69e4edfae8d78ebd4bf1d7161b62e44e57f58089..80c5e4c04ac93deaf8afe071b9a402f550dbd6c7 100644
--- a/dlls/mshtml/htmlhead.c
+++ b/dlls/mshtml/htmlhead.c
@@ -156,6 +156,7 @@ static const NodeImplVtbl HTMLTitleElementImplVtbl = {
     HTMLTitleElement_QI,
     HTMLTitleElement_destructor,
     HTMLElement_clone,
+    HTMLElement_get_attr_col
 };
 
 static const tid_t HTMLTitleElement_iface_tids[] = {
@@ -312,7 +313,8 @@ static void HTMLHeadElement_destructor(HTMLDOMNode *iface)
 static const NodeImplVtbl HTMLHeadElementImplVtbl = {
     HTMLHeadElement_QI,
     HTMLHeadElement_destructor,
-    HTMLElement_clone
+    HTMLElement_clone,
+    HTMLElement_get_attr_col
 };
 
 static const tid_t HTMLHeadElement_iface_tids[] = {
diff --git a/dlls/mshtml/htmliframe.c b/dlls/mshtml/htmliframe.c
index 8a293464b5c8ea9def37051aaa84ec5b16a993a9..3acab1eaa29bc3552e75aebeaf31fbfcb49423c3 100644
--- a/dlls/mshtml/htmliframe.c
+++ b/dlls/mshtml/htmliframe.c
@@ -248,6 +248,7 @@ static const NodeImplVtbl HTMLIFrameImplVtbl = {
     HTMLIFrame_QI,
     HTMLIFrame_destructor,
     HTMLElement_clone,
+    HTMLElement_get_attr_col,
     NULL,
     NULL,
     NULL,
diff --git a/dlls/mshtml/htmlimg.c b/dlls/mshtml/htmlimg.c
index c984fbd63bebe730423db9a219c2183e54e7ef00..0e8a60478230fad5fa7e4b3425b9f30e6960d2ed 100644
--- a/dlls/mshtml/htmlimg.c
+++ b/dlls/mshtml/htmlimg.c
@@ -658,6 +658,7 @@ static const NodeImplVtbl HTMLImgElementImplVtbl = {
     HTMLImgElement_QI,
     HTMLImgElement_destructor,
     HTMLElement_clone,
+    HTMLElement_get_attr_col,
     NULL,
     NULL,
     NULL,
diff --git a/dlls/mshtml/htmlinput.c b/dlls/mshtml/htmlinput.c
index 9d197618695e43728e96217841f18e64567a9dec..65cbeab8803240b858e541c8ec4b3df4dd78c022 100644
--- a/dlls/mshtml/htmlinput.c
+++ b/dlls/mshtml/htmlinput.c
@@ -1185,6 +1185,7 @@ static const NodeImplVtbl HTMLInputElementImplVtbl = {
     HTMLInputElement_QI,
     HTMLInputElement_destructor,
     HTMLElement_clone,
+    HTMLElement_get_attr_col,
     NULL,
     HTMLInputElementImpl_fire_event,
     NULL,
diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c
index 7afccd6f08b41980f345121ba90cfd94bca649dc..e8d6f95667fa09728774840e7de9eb191b892439 100644
--- a/dlls/mshtml/htmlnode.c
+++ b/dlls/mshtml/htmlnode.c
@@ -472,8 +472,22 @@ static HRESULT WINAPI HTMLDOMNode_get_childNodes(IHTMLDOMNode *iface, IDispatch
 static HRESULT WINAPI HTMLDOMNode_get_attributes(IHTMLDOMNode *iface, IDispatch **p)
 {
     HTMLDOMNode *This = impl_from_IHTMLDOMNode(iface);
-    FIXME("(%p)->(%p)\n", This, p);
-    return E_NOTIMPL;
+    HTMLAttributeCollection *col;
+    HRESULT hres;
+
+    TRACE("(%p)->(%p)\n", This, p);
+
+    if(This->vtbl->get_attr_col) {
+        hres = This->vtbl->get_attr_col(This, &col);
+        if(FAILED(hres))
+            return hres;
+
+        *p = (IDispatch*)&col->IHTMLAttributeCollection_iface;
+        return S_OK;
+    }
+
+    *p = NULL;
+    return S_OK;
 }
 
 static HRESULT WINAPI HTMLDOMNode_insertBefore(IHTMLDOMNode *iface, IHTMLDOMNode *newChild,
diff --git a/dlls/mshtml/htmlobject.c b/dlls/mshtml/htmlobject.c
index 50e04a916d9159b9305ec97154334db10727631d..40a0de080d55de5c4922d95b5dbcfa7e0e12eeb6 100644
--- a/dlls/mshtml/htmlobject.c
+++ b/dlls/mshtml/htmlobject.c
@@ -470,6 +470,7 @@ static const NodeImplVtbl HTMLObjectElementImplVtbl = {
     HTMLObjectElement_QI,
     HTMLObjectElement_destructor,
     HTMLElement_clone,
+    HTMLElement_get_attr_col,
     NULL,
     NULL,
     NULL,
diff --git a/dlls/mshtml/htmloption.c b/dlls/mshtml/htmloption.c
index 9137765136e36acfea8412517adf0b23d443b84c..533a914901f620d38a721b8368537cd5bcfcbdb5 100644
--- a/dlls/mshtml/htmloption.c
+++ b/dlls/mshtml/htmloption.c
@@ -343,7 +343,8 @@ static void HTMLOptionElement_destructor(HTMLDOMNode *iface)
 static const NodeImplVtbl HTMLOptionElementImplVtbl = {
     HTMLOptionElement_QI,
     HTMLOptionElement_destructor,
-    HTMLElement_clone
+    HTMLElement_clone,
+    HTMLElement_get_attr_col
 };
 
 static const tid_t HTMLOptionElement_iface_tids[] = {
diff --git a/dlls/mshtml/htmlscript.c b/dlls/mshtml/htmlscript.c
index ca0524fecdc0137066e3fefd0b5b83587833875c..3418fcc379cbe979cd1167e1318efc9a67a4b929 100644
--- a/dlls/mshtml/htmlscript.c
+++ b/dlls/mshtml/htmlscript.c
@@ -330,6 +330,7 @@ static const NodeImplVtbl HTMLScriptElementImplVtbl = {
     HTMLScriptElement_QI,
     HTMLScriptElement_destructor,
     HTMLElement_clone,
+    HTMLElement_get_attr_col,
     NULL,
     NULL,
     NULL,
diff --git a/dlls/mshtml/htmlselect.c b/dlls/mshtml/htmlselect.c
index 6d2e3935a6e401b6bdf29c1775a0f02f371d807a..0d454486894b455d71cac9bda8e4db772e6f9bd6 100644
--- a/dlls/mshtml/htmlselect.c
+++ b/dlls/mshtml/htmlselect.c
@@ -615,6 +615,7 @@ static const NodeImplVtbl HTMLSelectElementImplVtbl = {
     HTMLSelectElement_QI,
     HTMLSelectElement_destructor,
     HTMLElement_clone,
+    HTMLElement_get_attr_col,
     NULL,
     NULL,
     NULL,
diff --git a/dlls/mshtml/htmlstyleelem.c b/dlls/mshtml/htmlstyleelem.c
index 942f422bbeb2dc0fac05076cba1942a377f76c7e..d866db279a64a336c70620fa30c4a67b876dd29c 100644
--- a/dlls/mshtml/htmlstyleelem.c
+++ b/dlls/mshtml/htmlstyleelem.c
@@ -295,7 +295,8 @@ static void HTMLStyleElement_destructor(HTMLDOMNode *iface)
 static const NodeImplVtbl HTMLStyleElementImplVtbl = {
     HTMLStyleElement_QI,
     HTMLStyleElement_destructor,
-    HTMLElement_clone
+    HTMLElement_clone,
+    HTMLElement_get_attr_col
 };
 
 static const tid_t HTMLStyleElement_iface_tids[] = {
diff --git a/dlls/mshtml/htmltable.c b/dlls/mshtml/htmltable.c
index 5e25373fee45741b5a63c7734a026ad22c4d9e4e..61cde8070c96d325c431a653c6a5f08f097e8e3d 100644
--- a/dlls/mshtml/htmltable.c
+++ b/dlls/mshtml/htmltable.c
@@ -559,6 +559,7 @@ static const NodeImplVtbl HTMLTableImplVtbl = {
     HTMLTable_QI,
     HTMLTable_destructor,
     HTMLElement_clone,
+    HTMLElement_get_attr_col
 };
 
 static const tid_t HTMLTable_iface_tids[] = {
diff --git a/dlls/mshtml/htmltablerow.c b/dlls/mshtml/htmltablerow.c
index ee2c29548c63fd41c99d590ddd8c308524b29dfc..c9b21eca0be5ce3c02d3ded0f14634309ccb37ec 100644
--- a/dlls/mshtml/htmltablerow.c
+++ b/dlls/mshtml/htmltablerow.c
@@ -300,7 +300,8 @@ static void HTMLTableRow_destructor(HTMLDOMNode *iface)
 static const NodeImplVtbl HTMLTableRowImplVtbl = {
     HTMLTableRow_QI,
     HTMLTableRow_destructor,
-    HTMLElement_clone
+    HTMLElement_clone,
+    HTMLElement_get_attr_col
 };
 
 static const tid_t HTMLTableRow_iface_tids[] = {
diff --git a/dlls/mshtml/htmltextarea.c b/dlls/mshtml/htmltextarea.c
index ae2fd6a8aa82e2ff84171b87ac0814ffc26abec4..fc833e352292bca1eb89b21992c22ea19503ee47 100644
--- a/dlls/mshtml/htmltextarea.c
+++ b/dlls/mshtml/htmltextarea.c
@@ -447,6 +447,7 @@ static const NodeImplVtbl HTMLTextAreaElementImplVtbl = {
     HTMLTextAreaElement_QI,
     HTMLTextAreaElement_destructor,
     HTMLElement_clone,
+    HTMLElement_get_attr_col,
     NULL,
     NULL,
     NULL,
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 9bb37e482a59e0fb87e65d3dc1ab78aa14bb74e8..8bbedd509cadc46e5227110b6da54237da5140c9 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -73,6 +73,7 @@ typedef struct event_target_t event_target_t;
     XDIID(DispCPlugins) \
     XDIID(DispDOMChildrenCollection) \
     XDIID(DispHTMLAnchorElement) \
+    XDIID(DispHTMLAttributeCollection) \
     XDIID(DispHTMLBody) \
     XDIID(DispHTMLCommentElement) \
     XDIID(DispHTMLCurrentStyle) \
@@ -106,6 +107,9 @@ typedef struct event_target_t event_target_t;
     XDIID(DispHTMLWindow2) \
     XDIID(HTMLDocumentEvents) \
     XIID(IHTMLAnchorElement) \
+    XIID(IHTMLAttributeCollection) \
+    XIID(IHTMLAttributeCollection2) \
+    XIID(IHTMLAttributeCollection3) \
     XIID(IHTMLBodyElement) \
     XIID(IHTMLBodyElement2) \
     XIID(IHTMLCommentElement) \
@@ -223,6 +227,7 @@ typedef struct HTMLDocumentNode HTMLDocumentNode;
 typedef struct HTMLDocumentObj HTMLDocumentObj;
 typedef struct HTMLFrameBase HTMLFrameBase;
 typedef struct NSContainer NSContainer;
+typedef struct HTMLAttributeCollection HTMLAttributeCollection;
 
 typedef enum {
     SCRIPTMODE_GECKO,
@@ -498,6 +503,7 @@ typedef struct {
     HRESULT (*qi)(HTMLDOMNode*,REFIID,void**);
     void (*destructor)(HTMLDOMNode*);
     HRESULT (*clone)(HTMLDOMNode*,nsIDOMNode*,HTMLDOMNode**);
+    HRESULT (*get_attr_col)(HTMLDOMNode*,HTMLAttributeCollection**);
     event_target_t **(*get_event_target)(HTMLDOMNode*);
     HRESULT (*fire_event)(HTMLDOMNode*,DWORD,BOOL*);
     HRESULT (*handle_event)(HTMLDOMNode*,DWORD,BOOL*);
@@ -712,6 +718,20 @@ HRESULT create_nselem(HTMLDocumentNode*,const WCHAR*,nsIDOMHTMLElement**) DECLSP
 
 HRESULT HTMLDOMTextNode_Create(HTMLDocumentNode*,nsIDOMNode*,HTMLDOMNode**) DECLSPEC_HIDDEN;
 
+struct HTMLAttributeCollection {
+    DispatchEx dispex;
+    IHTMLAttributeCollection IHTMLAttributeCollection_iface;
+    IHTMLAttributeCollection2 IHTMLAttributeCollection2_iface;
+    IHTMLAttributeCollection3 IHTMLAttributeCollection3_iface;
+
+    LONG ref;
+
+    HTMLElement *elem;
+    LONG size;
+    DISPID *collection;
+    struct list attrs;
+};
+
 typedef struct {
     DispatchEx dispex;
     IHTMLDOMAttribute IHTMLDOMAttribute_iface;
@@ -760,6 +780,7 @@ void HTMLDOMNode_destructor(HTMLDOMNode*) DECLSPEC_HIDDEN;
 HRESULT HTMLElement_QI(HTMLDOMNode*,REFIID,void**) DECLSPEC_HIDDEN;
 void HTMLElement_destructor(HTMLDOMNode*) DECLSPEC_HIDDEN;
 HRESULT HTMLElement_clone(HTMLDOMNode*,nsIDOMNode*,HTMLDOMNode**) DECLSPEC_HIDDEN;
+HRESULT HTMLElement_get_attr_col(HTMLDOMNode*,HTMLAttributeCollection**) DECLSPEC_HIDDEN;
 
 HRESULT HTMLFrameBase_QI(HTMLFrameBase*,REFIID,void**) DECLSPEC_HIDDEN;
 void HTMLFrameBase_destructor(HTMLFrameBase*) DECLSPEC_HIDDEN;