aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/script/dom/element.rs52
-rw-r--r--components/script/dom/eventtarget.rs22
-rw-r--r--components/script/dom/htmlslotelement.rs61
-rw-r--r--components/script/dom/node.rs67
-rw-r--r--components/script/dom/raredata.rs6
-rw-r--r--components/script/dom/text.rs10
-rw-r--r--components/script/layout_dom/element.rs13
-rw-r--r--components/script/layout_dom/node.rs11
-rw-r--r--tests/unit/script/size_of.rs2
9 files changed, 77 insertions, 167 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs
index 24e760d510c..66e977bf2b5 100644
--- a/components/script/dom/element.rs
+++ b/components/script/dom/element.rs
@@ -613,43 +613,6 @@ impl Element {
Some(node) => node.is::<Document>(),
}
}
-
- pub(crate) fn assigned_slot(&self) -> Option<DomRoot<HTMLSlotElement>> {
- let assigned_slot = self
- .rare_data
- .borrow()
- .as_ref()?
- .slottable_data
- .assigned_slot
- .as_ref()?
- .as_rooted();
- Some(assigned_slot)
- }
-
- 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>> {
- let manually_assigned_slot = self
- .rare_data
- .borrow()
- .as_ref()?
- .slottable_data
- .manual_slot_assignment
- .as_ref()?
- .as_rooted();
- Some(manually_assigned_slot)
- }
-
- pub(crate) fn set_manual_slot_assignment(
- &self,
- manually_assigned_slot: Option<&HTMLSlotElement>,
- ) {
- self.ensure_rare_data()
- .slottable_data
- .manual_slot_assignment = manually_assigned_slot.map(Dom::from_ref);
- }
}
/// <https://dom.spec.whatwg.org/#valid-shadow-host-name>
@@ -727,7 +690,6 @@ 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> {
@@ -1261,20 +1223,6 @@ 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 {
diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs
index 480aa1bb105..adf2cc0d118 100644
--- a/components/script/dom/eventtarget.rs
+++ b/components/script/dom/eventtarget.rs
@@ -41,7 +41,6 @@ use crate::dom::bindings::codegen::Bindings::NodeBinding::GetRootNodeOptions;
use crate::dom::bindings::codegen::Bindings::NodeBinding::Node_Binding::NodeMethods;
use crate::dom::bindings::codegen::Bindings::ShadowRootBinding::ShadowRoot_Binding::ShadowRootMethods;
use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
-use crate::dom::bindings::codegen::InheritTypes::{CharacterDataTypeId, NodeTypeId};
use crate::dom::bindings::codegen::UnionTypes::{
AddEventListenerOptionsOrBoolean, EventListenerOptionsOrBoolean, EventOrString,
};
@@ -61,7 +60,6 @@ use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlformelement::FormControlElementHelpers;
use crate::dom::node::{Node, NodeTraits};
use crate::dom::shadowroot::ShadowRoot;
-use crate::dom::text::Text;
use crate::dom::virtualmethods::VirtualMethods;
use crate::dom::window::Window;
use crate::dom::workerglobalscope::WorkerGlobalScope;
@@ -821,25 +819,7 @@ impl EventTarget {
if let Some(node) = self.downcast::<Node>() {
// > A node’s get the parent algorithm, given an event, returns the node’s assigned slot,
// > if node is assigned; otherwise node’s parent.
- let assigned_slot = match node.type_id() {
- NodeTypeId::Element(_) => {
- let element = node.downcast::<Element>().unwrap();
- element
- .assigned_slot()
- .map(|slot| DomRoot::from_ref(slot.upcast::<EventTarget>()))
- },
- NodeTypeId::CharacterData(CharacterDataTypeId::Text(_)) => {
- let text = node.downcast::<Text>().unwrap();
- text.slottable_data()
- .borrow()
- .assigned_slot
- .as_ref()
- .map(|slot| DomRoot::from_ref(slot.upcast::<EventTarget>()))
- },
- _ => None,
- };
-
- return assigned_slot.or_else(|| {
+ return node.assigned_slot().map(DomRoot::upcast).or_else(|| {
node.GetParentNode()
.map(|parent| DomRoot::from_ref(parent.upcast::<EventTarget>()))
});
diff --git a/components/script/dom/htmlslotelement.rs b/components/script/dom/htmlslotelement.rs
index ccabca0972c..686705f9d4b 100644
--- a/components/script/dom/htmlslotelement.rs
+++ b/components/script/dom/htmlslotelement.rs
@@ -29,7 +29,6 @@ use crate::dom::globalscope::GlobalScope;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::mutationobserver::MutationObserver;
use crate::dom::node::{Node, NodeDamage, ShadowIncluding};
-use crate::dom::text::Text;
use crate::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc;
use crate::ScriptThread;
@@ -437,53 +436,23 @@ impl Slottable {
}
pub(crate) fn assigned_slot(&self) -> Option<DomRoot<HTMLSlotElement>> {
- self.match_slottable(
- |element: &Element| element.assigned_slot(),
- |text: &Text| {
- let assigned_slot = text
- .slottable_data()
- .borrow()
- .assigned_slot
- .as_ref()?
- .as_rooted();
- Some(assigned_slot)
- },
- )
+ self.node().assigned_slot()
}
pub(crate) fn set_assigned_slot(&self, assigned_slot: Option<&HTMLSlotElement>) {
- self.match_slottable(
- |element: &Element| element.set_assigned_slot(assigned_slot),
- |text: &Text| {
- text.slottable_data().borrow_mut().assigned_slot = assigned_slot.map(Dom::from_ref);
- },
- )
+ self.node().set_assigned_slot(assigned_slot);
}
pub(crate) fn set_manual_slot_assignment(
&self,
manually_assigned_slot: Option<&HTMLSlotElement>,
) {
- self.match_slottable(
- |element: &Element| element.set_manual_slot_assignment(manually_assigned_slot),
- |text: &Text| {
- text.slottable_data().borrow_mut().manual_slot_assignment =
- manually_assigned_slot.map(Dom::from_ref)
- },
- )
+ self.node()
+ .set_manual_slot_assignment(manually_assigned_slot);
}
pub(crate) fn manual_slot_assignment(&self) -> Option<DomRoot<HTMLSlotElement>> {
- self.match_slottable(
- |element: &Element| element.manual_slot_assignment(),
- |text: &Text| {
- text.slottable_data()
- .borrow()
- .manual_slot_assignment
- .as_ref()
- .map(Dom::as_rooted)
- },
- )
+ self.node().manual_slot_assignment()
}
fn name(&self) -> DOMString {
@@ -494,26 +463,6 @@ impl Slottable {
element.get_string_attribute(&local_name!("slot"))
}
-
- /// Call the `element_function` if the slottable is an Element, otherwise the
- /// `text_function`
- pub(crate) fn match_slottable<E, T, R>(&self, element_function: E, text_function: T) -> R
- where
- E: FnOnce(&Element) -> R,
- T: FnOnce(&Text) -> R,
- {
- match self.0.type_id() {
- NodeTypeId::Element(_) => {
- let element: &Element = self.0.downcast::<Element>().unwrap();
- element_function(element)
- },
- NodeTypeId::CharacterData(CharacterDataTypeId::Text(_)) => {
- let text: &Text = self.0.downcast::<Text>().unwrap();
- text_function(text)
- },
- _ => unreachable!(),
- }
- }
}
impl VirtualMethods for HTMLSlotElement {
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs
index 77be215cccb..b623ae18973 100644
--- a/components/script/dom/node.rs
+++ b/components/script/dom/node.rs
@@ -1361,6 +1361,43 @@ impl Node {
}
}
}
+
+ pub(crate) fn assigned_slot(&self) -> Option<DomRoot<HTMLSlotElement>> {
+ let assigned_slot = self
+ .rare_data
+ .borrow()
+ .as_ref()?
+ .slottable_data
+ .assigned_slot
+ .as_ref()?
+ .as_rooted();
+ Some(assigned_slot)
+ }
+
+ 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>> {
+ let manually_assigned_slot = self
+ .rare_data
+ .borrow()
+ .as_ref()?
+ .slottable_data
+ .manual_slot_assignment
+ .as_ref()?
+ .as_rooted();
+ Some(manually_assigned_slot)
+ }
+
+ pub(crate) fn set_manual_slot_assignment(
+ &self,
+ manually_assigned_slot: Option<&HTMLSlotElement>,
+ ) {
+ self.ensure_rare_data()
+ .slottable_data
+ .manual_slot_assignment = manually_assigned_slot.map(Dom::from_ref);
+ }
}
/// Iterate through `nodes` until we find a `Node` that is not in `not_in`
@@ -1395,6 +1432,7 @@ pub(crate) trait LayoutNodeHelpers<'dom> {
fn owner_doc_for_layout(self) -> LayoutDom<'dom, Document>;
fn containing_shadow_root_for_layout(self) -> Option<LayoutDom<'dom, ShadowRoot>>;
+ fn assigned_slot_for_layout(self) -> Option<LayoutDom<'dom, HTMLSlotElement>>;
fn is_element_for_layout(&self) -> bool;
unsafe fn get_flag(self, flag: NodeFlags) -> bool;
@@ -1517,6 +1555,21 @@ impl<'dom> LayoutNodeHelpers<'dom> for LayoutDom<'dom, Node> {
}
}
+ #[inline]
+ #[allow(unsafe_code)]
+ fn assigned_slot_for_layout(self) -> Option<LayoutDom<'dom, HTMLSlotElement>> {
+ unsafe {
+ self.unsafe_get()
+ .rare_data
+ .borrow_for_layout()
+ .as_ref()?
+ .slottable_data
+ .assigned_slot
+ .as_ref()
+ .map(|assigned_slot| assigned_slot.to_layout())
+ }
+ }
+
// FIXME(nox): get_flag/set_flag (especially the latter) are not safe because
// they mutate stuff while values of this type can be used from multiple
// threads at once, this should be revisited.
@@ -2379,19 +2432,7 @@ impl Node {
parent.remove_child(node, cached_index);
// Step 12. If node is assigned, then run assign slottables for node’s assigned slot.
- let assigned_slot = node
- .downcast::<Element>()
- .and_then(|e| e.assigned_slot())
- .or_else(|| {
- node.downcast::<Text>().and_then(|text| {
- text.slottable_data()
- .borrow()
- .assigned_slot
- .as_ref()
- .map(Dom::as_rooted)
- })
- });
- if let Some(slot) = assigned_slot {
+ if let Some(slot) = node.assigned_slot() {
slot.assign_slottables();
}
diff --git a/components/script/dom/raredata.rs b/components/script/dom/raredata.rs
index 383eaaf70c3..ac830a8e362 100644
--- a/components/script/dom/raredata.rs
+++ b/components/script/dom/raredata.rs
@@ -32,6 +32,8 @@ pub(crate) struct NodeRareData {
pub(crate) mutation_observers: Vec<RegisteredObserver>,
/// Lazily-generated Unique Id for this node.
pub(crate) unique_id: Option<UniqueId>,
+
+ pub(crate) slottable_data: SlottableData,
}
#[derive(Default, JSTraceable, MallocSizeOf)]
@@ -39,8 +41,6 @@ pub(crate) struct NodeRareData {
pub(crate) struct ElementRareData {
/// <https://dom.spec.whatwg.org/#dom-element-shadowroot>
/// The ShadowRoot this element is host of.
- /// XXX This is currently not exposed to web content. Only for
- /// internal use.
pub(crate) shadow_root: Option<Dom<ShadowRoot>>,
/// <https://html.spec.whatwg.org/multipage/#custom-element-reaction-queue>
pub(crate) custom_element_reaction_queue: Vec<CustomElementReaction>,
@@ -58,6 +58,4 @@ pub(crate) struct ElementRareData {
pub(crate) client_rect: Option<LayoutValue<Rect<i32>>>,
/// <https://html.spec.whatwg.org/multipage#elementinternals>
pub(crate) element_internals: Option<Dom<ElementInternals>>,
-
- pub(crate) slottable_data: SlottableData,
}
diff --git a/components/script/dom/text.rs b/components/script/dom/text.rs
index e34c9d2bd68..d4b31ab3dcf 100644
--- a/components/script/dom/text.rs
+++ b/components/script/dom/text.rs
@@ -2,8 +2,6 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
-use std::cell::RefCell;
-
use dom_struct::dom_struct;
use js::rust::HandleObject;
@@ -19,7 +17,7 @@ use crate::dom::bindings::str::DOMString;
use crate::dom::characterdata::CharacterData;
use crate::dom::document::Document;
use crate::dom::globalscope::GlobalScope;
-use crate::dom::htmlslotelement::{HTMLSlotElement, Slottable, SlottableData};
+use crate::dom::htmlslotelement::{HTMLSlotElement, Slottable};
use crate::dom::node::Node;
use crate::dom::window::Window;
use crate::script_runtime::CanGc;
@@ -28,14 +26,12 @@ use crate::script_runtime::CanGc;
#[dom_struct]
pub(crate) struct Text {
characterdata: CharacterData,
- slottable_data: RefCell<SlottableData>,
}
impl Text {
pub(crate) fn new_inherited(text: DOMString, document: &Document) -> Text {
Text {
characterdata: CharacterData::new_inherited(text, document),
- slottable_data: Default::default(),
}
}
@@ -56,10 +52,6 @@ impl Text {
can_gc,
)
}
-
- pub(crate) fn slottable_data(&self) -> &RefCell<SlottableData> {
- &self.slottable_data
- }
}
impl TextMethods<crate::DomTypeHolder> for Text {
diff --git a/components/script/layout_dom/element.rs b/components/script/layout_dom/element.rs
index 05271793184..cdca829dca4 100644
--- a/components/script/layout_dom/element.rs
+++ b/components/script/layout_dom/element.rs
@@ -140,11 +140,6 @@ impl<'dom> ServoLayoutElement<'dom> {
Some(node) => matches!(node.script_type_id(), NodeTypeId::Document(_)),
}
}
-
- fn assigned_slot(&self) -> Option<Self> {
- let slot = self.element.get_assigned_slot()?;
- Some(Self::from_layout_js(slot.upcast()))
- }
}
pub enum DOMDescendantIterator<E>
@@ -204,11 +199,7 @@ impl<'dom> style::dom::TElement for ServoLayoutElement<'dom> {
}
fn traversal_parent(&self) -> Option<Self> {
- if let Some(assigned_slot) = self.assigned_slot() {
- Some(assigned_slot)
- } else {
- self.as_node().traversal_parent()
- }
+ self.as_node().traversal_parent()
}
fn is_html_element(&self) -> bool {
@@ -752,7 +743,7 @@ impl<'dom> ::selectors::Element for ServoLayoutElement<'dom> {
#[allow(unsafe_code)]
fn assigned_slot(&self) -> Option<Self> {
- self.assigned_slot()
+ self.as_node().assigned_slot()
}
fn is_html_element_in_html_document(&self) -> bool {
diff --git a/components/script/layout_dom/node.rs b/components/script/layout_dom/node.rs
index 841a396fc5f..9e04e861844 100644
--- a/components/script/layout_dom/node.rs
+++ b/components/script/layout_dom/node.rs
@@ -94,6 +94,14 @@ impl<'dom> ServoLayoutNode<'dom> {
pub(crate) fn get_jsmanaged(self) -> LayoutDom<'dom, Node> {
self.node
}
+
+ pub(crate) fn assigned_slot(self) -> Option<ServoLayoutElement<'dom>> {
+ self.node
+ .assigned_slot_for_layout()
+ .as_ref()
+ .map(LayoutDom::upcast)
+ .map(ServoLayoutElement::from_layout_js)
+ }
}
impl style::dom::NodeInfo for ServoLayoutNode<'_> {
@@ -139,6 +147,9 @@ impl<'dom> style::dom::TNode for ServoLayoutNode<'dom> {
}
fn traversal_parent(&self) -> Option<ServoLayoutElement<'dom>> {
+ if let Some(assigned_slot) = self.assigned_slot() {
+ return Some(assigned_slot);
+ }
let parent = self.parent_node()?;
if let Some(shadow) = parent.as_shadow_root() {
return Some(shadow.host());
diff --git a/tests/unit/script/size_of.rs b/tests/unit/script/size_of.rs
index 3cbc005ac53..d39f6ebacd7 100644
--- a/tests/unit/script/size_of.rs
+++ b/tests/unit/script/size_of.rs
@@ -35,5 +35,5 @@ sizeof_checker!(size_element, Element, 376);
sizeof_checker!(size_htmlelement, HTMLElement, 392);
sizeof_checker!(size_div, HTMLDivElement, 392);
sizeof_checker!(size_span, HTMLSpanElement, 392);
-sizeof_checker!(size_text, Text, 256);
+sizeof_checker!(size_text, Text, 232);
sizeof_checker!(size_characterdata, CharacterData, 232);