mshtml: Added IHTMLButtonElement::form property implementation.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacek Caban 2016-06-16 19:30:27 +02:00 committed by Alexandre Julliard
parent 5a07f80ebe
commit a963b6c8c8
2 changed files with 71 additions and 22 deletions

View File

@ -45,6 +45,32 @@ typedef struct {
static const WCHAR forW[] = {'f','o','r',0}; static const WCHAR forW[] = {'f','o','r',0};
static HRESULT return_nsform(HTMLElement *elem, nsIDOMHTMLFormElement *nsform, IHTMLFormElement **p)
{
nsIDOMNode *form_node;
HTMLDOMNode *node;
nsresult nsres;
HRESULT hres;
if(!nsform) {
*p = NULL;
return S_OK;
}
nsres = nsIDOMHTMLFormElement_QueryInterface(nsform, &IID_nsIDOMNode, (void**)&form_node);
nsIDOMHTMLFormElement_Release(nsform);
assert(nsres == NS_OK);
hres = get_node(elem->node.doc, form_node, TRUE, &node);
nsIDOMNode_Release(form_node);
if (FAILED(hres))
return hres;
hres = IHTMLDOMNode_QueryInterface(&node->IHTMLDOMNode_iface, &IID_IHTMLElement, (void**)p);
node_release(node);
return hres;
}
static inline HTMLInputElement *impl_from_IHTMLInputElement(IHTMLInputElement *iface) static inline HTMLInputElement *impl_from_IHTMLInputElement(IHTMLInputElement *iface)
{ {
return CONTAINING_RECORD(iface, HTMLInputElement, IHTMLInputElement_iface); return CONTAINING_RECORD(iface, HTMLInputElement, IHTMLInputElement_iface);
@ -256,33 +282,17 @@ static HRESULT WINAPI HTMLInputElement_get_form(IHTMLInputElement *iface, IHTMLF
{ {
HTMLInputElement *This = impl_from_IHTMLInputElement(iface); HTMLInputElement *This = impl_from_IHTMLInputElement(iface);
nsIDOMHTMLFormElement *nsform; nsIDOMHTMLFormElement *nsform;
nsIDOMNode *form_node;
HTMLDOMNode *node;
HRESULT hres;
nsresult nsres; nsresult nsres;
TRACE("(%p)->(%p)\n", This, p); TRACE("(%p)->(%p)\n", This, p);
nsres = nsIDOMHTMLInputElement_GetForm(This->nsinput, &nsform); nsres = nsIDOMHTMLInputElement_GetForm(This->nsinput, &nsform);
if (NS_FAILED(nsres) || nsform == NULL) { if (NS_FAILED(nsres)) {
ERR("GetForm failed: %08x, nsform: %p\n", nsres, nsform); ERR("GetForm failed: %08x, nsform: %p\n", nsres, nsform);
*p = NULL;
return E_FAIL; return E_FAIL;
} }
nsres = nsIDOMHTMLFormElement_QueryInterface(nsform, &IID_nsIDOMNode, (void**)&form_node); return return_nsform(&This->element, nsform, p);
nsIDOMHTMLFormElement_Release(nsform);
assert(nsres == NS_OK);
hres = get_node(This->element.node.doc, form_node, TRUE, &node);
nsIDOMNode_Release(form_node);
if (FAILED(hres))
return hres;
hres = IHTMLDOMNode_QueryInterface(&node->IHTMLDOMNode_iface, &IID_IHTMLElement, (void**)p);
node_release(node);
return hres;
} }
static HRESULT WINAPI HTMLInputElement_put_size(IHTMLInputElement *iface, LONG v) static HRESULT WINAPI HTMLInputElement_put_size(IHTMLInputElement *iface, LONG v)
@ -1746,8 +1756,18 @@ static HRESULT WINAPI HTMLButtonElement_get_disabled(IHTMLButtonElement *iface,
static HRESULT WINAPI HTMLButtonElement_get_form(IHTMLButtonElement *iface, IHTMLFormElement **p) static HRESULT WINAPI HTMLButtonElement_get_form(IHTMLButtonElement *iface, IHTMLFormElement **p)
{ {
HTMLButtonElement *This = impl_from_IHTMLButtonElement(iface); HTMLButtonElement *This = impl_from_IHTMLButtonElement(iface);
FIXME("(%p)->(%p)\n", This, p); nsIDOMHTMLFormElement *nsform;
return E_NOTIMPL; nsresult nsres;
TRACE("(%p)->(%p)\n", This, p);
nsres = nsIDOMHTMLButtonElement_GetForm(This->nsbutton, &nsform);
if (NS_FAILED(nsres)) {
ERR("GetForm failed: %08x, nsform: %p\n", nsres, nsform);
return E_FAIL;
}
return return_nsform(&This->element, nsform, p);
} }
static HRESULT WINAPI HTMLButtonElement_createTextRange(IHTMLButtonElement *iface, IHTMLTxtRange **range) static HRESULT WINAPI HTMLButtonElement_createTextRange(IHTMLButtonElement *iface, IHTMLTxtRange **range)

View File

@ -4550,7 +4550,7 @@ static void test_select_form(IUnknown *uselect, IUnknown *uform)
ok(hres == S_OK, "get_form failed: %08x\n", hres); ok(hres == S_OK, "get_form failed: %08x\n", hres);
ok(form != NULL, "form == NULL\n"); ok(form != NULL, "form == NULL\n");
test_form_length((IUnknown*)form, 1); test_form_length((IUnknown*)form, 2);
test_form_elements((IUnknown*)form); test_form_elements((IUnknown*)form);
test_form_name((IUnknown*)form, "form_name"); test_form_name((IUnknown*)form, "form_name");
@ -6976,14 +6976,33 @@ static void _set_button_value(unsigned line, IHTMLElement *elem, const char *val
_test_button_value(line, elem, value); _test_button_value(line, elem, value);
} }
#define get_button_form(a) _get_button_form(__LINE__,a)
static IHTMLFormElement *_get_button_form(unsigned line, IHTMLElement *elem)
{
IHTMLButtonElement *button = _get_button_iface(line, (IUnknown*)elem);
IHTMLFormElement *form;
HRESULT hres;
hres = IHTMLButtonElement_get_form(button, &form);
ok_(__FILE__,line)(hres == S_OK, "get_form failed: %08x\n", hres);
IHTMLButtonElement_Release(button);
return form;
}
static void test_button_elem(IHTMLElement *elem) static void test_button_elem(IHTMLElement *elem)
{ {
IHTMLFormElement *form;
test_button_name(elem, NULL); test_button_name(elem, NULL);
set_button_name(elem, "button name"); set_button_name(elem, "button name");
test_button_type(elem, "submit"); test_button_type(elem, "submit");
test_button_value(elem, NULL); test_button_value(elem, NULL);
set_button_value(elem, "val"); set_button_value(elem, "val");
form = get_button_form(elem);
ok(!form, "form != NULL\n");
test_elem_istextedit(elem, VARIANT_TRUE); test_elem_istextedit(elem, VARIANT_TRUE);
} }
@ -9062,10 +9081,12 @@ static void test_elems2(IHTMLDocument2 *doc)
} }
test_elem_set_innerhtml((IUnknown*)div, test_elem_set_innerhtml((IUnknown*)div,
"<form id=\"form\" name=\"form_name\"><select id=\"sform\"><option id=\"oform\"></option></select></form>"); "<form id=\"form\" name=\"form_name\"><select id=\"sform\"><option id=\"oform\"></option></select><button id=\"btnid\"></button></form>");
elem = get_elem_by_id(doc, "sform", TRUE); elem = get_elem_by_id(doc, "sform", TRUE);
elem2 = get_elem_by_id(doc, "form", TRUE); elem2 = get_elem_by_id(doc, "form", TRUE);
if(elem && elem2) { if(elem && elem2) {
IHTMLFormElement *form;
test_select_form((IUnknown*)elem, (IUnknown*)elem2); test_select_form((IUnknown*)elem, (IUnknown*)elem2);
IHTMLElement_Release(elem); IHTMLElement_Release(elem);
@ -9074,6 +9095,14 @@ static void test_elems2(IHTMLDocument2 *doc)
test_option_form((IUnknown*)elem, (IUnknown*)elem2); test_option_form((IUnknown*)elem, (IUnknown*)elem2);
IHTMLElement_Release(elem); IHTMLElement_Release(elem);
} }
elem = get_elem_by_id(doc, "btnid", TRUE);
form = get_button_form(elem);
ok(iface_cmp((IUnknown*)form, (IUnknown*)elem2), "form != elem2\n");
IHTMLFormElement_Release(form);
IHTMLElement_Release(elem);
IHTMLElement_Release(elem2); IHTMLElement_Release(elem2);
} }