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;
};