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:
parent
64ba289cfb
commit
bc15144972
7 changed files with 80 additions and 71 deletions
|
@ -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.
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue