From 6c637ab9c6a65d5601f98545b05f413f777c444e Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 1 Mar 2016 14:31:25 +0100 Subject: [PATCH] mshtml: Added support for IHTMLDOMAttribute::nodeValue property on detached attributes. Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- dlls/mshtml/htmlattr.c | 13 +++++-------- dlls/mshtml/mshtml_private.h | 2 ++ dlls/mshtml/tests/dom.c | 16 ++++++++++++++++ 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/dlls/mshtml/htmlattr.c b/dlls/mshtml/htmlattr.c index 885b2aa7f62..97a4ce2695e 100644 --- a/dlls/mshtml/htmlattr.c +++ b/dlls/mshtml/htmlattr.c @@ -83,6 +83,7 @@ static ULONG WINAPI HTMLDOMAttribute_Release(IHTMLDOMAttribute *iface) if(!ref) { assert(!This->elem); release_dispex(&This->dispex); + VariantClear(&This->value); heap_free(This->name); heap_free(This); } @@ -150,10 +151,8 @@ static HRESULT WINAPI HTMLDOMAttribute_put_nodeValue(IHTMLDOMAttribute *iface, V TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); - if(!This->elem) { - FIXME("NULL This->elem\n"); - return E_UNEXPECTED; - } + if(!This->elem) + return VariantCopy(&This->value, &v); memset(&ei, 0, sizeof(ei)); @@ -167,10 +166,8 @@ static HRESULT WINAPI HTMLDOMAttribute_get_nodeValue(IHTMLDOMAttribute *iface, V TRACE("(%p)->(%p)\n", This, p); - if(!This->elem) { - FIXME("NULL This->elem\n"); - return E_UNEXPECTED; - } + if(!This->elem) + return VariantCopy(p, &This->value); return get_elem_attr_value_by_dispid(This->elem, This->dispid, 0, p); } diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index f4e6668389c..36c95cecb91 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -943,7 +943,9 @@ typedef struct { LONG ref; + /* name and value are valid only for detached attributes (when elem == NULL). */ WCHAR *name; + VARIANT value; HTMLElement *elem; DISPID dispid; diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 11e9d279bc1..15a30276224 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -4790,6 +4790,7 @@ static void _get_attr_node_value(unsigned line, IHTMLDOMAttribute *attr, VARIANT { HRESULT hres; + V_VT(v) = VT_EMPTY; hres = IHTMLDOMAttribute_get_nodeValue(attr, v); ok_(__FILE__,line) (hres == S_OK, "get_nodeValue failed: %08x\n", hres); ok_(__FILE__,line) (V_VT(v) == vt, "vt=%d, expected %d\n", V_VT(v), vt); @@ -8914,6 +8915,8 @@ static void test_create_elems(IHTMLDocument2 *doc) ok(hres == S_OK, "createAttribute dailed: %08x\n", hres); SysFreeString(str); if(SUCCEEDED(hres)) { + VARIANT v; + test_disp((IUnknown*)attr, &DIID_DispHTMLDOMAttribute, "[object]"); test_ifaces((IUnknown*)attr, attr_iids); test_no_iface((IUnknown*)attr, &IID_IHTMLDOMNode); @@ -8921,6 +8924,19 @@ static void test_create_elems(IHTMLDocument2 *doc) test_attr_node_name(attr, "Test"); test_attr_expando(attr, VARIANT_FALSE); + get_attr_node_value(attr, &v, VT_EMPTY); + + V_VT(&v) = VT_I4; + V_I4(&v) = 1; + put_attr_node_value(attr, v); + + get_attr_node_value(attr, &v, VT_I4); + ok(V_I4(&v) == 1, "nodeValue = %d\n", V_I4(&v)); + + V_VT(&v) = VT_EMPTY; + put_attr_node_value(attr, v); + get_attr_node_value(attr, &v, VT_EMPTY); + IHTMLDOMAttribute_Release(attr); }