Add an is_text_node to LayoutNode, so that we don't need to implement type_id for the style system.

This commit is contained in:
Bobby Holley 2015-12-15 20:37:53 -08:00
parent 6637626e02
commit e55a56d757
2 changed files with 45 additions and 40 deletions

View file

@ -11,7 +11,6 @@ use context::SharedLayoutContext;
use data::LayoutDataWrapper; use data::LayoutDataWrapper;
use incremental::{self, RestyleDamage}; use incremental::{self, RestyleDamage};
use msg::ParseErrorReporter; use msg::ParseErrorReporter;
use script::dom::bindings::inheritance::{CharacterDataTypeId, NodeTypeId};
use script::layout_interface::Animation; use script::layout_interface::Animation;
use selectors::bloom::BloomFilter; use selectors::bloom::BloomFilter;
use selectors::matching::{CommonStyleAffectingAttributeMode, CommonStyleAffectingAttributes}; use selectors::matching::{CommonStyleAffectingAttributeMode, CommonStyleAffectingAttributes};
@ -724,16 +723,14 @@ impl<'ln, ConcreteLayoutNode> MatchMethods<'ln, ConcreteLayoutNode>
match *layout_data_ref { match *layout_data_ref {
None => panic!("no layout data"), None => panic!("no layout data"),
Some(ref mut layout_data) => { Some(ref mut layout_data) => {
match self.type_id() { if self.is_text_node() {
NodeTypeId::CharacterData(CharacterDataTypeId::Text) => {
// Text nodes get a copy of the parent style. This ensures // Text nodes get a copy of the parent style. This ensures
// that during fragment construction any non-inherited // that during fragment construction any non-inherited
// CSS properties (such as vertical-align) are correctly // CSS properties (such as vertical-align) are correctly
// set on the fragment(s). // set on the fragment(s).
let cloned_parent_style = parent_style.unwrap().clone(); let cloned_parent_style = parent_style.unwrap().clone();
layout_data.shared_data.style = Some(cloned_parent_style); layout_data.shared_data.style = Some(cloned_parent_style);
} } else {
_ => {
let mut damage = self.cascade_node_pseudo_element( let mut damage = self.cascade_node_pseudo_element(
layout_context, layout_context,
parent_style, parent_style,
@ -743,7 +740,7 @@ impl<'ln, ConcreteLayoutNode> MatchMethods<'ln, ConcreteLayoutNode>
new_animations_sender, new_animations_sender,
applicable_declarations.normal_shareable, applicable_declarations.normal_shareable,
true); true);
if applicable_declarations.before.len() > 0 { if !applicable_declarations.before.is_empty() {
damage = damage | self.cascade_node_pseudo_element( damage = damage | self.cascade_node_pseudo_element(
layout_context, layout_context,
Some(layout_data.shared_data.style.as_ref().unwrap()), Some(layout_data.shared_data.style.as_ref().unwrap()),
@ -754,7 +751,7 @@ impl<'ln, ConcreteLayoutNode> MatchMethods<'ln, ConcreteLayoutNode>
false, false,
false); false);
} }
if applicable_declarations.after.len() > 0 { if !applicable_declarations.after.is_empty() {
damage = damage | self.cascade_node_pseudo_element( damage = damage | self.cascade_node_pseudo_element(
layout_context, layout_context,
Some(layout_data.shared_data.style.as_ref().unwrap()), Some(layout_data.shared_data.style.as_ref().unwrap()),
@ -771,4 +768,3 @@ impl<'ln, ConcreteLayoutNode> MatchMethods<'ln, ConcreteLayoutNode>
} }
} }
} }
}

View file

@ -93,6 +93,11 @@ pub trait LayoutNode<'ln> : Sized + Copy + Clone {
/// Returns the type ID of this node. /// Returns the type ID of this node.
fn type_id(&self) -> NodeTypeId; fn type_id(&self) -> NodeTypeId;
/// Returns whether this is a text node. It turns out that this is all the style system cares
/// about, and thus obviates the need to compute the full type id, which would be expensive in
/// Gecko.
fn is_text_node(&self) -> bool;
fn is_element(&self) -> bool; fn is_element(&self) -> bool;
fn dump(self); fn dump(self);
@ -304,6 +309,10 @@ impl<'ln> LayoutNode<'ln> for ServoLayoutNode<'ln> {
} }
} }
fn is_text_node(&self) -> bool {
self.type_id() == NodeTypeId::CharacterData(CharacterDataTypeId::Text)
}
fn is_element(&self) -> bool { fn is_element(&self) -> bool {
unsafe { unsafe {
self.node.is_element_for_layout() self.node.is_element_for_layout()