mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-07-30 04:39:06 +00:00
LibWeb: Add PopOverInvokerElement and use it in HTMLButtonElement
The popoverTargetElement seems to be one of the only cases of a reflected Element? attribute in the HTML spec, the behaviour of which is specified in section 2.6.1. Buttons can't actually toggle popovers yet because showing/hiding popovers is not implemented yet.
This commit is contained in:
parent
158acabd21
commit
a276cf2d5e
Notes:
github-actions[bot]
2024-12-12 17:12:26 +00:00
Author: https://github.com/nbvdkamp
Commit: a276cf2d5e
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/2542
Reviewed-by: https://github.com/tcl3 ✅
9 changed files with 97 additions and 2 deletions
|
@ -513,6 +513,7 @@ class PageTransitionEvent;
|
||||||
class Path2D;
|
class Path2D;
|
||||||
class Plugin;
|
class Plugin;
|
||||||
class PluginArray;
|
class PluginArray;
|
||||||
|
class PopoverInvokerElement;
|
||||||
class PromiseRejectionEvent;
|
class PromiseRejectionEvent;
|
||||||
class RadioNodeList;
|
class RadioNodeList;
|
||||||
class SelectedFile;
|
class SelectedFile;
|
||||||
|
|
|
@ -238,6 +238,8 @@ namespace AttributeNames {
|
||||||
__ENUMERATE_HTML_ATTRIBUTE(placeholder) \
|
__ENUMERATE_HTML_ATTRIBUTE(placeholder) \
|
||||||
__ENUMERATE_HTML_ATTRIBUTE(playsinline) \
|
__ENUMERATE_HTML_ATTRIBUTE(playsinline) \
|
||||||
__ENUMERATE_HTML_ATTRIBUTE(popover) \
|
__ENUMERATE_HTML_ATTRIBUTE(popover) \
|
||||||
|
__ENUMERATE_HTML_ATTRIBUTE(popovertarget) \
|
||||||
|
__ENUMERATE_HTML_ATTRIBUTE(popovertargetaction) \
|
||||||
__ENUMERATE_HTML_ATTRIBUTE(poster) \
|
__ENUMERATE_HTML_ATTRIBUTE(poster) \
|
||||||
__ENUMERATE_HTML_ATTRIBUTE(preload) \
|
__ENUMERATE_HTML_ATTRIBUTE(preload) \
|
||||||
__ENUMERATE_HTML_ATTRIBUTE(readonly) \
|
__ENUMERATE_HTML_ATTRIBUTE(readonly) \
|
||||||
|
|
|
@ -45,6 +45,12 @@ WebIDL::ExceptionOr<void> HTMLButtonElement::set_type(String const& type)
|
||||||
return set_attribute(HTML::AttributeNames::type, type);
|
return set_attribute(HTML::AttributeNames::type, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HTMLButtonElement::visit_edges(Visitor& visitor)
|
||||||
|
{
|
||||||
|
Base::visit_edges(visitor);
|
||||||
|
PopoverInvokerElement::visit_edges(visitor);
|
||||||
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/interaction.html#dom-tabindex
|
// https://html.spec.whatwg.org/multipage/interaction.html#dom-tabindex
|
||||||
i32 HTMLButtonElement::default_tab_index_value() const
|
i32 HTMLButtonElement::default_tab_index_value() const
|
||||||
{
|
{
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include <LibWeb/ARIA/Roles.h>
|
#include <LibWeb/ARIA/Roles.h>
|
||||||
#include <LibWeb/HTML/FormAssociatedElement.h>
|
#include <LibWeb/HTML/FormAssociatedElement.h>
|
||||||
#include <LibWeb/HTML/HTMLElement.h>
|
#include <LibWeb/HTML/HTMLElement.h>
|
||||||
|
#include <LibWeb/HTML/PopoverInvokerElement.h>
|
||||||
|
|
||||||
namespace Web::HTML {
|
namespace Web::HTML {
|
||||||
|
|
||||||
|
@ -19,7 +20,8 @@ namespace Web::HTML {
|
||||||
|
|
||||||
class HTMLButtonElement final
|
class HTMLButtonElement final
|
||||||
: public HTMLElement
|
: public HTMLElement
|
||||||
, public FormAssociatedElement {
|
, public FormAssociatedElement
|
||||||
|
, public PopoverInvokerElement {
|
||||||
WEB_PLATFORM_OBJECT(HTMLButtonElement, HTMLElement);
|
WEB_PLATFORM_OBJECT(HTMLButtonElement, HTMLElement);
|
||||||
GC_DECLARE_ALLOCATOR(HTMLButtonElement);
|
GC_DECLARE_ALLOCATOR(HTMLButtonElement);
|
||||||
FORM_ASSOCIATED_ELEMENT(HTMLElement, HTMLButtonElement)
|
FORM_ASSOCIATED_ELEMENT(HTMLElement, HTMLButtonElement)
|
||||||
|
@ -73,6 +75,8 @@ public:
|
||||||
virtual void activation_behavior(DOM::Event const&) override;
|
virtual void activation_behavior(DOM::Event const&) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
virtual void visit_edges(Visitor&) override;
|
||||||
|
|
||||||
virtual bool is_html_button_element() const override { return true; }
|
virtual bool is_html_button_element() const override { return true; }
|
||||||
|
|
||||||
HTMLButtonElement(DOM::Document&, DOM::QualifiedName);
|
HTMLButtonElement(DOM::Document&, DOM::QualifiedName);
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#import <HTML/HTMLElement.idl>
|
#import <HTML/HTMLElement.idl>
|
||||||
#import <HTML/HTMLFormElement.idl>
|
#import <HTML/HTMLFormElement.idl>
|
||||||
|
#import <HTML/PopoverInvokerElement.idl>
|
||||||
|
|
||||||
[MissingValueDefault=submit, InvalidValueDefault=submit]
|
[MissingValueDefault=submit, InvalidValueDefault=submit]
|
||||||
enum ButtonTypeState {
|
enum ButtonTypeState {
|
||||||
|
@ -33,4 +34,4 @@ interface HTMLButtonElement : HTMLElement {
|
||||||
|
|
||||||
readonly attribute NodeList labels;
|
readonly attribute NodeList labels;
|
||||||
};
|
};
|
||||||
// FIXME: HTMLButtonElement includes PopoverInvokerElement;
|
HTMLButtonElement includes PopoverInvokerElement;
|
||||||
|
|
34
Libraries/LibWeb/HTML/PopoverInvokerElement.h
Normal file
34
Libraries/LibWeb/HTML/PopoverInvokerElement.h
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2024, Nathan van der Kamp <nbvdkamp@gmail.com>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <LibGC/Ptr.h>
|
||||||
|
#include <LibJS/Heap/Cell.h>
|
||||||
|
#include <LibWeb/Forward.h>
|
||||||
|
|
||||||
|
namespace Web::HTML {
|
||||||
|
|
||||||
|
class PopoverInvokerElement {
|
||||||
|
|
||||||
|
public:
|
||||||
|
PopoverInvokerElement() { }
|
||||||
|
|
||||||
|
GC::Ptr<DOM::Element> get_popover_target_element() { return m_popover_target_element; }
|
||||||
|
|
||||||
|
void set_popover_target_element(GC::Ptr<DOM::Element> value) { m_popover_target_element = value; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void visit_edges(JS::Cell::Visitor& visitor)
|
||||||
|
{
|
||||||
|
visitor.visit(m_popover_target_element);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
GC::Ptr<DOM::Element> m_popover_target_element;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
13
Libraries/LibWeb/HTML/PopoverInvokerElement.idl
Normal file
13
Libraries/LibWeb/HTML/PopoverInvokerElement.idl
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
// https://html.spec.whatwg.org/multipage/popover.html#attr-popovertargetaction
|
||||||
|
[MissingValueDefault=toggle, InvalidValueDefault=toggle]
|
||||||
|
enum PopoverTargetActionAttribute {
|
||||||
|
"toggle",
|
||||||
|
"show",
|
||||||
|
"hide"
|
||||||
|
};
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/popover.html#popoverinvokerelement
|
||||||
|
interface mixin PopoverInvokerElement {
|
||||||
|
[Reflect=popovertarget, CEReactions] attribute Element? popoverTargetElement;
|
||||||
|
[Reflect=popovertargetaction, Enumerated=PopoverTargetActionAttribute, CEReactions] attribute DOMString popoverTargetAction;
|
||||||
|
};
|
|
@ -0,0 +1,5 @@
|
||||||
|
PASS
|
||||||
|
PASS
|
||||||
|
PASS
|
||||||
|
PASS
|
||||||
|
PASS
|
29
Tests/LibWeb/Text/input/HTML/popover-invoker-attributes.html
Normal file
29
Tests/LibWeb/Text/input/HTML/popover-invoker-attributes.html
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<button id="toggleButton" popovertarget="mypopover" popovertargetaction="toggle">Toggle the popover</button>
|
||||||
|
<div id="mypopover" popover>Popover content</div>
|
||||||
|
<script src="../include.js"></script>
|
||||||
|
<script>
|
||||||
|
test(() => {
|
||||||
|
const button = document.getElementById("toggleButton");
|
||||||
|
const div = document.getElementById("mypopover");
|
||||||
|
|
||||||
|
if (button.popoverTargetElement === div)
|
||||||
|
println("PASS");
|
||||||
|
|
||||||
|
button.popoverTargetElement = null;
|
||||||
|
if (button.popoverTargetElement === null)
|
||||||
|
println("PASS");
|
||||||
|
button.popoverTargetElement = div;
|
||||||
|
if (button.popoverTargetElement === div)
|
||||||
|
println("PASS");
|
||||||
|
|
||||||
|
|
||||||
|
if (button.popoverTargetAction === "toggle")
|
||||||
|
println("PASS");
|
||||||
|
|
||||||
|
button.popoverTargetAction = "invalid_value";
|
||||||
|
|
||||||
|
if (button.popoverTargetAction === "toggle")
|
||||||
|
println("PASS");
|
||||||
|
});
|
||||||
|
</script>
|
Loading…
Add table
Add a link
Reference in a new issue