aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/shadowroot.rs
diff options
context:
space:
mode:
authorSimon Wülker <simon.wuelker@arcor.de>2025-01-19 15:05:05 +0100
committerGitHub <noreply@github.com>2025-01-19 14:05:05 +0000
commitdabe162d44a2b8a47b7a9dc8566e7f51ae678d05 (patch)
tree0b915202184ab6924ecb38cc961bbd4dd8ed830e /components/script/dom/shadowroot.rs
parent8bb50fa3c9d82e2575b02cefb6558467a8187439 (diff)
downloadservo-dabe162d44a2b8a47b7a9dc8566e7f51ae678d05.tar.gz
servo-dabe162d44a2b8a47b7a9dc8566e7f51ae678d05.zip
Implement shadow dom slots (#35013)
* Implement slot-related algorithms Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Hook up slot elements to DOM creation logic Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Set a slot assignment mode for servo-internal shadow roots Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Assign slots when a slottable's slot attribute changes Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Properly compute slot name Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * ./mach test-tidy Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Update <slot> name when name attribute changes Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Implement fast path for Node::assign_slottables_for_a_tree assign_slottables_for_a_tree traverses all descendants of the node and is potentially very expensive. If the node is not a shadow root then assigning slottables to it won't have any effect, so we take a fast path out. Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Move slottable data into ElementRareData This shrinks all element descendants back to their original size. Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Address review comments Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Update WPT expectations Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> --------- Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
Diffstat (limited to 'components/script/dom/shadowroot.rs')
-rw-r--r--components/script/dom/shadowroot.rs23
1 files changed, 21 insertions, 2 deletions
diff --git a/components/script/dom/shadowroot.rs b/components/script/dom/shadowroot.rs
index c3911b35642..46fcb38cf1b 100644
--- a/components/script/dom/shadowroot.rs
+++ b/components/script/dom/shadowroot.rs
@@ -12,8 +12,10 @@ use style::stylesheets::Stylesheet;
use style::stylist::{CascadeData, Stylist};
use crate::dom::bindings::cell::DomRefCell;
-use crate::dom::bindings::codegen::Bindings::ShadowRootBinding::ShadowRootMode;
use crate::dom::bindings::codegen::Bindings::ShadowRootBinding::ShadowRoot_Binding::ShadowRootMethods;
+use crate::dom::bindings::codegen::Bindings::ShadowRootBinding::{
+ ShadowRootMode, SlotAssignmentMode,
+};
use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::num::Finite;
use crate::dom::bindings::reflector::reflect_dom_object;
@@ -57,6 +59,9 @@ pub(crate) struct ShadowRoot {
/// <https://dom.spec.whatwg.org/#dom-shadowroot-mode>
mode: ShadowRootMode,
+ /// <https://dom.spec.whatwg.org/#dom-shadowroot-slotassignment>
+ slot_assignment_mode: SlotAssignmentMode,
+
/// <https://dom.spec.whatwg.org/#dom-shadowroot-clonable>
clonable: bool,
}
@@ -67,6 +72,7 @@ impl ShadowRoot {
host: &Element,
document: &Document,
mode: ShadowRootMode,
+ slot_assignment_mode: SlotAssignmentMode,
clonable: bool,
) -> ShadowRoot {
let document_fragment = DocumentFragment::new_inherited(document);
@@ -86,6 +92,7 @@ impl ShadowRoot {
stylesheet_list: MutNullableDom::new(None),
window: Dom::from_ref(document.window()),
mode,
+ slot_assignment_mode,
clonable,
}
}
@@ -94,10 +101,17 @@ impl ShadowRoot {
host: &Element,
document: &Document,
mode: ShadowRootMode,
+ slot_assignment_mode: SlotAssignmentMode,
clonable: bool,
) -> DomRoot<ShadowRoot> {
reflect_dom_object(
- Box::new(ShadowRoot::new_inherited(host, document, mode, clonable)),
+ Box::new(ShadowRoot::new_inherited(
+ host,
+ document,
+ mode,
+ slot_assignment_mode,
+ clonable,
+ )),
document.window(),
CanGc::note(),
)
@@ -306,6 +320,11 @@ impl ShadowRootMethods<crate::DomTypeHolder> for ShadowRoot {
// Step 4. Replace all with fragment within this.
Node::replace_all(Some(frag.upcast()), self.upcast());
}
+
+ /// <https://dom.spec.whatwg.org/#dom-shadowroot-slotassignment>
+ fn SlotAssignment(&self) -> SlotAssignmentMode {
+ self.slot_assignment_mode
+ }
}
impl VirtualMethods for ShadowRoot {