aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/element.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/element.rs')
-rw-r--r--components/script/dom/element.rs66
1 files changed, 42 insertions, 24 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs
index 169fb7b9013..6983b8be2c1 100644
--- a/components/script/dom/element.rs
+++ b/components/script/dom/element.rs
@@ -106,7 +106,7 @@ use selectors::Element as SelectorsElement;
use servo_arc::Arc;
use servo_atoms::Atom;
use std::borrow::Cow;
-use std::cell::{Cell, Ref};
+use std::cell::{Cell, Ref, RefMut};
use std::default::Default;
use std::fmt;
use std::mem;
@@ -166,7 +166,7 @@ pub struct Element {
/// when it has exclusive access to the element.
#[ignore_malloc_size_of = "bitflags defined in rust-selectors"]
selector_flags: Cell<ElementSelectorFlags>,
- rare_data: Box<ElementRareData>,
+ rare_data: DomRefCell<Option<Box<ElementRareData>>>,
}
impl fmt::Debug for Element {
@@ -308,6 +308,8 @@ impl Element {
)
}
+ impl_rare_data!(ElementRareData);
+
pub fn restyle(&self, damage: NodeDamage) {
let doc = self.node.owner_doc();
let mut restyle = doc.ensure_pending_restyle(self);
@@ -330,39 +332,49 @@ impl Element {
}
pub fn set_custom_element_state(&self, state: CustomElementState) {
- self.rare_data.custom_element_state.set(state);
+ self.rare_data_mut().as_mut().unwrap().custom_element_state = state;
}
pub fn get_custom_element_state(&self) -> CustomElementState {
- self.rare_data.custom_element_state.get()
+ self.rare_data().as_ref().unwrap().custom_element_state
}
pub fn set_custom_element_definition(&self, definition: Rc<CustomElementDefinition>) {
- *self.rare_data.custom_element_definition.borrow_mut() = Some(definition);
+ self.rare_data_mut()
+ .as_mut()
+ .unwrap()
+ .custom_element_definition = Some(definition);
}
pub fn get_custom_element_definition(&self) -> Option<Rc<CustomElementDefinition>> {
- (*self.rare_data.custom_element_definition.borrow()).clone()
+ self.rare_data()
+ .as_ref()
+ .unwrap()
+ .custom_element_definition
+ .clone()
}
pub fn push_callback_reaction(&self, function: Rc<Function>, args: Box<[Heap<JSVal>]>) {
- self.rare_data
+ self.rare_data_mut()
+ .as_mut()
+ .unwrap()
.custom_element_reaction_queue
- .borrow_mut()
.push(CustomElementReaction::Callback(function, args));
}
pub fn push_upgrade_reaction(&self, definition: Rc<CustomElementDefinition>) {
- self.rare_data
+ self.rare_data_mut()
+ .as_mut()
+ .unwrap()
.custom_element_reaction_queue
- .borrow_mut()
.push(CustomElementReaction::Upgrade(definition));
}
pub fn clear_reaction_queue(&self) {
- self.rare_data
+ self.rare_data_mut()
+ .as_mut()
+ .unwrap()
.custom_element_reaction_queue
- .borrow_mut()
.clear();
}
@@ -371,14 +383,19 @@ impl Element {
// after clear_reaction_queue has been called.
rooted_vec!(let mut reactions);
while !self
- .rare_data
+ .rare_data()
+ .as_ref()
+ .unwrap()
.custom_element_reaction_queue
- .borrow()
.is_empty()
{
mem::swap(
&mut *reactions,
- &mut *self.rare_data.custom_element_reaction_queue.borrow_mut(),
+ &mut self
+ .rare_data_mut()
+ .as_mut()
+ .unwrap()
+ .custom_element_reaction_queue,
);
for reaction in reactions.iter() {
reaction.invoke(self);
@@ -441,7 +458,7 @@ impl Element {
}
pub fn is_shadow_host(&self) -> bool {
- self.rare_data.shadow_root.get().is_some()
+ self.rare_data().as_ref().unwrap().shadow_root.is_some()
}
/// https://dom.spec.whatwg.org/#dom-element-attachshadow
@@ -484,10 +501,8 @@ impl Element {
}
// Steps 4, 5 and 6.
- let shadow_root = self
- .rare_data
- .shadow_root
- .or_init(|| ShadowRoot::new(self, &*self.node.owner_doc()));
+ let shadow_root = ShadowRoot::new(self, &*self.node.owner_doc());
+ self.rare_data_mut().as_mut().unwrap().shadow_root = Some(Dom::from_ref(&*shadow_root));
if self.is_connected() {
self.node.owner_doc().register_shadow_root(&*shadow_root);
@@ -1063,9 +1078,12 @@ impl LayoutElementHelpers for LayoutDom<Element> {
#[allow(unsafe_code)]
unsafe fn get_shadow_root_for_layout(&self) -> Option<LayoutDom<ShadowRoot>> {
(*self.unsafe_get())
- .rare_data
+ .rare_data_for_layout()
+ .as_ref()
+ .unwrap()
.shadow_root
- .get_inner_as_layout()
+ .as_ref()
+ .map(|sr| sr.to_layout())
}
}
@@ -2809,7 +2827,7 @@ impl VirtualMethods for Element {
let doc = document_from_node(self);
- if let Some(shadow_root) = self.rare_data.shadow_root.get() {
+ if let Some(ref shadow_root) = self.rare_data().as_ref().unwrap().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);
@@ -2847,7 +2865,7 @@ impl VirtualMethods for Element {
let doc = document_from_node(self);
- if let Some(shadow_root) = self.rare_data.shadow_root.get() {
+ if let Some(ref shadow_root) = self.rare_data().as_ref().unwrap().shadow_root {
doc.unregister_shadow_root(&shadow_root);
let shadow_root = shadow_root.upcast::<Node>();
shadow_root.set_flag(NodeFlags::IS_CONNECTED, false);