Rob Shearman : mshtml: Implement HTMLElement_get_children.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jun 26 07:11:45 CDT 2007


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

Author: Rob Shearman <rob at codeweavers.com>
Date:   Mon Jun 25 15:01:27 2007 +0100

mshtml: Implement HTMLElement_get_children.

---

 dlls/mshtml/htmlelem.c |   45 +++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index ccdad8c..9d5d475 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -875,11 +875,52 @@ static HRESULT WINAPI HTMLElement_get_onfilterchange(IHTMLElement *iface, VARIAN
     return E_NOTIMPL;
 }
 
+static void create_child_list(HTMLDocument *doc, HTMLElement *elem, elem_vector *buf)
+{
+    nsIDOMNodeList *nsnode_list;
+    nsIDOMNode *iter;
+    PRUint32 list_len = 0, i;
+    HTMLDOMNode *node;
+    nsresult nsres;
+
+    nsres = nsIDOMNode_GetChildNodes(elem->node->nsnode, &nsnode_list);
+    if(NS_FAILED(nsres)) {
+        ERR("GetChildNodes failed: %08x\n", nsres);
+        return;
+    }
+
+    nsIDOMNodeList_GetLength(nsnode_list, &list_len);
+    if(!list_len)
+        return;
+
+    buf->size = list_len;
+    buf->buf = mshtml_alloc(buf->size*sizeof(HTMLElement**));
+
+    for(i=0; i<list_len; i++) {
+        nsres = nsIDOMNodeList_Item(nsnode_list, i, &iter);
+        if(NS_FAILED(nsres)) {
+            ERR("Item failed: %08x\n", nsres);
+            continue;
+        }
+
+        node = get_node(doc, iter);
+        if(node->node_type != NT_HTMLELEM)
+            continue;
+
+        elem_vector_add(buf, (HTMLElement*)node->impl.elem);
+    }
+}
+
 static HRESULT WINAPI HTMLElement_get_children(IHTMLElement *iface, IDispatch **p)
 {
     HTMLElement *This = HTMLELEM_THIS(iface);
-    FIXME("(%p)->(%p)\n", This, p);
-    return E_NOTIMPL;
+    elem_vector buf = {NULL, 0, 0};
+
+    TRACE("(%p)->(%p)\n", This, p);
+
+    create_child_list(This->node->doc, This, &buf);
+
+    return HTMLElementCollection_Create((IUnknown*)HTMLELEM(This), buf.buf, buf.len, p);
 }
 
 static void create_all_list(HTMLDocument *doc, HTMLElement *elem, elem_vector *buf)




More information about the wine-cvs mailing list