diff options
Diffstat (limited to 'components/layout/css/node_style.rs')
-rw-r--r-- | components/layout/css/node_style.rs | 58 |
1 files changed, 53 insertions, 5 deletions
diff --git a/components/layout/css/node_style.rs b/components/layout/css/node_style.rs index ecfb3383453..c3eaa04ddd2 100644 --- a/components/layout/css/node_style.rs +++ b/components/layout/css/node_style.rs @@ -2,27 +2,75 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -// Style retrieval from DOM elements. +//! Style retrieval from DOM elements. -use css::node_util::NodeUtil; -use wrapper::ThreadSafeLayoutNode; +use wrapper::{After, Before, Normal, ThreadSafeLayoutNode}; +use std::mem; use style::ComputedValues; use sync::Arc; /// Node mixin providing `style` method that returns a `NodeStyle` pub trait StyledNode { + /// Returns the style results for the given node. If CSS selector matching has not yet been + /// performed, fails. fn style<'a>(&'a self) -> &'a Arc<ComputedValues>; + /// Does this node have a computed style yet? + fn has_style(&self) -> bool; + /// Removes the style from this node. fn unstyle(self); } impl<'ln> StyledNode for ThreadSafeLayoutNode<'ln> { #[inline] fn style<'a>(&'a self) -> &'a Arc<ComputedValues> { - self.get_css_select_results() + unsafe { + let layout_data_ref = self.borrow_layout_data(); + match self.get_pseudo_element_type() { + Before(_) => { + mem::transmute(layout_data_ref.as_ref() + .unwrap() + .data + .before_style + .as_ref() + .unwrap()) + } + After(_) => { + mem::transmute(layout_data_ref.as_ref() + .unwrap() + .data + .after_style + .as_ref() + .unwrap()) + } + Normal => { + mem::transmute(layout_data_ref.as_ref() + .unwrap() + .shared_data + .style + .as_ref() + .unwrap()) + } + } + } + } + + fn has_style(&self) -> bool { + let layout_data_ref = self.borrow_layout_data(); + layout_data_ref.as_ref().unwrap().shared_data.style.is_some() } fn unstyle(self) { - self.remove_css_select_results() + let mut layout_data_ref = self.mutate_layout_data(); + let layout_data = layout_data_ref.as_mut().expect("no layout data"); + + let style = + match self.get_pseudo_element_type() { + Before(_) => &mut layout_data.data.before_style, + After (_) => &mut layout_data.data.after_style, + Normal => &mut layout_data.shared_data.style, + }; + + *style = None; } } |