diff options
author | Simon Wülker <simon.wuelker@arcor.de> | 2025-01-19 15:05:05 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-01-19 14:05:05 +0000 |
commit | dabe162d44a2b8a47b7a9dc8566e7f51ae678d05 (patch) | |
tree | 0b915202184ab6924ecb38cc961bbd4dd8ed830e /components/script/dom/shadowroot.rs | |
parent | 8bb50fa3c9d82e2575b02cefb6558467a8187439 (diff) | |
download | servo-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.rs | 23 |
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 { |