Module: wine Branch: master Commit: 41396b5bcc25f223f47ea19fd14c3ca4641e5829 URL: https://gitlab.winehq.org/wine/wine/-/commit/41396b5bcc25f223f47ea19fd14c3ca...
Author: Gabriel Ivăncescu gabrielopcode@gmail.com Date: Tue Sep 5 15:52:31 2023 +0300
mshtml: Implement querySelectorAll for document fragments.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com
---
dlls/mshtml/htmldoc.c | 12 +++++++++++- dlls/mshtml/tests/dom.js | 13 +++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 95b792388e5..2a0c25f9132 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -4762,8 +4762,18 @@ static HRESULT WINAPI DocumentSelector_querySelectorAll(IDocumentSelector *iface TRACE("(%p)->(%s %p)\n", This, debugstr_w(v), pel);
nsAString_InitDepend(&nsstr, v); - nsres = nsIDOMDocument_QuerySelectorAll(This->dom_document, &nsstr, &node_list); + if(This->dom_document) + nsres = nsIDOMDocument_QuerySelectorAll(This->dom_document, &nsstr, &node_list); + else { + nsIDOMDocumentFragment *frag; + nsres = nsIDOMNode_QueryInterface(This->node.nsnode, &IID_nsIDOMDocumentFragment, (void**)&frag); + if(NS_SUCCEEDED(nsres)) { + nsres = nsIDOMDocumentFragment_QuerySelectorAll(frag, &nsstr, &node_list); + nsIDOMDocumentFragment_Release(frag); + } + } nsAString_Finish(&nsstr); + if(NS_FAILED(nsres)) { WARN("QuerySelectorAll failed: %08lx\n", nsres); return map_nsresult(nsres); diff --git a/dlls/mshtml/tests/dom.js b/dlls/mshtml/tests/dom.js index 7a8e110da36..0cbcb95e578 100644 --- a/dlls/mshtml/tests/dom.js +++ b/dlls/mshtml/tests/dom.js @@ -285,6 +285,19 @@ sync_test("query_selector", function() { ok(e.tagName === "A", "e.tagName = " + e.tagName); e = frag.querySelector("a"); ok(e.tagName === "A", "e.tagName = " + e.tagName); + + e = document.querySelectorAll(".class1"); + ok(e.length === 3, "e.length = " + e.length); + e = document.body.querySelectorAll(".class1"); + ok(e.length === 3, "e.length = " + e.length); + e = document.querySelectorAll(".class2"); + ok(e.length === 1, "e.length = " + e.length); + e = document.body.querySelectorAll(".class2"); + ok(e.length === 1, "e.length = " + e.length); + e = frag.querySelectorAll(".class3"); + ok(e.length === 2, "e.length = " + e.length); + e = frag.querySelectorAll(".class4"); + ok(e.length === 1, "e.length = " + e.length); });
sync_test("compare_position", function() {