Move CSS animation values into a mutable overlay on computed properties and make base computed style data immutable after construction. Base style mutation now goes through a builder that is consumed on publish, so installed styles no longer expose mutation APIs. Build new base style data for inherited style updates instead of cloning and mutating installed computed properties. Element-specific computed style adjustments now run before publication, while animation and transition updates continue to mutate only the animated overlay.
113 lines
4.1 KiB
C++
113 lines
4.1 KiB
C++
/*
|
|
* Copyright (c) 2020, the SerenityOS developers.
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <LibWeb/ARIA/Roles.h>
|
|
#include <LibWeb/HTML/HTMLElement.h>
|
|
#include <LibWeb/HTML/PopoverTargetAttributes.h>
|
|
|
|
namespace Web::HTML {
|
|
|
|
#define ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTES \
|
|
__ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTE(submit, Submit) \
|
|
__ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTE(reset, Reset) \
|
|
__ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTE(button, Button) \
|
|
__ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTE(auto, Auto)
|
|
|
|
class HTMLButtonElement final
|
|
: public HTMLElement
|
|
, public PopoverTargetAttributes {
|
|
WEB_PLATFORM_OBJECT(HTMLButtonElement, HTMLElement);
|
|
GC_DECLARE_ALLOCATOR(HTMLButtonElement);
|
|
|
|
public:
|
|
virtual ~HTMLButtonElement() override;
|
|
|
|
virtual void initialize(JS::Realm&) override;
|
|
virtual void adjust_computed_style(CSS::ComputedProperties::Builder&) override;
|
|
|
|
enum class TypeAttributeState {
|
|
#define __ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTE(_, state) state,
|
|
ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTES
|
|
#undef __ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTE
|
|
};
|
|
|
|
TypeAttributeState type_state() const;
|
|
String type_for_bindings() const;
|
|
void set_type_for_bindings(String const&);
|
|
|
|
virtual void form_associated_element_attribute_changed(FlyString const& name, Optional<String> const& old_value, Optional<String> const& value, Optional<FlyString> const& namespace_) override;
|
|
|
|
// ^EventTarget
|
|
// https://html.spec.whatwg.org/multipage/interaction.html#the-tabindex-attribute:the-button-element
|
|
// https://html.spec.whatwg.org/multipage/interaction.html#focusable-area
|
|
// https://html.spec.whatwg.org/multipage/semantics-other.html#concept-element-disabled
|
|
virtual bool is_focusable() const override;
|
|
|
|
// ^FormAssociatedElement
|
|
virtual bool is_form_associated_element() const override { return true; }
|
|
|
|
// ^FormAssociatedElement
|
|
// https://html.spec.whatwg.org/multipage/forms.html#category-listed
|
|
virtual bool is_listed() const override { return true; }
|
|
|
|
// https://html.spec.whatwg.org/multipage/forms.html#category-submit
|
|
virtual bool is_submittable() const override { return true; }
|
|
|
|
// https://html.spec.whatwg.org/multipage/forms.html#category-autocapitalize
|
|
virtual bool is_autocapitalize_and_autocorrect_inheriting() const override { return true; }
|
|
|
|
// https://html.spec.whatwg.org/multipage/forms.html#concept-button
|
|
// https://html.spec.whatwg.org/multipage/form-elements.html#the-button-element:concept-button
|
|
virtual bool is_button() const override { return true; }
|
|
|
|
virtual bool is_submit_button() const override;
|
|
|
|
// ^HTMLElement
|
|
// https://html.spec.whatwg.org/multipage/forms.html#category-label
|
|
virtual bool is_labelable() const override { return true; }
|
|
|
|
// https://www.w3.org/TR/html-aria/#el-button
|
|
virtual Optional<ARIA::Role> default_role() const override { return ARIA::Role::button; }
|
|
|
|
Utf16String value() const;
|
|
virtual Utf16String form_value() const override { return value(); }
|
|
virtual Optional<String> optional_value() const override;
|
|
|
|
virtual bool has_activation_behavior() const override;
|
|
virtual void activation_behavior(DOM::Event const&) override;
|
|
|
|
String command() const;
|
|
void set_command(String const&);
|
|
|
|
GC::Ptr<DOM::Element> command_for_element() { return m_command_for_element; }
|
|
void set_command_for_element(GC::Ptr<DOM::Element> value) { m_command_for_element = value; }
|
|
|
|
// https://html.spec.whatwg.org/multipage/rendering.html#the-button-element-2:button-layout-2
|
|
virtual bool uses_button_layout() const override { return true; }
|
|
|
|
private:
|
|
virtual void visit_edges(Visitor&) override;
|
|
|
|
virtual bool is_html_button_element() const override { return true; }
|
|
|
|
HTMLButtonElement(DOM::Document&, DOM::QualifiedName);
|
|
|
|
// ^DOM::Element
|
|
virtual i32 default_tab_index_value() const override;
|
|
|
|
GC::Ptr<DOM::Element> m_command_for_element;
|
|
};
|
|
|
|
}
|
|
|
|
namespace Web::DOM {
|
|
|
|
template<>
|
|
inline bool Node::fast_is<HTML::HTMLButtonElement>() const { return is_html_button_element(); }
|
|
|
|
}
|