From: Zhenbo Li Subject: mshtml: Added IHTMLInputElement_get_form method implementation. Message-Id: <53D66411.6000302@gmail.com> Date: Mon, 28 Jul 2014 22:54:09 +0800 My code is a little ugly, and I'm wondering if there is a better solution. --- dlls/mshtml/htmlinput.c | 39 +++++++++++++++++++++++++++++++++++++-- dlls/mshtml/tests/dom.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 84 insertions(+), 3 deletions(-) diff --git a/dlls/mshtml/htmlinput.c b/dlls/mshtml/htmlinput.c index f832b88..6e92df1 100644 --- a/dlls/mshtml/htmlinput.c +++ b/dlls/mshtml/htmlinput.c @@ -255,8 +255,43 @@ 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; + IHTMLElement *son, *par; + HRESULT hres; + + TRACE("(%p)->(%p)\n", This, p); + + hres = IHTMLInputElement_QueryInterface(iface, &IID_IHTMLElement, (void **)&son); + if (hres != S_OK){ + ERR("QueryInterface(IID_IHTMLElement) failed: %08x\n", hres); + return hres; + } + + do { + hres = IHTMLElement_get_parentElement(son, &par); + if (hres != S_OK){ + ERR("get parent failed: %08x\n", hres); + IHTMLElement_Release(son); + return hres; + } + + if (par == NULL){ + ERR("Can't find parent.\n"); + IHTMLElement_Release(son); + return hres; + } + + hres = IHTMLElement_QueryInterface(par, &IID_IHTMLFormElement, (void **)p); + if (hres == S_OK) + break; + + IHTMLElement_Release(son); + son = par; + } while(1); + + IHTMLElement_Release(son); + IHTMLElement_Release(par); + + return S_OK; } 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..6cb659a 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);