Module: wine Branch: master Commit: 833286f48586248f14358ec9e841a9ee9aba1dba URL: https://gitlab.winehq.org/wine/wine/-/commit/833286f48586248f14358ec9e841a9e...
Author: Gabriel Ivăncescu gabrielopcode@gmail.com Date: Tue Sep 5 15:52:31 2023 +0300
mshtml: Implement querySelector for document fragments.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com
---
dlls/mshtml/htmldoc.c | 12 +++++++++++- dlls/mshtml/tests/dom.js | 27 ++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index dd8c4b24a4a..95b792388e5 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -4720,8 +4720,18 @@ static HRESULT WINAPI DocumentSelector_querySelector(IDocumentSelector *iface, B TRACE("(%p)->(%s %p)\n", This, debugstr_w(v), pel);
nsAString_InitDepend(&nsstr, v); - nsres = nsIDOMDocument_QuerySelector(This->dom_document, &nsstr, &nselem); + if(This->dom_document) + nsres = nsIDOMDocument_QuerySelector(This->dom_document, &nsstr, &nselem); + else { + nsIDOMDocumentFragment *frag; + nsres = nsIDOMNode_QueryInterface(This->node.nsnode, &IID_nsIDOMDocumentFragment, (void**)&frag); + if(NS_SUCCEEDED(nsres)) { + nsres = nsIDOMDocumentFragment_QuerySelector(frag, &nsstr, &nselem); + nsIDOMDocumentFragment_Release(frag); + } + } nsAString_Finish(&nsstr); + if(NS_FAILED(nsres)) { WARN("QuerySelector failed: %08lx\n", nsres); return map_nsresult(nsres); diff --git a/dlls/mshtml/tests/dom.js b/dlls/mshtml/tests/dom.js index 4f2d1a5edc5..7a8e110da36 100644 --- a/dlls/mshtml/tests/dom.js +++ b/dlls/mshtml/tests/dom.js @@ -244,10 +244,20 @@ sync_test("query_selector", function() { + '</div>' + '<script class="class1"></script>';
- var e = document.querySelector("nomatch"); + var frag = document.createDocumentFragment() + var e = document.createElement("div"); + e.innerHTML = '<div class="class3"></div><a id="class3" class="class4"></a></div>'; + frag.appendChild(e); + var e = document.createElement("script"); + e.className = "class3"; + frag.appendChild(e); + + e = document.querySelector("nomatch"); ok(e === null, "e = " + e); e = document.body.querySelector("nomatch"); ok(e === null, "e = " + e); + e = frag.querySelector("nomatch"); + ok(e === null, "e = " + e);
e = document.querySelector(".class1"); ok(e.tagName === "DIV", "e.tagName = " + e.tagName); @@ -255,11 +265,26 @@ sync_test("query_selector", function() { ok(e.tagName === "DIV", "e.tagName = " + e.tagName); ok(e.msMatchesSelector(".class1") === true, "msMatchesSelector returned " + e.msMatchesSelector(".class1")); ok(e.msMatchesSelector(".class2") === false, "msMatchesSelector returned " + e.msMatchesSelector(".class2")); + e = document.querySelector(".class3"); + ok(e === null, "e = " + e); + e = document.body.querySelector(".class3"); + ok(e === null, "e = " + e); + + e = frag.querySelector(".class3"); + ok(e.tagName === "DIV", "e.tagName = " + e.tagName); + e = frag.querySelector(".class4"); + ok(e.tagName === "A", "e.tagName = " + e.tagName); + e = frag.querySelector(".class1"); + ok(e === null, "e = " + e); + e = frag.querySelector(".class2"); + ok(e === null, "e = " + e);
e = document.querySelector("a"); ok(e.tagName === "A", "e.tagName = " + e.tagName); e = document.body.querySelector("a"); ok(e.tagName === "A", "e.tagName = " + e.tagName); + e = frag.querySelector("a"); + ok(e.tagName === "A", "e.tagName = " + e.tagName); });
sync_test("compare_position", function() {