From 8ec96e4f900d3aff525e6b507d0dec2e53390bc6 Mon Sep 17 00:00:00 2001 From: Witold Filipczyk Date: Fri, 17 Dec 2021 15:24:55 +0100 Subject: [PATCH] [quickjs] Fixes in querySelector --- src/ecmascript/quickjs/element.c | 25 +++++++++++++++++++++---- test/ecmascript/querySelector2.html | 3 +++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/ecmascript/quickjs/element.c b/src/ecmascript/quickjs/element.c index df405d3e..7de87abb 100644 --- a/src/ecmascript/quickjs/element.c +++ b/src/ecmascript/quickjs/element.c @@ -1483,6 +1483,19 @@ js_element_matches(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst return JS_NewBool(ctx, elements.size()); } +static bool +isAncestor(xmlpp::Element *el, xmlpp::Element *node) +{ + while (node) { + if (el == node) { + return true; + } + node = node->get_parent(); + } + + return false; +} + static JSValue js_element_querySelector(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) { @@ -1516,12 +1529,15 @@ js_element_querySelector(JSContext *ctx, JSValueConst this_val, int argc, JSValu return JS_NULL; } - if (elements.size() == 0) { - return JS_NULL; + for (auto node: elements) + { + if (isAncestor(el, node)) + { + return getElement(ctx, node); + } } - auto node = elements[0]; - return getElement(ctx, node); + return JS_NULL; } static JSValue @@ -1558,6 +1574,7 @@ js_element_querySelectorAll(JSContext *ctx, JSValueConst this_val, int argc, JSV *elements = el->find(xpath); } catch (xmlpp::exception) { } + elements->erase(std::remove_if(elements->begin(), elements->end(), [el](xmlpp::Node *node){return !isAncestor(el, node);})); return getCollection(ctx, elements); } diff --git a/test/ecmascript/querySelector2.html b/test/ecmascript/querySelector2.html index 5f077b5e..48ab0504 100644 --- a/test/ecmascript/querySelector2.html +++ b/test/ecmascript/querySelector2.html @@ -1,3 +1,6 @@ +
+first span +
Original content