From 808c2d6c7fefb38fe50357749439ea9af9c2cf48 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 19 Nov 2015 12:14:59 +0100 Subject: [PATCH] mshtml: Added support for getElementsByTagName in document fragment nodes. Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- dlls/mshtml/htmldoc.c | 46 +++++++++++++++++++++++++++++++++++---------- dlls/mshtml/tests/dom.c | 50 +++++++++++++++++++++++++++++++++++-------------- 2 files changed, 72 insertions(+), 24 deletions(-) diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 8e53b8bcefc..cdeb3711611 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -2371,19 +2371,45 @@ static HRESULT WINAPI HTMLDocument3_getElementsByTagName(IHTMLDocument3 *iface, TRACE("(%p)->(%s %p)\n", This, debugstr_w(v), pelColl); - if(!This->doc_node->nsdoc) { - WARN("NULL nsdoc\n"); - return E_UNEXPECTED; - } + if(This->doc_node->nsdoc) { + nsAString_InitDepend(&id_str, v); + nsres = nsIDOMHTMLDocument_GetElementsByTagName(This->doc_node->nsdoc, &id_str, &nslist); + nsAString_Finish(&id_str); + if(FAILED(nsres)) { + ERR("GetElementByName failed: %08x\n", nsres); + return E_FAIL; + } + }else { + nsIDOMDocumentFragment *docfrag; + nsAString nsstr; + + if(v) { + const WCHAR *ptr; + for(ptr=v; *ptr; ptr++) { + if(!isalnumW(*ptr)) { + FIXME("Unsupported invalid tag %s\n", debugstr_w(v)); + return E_NOTIMPL; + } + } + } - nsAString_InitDepend(&id_str, v); - nsres = nsIDOMHTMLDocument_GetElementsByTagName(This->doc_node->nsdoc, &id_str, &nslist); - nsAString_Finish(&id_str); - if(FAILED(nsres)) { - ERR("GetElementByName failed: %08x\n", nsres); - return E_FAIL; + nsres = nsIDOMNode_QueryInterface(This->doc_node->node.nsnode, &IID_nsIDOMDocumentFragment, (void**)&docfrag); + if(NS_FAILED(nsres)) { + ERR("Could not get nsIDOMDocumentFragment iface: %08x\n", nsres); + return E_UNEXPECTED; + } + + nsAString_InitDepend(&nsstr, v); + nsres = nsIDOMDocumentFragment_QuerySelectorAll(docfrag, &nsstr, &nslist); + nsAString_Finish(&nsstr); + nsIDOMDocumentFragment_Release(docfrag); + if(NS_FAILED(nsres)) { + ERR("QuerySelectorAll failed: %08x\n", nsres); + return E_FAIL; + } } + *pelColl = create_collection_from_nodelist(This->doc_node, nslist); nsIDOMNodeList_Release(nslist); diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 896e6adbe75..bc60ff003b9 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -2693,6 +2693,35 @@ static void _test_elem_getelembytag(unsigned line, IUnknown *unk, elem_type_t ty IHTMLElementCollection_Release(col); } +#define test_doc_getelembytag(a,b,c,d) _test_doc_getelembytag(__LINE__,a,b,c,d) +static void _test_doc_getelembytag(unsigned line, IHTMLDocument2 *unk, const char *tag, elem_type_t type, LONG exlen) +{ + IHTMLDocument3 *doc = _get_doc3_iface(line, unk); + IHTMLElementCollection *col = NULL; + elem_type_t *types = NULL; + BSTR tmp; + int i; + HRESULT hres; + + tmp = a2bstr(elem_type_infos[type].tag); + hres = IHTMLDocument3_getElementsByTagName(doc, tmp, &col); + SysFreeString(tmp); + ok_(__FILE__,line) (hres == S_OK, "getElementByTagName failed: %08x\n", hres); + ok_(__FILE__,line) (col != NULL, "col == NULL\n"); + + if(exlen) { + types = HeapAlloc(GetProcessHeap(), 0, exlen*sizeof(elem_type_t)); + for(i=0; i