mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-10 13:00:29 +03:00
LibWeb: Implement Range.surroundContents(newParent)
Here goes another Acid3 point :^)
This commit is contained in:
parent
686507a38f
commit
8ab25f8d8c
Notes:
sideshowbarker
2024-07-17 16:58:38 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/8ab25f8d8c
@ -864,4 +864,42 @@ ExceptionOr<void> Range::insert(NonnullRefPtr<Node> node)
|
||||
return {};
|
||||
}
|
||||
|
||||
// https://dom.spec.whatwg.org/#dom-range-surroundcontents
|
||||
ExceptionOr<void> Range::surround_contents(NonnullRefPtr<Node> new_parent)
|
||||
{
|
||||
// 1. If a non-Text node is partially contained in this, then throw an "InvalidStateError" DOMException.
|
||||
Node* start_non_text_node = start_container();
|
||||
if (is<Text>(*start_non_text_node))
|
||||
start_non_text_node = start_non_text_node->parent_node();
|
||||
Node* end_non_text_node = end_container();
|
||||
if (is<Text>(*end_non_text_node))
|
||||
end_non_text_node = end_non_text_node->parent_node();
|
||||
if (start_non_text_node != end_non_text_node)
|
||||
return InvalidStateError::create("Non-Text node is partially contained in range.");
|
||||
|
||||
// 2. If newParent is a Document, DocumentType, or DocumentFragment node, then throw an "InvalidNodeTypeError" DOMException.
|
||||
if (is<Document>(*new_parent) || is<DocumentType>(*new_parent) || is<DocumentFragment>(*new_parent))
|
||||
return InvalidNodeTypeError::create("Invalid parent node type");
|
||||
|
||||
// 3. Let fragment be the result of extracting this.
|
||||
auto fragment_or_error = extract();
|
||||
if (fragment_or_error.is_exception())
|
||||
return fragment_or_error.exception();
|
||||
auto fragment = fragment_or_error.release_value();
|
||||
|
||||
// 4. If newParent has children, then replace all with null within newParent.
|
||||
if (new_parent->has_children())
|
||||
new_parent->replace_all(nullptr);
|
||||
|
||||
// 5. Insert newParent into this.
|
||||
if (auto result = insert(new_parent); result.is_exception())
|
||||
return result.exception();
|
||||
|
||||
// 6. Append fragment to newParent.
|
||||
new_parent->append_child(fragment);
|
||||
|
||||
// 7. Select newParent within this.
|
||||
return select(*new_parent);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -64,6 +64,7 @@ public:
|
||||
ExceptionOr<NonnullRefPtr<DocumentFragment>> extract_contents();
|
||||
|
||||
ExceptionOr<void> insert_node(NonnullRefPtr<Node>);
|
||||
ExceptionOr<void> surround_contents(NonnullRefPtr<Node> new_parent);
|
||||
|
||||
String to_string() const;
|
||||
|
||||
|
@ -26,6 +26,7 @@ interface Range : AbstractRange {
|
||||
|
||||
[CEReactions, NewObject] DocumentFragment extractContents();
|
||||
[CEReactions] undefined insertNode(Node node);
|
||||
[CEReactions] undefined surroundContents(Node newParent);
|
||||
|
||||
Range cloneRange();
|
||||
undefined detach();
|
||||
|
Loading…
Reference in New Issue
Block a user