From 51fc30a19133997991681b88287e3a02fa54080d Mon Sep 17 00:00:00 2001 From: Tim Ledbetter Date: Thu, 16 May 2024 06:02:56 +0100 Subject: [PATCH] LibWeb: Implement the `HTMLLinkElement.relList` attribute This returns a DOMTokenList that reflects the `rel` attribute. --- .../LibWeb/Text/expected/HTML/relList-attribute.txt | 6 ++++++ Tests/LibWeb/Text/input/HTML/relList-attribute.html | 1 + Userland/Libraries/LibWeb/HTML/HTMLLinkElement.cpp | 13 +++++++++++++ Userland/Libraries/LibWeb/HTML/HTMLLinkElement.h | 5 ++++- Userland/Libraries/LibWeb/HTML/HTMLLinkElement.idl | 2 +- 5 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Tests/LibWeb/Text/expected/HTML/relList-attribute.txt b/Tests/LibWeb/Text/expected/HTML/relList-attribute.txt index b00f12b46e8..2b4030db33e 100644 --- a/Tests/LibWeb/Text/expected/HTML/relList-attribute.txt +++ b/Tests/LibWeb/Text/expected/HTML/relList-attribute.txt @@ -16,3 +16,9 @@ form.relList for after setting rel to "whatever": whatever form.relList for after setting rel to "prefetch": prefetch form.relList contains "prefetch": true form.relList contains "whatever": false +link.relList initial length: 0 +link.relList always returns the same value: true +link.relList for after setting rel to "whatever": whatever +link.relList for after setting rel to "prefetch": prefetch +link.relList contains "prefetch": true +link.relList contains "whatever": false diff --git a/Tests/LibWeb/Text/input/HTML/relList-attribute.html b/Tests/LibWeb/Text/input/HTML/relList-attribute.html index 2c9b03791f2..b6f292a0d70 100644 --- a/Tests/LibWeb/Text/input/HTML/relList-attribute.html +++ b/Tests/LibWeb/Text/input/HTML/relList-attribute.html @@ -19,6 +19,7 @@ "a", "area", "form", + "link", ]; for (const tagName of tagNamesToTest) { diff --git a/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.cpp index 4c534d91acc..88b6b70e32f 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -89,6 +90,15 @@ void HTMLLinkElement::inserted() } } +// https://html.spec.whatwg.org/multipage/semantics.html#dom-link-rellist +JS::GCPtr HTMLLinkElement::rel_list() +{ + // The relList IDL attribute must reflect the rel content attribute. + if (!m_rel_list) + m_rel_list = DOM::DOMTokenList::create(*this, HTML::AttributeNames::rel); + return m_rel_list; +} + bool HTMLLinkElement::has_loaded_icon() const { return m_relationship & Relationship::Icon && resource() && resource()->is_loaded() && resource()->has_encoded_data(); @@ -121,6 +131,9 @@ void HTMLLinkElement::attribute_changed(FlyString const& name, Optional else if (part == "icon"sv) m_relationship |= Relationship::Icon; } + + if (m_rel_list) + m_rel_list->associated_attribute_changed(value.value_or(String {})); } // https://html.spec.whatwg.org/multipage/semantics.html#the-link-element:explicitly-enabled diff --git a/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.h b/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.h index 1d9bbe5915f..4a876183c59 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.h @@ -34,6 +34,8 @@ public: String type() const { return get_attribute_value(HTML::AttributeNames::type); } String href() const { return get_attribute_value(HTML::AttributeNames::href); } + JS::GCPtr rel_list(); + bool has_loaded_icon() const; bool load_favicon_and_use_if_window_is_active(); @@ -43,7 +45,7 @@ private: HTMLLinkElement(DOM::Document&, DOM::QualifiedName); virtual void initialize(JS::Realm&) override; - void attribute_changed(FlyString const&, Optional const&) override; + virtual void attribute_changed(FlyString const&, Optional const&) override; // ^ResourceClient virtual void resource_did_fail() override; @@ -133,6 +135,7 @@ private: JS::GCPtr m_loaded_style_sheet; Optional m_document_load_event_delayer; + JS::GCPtr m_rel_list; unsigned m_relationship { 0 }; // https://html.spec.whatwg.org/multipage/semantics.html#explicitly-enabled bool m_explicitly_enabled { false }; diff --git a/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.idl b/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.idl index 0cea8e9abba..fb685810b08 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.idl +++ b/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.idl @@ -11,7 +11,7 @@ interface HTMLLinkElement : HTMLElement { // FIXME: [CEReactions] attribute DOMString? crossOrigin; [CEReactions, Reflect] attribute DOMString rel; // FIXME: [CEReactions] attribute DOMString as; - // FIXME: [SameObject, PutForwards=value] readonly attribute DOMTokenList relList; + [SameObject, PutForwards=value] readonly attribute DOMTokenList relList; [CEReactions, Reflect] attribute DOMString media; [CEReactions, Reflect] attribute DOMString integrity; [CEReactions, Reflect] attribute DOMString hreflang;