Jacek Caban : mshtml: Added support for getElementsByTagName in document fragment nodes.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Nov 19 09:05:05 CST 2015


Module: wine
Branch: master
Commit: 808c2d6c7fefb38fe50357749439ea9af9c2cf48
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=808c2d6c7fefb38fe50357749439ea9af9c2cf48

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Nov 19 12:14:59 2015 +0100

mshtml: Added support for getElementsByTagName in document fragment nodes.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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 8e53b8b..cdeb371 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 896e6ad..bc60ff0 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<exlen; i++)
+            types[i] = type;
+    }
+
+    _test_elem_collection(line, (IUnknown*)col, types, exlen);
+
+    HeapFree(GetProcessHeap(), 0, types);
+    IHTMLElementCollection_Release(col);
+    IHTMLDocument3_Release(doc);
+}
+
 #define test_elem_innertext(e,t) _test_elem_innertext(__LINE__,e,t)
 static void _test_elem_innertext(unsigned line, IHTMLElement *elem, const char *extext)
 {
@@ -8283,20 +8312,7 @@ static void test_elems(IHTMLDocument2 *doc)
     }
     IDispatch_Release(disp);
 
-    hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument3, (void**)&doc3);
-    ok(hres == S_OK, "Could not get IHTMLDocument3 iface: %08x\n", hres);
-
-    str = a2bstr("Img");
-    hres = IHTMLDocument3_getElementsByTagName(doc3, str, &col);
-    ok(hres == S_OK, "getElementsByTagName(%s) failed: %08x\n", wine_dbgstr_w(str), hres);
-    SysFreeString(str);
-    if(hres == S_OK)
-    {
-        static const elem_type_t img_types[] = { ET_IMG };
-
-        test_elem_collection((IUnknown*)col, img_types, sizeof(img_types)/sizeof(img_types[0]));
-        IHTMLElementCollection_Release(col);
-    }
+    test_doc_getelembytag(doc, "Img", ET_IMG, 1);
 
     elem = get_doc_elem_by_id(doc, "y");
     test_elem_set_innerhtml((IUnknown*)elem, "inner html");
@@ -8313,6 +8329,9 @@ static void test_elems(IHTMLDocument2 *doc)
     IHTMLElement_Release(elem2);
     IHTMLElement_Release(elem);
 
+    hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument3, (void**)&doc3);
+    ok(hres == S_OK, "Could not get IHTMLDocument3 iface: %08x\n", hres);
+
     hres = IHTMLDocument3_recalc(doc3, VARIANT_TRUE);
     ok(hres == S_OK, "recalc failed: %08x\n", hres);
 
@@ -9263,6 +9282,9 @@ static void test_docfrag(IHTMLDocument2 *doc)
     test_elem_source_index(br, 0);
     IHTMLElement_Release(br);
 
+    test_doc_getelembytag(frag, "a", ET_A, 0);
+    test_doc_getelembytag(frag, "Br", ET_BR, 1);
+
     div = get_elem_by_id(doc, "divid", TRUE);
     test_node_append_child((IUnknown*)div, (IUnknown*)frag);
     IHTMLElement_Release(div);




More information about the wine-cvs mailing list