mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
Lay out the contents of slot elements (#35220)
* Make Slottable match layout/alignment of NonNull<Node> Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Implement ServoLayoutElement::slotted_nodes Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Bump mozjs Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Layout the contents of slot elements Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Implement ServoLayoutElement::assigned_slot Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * implement ServoLayoutElement::traversal_parent Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Simplify slottable name update Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Don't iterate over children of shadow hosts Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Recompute slot style when contents change Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Change match_slottable to a function instead of a macro Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Fix crown errors Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Update WPT expectations Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Reset a slottable's assigned slot when it's removed from the slot Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> --------- Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
This commit is contained in:
parent
938baf6bf3
commit
6a2e37183c
26 changed files with 263 additions and 143 deletions
|
@ -626,8 +626,8 @@ impl Element {
|
|||
Some(assigned_slot)
|
||||
}
|
||||
|
||||
pub(crate) fn set_assigned_slot(&self, assigned_slot: DomRoot<HTMLSlotElement>) {
|
||||
self.ensure_rare_data().slottable_data.assigned_slot = Some(assigned_slot.as_traced());
|
||||
pub(crate) fn set_assigned_slot(&self, assigned_slot: Option<&HTMLSlotElement>) {
|
||||
self.ensure_rare_data().slottable_data.assigned_slot = assigned_slot.map(Dom::from_ref);
|
||||
}
|
||||
|
||||
pub(crate) fn manual_slot_assignment(&self) -> Option<DomRoot<HTMLSlotElement>> {
|
||||
|
@ -727,6 +727,7 @@ pub(crate) trait LayoutElementHelpers<'dom> {
|
|||
) -> Option<&'dom AttrValue>;
|
||||
fn get_attr_val_for_layout(self, namespace: &Namespace, name: &LocalName) -> Option<&'dom str>;
|
||||
fn get_attr_vals_for_layout(self, name: &LocalName) -> Vec<&'dom AttrValue>;
|
||||
fn get_assigned_slot(&self) -> Option<LayoutDom<'dom, HTMLSlotElement>>;
|
||||
}
|
||||
|
||||
impl LayoutDom<'_, Element> {
|
||||
|
@ -1260,6 +1261,20 @@ impl<'dom> LayoutElementHelpers<'dom> for LayoutDom<'dom, Element> {
|
|||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
#[allow(unsafe_code)]
|
||||
fn get_assigned_slot(&self) -> Option<LayoutDom<'dom, HTMLSlotElement>> {
|
||||
unsafe {
|
||||
self.unsafe_get()
|
||||
.rare_data
|
||||
.borrow_for_layout()
|
||||
.as_ref()?
|
||||
.slottable_data
|
||||
.assigned_slot
|
||||
.as_ref()
|
||||
.map(|slot| slot.to_layout())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Element {
|
||||
|
@ -3525,7 +3540,7 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
|
|||
|
||||
// > The assignedSlot getter steps are to return the result of
|
||||
// > find a slot given this and with the open flag set.
|
||||
rooted!(in(*cx) let slottable = Slottable::Element(Dom::from_ref(self)));
|
||||
rooted!(in(*cx) let slottable = Slottable(Dom::from_ref(self.upcast::<Node>())));
|
||||
slottable.find_a_slot(true)
|
||||
}
|
||||
}
|
||||
|
@ -3671,7 +3686,8 @@ impl VirtualMethods for Element {
|
|||
&local_name!("slot") => {
|
||||
// Update slottable data
|
||||
let cx = GlobalScope::get_cx();
|
||||
rooted!(in(*cx) let slottable = Slottable::Element(Dom::from_ref(self)));
|
||||
|
||||
rooted!(in(*cx) let slottable = Slottable(Dom::from_ref(self.upcast::<Node>())));
|
||||
|
||||
// Slottable name change steps from https://dom.spec.whatwg.org/#light-tree-slotables
|
||||
if let Some(assigned_slot) = slottable.assigned_slot() {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue