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

LibWeb: Implement Element.insertAdjacentElement

This commit is contained in:
Luke Wilde 2022-10-01 00:30:15 +01:00 committed by Andreas Kling
parent f27f2e0d3b
commit d540e2ec98
3 changed files with 56 additions and 0 deletions

View file

@ -840,4 +840,55 @@ WebIDL::ExceptionOr<void> Element::insert_adjacent_html(String position, String
return {};
}
// https://dom.spec.whatwg.org/#insert-adjacent
WebIDL::ExceptionOr<JS::GCPtr<Node>> Element::insert_adjacent(String const& where, JS::NonnullGCPtr<Node> node)
{
// To insert adjacent, given an element element, string where, and a node node, run the steps associated with the first ASCII case-insensitive match for where:
if (where.equals_ignoring_case("beforebegin"sv)) {
// -> "beforebegin"
// If elements parent is null, return null.
if (!parent())
return JS::GCPtr<Node> { nullptr };
// Return the result of pre-inserting node into elements parent before element.
return JS::GCPtr<Node> { TRY(parent()->pre_insert(move(node), this)) };
}
if (where.equals_ignoring_case("afterbegin"sv)) {
// -> "afterbegin"
// Return the result of pre-inserting node into element before elements first child.
return JS::GCPtr<Node> { TRY(pre_insert(move(node), first_child())) };
}
if (where.equals_ignoring_case("beforeend"sv)) {
// -> "beforeend"
// Return the result of pre-inserting node into element before null.
return JS::GCPtr<Node> { TRY(pre_insert(move(node), nullptr)) };
}
if (where.equals_ignoring_case("afterend"sv)) {
// -> "afterend"
// If elements parent is null, return null.
if (!parent())
return JS::GCPtr<Node> { nullptr };
// Return the result of pre-inserting node into elements parent before elements next sibling.
return JS::GCPtr<Node> { TRY(parent()->pre_insert(move(node), next_sibling())) };
}
// -> Otherwise
// Throw a "SyntaxError" DOMException.
return WebIDL::SyntaxError::create(global_object(), String::formatted("Unknown position '{}'. Must be one of 'beforebegin', 'afterbegin', 'beforeend' or 'afterend'"sv, where));
}
// https://dom.spec.whatwg.org/#dom-element-insertadjacentelement
WebIDL::ExceptionOr<JS::GCPtr<Element>> Element::insert_adjacent_element(String const& where, JS::NonnullGCPtr<Element> element)
{
// The insertAdjacentElement(where, element) method steps are to return the result of running insert adjacent, give this, where, and element.
auto returned_node = TRY(insert_adjacent(where, move(element)));
if (!returned_node)
return JS::GCPtr<Element> { nullptr };
return JS::GCPtr<Element> { verify_cast<Element>(*returned_node) };
}
}