mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-30 22:28:22 +00:00
LibWeb/DOM: Implement 'find flattened slottables'
Returning a Vector of Slottable is not very nice here, but this matches find_slottable (which this calls), and as far as I can tell this is technically 'safe' at the moment in the way in which it is / will be called. It's also not great that like find_slottable it takes a non-const ref, but changing that causes a bunch of other fallout.
This commit is contained in:
parent
98c45f3f03
commit
2d6b11c8cb
Notes:
github-actions[bot]
2025-05-19 11:27:20 +00:00
Author: https://github.com/shannonbooth
Commit: 2d6b11c8cb
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4562
Reviewed-by: https://github.com/AtkinsSJ
2 changed files with 50 additions and 0 deletions
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2023, Tim Flynn <trflynn89@serenityos.org>
|
* Copyright (c) 2023, Tim Flynn <trflynn89@serenityos.org>
|
||||||
|
* Copyright (c) 2025, Shannon Booth <shannon@serenityos.org>
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-2-Clause
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
*/
|
*/
|
||||||
|
@ -154,6 +155,54 @@ Vector<Slottable> find_slottables(GC::Ref<HTML::HTMLSlotElement> slot)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://dom.spec.whatwg.org/#find-flattened-slotables
|
||||||
|
Vector<Slottable> find_flattened_slottables(GC::Ref<HTML::HTMLSlotElement> slot)
|
||||||
|
{
|
||||||
|
// 1. Let result be « ».
|
||||||
|
Vector<Slottable> result;
|
||||||
|
|
||||||
|
// 2. If slot’s root is not a shadow root, then return result.
|
||||||
|
if (!slot->root().is_shadow_root())
|
||||||
|
return result;
|
||||||
|
|
||||||
|
// 3. Let slottables be the result of finding slottables given slot.
|
||||||
|
auto slottables = find_slottables(slot);
|
||||||
|
|
||||||
|
// 4. If slottables is the empty list, then append each slottable child of slot, in tree order, to slottables.
|
||||||
|
if (slottables.is_empty()) {
|
||||||
|
slot->for_each_child([&](auto& node) {
|
||||||
|
if (!node.is_slottable())
|
||||||
|
return IterationDecision::Continue;
|
||||||
|
|
||||||
|
slottables.append(node.as_slottable());
|
||||||
|
return IterationDecision::Continue;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. For each node of slottables:
|
||||||
|
for (auto& node : slottables) {
|
||||||
|
// 1. If node is a slot whose root is a shadow root:
|
||||||
|
// 1. Let temporaryResult be the result of finding flattened slottables given node.
|
||||||
|
// 2. Append each slottable in temporaryResult, in order, to result.
|
||||||
|
// 2. Otherwise, append node to result.
|
||||||
|
auto* maybe_slot = node.get_pointer<GC::Ref<DOM::Element>>();
|
||||||
|
if (!maybe_slot) {
|
||||||
|
result.append(node);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auto* slot = as_if<HTML::HTMLSlotElement>(maybe_slot->ptr()); slot && slot->root().is_shadow_root()) {
|
||||||
|
auto temporary_result = find_flattened_slottables(*slot);
|
||||||
|
result.extend(temporary_result);
|
||||||
|
} else {
|
||||||
|
result.append(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 6. Return result.
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
// https://dom.spec.whatwg.org/#assign-slotables
|
// https://dom.spec.whatwg.org/#assign-slotables
|
||||||
void assign_slottables(GC::Ref<HTML::HTMLSlotElement> slot)
|
void assign_slottables(GC::Ref<HTML::HTMLSlotElement> slot)
|
||||||
{
|
{
|
||||||
|
|
|
@ -57,6 +57,7 @@ bool is_an_assigned_slottable(GC::Ref<Node>);
|
||||||
|
|
||||||
GC::Ptr<HTML::HTMLSlotElement> find_a_slot(Slottable const&, OpenFlag = OpenFlag::Unset);
|
GC::Ptr<HTML::HTMLSlotElement> find_a_slot(Slottable const&, OpenFlag = OpenFlag::Unset);
|
||||||
Vector<Slottable> find_slottables(GC::Ref<HTML::HTMLSlotElement>);
|
Vector<Slottable> find_slottables(GC::Ref<HTML::HTMLSlotElement>);
|
||||||
|
Vector<Slottable> find_flattened_slottables(GC::Ref<HTML::HTMLSlotElement>);
|
||||||
void assign_slottables(GC::Ref<HTML::HTMLSlotElement>);
|
void assign_slottables(GC::Ref<HTML::HTMLSlotElement>);
|
||||||
void assign_slottables_for_a_tree(GC::Ref<Node>);
|
void assign_slottables_for_a_tree(GC::Ref<Node>);
|
||||||
void assign_a_slot(Slottable const&);
|
void assign_a_slot(Slottable const&);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue