From baaaa0008ee23f03e2bcba26320f2765c3457b94 Mon Sep 17 00:00:00 2001 From: Shannon Booth Date: Fri, 26 Apr 2024 22:27:27 +1200 Subject: [PATCH] LibWeb: Look for first ID _or_ name in HTMLCollection::named_item Previously we would look for a matching ID, and then for a matching name. If there was an element in the collection which had a matching ID as well as an element with a matching name, we would always return the element with a matching ID irrespective of what order that element was in. --- .../expected/DOM/HTMLCollection-order.txt | 6 +++++ .../Text/input/DOM/HTMLCollection-order.html | 15 ++++++++++++ .../Libraries/LibWeb/DOM/HTMLCollection.cpp | 23 +++++++++++-------- .../Libraries/LibWeb/DOM/HTMLCollection.h | 2 +- 4 files changed, 35 insertions(+), 11 deletions(-) create mode 100644 Tests/LibWeb/Text/expected/DOM/HTMLCollection-order.txt create mode 100644 Tests/LibWeb/Text/input/DOM/HTMLCollection-order.html diff --git a/Tests/LibWeb/Text/expected/DOM/HTMLCollection-order.txt b/Tests/LibWeb/Text/expected/DOM/HTMLCollection-order.txt new file mode 100644 index 00000000000..4aaa6923125 --- /dev/null +++ b/Tests/LibWeb/Text/expected/DOM/HTMLCollection-order.txt @@ -0,0 +1,6 @@ + HTMLCollection +anchor1 +anchor2 +anchor3 +anchor1 +anchor2 diff --git a/Tests/LibWeb/Text/input/DOM/HTMLCollection-order.html b/Tests/LibWeb/Text/input/DOM/HTMLCollection-order.html new file mode 100644 index 00000000000..915d0de48a9 --- /dev/null +++ b/Tests/LibWeb/Text/input/DOM/HTMLCollection-order.html @@ -0,0 +1,15 @@ + + + + + + diff --git a/Userland/Libraries/LibWeb/DOM/HTMLCollection.cpp b/Userland/Libraries/LibWeb/DOM/HTMLCollection.cpp index bec858f91d4..ad28bb31fd0 100644 --- a/Userland/Libraries/LibWeb/DOM/HTMLCollection.cpp +++ b/Userland/Libraries/LibWeb/DOM/HTMLCollection.cpp @@ -100,23 +100,26 @@ Element* HTMLCollection::item(size_t index) const } // https://dom.spec.whatwg.org/#dom-htmlcollection-nameditem-key -Element* HTMLCollection::named_item(FlyString const& name) const +Element* HTMLCollection::named_item(FlyString const& key) const { // 1. If key is the empty string, return null. - if (name.is_empty()) + if (key.is_empty()) return nullptr; update_cache_if_needed(); - auto const& elements = m_cached_elements; // 2. Return the first element in the collection for which at least one of the following is true: - // - it has an ID which is key; - if (auto it = elements.find_if([&](auto& entry) { return entry->id().has_value() && entry->id().value() == name; }); it != elements.end()) - return *it; - // - it is in the HTML namespace and has a name attribute whose value is key; - if (auto it = elements.find_if([&](auto& entry) { return entry->namespace_uri() == Namespace::HTML && entry->name() == name; }); it != elements.end()) - return *it; - // or null if there is no such element. + for (auto const& element : m_cached_elements) { + // - it has an ID which is key; + if (element->id() == key) + return element; + + // - it is in the HTML namespace and has a name attribute whose value is key; + if (element->namespace_uri() == Namespace::HTML && element->name() == key) + return element; + } + + // or null if there is no such element. return nullptr; } diff --git a/Userland/Libraries/LibWeb/DOM/HTMLCollection.h b/Userland/Libraries/LibWeb/DOM/HTMLCollection.h index f6b21295d41..aab5f24918c 100644 --- a/Userland/Libraries/LibWeb/DOM/HTMLCollection.h +++ b/Userland/Libraries/LibWeb/DOM/HTMLCollection.h @@ -36,7 +36,7 @@ public: size_t length() const; Element* item(size_t index) const; - Element* named_item(FlyString const& name) const; + Element* named_item(FlyString const& key) const; JS::MarkedVector> collect_matching_elements() const;