1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-28 16:25:06 +00:00

LibWeb: Move contentEditable from Element to HTMLElement

HTMLElement is the only interface that includes ElementContentEditable
in the HTML specification. This makes sense, as Element is also a base
class for elements in other specifications such as SVG,
which definitely shouldn't be editable.

Also adds a test for the attribute based on what Andreas did in the
video that added it.
This commit is contained in:
Luke 2020-08-03 02:57:28 +01:00 committed by Andreas Kling
parent 64ba289cfb
commit bc15144972
7 changed files with 80 additions and 71 deletions

View file

@ -37,4 +37,62 @@ HTMLElement::~HTMLElement()
{
}
HTMLElement::ContentEditableState HTMLElement::content_editable_state() const
{
auto contenteditable = attribute(HTML::AttributeNames::contenteditable);
// "true" and the empty string map to the "true" state.
if ((!contenteditable.is_null() && contenteditable.is_empty()) || contenteditable.equals_ignoring_case("true"))
return ContentEditableState::True;
// "false" maps to the "false" state.
if (contenteditable.equals_ignoring_case("false"))
return ContentEditableState::False;
// "inherit", an invalid value, and a missing value all map to the "inherit" state.
return ContentEditableState::Inherit;
}
bool HTMLElement::is_editable() const
{
switch (content_editable_state()) {
case ContentEditableState::True:
return true;
case ContentEditableState::False:
return false;
case ContentEditableState::Inherit:
return parent() && parent()->is_editable();
default:
ASSERT_NOT_REACHED();
}
}
String HTMLElement::content_editable() const
{
switch (content_editable_state()) {
case ContentEditableState::True:
return "true";
case ContentEditableState::False:
return "false";
case ContentEditableState::Inherit:
return "inherit";
default:
ASSERT_NOT_REACHED();
}
}
void HTMLElement::set_content_editable(const String& content_editable)
{
if (content_editable.equals_ignoring_case("inherit")) {
remove_attribute(HTML::AttributeNames::contenteditable);
return;
}
if (content_editable.equals_ignoring_case("true")) {
set_attribute(HTML::AttributeNames::contenteditable, "true");
return;
}
if (content_editable.equals_ignoring_case("false")) {
set_attribute(HTML::AttributeNames::contenteditable, "false");
return;
}
// FIXME: otherwise the attribute setter must throw a "SyntaxError" DOMException.
}
}