mshtml: Added IHTMLElementCollection::tags implementation.

This commit is contained in:
Jacek Caban 2006-03-06 22:34:49 +01:00 committed by Alexandre Julliard
parent 78872852fd
commit 3d68599355
4 changed files with 76 additions and 10 deletions

View File

@ -1096,8 +1096,52 @@ static HRESULT WINAPI HTMLElementCollection_tags(IHTMLElementCollection *iface,
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

View File

@ -203,6 +203,10 @@ PRUint32 nsACString_GetData(const nsACString*,const char**,PRBool*);
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);

View File

@ -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_CStringContainerFinish)(nsCStringContainer*);
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;

View File

@ -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;