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