diff --git a/dlls/mshtml/htmltextarea.c b/dlls/mshtml/htmltextarea.c index 9ded8ac6e12..afa9c8fc7ab 100644 --- a/dlls/mshtml/htmltextarea.c +++ b/dlls/mshtml/htmltextarea.c @@ -105,8 +105,20 @@ static HRESULT WINAPI HTMLTextAreaElement_get_type(IHTMLTextAreaElement *iface, static HRESULT WINAPI HTMLTextAreaElement_put_value(IHTMLTextAreaElement *iface, BSTR v) { HTMLTextAreaElement *This = HTMLTXTAREA_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(v)); - return E_NOTIMPL; + nsAString value_str; + nsresult nsres; + + TRACE("(%p)->(%s)\n", This, debugstr_w(v)); + + nsAString_InitDepend(&value_str, v); + nsres = nsIDOMHTMLTextAreaElement_SetValue(This->nstextarea, &value_str); + nsAString_Finish(&value_str); + if(NS_FAILED(nsres)) { + ERR("SetValue failed: %08x\n", nsres); + return E_FAIL; + } + + return S_OK; } static HRESULT WINAPI HTMLTextAreaElement_get_value(IHTMLTextAreaElement *iface, BSTR *p) @@ -115,6 +127,7 @@ static HRESULT WINAPI HTMLTextAreaElement_get_value(IHTMLTextAreaElement *iface, nsAString value_str; const PRUnichar *value; nsresult nsres; + HRESULT hres = S_OK; TRACE("(%p)->(%p)\n", This, p); @@ -123,15 +136,14 @@ static HRESULT WINAPI HTMLTextAreaElement_get_value(IHTMLTextAreaElement *iface, nsres = nsIDOMHTMLTextAreaElement_GetValue(This->nstextarea, &value_str); if(NS_SUCCEEDED(nsres)) { nsAString_GetData(&value_str, &value); - *p = SysAllocString(value); + *p = *value ? SysAllocString(value) : NULL; }else { ERR("GetValue failed: %08x\n", nsres); + hres = E_FAIL; } nsAString_Finish(&value_str); - - TRACE("%s\n", debugstr_w(*p)); - return S_OK; + return hres; } static HRESULT WINAPI HTMLTextAreaElement_put_name(IHTMLTextAreaElement *iface, BSTR v) diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index ad5fb26d558..a66b13cd2c2 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -673,6 +673,17 @@ static IHTMLAnchorElement *_get_anchor_iface(unsigned line, IUnknown *unk) return anchor; } +#define get_textarea_iface(u) _get_textarea_iface(__LINE__,u) +static IHTMLTextAreaElement *_get_textarea_iface(unsigned line, IUnknown *unk) +{ + IHTMLTextAreaElement *textarea; + HRESULT hres; + + hres = IUnknown_QueryInterface(unk, &IID_IHTMLTextAreaElement, (void**)&textarea); + ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLTextAreaElement: %08x\n", hres); + return textarea; +} + #define get_select_iface(u) _get_select_iface(__LINE__,u) static IHTMLSelectElement *_get_select_iface(unsigned line, IUnknown *unk) { @@ -1156,6 +1167,38 @@ static void _test_option_put_selected(unsigned line, IHTMLOptionElement *option, _test_option_selected(line, option, b); } +#define test_textarea_value(t,v) _test_textarea_value(__LINE__,t,v) +static void _test_textarea_value(unsigned line, IUnknown *unk, const char *exval) +{ + IHTMLTextAreaElement *textarea = _get_textarea_iface(line, unk); + BSTR value = (void*)0xdeadbeef; + HRESULT hres; + + hres = IHTMLTextAreaElement_get_value(textarea, &value); + IHTMLTextAreaElement_Release(textarea); + ok_(__FILE__,line)(hres == S_OK, "get_value failed: %08x\n", hres); + if(exval) + ok_(__FILE__,line)(!strcmp_wa(value, exval), "value = %s, expected %s\n", wine_dbgstr_w(value), exval); + else + ok_(__FILE__,line)(!value, "value = %p\n", value); + SysFreeString(value); +} + +#define test_textarea_put_value(t,v) _test_textarea_put_value(__LINE__,t,v) +static void _test_textarea_put_value(unsigned line, IUnknown *unk, const char *value) +{ + IHTMLTextAreaElement *textarea = _get_textarea_iface(line, unk); + BSTR tmp = a2bstr(value); + HRESULT hres; + + hres = IHTMLTextAreaElement_put_value(textarea, tmp); + IHTMLTextAreaElement_Release(textarea); + ok_(__FILE__,line)(hres == S_OK, "put_value failed: %08x\n", hres); + SysFreeString(tmp); + + _test_textarea_value(line, unk, value); +} + #define test_comment_text(c,t) _test_comment_text(__LINE__,c,t) static void _test_comment_text(unsigned line, IUnknown *unk, const char *extext) { @@ -6004,29 +6047,37 @@ static void test_elems(IHTMLDocument2 *doc) static void test_elems2(IHTMLDocument2 *doc) { - IHTMLElement *elem, *elem2; + IHTMLElement *elem, *elem2, *div; static const elem_type_t outer_types[] = { ET_BR, ET_A }; - elem = get_doc_elem_by_id(doc, "divid"); + div = get_doc_elem_by_id(doc, "divid"); - test_elem_set_innerhtml((IUnknown*)elem, "
"); + test_elem_set_innerhtml((IUnknown*)div, ""); elem2 = get_doc_elem_by_id(doc, "innerid"); ok(elem2 != NULL, "elem2 == NULL\n"); test_elem_set_outerhtml((IUnknown*)elem2, "