From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlattr.c | 22 ++++++++++++++++++++-- dlls/mshtml/tests/dom.c | 22 ++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/htmlattr.c b/dlls/mshtml/htmlattr.c index 963909fdc00..5b3f070f0a7 100644 --- a/dlls/mshtml/htmlattr.c +++ b/dlls/mshtml/htmlattr.c @@ -324,8 +324,26 @@ static HRESULT WINAPI HTMLDOMAttribute2_cloneNode(IHTMLDOMAttribute2 *iface, VAR IHTMLDOMAttribute **clonedNode) { HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute2(iface); - FIXME("(%p)->(%x %p)\n", This, fDeep, clonedNode); - return E_NOTIMPL; + HTMLDOMAttribute *new_attr; + HRESULT hres; + + TRACE("(%p)->(%x %p)\n", This, fDeep, clonedNode); + + hres = HTMLDOMAttribute_Create(This->name, NULL, 0, This->node.doc, &new_attr); + if(FAILED(hres)) + return hres; + + if(This->elem) + hres = get_elem_attr_value_by_dispid(This->elem, This->dispid, &new_attr->value); + else + hres = VariantCopy(&new_attr->value, &This->value); + if(FAILED(hres)) { + IHTMLDOMAttribute_Release(&new_attr->IHTMLDOMAttribute_iface); + return hres; + } + + *clonedNode = &new_attr->IHTMLDOMAttribute_iface; + return hres; }
static const IHTMLDOMAttribute2Vtbl HTMLDOMAttribute2Vtbl = { diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 4daeb4ff552..ba82a32c05c 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -9947,8 +9947,10 @@ static void test_elems(IHTMLDocument2 *doc) static void test_attr_node(IHTMLDOMAttribute *test_attr, IHTMLDocument2 *doc) { IHTMLDOMAttribute2 *attr; + IHTMLDOMAttribute *clone; IHTMLDocument2 *doc_node; IHTMLWindow2 *window; + VARIANT v, v_clone; IDispatch *disp; HRESULT hres; LONG type; @@ -9978,6 +9980,26 @@ static void test_attr_node(IHTMLDOMAttribute *test_attr, IHTMLDocument2 *doc) IHTMLDocument2_Release(doc_node); IDispatch_Release(disp);
+ hres = IHTMLDOMAttribute2_cloneNode(attr, VARIANT_TRUE, &clone); + ok(hres == S_OK, "cloneNode failed: %08lx\n", hres); + ok(!iface_cmp((IUnknown*)attr, (IUnknown*)clone), "attr == cloned attr\n"); + + V_VT(&v) = VT_EMPTY; + V_VT(&v_clone) = VT_EMPTY; + hres = IHTMLDOMAttribute_get_nodeValue(test_attr, &v); + ok(hres == S_OK, "get_nodeValue failed: %08lx\n", hres); + hres = IHTMLDOMAttribute_get_nodeValue(clone, &v_clone); + ok(hres == S_OK, "get_nodeValue failed: %08lx\n", hres); + if(V_VT(&v) == VT_BSTR) + ok(VarCmp(&v, &v_clone, 0, 0) == VARCMP_EQ, "attr value %s != cloned attr value %s\n", wine_dbgstr_variant(&v), wine_dbgstr_variant(&v_clone)); + else { + todo_wine + ok(V_VT(&v_clone) == VT_BSTR, "unexpected cloned attr value %s for non-string attr value %s\n", wine_dbgstr_variant(&v), wine_dbgstr_variant(&v_clone)); + } + IHTMLDOMAttribute_Release(clone); + VariantClear(&v_clone); + VariantClear(&v); + IHTMLDOMAttribute2_Release(attr); }