From 3e507102ea6c4a0bf450758aec278aa09a1967ee Mon Sep 17 00:00:00 2001 From: Bastiaan van der Plaat Date: Tue, 9 Apr 2024 18:29:57 +0200 Subject: [PATCH] LibWeb: Add datalist element options property --- .../Text/expected/HTML/datalist-element.txt | 2 ++ .../Text/input/HTML/datalist-element.html | 35 +++++++++++++++++++ .../LibWeb/HTML/HTMLDataListElement.cpp | 19 ++++++++++ .../LibWeb/HTML/HTMLDataListElement.h | 6 ++++ .../LibWeb/HTML/HTMLDataListElement.idl | 2 +- 5 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 Tests/LibWeb/Text/expected/HTML/datalist-element.txt create mode 100644 Tests/LibWeb/Text/input/HTML/datalist-element.html diff --git a/Tests/LibWeb/Text/expected/HTML/datalist-element.txt b/Tests/LibWeb/Text/expected/HTML/datalist-element.txt new file mode 100644 index 00000000000..814ea015591 --- /dev/null +++ b/Tests/LibWeb/Text/expected/HTML/datalist-element.txt @@ -0,0 +1,2 @@ +1. 10 +2. 11 diff --git a/Tests/LibWeb/Text/input/HTML/datalist-element.html b/Tests/LibWeb/Text/input/HTML/datalist-element.html new file mode 100644 index 00000000000..b25496e4484 --- /dev/null +++ b/Tests/LibWeb/Text/input/HTML/datalist-element.html @@ -0,0 +1,35 @@ + + diff --git a/Userland/Libraries/LibWeb/HTML/HTMLDataListElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLDataListElement.cpp index 45191c3977d..41d7b8f2d05 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLDataListElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLDataListElement.cpp @@ -6,6 +6,7 @@ #include #include +#include namespace Web::HTML { @@ -24,4 +25,22 @@ void HTMLDataListElement::initialize(JS::Realm& realm) WEB_SET_PROTOTYPE_FOR_INTERFACE(HTMLDataListElement); } +void HTMLDataListElement::visit_edges(Cell::Visitor& visitor) +{ + Base::visit_edges(visitor); + visitor.visit(m_options); +} + +// https://html.spec.whatwg.org/multipage/form-elements.html#dom-datalist-options +JS::NonnullGCPtr HTMLDataListElement::options() +{ + // The options IDL attribute must return an HTMLCollection rooted at the datalist node, whose filter matches option elements. + if (!m_options) { + m_options = DOM::HTMLCollection::create(*this, DOM::HTMLCollection::Scope::Descendants, [](Element const& element) { + return is(element); + }); + } + return *m_options; +} + } diff --git a/Userland/Libraries/LibWeb/HTML/HTMLDataListElement.h b/Userland/Libraries/LibWeb/HTML/HTMLDataListElement.h index f910c707a05..2716a2468c9 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLDataListElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLDataListElement.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include namespace Web::HTML { @@ -20,10 +21,15 @@ public: virtual Optional default_role() const override { return ARIA::Role::listbox; } + JS::NonnullGCPtr options(); + private: HTMLDataListElement(DOM::Document&, DOM::QualifiedName); virtual void initialize(JS::Realm&) override; + virtual void visit_edges(Cell::Visitor&) override; + + JS::GCPtr m_options; }; } diff --git a/Userland/Libraries/LibWeb/HTML/HTMLDataListElement.idl b/Userland/Libraries/LibWeb/HTML/HTMLDataListElement.idl index f9b29425f70..f7baf0725ba 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLDataListElement.idl +++ b/Userland/Libraries/LibWeb/HTML/HTMLDataListElement.idl @@ -5,5 +5,5 @@ interface HTMLDataListElement : HTMLElement { [HTMLConstructor] constructor(); - // FIXME: [SameObject] readonly attribute HTMLCollection options; + [SameObject] readonly attribute HTMLCollection options; };