Jacek Caban : mshtml: Added IHTMLElementCollection::tags implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Mar 7 06:12:48 CST 2006


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Mar  6 22:34:49 2006 +0100

mshtml: Added IHTMLElementCollection::tags implementation.

---

 dlls/mshtml/htmlelem.c       |   48 ++++++++++++++++++++++++++++++++++++++++--
 dlls/mshtml/mshtml_private.h |    4 ++++
 dlls/mshtml/nsembed.c        |   26 +++++++++++++++++------
 dlls/mshtml/nsiface.idl      |    8 ++++++-
 4 files changed, 76 insertions(+), 10 deletions(-)

diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index 818a3a3..12765af 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -1096,8 +1096,52 @@ static HRESULT WINAPI HTMLElementCollect
                                                  VARIANT tagName, IDispatch **pdisp)
 {
     HTMLElementCollection *This = ELEMCOL_THIS(iface);
-    FIXME("(%p)->(%s %p)\n", This, debugstr_w(V_BSTR(&tagName)), pdisp);
-    return E_NOTIMPL;
+    DWORD size = 8, len = 0, i;
+    HTMLElement **elem_list;
+    nsAString tag_str;
+    const PRUnichar *tag;
+
+    if(V_VT(&tagName) != VT_BSTR) {
+        WARN("Invalid arg\n");
+        return E_INVALIDARG;
+    }
+
+    TRACE("(%p)->(%s %p)\n", This, debugstr_w(V_BSTR(&tagName)), pdisp);
+
+    elem_list = HeapAlloc(GetProcessHeap(), 0, size*sizeof(HTMLElement*));
+
+    nsAString_Init(&tag_str, NULL);
+
+    for(i=0; i<This->len; i++) {
+        if(!This->elems[i]->nselem)
+            continue;
+
+        nsIDOMElement_GetTagName(This->elems[i]->nselem, &tag_str);
+        nsAString_GetData(&tag_str, &tag, NULL);
+
+        if(CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, tag, -1,
+                          V_BSTR(&tagName), -1) == CSTR_EQUAL) {
+            if(len == size) {
+                size <<= 2;
+                elem_list = HeapReAlloc(GetProcessHeap(), 0, elem_list, size);
+            }
+
+            elem_list[len++] = This->elems[i];
+        }
+    }
+
+    nsAString_Finish(&tag_str);
+
+    TRACE("fount %ld tags\n", len);
+
+    if(!len) {
+        HeapFree(GetProcessHeap(), 0, elem_list);
+        elem_list = NULL;
+    }else if(size > len) {
+        HeapReAlloc(GetProcessHeap(), 0, elem_list, len);
+    }
+
+    return HTMLElementCollection_Create(This->ref_unk, elem_list, len, pdisp);
 }
 
 #undef ELEMCOL_THIS
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 246205d..57aece0 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -203,6 +203,10 @@ PRUint32 nsACString_GetData(const nsACSt
 void nsACString_SetData(nsACString*,const char*);
 void nsACString_Destroy(nsACString*);
 
+void nsAString_Init(nsAString*,const PRUnichar*);
+PRUint32 nsAString_GetData(const nsAString*,const PRUnichar**,PRBool*);
+void nsAString_Finish(nsAString*);
+
 nsIInputStream *create_nsstream(const char*,PRInt32);
 
 IHlink *Hlink_Create(void);
diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c
index 029fa1c..03c1fed 100644
--- a/dlls/mshtml/nsembed.c
+++ b/dlls/mshtml/nsembed.c
@@ -44,13 +44,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 
 #define PR_UINT32_MAX 0xffffffff
 
-struct nsStringContainer {
-    void *v;
-    void *d1;
-    PRUint32 d2;
-    void *d3;
-};
-
 struct nsCStringContainer {
     void *v;
     void *d1;
@@ -68,6 +61,7 @@ static nsresult (*NS_CStringContainerFin
 static nsresult (*NS_StringSetData)(nsAString*,const PRUnichar*,PRUint32);
 static nsresult (*NS_CStringSetData)(nsACString*,const char*,PRUint32);
 static nsresult (*NS_NewLocalFile)(const nsAString*,PRBool,nsIFile**);
+static PRUint32 (*NS_StringGetData)(const nsAString*,const PRUnichar **,PRBool*);
 static PRUint32 (*NS_CStringGetData)(const nsACString*,const char**,PRBool*);
 
 static HINSTANCE hXPCOM = NULL;
@@ -304,6 +298,7 @@ static BOOL load_gecko(void)
     NS_DLSYM(NS_StringSetData);
     NS_DLSYM(NS_CStringSetData);
     NS_DLSYM(NS_NewLocalFile);
+    NS_DLSYM(NS_StringGetData);
     NS_DLSYM(NS_CStringGetData);
 
 #undef NS_DLSYM
@@ -390,6 +385,23 @@ void nsACString_Destroy(nsACString *str)
     HeapFree(GetProcessHeap(), 0, str);
 }
 
+void nsAString_Init(nsAString *str, const PRUnichar *data)
+{
+    NS_StringContainerInit(str);
+    if(data)
+        NS_StringSetData(str, data, PR_UINT32_MAX);
+}
+
+PRUint32 nsAString_GetData(const nsAString *str, const PRUnichar **data, PRBool *termited)
+{
+    return NS_StringGetData(str, data, termited);
+}
+
+void nsAString_Finish(nsAString *str)
+{
+    NS_StringContainerFinish(str);
+}
+
 nsIInputStream *create_nsstream(const char *data, PRInt32 data_len)
 {
     nsIStringInputStream *ret;
diff --git a/dlls/mshtml/nsiface.idl b/dlls/mshtml/nsiface.idl
index 7aa4acd..bc7cca0 100644
--- a/dlls/mshtml/nsiface.idl
+++ b/dlls/mshtml/nsiface.idl
@@ -47,8 +47,14 @@ typedef ULARGE_INTEGER PRUint64;
 typedef PRUint64 DOMTimeStamp;
 typedef PRUint32 nsLoadFlags;
 
+typedef struct {
+    void *v;
+    void *d1;
+    PRUint32 d2;
+    void *d3;
+} nsStringContainer;
+
 typedef struct nsCStringContainer nsCStringContainer;
-typedef struct nsStringContainer nsStringContainer;
 typedef nsCStringContainer nsACString;
 typedef nsStringContainer nsAString;
 




More information about the wine-cvs mailing list