Module: wine Branch: master Commit: 6437becb5b70d120e0a34a0f5c01b3fa4ec28e9a URL: http://source.winehq.org/git/wine.git/?a=commit;h=6437becb5b70d120e0a34a0f5c...
Author: Jacek Caban jacek@codeweavers.com Date: Thu Oct 4 02:13:01 2007 +0200
mshtml: Include document element in collection returned by IHTMLDocument2::get_all.
---
dlls/mshtml/htmldoc.c | 37 ++++++++++++++++++++++++------------- dlls/mshtml/htmlelem.c | 21 +++++++++++++++++---- dlls/mshtml/mshtml_private.h | 2 ++ 3 files changed, 43 insertions(+), 17 deletions(-)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 32307e4..4faeb6e 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -234,25 +234,36 @@ static HRESULT WINAPI HTMLDocument_get_Script(IHTMLDocument2 *iface, IDispatch * static HRESULT WINAPI HTMLDocument_get_all(IHTMLDocument2 *iface, IHTMLElementCollection **p) { HTMLDocument *This = HTMLDOC_THIS(iface); - IHTMLElement *doc; - IDispatch *disp; - HRESULT hres; + nsIDOMDocument *nsdoc = NULL; + nsIDOMElement *nselem = NULL; + nsresult nsres;
TRACE("(%p)->(%p)\n", This, p);
- hres = IHTMLDocument3_get_documentElement(HTMLDOC3(This), &doc); - if(FAILED(hres)) - return hres; + if(!This->nscontainer) { + *p = NULL; + return S_OK; + }
- hres = IHTMLElement_get_all(doc, &disp); - IHTMLElement_Release(doc); - if(FAILED(hres)) - return hres; + nsres = nsIWebNavigation_GetDocument(This->nscontainer->navigation, &nsdoc); + if(NS_FAILED(nsres)) + ERR("GetDocument failed: %08x\n", nsres);
- hres = IDispatch_QueryInterface(disp, &IID_IHTMLElementCollection, (void**)p); - IDispatch_Release(disp); + if(nsdoc) { + nsres = nsIDOMHTMLDocument_GetDocumentElement(nsdoc, &nselem); + if(NS_FAILED(nsres)) + ERR("GetDocumentElement failed: %08x\n", nsres); + }
- return hres; + if(!nselem) { + *p = NULL; + return S_OK; + } + + *p = create_all_collection(get_node(This, (nsIDOMNode*)nselem)); + + nsIDOMElement_Release(nselem); + return S_OK; }
static HRESULT WINAPI HTMLDocument_get_body(IHTMLDocument2 *iface, IHTMLElement **p) diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index dd152f2..4d921c2 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -1087,7 +1087,7 @@ static HRESULT WINAPI HTMLElement_get_children(IHTMLElement *iface, IDispatch ** return S_OK; }
-static void create_all_list(HTMLDocument *doc, HTMLElement *elem, elem_vector *buf) +static void create_all_list(HTMLDocument *doc, HTMLDOMNode *elem, elem_vector *buf) { nsIDOMNodeList *nsnode_list; nsIDOMNode *iter; @@ -1095,7 +1095,7 @@ static void create_all_list(HTMLDocument *doc, HTMLElement *elem, elem_vector *b PRUint16 node_type; nsresult nsres;
- nsres = nsIDOMNode_GetChildNodes(elem->node.nsnode, &nsnode_list); + nsres = nsIDOMNode_GetChildNodes(elem->nsnode, &nsnode_list); if(NS_FAILED(nsres)) { ERR("GetChildNodes failed: %08x\n", nsres); return; @@ -1117,7 +1117,7 @@ static void create_all_list(HTMLDocument *doc, HTMLElement *elem, elem_vector *b HTMLDOMNode *node = get_node(doc, iter);
elem_vector_add(buf, HTMLELEM_NODE_THIS(node)); - create_all_list(doc, HTMLELEM_NODE_THIS(node), buf); + create_all_list(doc, node, buf); } } } @@ -1131,7 +1131,7 @@ static HRESULT WINAPI HTMLElement_get_all(IHTMLElement *iface, IDispatch **p)
buf.buf = mshtml_alloc(buf.size*sizeof(HTMLElement**));
- create_all_list(This->node.doc, This, &buf); + create_all_list(This->node.doc, &This->node, &buf); elem_vector_normalize(&buf);
*p = (IDispatch*)HTMLElementCollection_Create((IUnknown*)HTMLELEM(This), buf.buf, buf.len); @@ -1595,6 +1595,19 @@ static const IHTMLElementCollectionVtbl HTMLElementCollectionVtbl = { HTMLElementCollection_tags };
+IHTMLElementCollection *create_all_collection(HTMLDOMNode *node) +{ + elem_vector buf = {NULL, 0, 8}; + + buf.buf = mshtml_alloc(buf.size*sizeof(HTMLElement**)); + + elem_vector_add(&buf, HTMLELEM_NODE_THIS(node)); + create_all_list(node->doc, node, &buf); + elem_vector_normalize(&buf); + + return HTMLElementCollection_Create((IUnknown*)HTMLDOMNODE(node), buf.buf, buf.len); +} + static IHTMLElementCollection *HTMLElementCollection_Create(IUnknown *ref_unk, HTMLElement **elems, DWORD len) { diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index b0ac454..f73d1a0 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -430,6 +430,8 @@ void HTMLElement_destructor(HTMLDOMNode*); HTMLDOMNode *get_node(HTMLDocument*,nsIDOMNode*); void release_nodes(HTMLDocument*);
+IHTMLElementCollection *create_all_collection(HTMLDOMNode*); + BOOL install_wine_gecko(void);
/* commands */