aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout/css/node_style.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/layout/css/node_style.rs')
-rw-r--r--components/layout/css/node_style.rs58
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;
}
}