Kovács András : mshtml: HTMLElementCollection_item implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Nov 15 05:37:29 CST 2006


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

Author: Kovács András <andras at csevego.net>
Date:   Mon Nov  6 16:06:52 2006 +0100

mshtml: HTMLElementCollection_item implementation.

---

 dlls/mshtml/htmlelem.c |   75 ++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 63 insertions(+), 12 deletions(-)

diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index 5a19805..cd869d5 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -1183,22 +1183,73 @@ static HRESULT WINAPI HTMLElementCollect
 {
     HTMLElementCollection *This = ELEMCOL_THIS(iface);
 
-    if(V_VT(&index) != VT_I4) {
-        WARN("Invalid index vt=%d\n", V_VT(&index));
-        return E_INVALIDARG;
-    }
+    TRACE("(%p)->(v(%d) v(%d) %p)\n", This, V_VT(&name), V_VT(&index), pdisp);
 
-    if(V_VT(&name) != VT_I4 || V_I4(&name) != V_I4(&index))
-        FIXME("Unsupproted name vt=%d\n", V_VT(&name));
+    if(V_VT(&name) == VT_I4) {
+        TRACE("name is VT_I4: %d\n", V_I4(&name));
+        if(V_I4(&name) < 0 || V_I4(&name) >= This->len) {
+            ERR("Invalid name! name=%d\n", V_I4(&name));
+            return E_INVALIDARG;
+        }
 
-    TRACE("(%p)->(%d %d %p)\n", This, V_I4(&name), V_I4(&index), pdisp);
+        *pdisp = (IDispatch*)This->elems[V_I4(&name)];
+        IDispatch_AddRef(*pdisp);
+        TRACE("Returning pdisp=%p\n", pdisp);
+        return S_OK;
+    }
 
-    if(V_I4(&index) < 0 || V_I4(&index) >= This->len)
-        return E_INVALIDARG;
+    if(V_VT(&name) == VT_BSTR) {
+        DWORD i;
+        nsAString tag_str;
+        const PRUnichar *tag;
+        elem_vector buf = {NULL, 0, 8};
+
+        TRACE("name is VT_BSTR: %s\n", debugstr_w(V_BSTR(&name)));
+
+        nsAString_Init(&tag_str, NULL);
+        buf.buf = mshtml_alloc(buf.size*sizeof(HTMLElement*));
+
+        for(i=0; i<This->len; i++) {
+            if(!This->elems[i]->nselem) continue;
+
+            nsIDOMHTMLElement_GetId(This->elems[i]->nselem, &tag_str);
+            nsAString_GetData(&tag_str, &tag, NULL);
+
+            if(CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, tag, -1,
+                                V_BSTR(&name), -1) == CSTR_EQUAL) {
+                TRACE("Found name. elem=%d\n", i);
+                if (V_VT(&index) == VT_I4)
+                    if (buf.len == V_I4(&index)) {
+                        nsAString_Finish(&tag_str);
+                        mshtml_free(buf.buf);
+                        buf.buf = NULL;
+                        *pdisp = (IDispatch*)This->elems[i];
+                        TRACE("Returning element %d pdisp=%p\n", i, pdisp);
+                        IDispatch_AddRef(*pdisp);
+                        return S_OK;
+                    }
+                elem_vector_add(&buf, This->elems[i]);
+            }
+        }
+        nsAString_Finish(&tag_str);
+        if (V_VT(&index) == VT_I4) {
+            mshtml_free(buf.buf);
+            buf.buf = NULL;
+            ERR("Invalid index. index=%d >= buf.len=%d\n",V_I4(&index), buf.len);
+            return E_INVALIDARG;
+        }
+        if(!buf.len) {
+            mshtml_free(buf.buf);
+            buf.buf = NULL;
+        } else if(buf.size > buf.len) {
+            buf.buf = mshtml_realloc(buf.buf, buf.len*sizeof(HTMLElement*));
+        }
+        TRACE("Returning %d element(s).\n", buf.len);
+        return HTMLElementCollection_Create(This->ref_unk, buf.buf, buf.len, pdisp);
+    }
 
-    *pdisp = (IDispatch*)This->elems[V_I4(&index)];
-    IDispatch_AddRef(*pdisp);
-    return S_OK;
+    FIXME("unsupported arguments\n");
+    return E_INVALIDARG;
 }
 
 static HRESULT WINAPI HTMLElementCollection_tags(IHTMLElementCollection *iface,




More information about the wine-cvs mailing list