From: Zhenbo Li Subject: mshtml: Added IHTMLInputElement_get_form method implementation. (try 2) Message-Id: <53D713D5.2060806@gmail.com> Date: Tue, 29 Jul 2014 11:24:05 +0800 try 2: 1. Use nsIDOMHTMLInputElement_GetForm (Thanks Jacek) 2. Tiny change to test case --- dlls/mshtml/htmlinput.c | 25 +++++++++++++++++++++++-- dlls/mshtml/tests/dom.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 70 insertions(+), 3 deletions(-) diff --git a/dlls/mshtml/htmlinput.c b/dlls/mshtml/htmlinput.c index f832b88..77e209e 100644 --- a/dlls/mshtml/htmlinput.c +++ b/dlls/mshtml/htmlinput.c @@ -255,8 +255,29 @@ static HRESULT WINAPI HTMLInputElement_get_disabled(IHTMLInputElement *iface, VA static HRESULT WINAPI HTMLInputElement_get_form(IHTMLInputElement *iface, IHTMLFormElement **p) { HTMLInputElement *This = impl_from_IHTMLInputElement(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + nsIDOMHTMLFormElement *nsform; + HTMLDOMNode *node; + HRESULT hres; + nsresult nsres; + + TRACE("(%p)->(%p)\n", This, p); + + nsres = nsIDOMHTMLInputElement_GetForm(This->nsinput, &nsform); + if (NS_FAILED(nsres) || nsform == NULL) { + ERR("GetForm failed: %08x, nsform: %p\n", nsres, nsform); + p = NULL; + return E_FAIL; + } + + hres = get_node(This->element.node.doc, (nsIDOMNode*)nsform, TRUE, &node); + nsIDOMHTMLFormElement_Release(nsform); + 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) diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 33645c8..80a7dfd 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -3209,6 +3209,48 @@ static void _test_input_value(unsigned line, IUnknown *unk, const char *exval) IHTMLInputElement_Release(input); } +#define test_input_get_form(o, t) _test_input_get_form(__LINE__, o, t) +static void _test_input_get_form(unsigned line, IUnknown *unk, const char *id) +{ + IHTMLInputElement *input; + IHTMLFormElement *form; + IHTMLElement *elem; + BSTR bstr; + HRESULT hres; + + ok_(__FILE__,line) (unk != NULL, "unk is NULL!\n"); + hres = IUnknown_QueryInterface(unk, &IID_IHTMLInputElement, (void**)&input); + ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLInputElement: %08x\n", hres); + if(FAILED(hres) || unk == NULL) + return; + + hres = IHTMLInputElement_get_form(input, &form); + ok_(__FILE__, line) (hres == S_OK, "get_form failed: %08x\n", hres); + ok_(__FILE__, line) (form != NULL, "form == NULL\n"); + if(FAILED(hres) || form == NULL){ + IHTMLInputElement_Release(input); + return; + } + + hres = IHTMLFormElement_QueryInterface(form, &IID_IHTMLElement, (void **)&elem); + ok_(__FILE__, line) (hres == S_OK, "QueryInterface(IID_IHTMLElement) failed: %08x\n", hres); + ok_(__FILE__, line) (elem != NULL, "elem == NULL\n"); + if(FAILED(hres) || elem == NULL){ + IHTMLInputElement_Release(input); + IHTMLFormElement_Release(form); + return; + } + + hres = IHTMLElement_get_id(elem, &bstr); + ok_(__FILE__, line) (hres == S_OK, "get_id failed: %08x\n", hres); + ok_(__FILE__, line) (!strcmp_wa(bstr, id), "Expect %s, got %s\n", id, wine_dbgstr_w(bstr)); + + SysFreeString(bstr); + IHTMLInputElement_Release(input); + IHTMLFormElement_Release(form); + IHTMLElement_Release(elem); +} + #define test_input_put_value(o,v) _test_input_put_value(__LINE__,o,v) static void _test_input_put_value(unsigned line, IUnknown *unk, const char *val) { @@ -7376,7 +7418,7 @@ static void test_elems2(IHTMLDocument2 *doc) test_insert_adjacent_elems(doc, div); test_elem_set_innerhtml((IUnknown*)div, - "
"); + "
"); elem = get_elem_by_id(doc, "form", TRUE); if(elem) { test_form_length((IUnknown*)elem, 2); @@ -7398,6 +7440,10 @@ static void test_elems2(IHTMLDocument2 *doc) test_form_reset((IUnknown*)elem); test_form_target((IUnknown*)elem); IHTMLElement_Release(elem); + + elem = get_elem_by_id(doc, "inputid", TRUE); + test_input_get_form((IUnknown*)elem, "form"); + IHTMLElement_Release(elem); } test_attr(div);