diff --git a/dlls/mshtml/htmlform.c b/dlls/mshtml/htmlform.c index bcb6e6e22a4..6ca8e92e47c 100644 --- a/dlls/mshtml/htmlform.c +++ b/dlls/mshtml/htmlform.c @@ -299,7 +299,20 @@ static HRESULT WINAPI HTMLFormElement_item(IHTMLFormElement *iface, VARIANT name VARIANT index, IDispatch **pdisp) { HTMLFormElement *This = HTMLFORM_THIS(iface); - FIXME("(%p)->(v v %p)\n", This, pdisp); + + TRACE("(%p)->(%s %s %p)\n", This, debugstr_variant(&name), debugstr_variant(&index), pdisp); + + if(!pdisp) + return E_INVALIDARG; + *pdisp = NULL; + + if(V_VT(&name) == VT_I4) { + if(V_I4(&name) < 0) + return E_INVALIDARG; + return htmlform_item(This, V_I4(&name), pdisp); + } + + FIXME("Unsupported args\n"); return E_NOTIMPL; } diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index c91addaa48e..e8657f43aa7 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -2964,6 +2964,48 @@ static void test_select_elem(IHTMLSelectElement *select) IDispatch_Release(disp); } +static void test_form_item(IHTMLElement *elem) +{ + IHTMLFormElement *form = get_form_iface((IUnknown*)elem); + IDispatch *disp, *disp2; + VARIANT name, index; + HRESULT hres; + + V_VT(&index) = VT_EMPTY; + V_VT(&name) = VT_I4; + V_I4(&name) = -1; + disp = (void*)0xdeadbeef; + hres = IHTMLFormElement_item(form, name, index, &disp); + ok(hres == E_INVALIDARG, "item failed: %08x, expected E_INVALIDARG\n", hres); + ok(!disp, "disp = %p\n", disp); + + V_I4(&name) = 2; + disp = (void*)0xdeadbeef; + hres = IHTMLFormElement_item(form, name, index, &disp); + ok(hres == S_OK, "item failed: %08x\n", hres); + ok(!disp, "disp = %p\n", disp); + + V_I4(&name) = 1; + hres = IHTMLFormElement_item(form, name, index, NULL); + ok(hres == E_INVALIDARG, "item failed: %08x, expected E_INVALIDARG\n", hres); + + disp = NULL; + hres = IHTMLFormElement_item(form, name, index, &disp); + ok(hres == S_OK, "item failed: %08x\n", hres); + ok(disp != NULL, "disp = NULL\n"); + test_disp((IUnknown*)disp, &DIID_DispHTMLInputElement, NULL); + + V_VT(&index) = VT_I4; + V_I4(&index) = 1; + disp2 = NULL; + hres = IHTMLFormElement_item(form, name, index, &disp2); + ok(hres == S_OK, "item failed: %08x\n", hres); + ok(disp2 != NULL, "disp = NULL\n"); + ok(iface_cmp((IUnknown*)disp, (IUnknown*)disp2), "disp != disp2\n"); + IDispatch_Release(disp2); + IDispatch_Release(disp); +} + static void test_create_option_elem(IHTMLDocument2 *doc) { IHTMLOptionElement *option; @@ -6112,6 +6154,15 @@ static void test_elems2(IHTMLDocument2 *doc) IHTMLElement_Release(elem); } + test_elem_set_innerhtml((IUnknown*)div, + "
"); + elem = get_elem_by_id(doc, "form", TRUE); + if(elem) { + test_form_length((IUnknown*)elem, 2); + test_form_item(elem); + IHTMLElement_Release(elem); + } + IHTMLElement_Release(div); }