diff --git a/dlls/mshtml/htmlinput.c b/dlls/mshtml/htmlinput.c
index 0ca0e76a8ba..d6bd3941aa5 100644
--- a/dlls/mshtml/htmlinput.c
+++ b/dlls/mshtml/htmlinput.c
@@ -1417,6 +1417,8 @@ typedef struct {
HTMLElement element;
IHTMLButtonElement IHTMLButtonElement_iface;
+
+ nsIDOMHTMLButtonElement *nsbutton;
} HTMLButtonElement;
static inline HTMLButtonElement *impl_from_IHTMLButtonElement(IHTMLButtonElement *iface)
@@ -1504,15 +1506,33 @@ static HRESULT WINAPI HTMLButtonElement_get_value(IHTMLButtonElement *iface, BST
static HRESULT WINAPI HTMLButtonElement_put_name(IHTMLButtonElement *iface, BSTR v)
{
HTMLButtonElement *This = impl_from_IHTMLButtonElement(iface);
- FIXME("(%p)->(%s)\n", This, debugstr_w(v));
- return E_NOTIMPL;
+ nsAString name_str;
+ nsresult nsres;
+
+ TRACE("(%p)->(%s)\n", This, debugstr_w(v));
+
+ nsAString_InitDepend(&name_str, v);
+ nsres = nsIDOMHTMLButtonElement_SetName(This->nsbutton, &name_str);
+ nsAString_Finish(&name_str);
+ if(NS_FAILED(nsres)) {
+ ERR("SetName failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ return S_OK;
}
static HRESULT WINAPI HTMLButtonElement_get_name(IHTMLButtonElement *iface, BSTR *p)
{
HTMLButtonElement *This = impl_from_IHTMLButtonElement(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ nsAString name_str;
+ nsresult nsres;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ nsAString_Init(&name_str, NULL);
+ nsres = nsIDOMHTMLButtonElement_GetName(This->nsbutton, &name_str);
+ return return_nsstr(nsres, &name_str, p);
}
static HRESULT WINAPI HTMLButtonElement_put_status(IHTMLButtonElement *iface, VARIANT v)
@@ -1628,8 +1648,7 @@ static dispex_static_data_t HTMLButtonElement_dispex = {
HRESULT HTMLButtonElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem)
{
HTMLButtonElement *ret;
-
- ERR("!!!\n");
+ nsresult nsres;
ret = heap_alloc_zero(sizeof(*ret));
if(!ret)
@@ -1639,6 +1658,13 @@ HRESULT HTMLButtonElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nsele
ret->element.node.vtbl = &HTMLButtonElementImplVtbl;
HTMLElement_Init(&ret->element, doc, nselem, &HTMLButtonElement_dispex);
+
+ nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLButtonElement, (void**)&ret->nsbutton);
+
+ /* Share nsbutton reference with nsnode */
+ assert(nsres == NS_OK && (nsIDOMNode*)ret->nsbutton == ret->element.node.nsnode);
+ nsIDOMNode_Release(ret->element.node.nsnode);
+
*elem = &ret->element;
return S_OK;
}
diff --git a/dlls/mshtml/nsiface.idl b/dlls/mshtml/nsiface.idl
index 647566f87a5..76f8ed090fd 100644
--- a/dlls/mshtml/nsiface.idl
+++ b/dlls/mshtml/nsiface.idl
@@ -1688,6 +1688,41 @@ interface nsIDOMHTMLOptionElement : nsIDOMHTMLElement
nsresult GetIndex(int32_t *aIndex);
}
+[
+ object,
+ uuid(8e40d4d7-c204-4192-802a-0b5602e9c669),
+ local
+]
+interface nsIDOMHTMLButtonElement : nsIDOMHTMLElement
+{
+ nsresult GetAutofocus(bool *aAutofocus);
+ nsresult SetAutofocus(bool aAutofocus);
+ nsresult GetDisabled(bool *aDisabled);
+ nsresult SetDisabled(bool aDisabled);
+ nsresult GetForm(nsIDOMHTMLFormElement **aForm);
+ nsresult GetFormAction(nsAString *aFormAction);
+ nsresult SetFormAction(const nsAString *aFormAction);
+ nsresult GetFormEnctype(nsAString *aFormEnctype);
+ nsresult SetFormEnctype(const nsAString *aFormEnctype);
+ nsresult GetFormMethod(nsAString *aFormMethod);
+ nsresult SetFormMethod(const nsAString *aFormMethod);
+ nsresult GetFormNoValidate(bool *aFormNoValidate);
+ nsresult SetFormNoValidate(bool aFormNoValidate);
+ nsresult GetFormTarget(nsAString *aFormTarget);
+ nsresult SetFormTarget(const nsAString *aFormTarget);
+ nsresult GetName(nsAString *aName);
+ nsresult SetName(const nsAString *aName);
+ nsresult GetType(nsAString *aType);
+ nsresult SetType(const nsAString *aType);
+ nsresult GetValue(nsAString *aValue);
+ nsresult SetValue(const nsAString *aValue);
+ nsresult GetWillValidate(bool *aWillValidate);
+ nsresult GetValidity(nsIDOMValidityState **aValidity);
+ nsresult GetValidationMessage(nsAString *aValidationMessage);
+ nsresult CheckValidity(bool *_retval);
+ nsresult SetCustomValidity(const nsAString *error);
+}
+
[
object,
uuid(429b041b-06df-486c-9a3a-a1d901cc76a2),