aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorFernando Jiménez Moreno <ferjmoreno@gmail.com>2019-04-26 09:44:21 +0200
committerFernando Jiménez Moreno <ferjmoreno@gmail.com>2019-04-29 12:02:04 +0200
commit68bee1c7717f6219bcace8f6be4de42629687eab (patch)
tree64f4a3cee7816f98f413adc66dab24bf3e548830 /components/script
parent9b2eb775302b84542ab8fea921ab441342fe79c3 (diff)
downloadservo-68bee1c7717f6219bcace8f6be4de42629687eab.tar.gz
servo-68bee1c7717f6219bcace8f6be4de42629687eab.zip
Final nits; fix custom elements rare data usage; s/owner_s_r/containing_s_r
Clarify special case for containing_shadow_root and add it to layout accessor
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/element.rs106
-rw-r--r--components/script/dom/htmlbaseelement.rs2
-rw-r--r--components/script/dom/macros.rs5
-rw-r--r--components/script/dom/node.rs66
-rw-r--r--components/script/dom/raredata.rs3
5 files changed, 94 insertions, 88 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs
index 034c57abad8..870b5dc7a4f 100644
--- a/components/script/dom/element.rs
+++ b/components/script/dom/element.rs
@@ -347,10 +347,7 @@ impl Element {
}
pub fn get_custom_element_definition(&self) -> Option<Rc<CustomElementDefinition>> {
- if let Some(rare_data) = self.rare_data().as_ref() {
- return rare_data.custom_element_definition.clone();
- }
- None
+ self.rare_data().as_ref()?.custom_element_definition.clone()
}
pub fn push_callback_reaction(&self, function: Rc<Function>, args: Box<[Heap<JSVal>]>) {
@@ -366,26 +363,30 @@ impl Element {
}
pub fn clear_reaction_queue(&self) {
- self.ensure_rare_data()
- .custom_element_reaction_queue
- .clear();
+ if let Some(ref mut rare_data) = *self.rare_data_mut() {
+ rare_data.custom_element_reaction_queue.clear();
+ }
}
pub fn invoke_reactions(&self) {
- if let Some(rare_data) = self.rare_data().as_ref() {
- // TODO: This is not spec compliant, as this will allow some reactions to be processed
- // after clear_reaction_queue has been called.
+ loop {
rooted_vec!(let mut reactions);
- while !rare_data.custom_element_reaction_queue.is_empty() {
- mem::swap(
- &mut *reactions,
- &mut self.ensure_rare_data().custom_element_reaction_queue,
- );
- for reaction in reactions.iter() {
- reaction.invoke(self);
- }
- reactions.clear();
+ match *self.rare_data_mut() {
+ Some(ref mut data) => {
+ mem::swap(&mut *reactions, &mut data.custom_element_reaction_queue)
+ },
+ None => break,
+ };
+
+ if reactions.is_empty() {
+ break;
+ }
+
+ for reaction in reactions.iter() {
+ reaction.invoke(self);
}
+
+ reactions.clear();
}
}
@@ -442,11 +443,16 @@ impl Element {
})
}
+ fn shadow_root(&self) -> Option<DomRoot<ShadowRoot>> {
+ self.rare_data()
+ .as_ref()?
+ .shadow_root
+ .as_ref()
+ .map(|sr| DomRoot::from_ref(&**sr))
+ }
+
pub fn is_shadow_host(&self) -> bool {
- if let Some(rare_data) = self.rare_data().as_ref() {
- return rare_data.shadow_root.is_some();
- }
- false
+ self.shadow_root().is_some()
}
/// https://dom.spec.whatwg.org/#dom-element-attachshadow
@@ -1065,10 +1071,12 @@ impl LayoutElementHelpers for LayoutDom<Element> {
#[inline]
#[allow(unsafe_code)]
unsafe fn get_shadow_root_for_layout(&self) -> Option<LayoutDom<ShadowRoot>> {
- if let Some(rare_data) = (*self.unsafe_get()).rare_data_for_layout().as_ref() {
- return rare_data.shadow_root.as_ref().map(|sr| sr.to_layout());
- }
- None
+ (*self.unsafe_get())
+ .rare_data_for_layout()
+ .as_ref()?
+ .shadow_root
+ .as_ref()
+ .map(|sr| sr.to_layout())
}
}
@@ -2742,21 +2750,21 @@ impl VirtualMethods for Element {
None
}
});
- let owner_shadow_root = self.upcast::<Node>().owner_shadow_root();
+ let containing_shadow_root = self.upcast::<Node>().containing_shadow_root();
if node.is_connected() {
let value = attr.value().as_atom().clone();
match mutation {
AttributeMutation::Set(old_value) => {
if let Some(old_value) = old_value {
let old_value = old_value.as_atom().clone();
- if let Some(ref shadow_root) = owner_shadow_root {
+ if let Some(ref shadow_root) = containing_shadow_root {
shadow_root.unregister_named_element(self, old_value);
} else {
doc.unregister_named_element(self, old_value);
}
}
if value != atom!("") {
- if let Some(ref shadow_root) = owner_shadow_root {
+ if let Some(ref shadow_root) = containing_shadow_root {
shadow_root.register_named_element(self, value);
} else {
doc.register_named_element(self, value);
@@ -2765,7 +2773,7 @@ impl VirtualMethods for Element {
},
AttributeMutation::Removed => {
if value != atom!("") {
- if let Some(ref shadow_root) = owner_shadow_root {
+ if let Some(ref shadow_root) = containing_shadow_root {
shadow_root.unregister_named_element(self, value);
} else {
doc.unregister_named_element(self, value);
@@ -2812,15 +2820,13 @@ impl VirtualMethods for Element {
let doc = document_from_node(self);
- if let Some(rare_data) = self.rare_data().as_ref() {
- if let Some(ref shadow_root) = rare_data.shadow_root {
- doc.register_shadow_root(&shadow_root);
- let shadow_root = shadow_root.upcast::<Node>();
- shadow_root.set_flag(NodeFlags::IS_CONNECTED, context.tree_connected);
- for node in shadow_root.children() {
- node.set_flag(NodeFlags::IS_CONNECTED, context.tree_connected);
- node.bind_to_tree(context);
- }
+ if let Some(ref shadow_root) = self.shadow_root() {
+ doc.register_shadow_root(&shadow_root);
+ let shadow_root = shadow_root.upcast::<Node>();
+ shadow_root.set_flag(NodeFlags::IS_CONNECTED, context.tree_connected);
+ for node in shadow_root.children() {
+ node.set_flag(NodeFlags::IS_CONNECTED, context.tree_connected);
+ node.bind_to_tree(context);
}
}
@@ -2829,7 +2835,7 @@ impl VirtualMethods for Element {
}
if let Some(ref value) = *self.id_attribute.borrow() {
- if let Some(shadow_root) = self.upcast::<Node>().owner_shadow_root() {
+ if let Some(shadow_root) = self.upcast::<Node>().containing_shadow_root() {
shadow_root.register_named_element(self, value.clone());
} else {
doc.register_named_element(self, value.clone());
@@ -2852,15 +2858,13 @@ impl VirtualMethods for Element {
let doc = document_from_node(self);
- if let Some(rare_data) = self.rare_data().as_ref() {
- if let Some(ref shadow_root) = rare_data.shadow_root {
- doc.unregister_shadow_root(&shadow_root);
- let shadow_root = shadow_root.upcast::<Node>();
- shadow_root.set_flag(NodeFlags::IS_CONNECTED, false);
- for node in shadow_root.children() {
- node.set_flag(NodeFlags::IS_CONNECTED, false);
- node.unbind_from_tree(context);
- }
+ if let Some(ref shadow_root) = self.shadow_root() {
+ doc.unregister_shadow_root(&shadow_root);
+ let shadow_root = shadow_root.upcast::<Node>();
+ shadow_root.set_flag(NodeFlags::IS_CONNECTED, false);
+ for node in shadow_root.children() {
+ node.set_flag(NodeFlags::IS_CONNECTED, false);
+ node.unbind_from_tree(context);
}
}
@@ -2931,7 +2935,7 @@ impl<'a> SelectorsElement for DomRoot<Element> {
}
fn containing_shadow_host(&self) -> Option<Self> {
- if let Some(shadow_root) = self.upcast::<Node>().owner_shadow_root() {
+ if let Some(shadow_root) = self.upcast::<Node>().containing_shadow_root() {
Some(shadow_root.Host())
} else {
None
diff --git a/components/script/dom/htmlbaseelement.rs b/components/script/dom/htmlbaseelement.rs
index fc20091302d..71aa235df62 100644
--- a/components/script/dom/htmlbaseelement.rs
+++ b/components/script/dom/htmlbaseelement.rs
@@ -64,7 +64,7 @@ impl HTMLBaseElement {
/// Update the cached base element in response to binding or unbinding from
/// a tree.
pub fn bind_unbind(&self, tree_in_doc: bool) {
- if !tree_in_doc || self.upcast::<Node>().owner_shadow_root().is_some() {
+ if !tree_in_doc || self.upcast::<Node>().containing_shadow_root().is_some() {
return;
}
diff --git a/components/script/dom/macros.rs b/components/script/dom/macros.rs
index de531f0c53f..021527a286a 100644
--- a/components/script/dom/macros.rs
+++ b/components/script/dom/macros.rs
@@ -639,6 +639,11 @@ macro_rules! impl_rare_data (
self.rare_data.borrow()
}
+ #[allow(dead_code)]
+ fn rare_data_mut(&self) -> RefMut<Option<Box<$type>>> {
+ self.rare_data.borrow_mut()
+ }
+
fn ensure_rare_data(&self) -> RefMut<Box<$type>> {
let mut rare_data = self.rare_data.borrow_mut();
if rare_data.is_none() {
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs
index c95e90e303c..630e16d6d0e 100644
--- a/components/script/dom/node.rs
+++ b/components/script/dom/node.rs
@@ -282,10 +282,10 @@ impl Node {
for node in new_child.traverse_preorder(ShadowIncluding::No) {
if parent_in_shadow_tree {
- if let Some(shadow_root) = self.owner_shadow_root() {
- node.set_owner_shadow_root(&*shadow_root);
+ if let Some(shadow_root) = self.containing_shadow_root() {
+ node.set_containing_shadow_root(&*shadow_root);
}
- debug_assert!(node.owner_shadow_root().is_some());
+ debug_assert!(node.containing_shadow_root().is_some());
}
node.set_flag(NodeFlags::IS_IN_DOC, parent_in_doc);
node.set_flag(NodeFlags::IS_IN_SHADOW_TREE, parent_in_shadow_tree);
@@ -946,21 +946,21 @@ impl Node {
self.owner_doc.set(Some(document));
}
- pub fn owner_shadow_root(&self) -> Option<DomRoot<ShadowRoot>> {
+ pub fn containing_shadow_root(&self) -> Option<DomRoot<ShadowRoot>> {
+ // NodeRareData contains the shadow root the node belongs to,
+ // but this node may be a shadow root itself.
if let Some(ref shadow_root) = self.downcast::<ShadowRoot>() {
return Some(DomRoot::from_ref(shadow_root));
}
- if let Some(rare_data) = self.rare_data().as_ref() {
- return rare_data
- .owner_shadow_root
- .as_ref()
- .map(|sr| DomRoot::from_ref(&**sr));
- }
- None
+ self.rare_data()
+ .as_ref()?
+ .containing_shadow_root
+ .as_ref()
+ .map(|sr| DomRoot::from_ref(&**sr))
}
- pub fn set_owner_shadow_root(&self, shadow_root: &ShadowRoot) {
- self.ensure_rare_data().owner_shadow_root = Some(Dom::from_ref(shadow_root));
+ pub fn set_containing_shadow_root(&self, shadow_root: &ShadowRoot) {
+ self.ensure_rare_data().containing_shadow_root = Some(Dom::from_ref(shadow_root));
}
pub fn is_in_html_doc(&self) -> bool {
@@ -1195,7 +1195,7 @@ pub trait LayoutNodeHelpers {
unsafe fn next_sibling_ref(&self) -> Option<LayoutDom<Node>>;
unsafe fn owner_doc_for_layout(&self) -> LayoutDom<Document>;
- unsafe fn owner_shadow_root_for_layout(&self) -> Option<LayoutDom<ShadowRoot>>;
+ unsafe fn containing_shadow_root_for_layout(&self) -> Option<LayoutDom<ShadowRoot>>;
unsafe fn is_element_for_layout(&self) -> bool;
unsafe fn get_flag(&self, flag: NodeFlags) -> bool;
@@ -1280,14 +1280,16 @@ impl LayoutNodeHelpers for LayoutDom<Node> {
#[inline]
#[allow(unsafe_code)]
- unsafe fn owner_shadow_root_for_layout(&self) -> Option<LayoutDom<ShadowRoot>> {
- if let Some(rare_data) = (*self.unsafe_get()).rare_data_for_layout().as_ref() {
- return rare_data
- .owner_shadow_root
- .as_ref()
- .map(|sr| sr.to_layout());
+ unsafe fn containing_shadow_root_for_layout(&self) -> Option<LayoutDom<ShadowRoot>> {
+ if let Some(ref shadow_root) = self.downcast::<ShadowRoot>() {
+ return Some(*shadow_root);
}
- None
+ (*self.unsafe_get())
+ .rare_data_for_layout()
+ .as_ref()?
+ .containing_shadow_root
+ .as_ref()
+ .map(|sr| sr.to_layout())
}
#[inline]
@@ -2292,19 +2294,13 @@ impl NodeMethods for Node {
// https://dom.spec.whatwg.org/#dom-node-getrootnode
fn GetRootNode(&self, options: &GetRootNodeOptions) -> DomRoot<Node> {
- if options.composed {
- if let Some(rare_data) = self.rare_data().as_ref() {
- if let Some(ref shadow_root) = rare_data.owner_shadow_root {
- // shadow-including root.
- return shadow_root.Host().upcast::<Node>().GetRootNode(options);
- }
- }
- }
-
- if let Some(rare_data) = self.rare_data().as_ref() {
- if let Some(ref shadow_root) = rare_data.owner_shadow_root {
- return DomRoot::from_ref(shadow_root.upcast::<Node>());
- }
+ if let Some(shadow_root) = self.containing_shadow_root() {
+ return if options.composed {
+ // shadow-including root.
+ shadow_root.Host().upcast::<Node>().GetRootNode(options)
+ } else {
+ DomRoot::from_ref(shadow_root.upcast::<Node>())
+ };
}
if self.is_in_doc() {
@@ -2837,7 +2833,7 @@ pub fn document_from_node<T: DerivedFrom<Node> + DomObject>(derived: &T) -> DomR
pub fn containing_shadow_root<T: DerivedFrom<Node> + DomObject>(
derived: &T,
) -> Option<DomRoot<ShadowRoot>> {
- derived.upcast().owner_shadow_root()
+ derived.upcast().containing_shadow_root()
}
#[allow(unrooted_must_root)]
diff --git a/components/script/dom/raredata.rs b/components/script/dom/raredata.rs
index 30929d2a247..2372b0b89ab 100644
--- a/components/script/dom/raredata.rs
+++ b/components/script/dom/raredata.rs
@@ -19,7 +19,7 @@ pub struct NodeRareData {
/// The shadow root the node belongs to.
/// This is None if the node is not in a shadow tree or
/// if it is a ShadowRoot.
- pub owner_shadow_root: Option<Dom<ShadowRoot>>,
+ pub containing_shadow_root: Option<Dom<ShadowRoot>>,
/// Registered observers for this node.
pub mutation_observers: Vec<RegisteredObserver>,
}
@@ -28,6 +28,7 @@ pub struct NodeRareData {
#[must_root]
pub 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 shadow_root: Option<Dom<ShadowRoot>>,