Module: wine Branch: master Commit: 531a07db142c28026fec1ea7ad1c4048eb1ebfff URL: http://source.winehq.org/git/wine.git/?a=commit;h=531a07db142c28026fec1ea7ad...
Author: Alistair Leslie-Hughes leslie_alistair@hotmail.com Date: Sat Feb 19 15:58:30 2011 +1100
mshtml: Implement IHTMLDOMNode replaceChild.
---
dlls/mshtml/htmlnode.c | 33 +++++++++++++++++++++++++++++++-- dlls/mshtml/tests/dom.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c index dbb5888..8962acf 100644 --- a/dlls/mshtml/htmlnode.c +++ b/dlls/mshtml/htmlnode.c @@ -580,8 +580,37 @@ static HRESULT WINAPI HTMLDOMNode_replaceChild(IHTMLDOMNode *iface, IHTMLDOMNode IHTMLDOMNode *oldChild, IHTMLDOMNode **node) { HTMLDOMNode *This = impl_from_IHTMLDOMNode(iface); - FIXME("(%p)->(%p %p %p)\n", This, newChild, oldChild, node); - return E_NOTIMPL; + HTMLDOMNode *node_new; + HTMLDOMNode *node_old; + nsIDOMNode *nsnode; + nsresult nsres; + HRESULT hres; + + TRACE("(%p)->(%p %p %p)\n", This, newChild, oldChild, node); + + node_new = get_node_obj(This->doc, (IUnknown*)newChild); + if(!node_new) + return E_FAIL; + + node_old = get_node_obj(This->doc, (IUnknown*)oldChild); + if(!node_old) + return E_FAIL; + + nsres = nsIDOMNode_ReplaceChild(This->nsnode, node_new->nsnode, node_old->nsnode, &nsnode); + if(NS_FAILED(nsres)) { + return E_FAIL; + } + + nsnode = node_new->nsnode; + + hres = get_node(This->doc, nsnode, TRUE, &node_new); + nsIDOMNode_Release(nsnode); + if(FAILED(hres)) + return hres; + + *node = &node_new->IHTMLDOMNode_iface; + IHTMLDOMNode_AddRef(*node); + return S_OK; }
static HRESULT WINAPI HTMLDOMNode_cloneNode(IHTMLDOMNode *iface, VARIANT_BOOL fDeep, diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 0ce3ead..6cc1733 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -5639,6 +5639,41 @@ static void test_create_elems(IHTMLDocument2 *doc) IHTMLElement_Release(body); }
+static void test_replacechild_elems(IHTMLDocument2 *doc) +{ + IHTMLElement *body; + IHTMLDOMNode *node, *node2, *node3; + IHTMLDOMNode *nodeBody, *nodeNew; + HRESULT hres; + VARIANT var; + + body = doc_get_body(doc); + + node = test_create_text(doc, "insert"); + + V_VT(&var) = VT_NULL; + V_DISPATCH(&var) = NULL; + node2 = test_node_insertbefore((IUnknown*)body, node, &var); + IHTMLDOMNode_Release(node); + + test_elem_innertext(body, "insert"); + + node3 = test_create_text(doc, "replaced"); + + nodeBody = _get_node_iface(__LINE__, (IUnknown *)body); + + hres = IHTMLDOMNode_replaceChild(nodeBody, node3, node2, &nodeNew); + ok(hres == S_OK, "Expected S_OK, got 0x%08x\n", hres); + + test_elem_innertext(body, "replaced"); + + IHTMLDOMNode_Release(node2); + IHTMLDOMNode_Release(node3); + IHTMLDOMNode_Release(nodeBody); + + IHTMLElement_Release(body); +} + static void test_null_write(IHTMLDocument2 *doc) { HRESULT hres; @@ -6201,6 +6236,7 @@ START_TEST(dom) run_domtest(cond_comment_str, test_cond_comment); run_domtest(frameset_str, test_frameset); run_domtest(emptydiv_str, test_docfrag); + run_domtest(doc_blank, test_replacechild_elems);
CoUninitialize(); }