Jacek Caban : mshtml: Added IHTMLElement::get_offsetParent implementation.

Alexandre Julliard julliard at winehq.org
Fri Jun 3 14:04:39 CDT 2011


Module: wine
Branch: master
Commit: 3bf7482d52bfcebd43c0b632e1696f957d969101
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3bf7482d52bfcebd43c0b632e1696f957d969101

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Jun  2 17:58:55 2011 +0200

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 0cf0227..a47f288 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 4329be3..414da44 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);




More information about the wine-cvs mailing list