mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 11:07:45 +00:00
LibWeb: Implement ChildNode.after
This commit is contained in:
parent
1bbe40c5af
commit
5a5e3a6ec3
4 changed files with 58 additions and 0 deletions
|
@ -8,6 +8,7 @@ interface CharacterData : Node {
|
||||||
|
|
||||||
// FIXME: These should come from a ChildNode mixin
|
// FIXME: These should come from a ChildNode mixin
|
||||||
[CEReactions, Unscopable] undefined before((Node or DOMString)... nodes);
|
[CEReactions, Unscopable] undefined before((Node or DOMString)... nodes);
|
||||||
|
[CEReactions, Unscopable] undefined after((Node or DOMString)... nodes);
|
||||||
[CEReactions, Unscopable, ImplementedAs=remove_binding] undefined remove();
|
[CEReactions, Unscopable, ImplementedAs=remove_binding] undefined remove();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -51,6 +51,36 @@ public:
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://dom.spec.whatwg.org/#dom-childnode-after
|
||||||
|
ExceptionOr<void> after(Vector<Variant<NonnullRefPtr<Node>, String>> const& nodes)
|
||||||
|
{
|
||||||
|
auto* node = static_cast<NodeType*>(this);
|
||||||
|
|
||||||
|
// 1. Let parent be this’s parent.
|
||||||
|
auto* parent = node->parent();
|
||||||
|
|
||||||
|
// 2. If parent is null, then return.
|
||||||
|
if (!parent)
|
||||||
|
return {};
|
||||||
|
|
||||||
|
// 3. Let viableNextSibling be this’s first following sibling not in nodes; otherwise null.
|
||||||
|
auto viable_next_sibling = viable_nest_sibling_for_insertion(nodes);
|
||||||
|
|
||||||
|
// 4. Let node be the result of converting nodes into a node, given nodes and this’s node document.
|
||||||
|
auto node_or_exception = convert_nodes_to_single_node(nodes, node->document());
|
||||||
|
if (node_or_exception.is_exception())
|
||||||
|
return node_or_exception.exception();
|
||||||
|
|
||||||
|
auto node_to_insert = node_or_exception.release_value();
|
||||||
|
|
||||||
|
// 5. Pre-insert node into parent before viableNextSibling.
|
||||||
|
auto result = parent->pre_insert(node_to_insert, viable_next_sibling);
|
||||||
|
if (result.is_exception())
|
||||||
|
return result.exception();
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
// https://dom.spec.whatwg.org/#dom-childnode-remove
|
// https://dom.spec.whatwg.org/#dom-childnode-remove
|
||||||
void remove_binding()
|
void remove_binding()
|
||||||
{
|
{
|
||||||
|
@ -92,6 +122,31 @@ private:
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RefPtr<Node> viable_nest_sibling_for_insertion(Vector<Variant<NonnullRefPtr<Node>, String>> const& nodes) const
|
||||||
|
{
|
||||||
|
auto* node = static_cast<NodeType const*>(this);
|
||||||
|
|
||||||
|
while (auto* next_sibling = node->next_sibling()) {
|
||||||
|
bool contained_in_nodes = false;
|
||||||
|
|
||||||
|
for (auto const& node_or_string : nodes) {
|
||||||
|
if (!node_or_string.template has<NonnullRefPtr<Node>>())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
auto node_in_vector = node_or_string.template get<NonnullRefPtr<Node>>();
|
||||||
|
if (node_in_vector.ptr() == next_sibling) {
|
||||||
|
contained_in_nodes = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!contained_in_nodes)
|
||||||
|
return next_sibling;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ interface DocumentType : Node {
|
||||||
|
|
||||||
// FIXME: These should come from a ChildNode mixin
|
// FIXME: These should come from a ChildNode mixin
|
||||||
[CEReactions, Unscopable] undefined before((Node or DOMString)... nodes);
|
[CEReactions, Unscopable] undefined before((Node or DOMString)... nodes);
|
||||||
|
[CEReactions, Unscopable] undefined after((Node or DOMString)... nodes);
|
||||||
[CEReactions, Unscopable, ImplementedAs=remove_binding] undefined remove();
|
[CEReactions, Unscopable, ImplementedAs=remove_binding] undefined remove();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -56,6 +56,7 @@ interface Element : Node {
|
||||||
|
|
||||||
// FIXME: These should come from a ChildNode mixin
|
// FIXME: These should come from a ChildNode mixin
|
||||||
[CEReactions, Unscopable] undefined before((Node or DOMString)... nodes);
|
[CEReactions, Unscopable] undefined before((Node or DOMString)... nodes);
|
||||||
|
[CEReactions, Unscopable] undefined after((Node or DOMString)... nodes);
|
||||||
[CEReactions, Unscopable, ImplementedAs=remove_binding] undefined remove();
|
[CEReactions, Unscopable, ImplementedAs=remove_binding] undefined remove();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue