Module: wine Branch: master Commit: beeaea11763e06b2c2233c210734413c9b07e386 URL: http://source.winehq.org/git/wine.git/?a=commit;h=beeaea11763e06b2c2233c2107...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Jun 25 19:28:37 2008 -0500
mshtml: Added IHTMLDOMNode::get_parentNode implementation.
---
dlls/mshtml/htmlnode.c | 23 +++++++++++++++++++++-- dlls/mshtml/tests/dom.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c index d46d75c..b802e90 100644 --- a/dlls/mshtml/htmlnode.c +++ b/dlls/mshtml/htmlnode.c @@ -386,8 +386,27 @@ static HRESULT WINAPI HTMLDOMNode_get_nodeType(IHTMLDOMNode *iface, long *p) static HRESULT WINAPI HTMLDOMNode_get_parentNode(IHTMLDOMNode *iface, IHTMLDOMNode **p) { HTMLDOMNode *This = HTMLDOMNODE_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + HTMLDOMNode *node; + nsIDOMNode *nsnode; + nsresult nsres; + + TRACE("(%p)->(%p)\n", This, p); + + nsres = nsIDOMNode_GetParentNode(This->nsnode, &nsnode); + if(NS_FAILED(nsres)) { + ERR("GetParentNode failed: %08x\n", nsres); + return E_FAIL; + } + + if(!nsnode) { + *p = NULL; + return S_OK; + } + + node = get_node(This->doc, nsnode, TRUE); + *p = HTMLDOMNODE(node); + IHTMLDOMNode_AddRef(*p); + return S_OK; }
static HRESULT WINAPI HTMLDOMNode_hasChildNodes(IHTMLDOMNode *iface, VARIANT_BOOL *fChildren) diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index a1b2e66..0748c89 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -900,6 +900,20 @@ static void _test_node_has_child(unsigned line, IUnknown *unk, VARIANT_BOOL exb) IHTMLDOMNode_Release(node); }
+#define test_node_get_parent(u) _test_node_get_parent(__LINE__,u) +static IHTMLDOMNode *_test_node_get_parent(unsigned line, IUnknown *unk) +{ + IHTMLDOMNode *node = _get_node_iface(line, unk); + IHTMLDOMNode *parent; + HRESULT hres; + + hres = IHTMLDOMNode_get_parentNode(node, &parent); + IHTMLDOMNode_Release(node); + ok_(__FILE__,line) (hres == S_OK, "get_parentNode failed: %08x\n", hres); + + return parent; +} + #define get_node_type(n) _get_node_type(__LINE__,n) static long _get_node_type(unsigned line, IUnknown *unk) { @@ -2042,6 +2056,22 @@ static void test_elems(IHTMLDocument2 *doc) test_elem_set_class((IUnknown*)elem, NULL); test_elem_tabindex((IUnknown*)elem, 0); test_elem_set_tabindex((IUnknown*)elem, 1); + + node = test_node_get_parent((IUnknown*)elem); + ok(node != NULL, "node == NULL\n"); + test_node_name((IUnknown*)node, "BODY"); + node2 = test_node_get_parent((IUnknown*)node); + IHTMLDOMNode_Release(node); + ok(node2 != NULL, "node == NULL\n"); + test_node_name((IUnknown*)node2, "HTML"); + node = test_node_get_parent((IUnknown*)node2); + IHTMLDOMNode_Release(node2); + ok(node != NULL, "node == NULL\n"); + test_node_name((IUnknown*)node, "#document"); + node2 = test_node_get_parent((IUnknown*)node); + IHTMLDOMNode_Release(node); + ok(node2 == NULL, "node != NULL\n"); + IHTMLElement_Release(elem); }