mshtml: Implement IHTMLDOMNode replaceChild.

This commit is contained in:
Alistair Leslie-Hughes 2011-02-19 15:58:30 +11:00 committed by Alexandre Julliard
parent d0451f6b3f
commit 531a07db14
2 changed files with 67 additions and 2 deletions

View file

@ -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,

View file

@ -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();
}