From d5c6e45dca91161ad1890b1115e3d156f6751a22 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Fri, 22 Mar 2024 17:53:58 +0100 Subject: [PATCH] LibWeb: Change Element::closest() to check if any of selector matches ...instead of checking if all selectors match an element. Fixes bug reduced from GitHub's "new issue" page. --- Tests/LibWeb/Text/expected/DOM/Element-closest.txt | 1 + Tests/LibWeb/Text/input/DOM/Element-closest.html | 10 ++++++++++ Userland/Libraries/LibWeb/DOM/Element.cpp | 8 ++++---- 3 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 Tests/LibWeb/Text/expected/DOM/Element-closest.txt create mode 100644 Tests/LibWeb/Text/input/DOM/Element-closest.html diff --git a/Tests/LibWeb/Text/expected/DOM/Element-closest.txt b/Tests/LibWeb/Text/expected/DOM/Element-closest.txt new file mode 100644 index 00000000000..de47a9212a4 --- /dev/null +++ b/Tests/LibWeb/Text/expected/DOM/Element-closest.txt @@ -0,0 +1 @@ +
diff --git a/Tests/LibWeb/Text/input/DOM/Element-closest.html b/Tests/LibWeb/Text/input/DOM/Element-closest.html new file mode 100644 index 00000000000..fc7cbb00545 --- /dev/null +++ b/Tests/LibWeb/Text/input/DOM/Element-closest.html @@ -0,0 +1,10 @@ + + +
+ + diff --git a/Userland/Libraries/LibWeb/DOM/Element.cpp b/Userland/Libraries/LibWeb/DOM/Element.cpp index 24ab9f97cac..c1134513340 100644 --- a/Userland/Libraries/LibWeb/DOM/Element.cpp +++ b/Userland/Libraries/LibWeb/DOM/Element.cpp @@ -678,11 +678,11 @@ WebIDL::ExceptionOr Element::closest(StringView selectors) auto matches_selectors = [this](CSS::SelectorList const& selector_list, Element const* element) { // 4. For each element in elements, if match a selector against an element, using s, element, and scoping root this, returns success, return element. - for (auto& selector : selector_list) { - if (!SelectorEngine::matches(selector, {}, *element, {}, this)) - return false; + for (auto const& selector : selector_list) { + if (SelectorEngine::matches(selector, {}, *element, {}, this)) + return true; } - return true; + return false; }; auto const selector_list = maybe_selectors.release_value();