mshtml: Use create_all_collection in IHTMLElement::get_all implementation.
This commit is contained in:
parent
53f00d0221
commit
0769ebc8a6
|
@ -289,7 +289,7 @@ static HRESULT WINAPI HTMLDocument_get_all(IHTMLDocument2 *iface, IHTMLElementCo
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
*p = create_all_collection(get_node(This, (nsIDOMNode*)nselem, TRUE));
|
*p = create_all_collection(get_node(This, (nsIDOMNode*)nselem, TRUE), TRUE);
|
||||||
|
|
||||||
nsIDOMElement_Release(nselem);
|
nsIDOMElement_Release(nselem);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
|
@ -35,43 +35,6 @@
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
|
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
HTMLElement **buf;
|
|
||||||
DWORD len;
|
|
||||||
DWORD size;
|
|
||||||
} elem_vector;
|
|
||||||
|
|
||||||
static void elem_vector_add(elem_vector *buf, HTMLElement *elem)
|
|
||||||
{
|
|
||||||
if(buf->len == buf->size) {
|
|
||||||
buf->size <<= 1;
|
|
||||||
buf->buf = heap_realloc(buf->buf, buf->size*sizeof(HTMLElement**));
|
|
||||||
}
|
|
||||||
|
|
||||||
buf->buf[buf->len++] = elem;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void elem_vector_normalize(elem_vector *buf)
|
|
||||||
{
|
|
||||||
if(!buf->len) {
|
|
||||||
heap_free(buf->buf);
|
|
||||||
buf->buf = NULL;
|
|
||||||
}else if(buf->size > buf->len) {
|
|
||||||
buf->buf = heap_realloc(buf->buf, buf->len*sizeof(HTMLElement**));
|
|
||||||
}
|
|
||||||
|
|
||||||
buf->size = buf->len;
|
|
||||||
}
|
|
||||||
|
|
||||||
static BOOL is_elem_node(nsIDOMNode *node)
|
|
||||||
{
|
|
||||||
PRUint16 type=0;
|
|
||||||
|
|
||||||
nsIDOMNode_GetNodeType(node, &type);
|
|
||||||
|
|
||||||
return type == ELEMENT_NODE || type == COMMENT_NODE;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define HTMLELEM_THIS(iface) DEFINE_THIS(HTMLElement, HTMLElement, iface)
|
#define HTMLELEM_THIS(iface) DEFINE_THIS(HTMLElement, HTMLElement, iface)
|
||||||
|
|
||||||
#define HTMLELEM_NODE_THIS(iface) DEFINE_THIS2(HTMLElement, node, iface)
|
#define HTMLELEM_NODE_THIS(iface) DEFINE_THIS2(HTMLElement, node, iface)
|
||||||
|
@ -1230,52 +1193,13 @@ static HRESULT WINAPI HTMLElement_get_children(IHTMLElement *iface, IDispatch **
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void create_all_list(HTMLDocument *doc, HTMLDOMNode *elem, elem_vector *buf)
|
|
||||||
{
|
|
||||||
nsIDOMNodeList *nsnode_list;
|
|
||||||
nsIDOMNode *iter;
|
|
||||||
PRUint32 list_len = 0, i;
|
|
||||||
nsresult nsres;
|
|
||||||
|
|
||||||
nsres = nsIDOMNode_GetChildNodes(elem->nsnode, &nsnode_list);
|
|
||||||
if(NS_FAILED(nsres)) {
|
|
||||||
ERR("GetChildNodes failed: %08x\n", nsres);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsIDOMNodeList_GetLength(nsnode_list, &list_len);
|
|
||||||
if(!list_len)
|
|
||||||
return;
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(is_elem_node(iter)) {
|
|
||||||
HTMLDOMNode *node = get_node(doc, iter, TRUE);
|
|
||||||
|
|
||||||
elem_vector_add(buf, HTMLELEM_NODE_THIS(node));
|
|
||||||
create_all_list(doc, node, buf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT WINAPI HTMLElement_get_all(IHTMLElement *iface, IDispatch **p)
|
static HRESULT WINAPI HTMLElement_get_all(IHTMLElement *iface, IDispatch **p)
|
||||||
{
|
{
|
||||||
HTMLElement *This = HTMLELEM_THIS(iface);
|
HTMLElement *This = HTMLELEM_THIS(iface);
|
||||||
elem_vector buf = {NULL, 0, 8};
|
|
||||||
|
|
||||||
TRACE("(%p)->(%p)\n", This, p);
|
TRACE("(%p)->(%p)\n", This, p);
|
||||||
|
|
||||||
buf.buf = heap_alloc(buf.size*sizeof(HTMLElement**));
|
*p = (IDispatch*)create_all_collection(&This->node, FALSE);
|
||||||
|
|
||||||
create_all_list(This->node.doc, &This->node, &buf);
|
|
||||||
elem_vector_normalize(&buf);
|
|
||||||
|
|
||||||
*p = (IDispatch*)HTMLElementCollection_Create((IUnknown*)HTMLELEM(This), buf.buf, buf.len);
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -463,13 +463,14 @@ static void create_all_list(HTMLDocument *doc, HTMLDOMNode *elem, elem_vector_t
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IHTMLElementCollection *create_all_collection(HTMLDOMNode *node)
|
IHTMLElementCollection *create_all_collection(HTMLDOMNode *node, BOOL include_root)
|
||||||
{
|
{
|
||||||
elem_vector_t buf = {NULL, 0, 8};
|
elem_vector_t buf = {NULL, 0, 8};
|
||||||
|
|
||||||
buf.buf = heap_alloc(buf.size*sizeof(HTMLElement**));
|
buf.buf = heap_alloc(buf.size*sizeof(HTMLElement**));
|
||||||
|
|
||||||
elem_vector_add(&buf, HTMLELEM_NODE_THIS(node));
|
if(include_root)
|
||||||
|
elem_vector_add(&buf, HTMLELEM_NODE_THIS(node));
|
||||||
create_all_list(node->doc, node, &buf);
|
create_all_list(node->doc, node, &buf);
|
||||||
elem_vector_normalize(&buf);
|
elem_vector_normalize(&buf);
|
||||||
|
|
||||||
|
|
|
@ -585,7 +585,7 @@ IDispatch *script_parse_event(HTMLDocument*,LPCWSTR);
|
||||||
void set_script_mode(HTMLDocument*,SCRIPTMODE);
|
void set_script_mode(HTMLDocument*,SCRIPTMODE);
|
||||||
|
|
||||||
IHTMLElementCollection *HTMLElementCollection_Create(IUnknown*,HTMLElement**,DWORD);
|
IHTMLElementCollection *HTMLElementCollection_Create(IUnknown*,HTMLElement**,DWORD);
|
||||||
IHTMLElementCollection *create_all_collection(HTMLDOMNode*);
|
IHTMLElementCollection *create_all_collection(HTMLDOMNode*,BOOL);
|
||||||
IHTMLElementCollection *create_collection_from_nodelist(HTMLDocument*,IUnknown*,nsIDOMNodeList*);
|
IHTMLElementCollection *create_collection_from_nodelist(HTMLDocument*,IUnknown*,nsIDOMNodeList*);
|
||||||
|
|
||||||
/* commands */
|
/* commands */
|
||||||
|
|
Loading…
Reference in New Issue