From 3bf7482d52bfcebd43c0b632e1696f957d969101 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 2 Jun 2011 17:58:55 +0200 Subject: [PATCH] mshtml: Added IHTMLElement::get_offsetParent implementation. --- dlls/mshtml/htmlelem.c | 37 +++++++++++++++++++++++++++++++++++-- dlls/mshtml/tests/dom.c | 13 ++++++++++--- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 0cf0227642c..a47f2885479 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -923,8 +923,41 @@ static HRESULT WINAPI HTMLElement_get_offsetHeight(IHTMLElement *iface, LONG *p) static HRESULT WINAPI HTMLElement_get_offsetParent(IHTMLElement *iface, IHTMLElement **p) { HTMLElement *This = impl_from_IHTMLElement(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + nsIDOMNSHTMLElement *nselem; + nsIDOMElement *nsparent; + nsresult nsres; + HRESULT hres; + + TRACE("(%p)->(%p)\n", This, p); + + nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem); + if(NS_FAILED(nsres)) { + ERR("Could not get nsIDOMNSHTMLElement: %08x\n", nsres); + return E_FAIL; + } + + nsres = nsIDOMNSHTMLElement_GetOffsetParent(nselem, &nsparent); + nsIDOMNSHTMLElement_Release(nselem); + if(NS_FAILED(nsres)) { + ERR("GetOffsetParent failed: %08x\n", nsres); + return E_FAIL; + } + + if(nsparent) { + HTMLDOMNode *node; + + hres = get_node(This->node.doc, (nsIDOMNode*)nsparent, TRUE, &node); + nsIDOMElement_Release(nsparent); + if(FAILED(hres)) + return hres; + + hres = IHTMLDOMNode_QueryInterface(&node->IHTMLDOMNode_iface, &IID_IHTMLElement, (void**)p); + }else { + *p = NULL; + hres = S_OK; + } + + return hres; } static HRESULT WINAPI HTMLElement_put_innerHTML(IHTMLElement *iface, BSTR v) diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 4329be3de04..414da447105 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -931,10 +931,11 @@ static void _test_elem_attr(unsigned line, IHTMLElement *elem, const char *name, VariantClear(&value); } -#define test_elem_offset(u) _test_elem_offset(__LINE__,u) -static void _test_elem_offset(unsigned line, IUnknown *unk) +#define test_elem_offset(a,b) _test_elem_offset(__LINE__,a,b) +static void _test_elem_offset(unsigned line, IUnknown *unk, const char *parent_tag) { IHTMLElement *elem = _get_elem_iface(line, unk); + IHTMLElement *off_parent; LONG l; HRESULT hres; @@ -950,6 +951,12 @@ static void _test_elem_offset(unsigned line, IUnknown *unk) hres = IHTMLElement_get_offsetLeft(elem, &l); ok_(__FILE__,line) (hres == S_OK, "get_offsetLeft failed: %08x\n", hres); + hres = IHTMLElement_get_offsetParent(elem, &off_parent); + ok_(__FILE__,line) (hres == S_OK, "get_offsetParent failed: %08x\n", hres); + + _test_elem_tag(line, (IUnknown*)off_parent, parent_tag); + IHTMLElement_Release(off_parent); + IHTMLElement_Release(elem); } @@ -6513,7 +6520,7 @@ static void test_elems(IHTMLDocument2 *doc) test_elem_title((IUnknown*)select, NULL); test_elem_set_title((IUnknown*)select, "Title"); test_elem_title((IUnknown*)select, "Title"); - test_elem_offset((IUnknown*)select); + test_elem_offset((IUnknown*)select, "BODY"); test_elem_bounding_client_rect((IUnknown*)select); node = get_first_child((IUnknown*)select);