
And dealing with the fallout of doing so. I am not 100% sure that it is safe for us to be treating Strings in the value sanitization algorithm in all cases as if they are ASCII, but this commit does not change any existing behaviour there.
109 lines
3.3 KiB
C++
109 lines
3.3 KiB
C++
/*
|
|
* Copyright (c) 2020, the SerenityOS developers.
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <LibWeb/DOM/Document.h>
|
|
#include <LibWeb/HTML/HTMLButtonElement.h>
|
|
#include <LibWeb/HTML/HTMLFormElement.h>
|
|
|
|
namespace Web::HTML {
|
|
|
|
JS_DEFINE_ALLOCATOR(HTMLButtonElement);
|
|
|
|
HTMLButtonElement::HTMLButtonElement(DOM::Document& document, DOM::QualifiedName qualified_name)
|
|
: HTMLElement(document, move(qualified_name))
|
|
{
|
|
}
|
|
|
|
HTMLButtonElement::~HTMLButtonElement() = default;
|
|
|
|
void HTMLButtonElement::initialize(JS::Realm& realm)
|
|
{
|
|
Base::initialize(realm);
|
|
set_prototype(&Bindings::ensure_web_prototype<Bindings::HTMLButtonElementPrototype>(realm, "HTMLButtonElement"));
|
|
}
|
|
|
|
HTMLButtonElement::TypeAttributeState HTMLButtonElement::type_state() const
|
|
{
|
|
auto value = deprecated_attribute(HTML::AttributeNames::type);
|
|
|
|
#define __ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTE(keyword, state) \
|
|
if (value.equals_ignoring_ascii_case(#keyword##sv)) \
|
|
return HTMLButtonElement::TypeAttributeState::state;
|
|
ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTES
|
|
#undef __ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTE
|
|
|
|
// The missing value default and invalid value default are the Submit Button state.
|
|
return HTMLButtonElement::TypeAttributeState::Submit;
|
|
}
|
|
|
|
WebIDL::ExceptionOr<void> HTMLButtonElement::set_type(String const& type)
|
|
{
|
|
return set_attribute(HTML::AttributeNames::type, type);
|
|
}
|
|
|
|
// https://html.spec.whatwg.org/multipage/interaction.html#dom-tabindex
|
|
i32 HTMLButtonElement::default_tab_index_value() const
|
|
{
|
|
// See the base function for the spec comments.
|
|
return 0;
|
|
}
|
|
|
|
// https://html.spec.whatwg.org/multipage/forms.html#concept-submit-button
|
|
// https://html.spec.whatwg.org/multipage/form-elements.html#the-button-element:concept-submit-button
|
|
bool HTMLButtonElement::is_submit_button() const
|
|
{
|
|
// If the type attribute is in the Submit Button state, the element is specifically a submit button.
|
|
return type_state() == TypeAttributeState::Submit;
|
|
}
|
|
|
|
// https://html.spec.whatwg.org/multipage/form-elements.html#the-button-element:concept-fe-value
|
|
String HTMLButtonElement::value() const
|
|
{
|
|
return attribute(AttributeNames::value).value_or(String {});
|
|
}
|
|
|
|
bool HTMLButtonElement::has_activation_behavior() const
|
|
{
|
|
return true;
|
|
}
|
|
|
|
void HTMLButtonElement::activation_behavior(DOM::Event const&)
|
|
{
|
|
// https://html.spec.whatwg.org/multipage/form-elements.html#the-button-element:activation-behaviour
|
|
// 1. If element is disabled, then return.
|
|
if (!enabled())
|
|
return;
|
|
|
|
// 2. If element does not have a form owner, then return.
|
|
if (!form())
|
|
return;
|
|
|
|
// 3. If element's node document is not fully active, then return.
|
|
if (!this->document().is_fully_active())
|
|
return;
|
|
|
|
// 4. Switch on element's type attribute's state:
|
|
switch (type_state()) {
|
|
case TypeAttributeState::Submit:
|
|
// Submit Button
|
|
// Submit element's form owner from element.
|
|
form()->submit_form(*this).release_value_but_fixme_should_propagate_errors();
|
|
break;
|
|
case TypeAttributeState::Reset:
|
|
// Reset Button
|
|
// Reset element's form owner.
|
|
form()->reset_form();
|
|
break;
|
|
case TypeAttributeState::Button:
|
|
// Button
|
|
// Do nothing.
|
|
break;
|
|
default:
|
|
VERIFY_NOT_REACHED();
|
|
}
|
|
}
|
|
|
|
}
|