summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Userland/Libraries/LibWeb/DOM/Element.cpp51
-rw-r--r--Userland/Libraries/LibWeb/DOM/Element.h4
-rw-r--r--Userland/Libraries/LibWeb/DOM/Element.idl1
3 files changed, 56 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/DOM/Element.cpp b/Userland/Libraries/LibWeb/DOM/Element.cpp
index b9d8a62d9c..47a8e18b48 100644
--- a/Userland/Libraries/LibWeb/DOM/Element.cpp
+++ b/Userland/Libraries/LibWeb/DOM/Element.cpp
@@ -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 elementā€™s parent is null, return null.
+ if (!parent())
+ return JS::GCPtr<Node> { nullptr };
+
+ // Return the result of pre-inserting node into elementā€™s 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 elementā€™s 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 elementā€™s parent is null, return null.
+ if (!parent())
+ return JS::GCPtr<Node> { nullptr };
+
+ // Return the result of pre-inserting node into elementā€™s parent before elementā€™s 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) };
+}
+
}
diff --git a/Userland/Libraries/LibWeb/DOM/Element.h b/Userland/Libraries/LibWeb/DOM/Element.h
index 451dc3daea..08e4b42bc9 100644
--- a/Userland/Libraries/LibWeb/DOM/Element.h
+++ b/Userland/Libraries/LibWeb/DOM/Element.h
@@ -144,6 +144,8 @@ public:
bool is_actually_disabled() const;
+ WebIDL::ExceptionOr<JS::GCPtr<Element>> insert_adjacent_element(String const& where, JS::NonnullGCPtr<Element> element);
+
protected:
Element(Document&, DOM::QualifiedName);
virtual void initialize(JS::Realm&) override;
@@ -155,6 +157,8 @@ protected:
private:
void make_html_uppercased_qualified_name();
+ WebIDL::ExceptionOr<JS::GCPtr<Node>> insert_adjacent(String const& where, JS::NonnullGCPtr<Node> node);
+
QualifiedName m_qualified_name;
String m_html_uppercased_qualified_name;
diff --git a/Userland/Libraries/LibWeb/DOM/Element.idl b/Userland/Libraries/LibWeb/DOM/Element.idl
index 9d25de71b2..6b514f6173 100644
--- a/Userland/Libraries/LibWeb/DOM/Element.idl
+++ b/Userland/Libraries/LibWeb/DOM/Element.idl
@@ -53,6 +53,7 @@ interface Element : Node {
readonly attribute long clientWidth;
readonly attribute long clientHeight;
+ [CEReactions] Element? insertAdjacentElement(DOMString where, Element element);
[CEReactions] undefined insertAdjacentHTML(DOMString position, DOMString text);
};