From 47c1b65012539417974d940155460710bd8df05c Mon Sep 17 00:00:00 2001 From: Luke Warlow Date: Mon, 1 Jul 2024 19:55:33 +0100 Subject: [PATCH] LibWeb: Implement popover property and attribute The popover property now reflects the attribute. It cannot currently use the Reflect IDL concept because the empty string value is special cased. (cherry picked from commit a9669639cee27e81640fe7a37d9d1f319db6b666; amended to undo unintentional -- and conflicting -- change to Tests/LibWeb/rebaseline-libweb-test) --- .../Libraries/LibWeb/HTML/AttributeNames.h | 1 + .../Libraries/LibWeb/HTML/HTMLElement.cpp | 28 +++++++++++++++++++ Userland/Libraries/LibWeb/HTML/HTMLElement.h | 3 ++ .../Libraries/LibWeb/HTML/HTMLElement.idl | 2 +- 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibWeb/HTML/AttributeNames.h b/Userland/Libraries/LibWeb/HTML/AttributeNames.h index e38d21f6a66714..9ac71456de80fa 100644 --- a/Userland/Libraries/LibWeb/HTML/AttributeNames.h +++ b/Userland/Libraries/LibWeb/HTML/AttributeNames.h @@ -214,6 +214,7 @@ namespace AttributeNames { __ENUMERATE_HTML_ATTRIBUTE(ping) \ __ENUMERATE_HTML_ATTRIBUTE(placeholder) \ __ENUMERATE_HTML_ATTRIBUTE(playsinline) \ + __ENUMERATE_HTML_ATTRIBUTE(popover) \ __ENUMERATE_HTML_ATTRIBUTE(poster) \ __ENUMERATE_HTML_ATTRIBUTE(preload) \ __ENUMERATE_HTML_ATTRIBUTE(readonly) \ diff --git a/Userland/Libraries/LibWeb/HTML/HTMLElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLElement.cpp index 1d3e02113f2660..a91cb8251be56d 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLElement.cpp @@ -681,6 +681,34 @@ WebIDL::ExceptionOr> HTMLElement::attach_inte return { internals }; } +// https://html.spec.whatwg.org/multipage/popover.html#dom-popover +Optional HTMLElement::popover() const +{ + // FIXME: This should probably be `Reflect` in the IDL. + // The popover IDL attribute must reflect the popover attribute, limited to only known values. + auto value = get_attribute(HTML::AttributeNames::popover); + + if (!value.has_value()) + return {}; + + if (value.value().is_empty() || value.value().equals_ignoring_ascii_case("auto"sv)) + return "auto"_string; + + return "manual"_string; +} + +// https://html.spec.whatwg.org/multipage/popover.html#dom-popover +WebIDL::ExceptionOr HTMLElement::set_popover(Optional value) +{ + // FIXME: This should probably be `Reflect` in the IDL. + // The popover IDL attribute must reflect the popover attribute, limited to only known values. + if (value.has_value()) + return set_attribute(HTML::AttributeNames::popover, value.release_value()); + + remove_attribute(HTML::AttributeNames::popover); + return {}; +} + void HTMLElement::did_receive_focus() { if (m_content_editable_state != ContentEditableState::True) diff --git a/Userland/Libraries/LibWeb/HTML/HTMLElement.h b/Userland/Libraries/LibWeb/HTML/HTMLElement.h index e44a93e8f0073d..230c7d85ede76a 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLElement.h @@ -77,6 +77,9 @@ class HTMLElement WebIDL::ExceptionOr> attach_internals(); + WebIDL::ExceptionOr set_popover(Optional value); + Optional popover() const; + protected: HTMLElement(DOM::Document&, DOM::QualifiedName); diff --git a/Userland/Libraries/LibWeb/HTML/HTMLElement.idl b/Userland/Libraries/LibWeb/HTML/HTMLElement.idl index d4031754f234d5..299668a2fbcdc1 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLElement.idl +++ b/Userland/Libraries/LibWeb/HTML/HTMLElement.idl @@ -35,7 +35,7 @@ interface HTMLElement : Element { [FIXME] undefined showPopover(); [FIXME] undefined hidePopover(); [FIXME] boolean togglePopover(optional boolean force); - [FIXME, CEReactions] attribute DOMString? popover; + [CEReactions] attribute DOMString? popover; // https://drafts.csswg.org/cssom-view/#extensions-to-the-htmlelement-interface readonly attribute Element? offsetParent;