aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/document.rs1
-rw-r--r--components/script/dom/node.rs13
-rw-r--r--components/script/layout_wrapper.rs117
3 files changed, 50 insertions, 81 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index b4273233c37..5870e4c1320 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -434,7 +434,6 @@ impl Document {
// that workable.
match self.GetDocumentElement() {
Some(root) => {
- root.upcast::<Node>().is_dirty() ||
root.upcast::<Node>().has_dirty_descendants() ||
!self.pending_restyles.borrow().is_empty() ||
self.needs_paint()
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs
index 8e8bf6edc9e..983e2e8d403 100644
--- a/components/script/dom/node.rs
+++ b/components/script/dom/node.rs
@@ -149,9 +149,6 @@ bitflags! {
#[doc = "Specifies whether this node is in a document."]
const IS_IN_DOC = 0x01,
#[doc = "Specifies whether this node needs style recalc on next reflow."]
- const IS_DIRTY = 0x04,
- #[doc = "Specifies whether this node has descendants (inclusive of itself) which \
- have changed since the last reflow."]
const HAS_DIRTY_DESCENDANTS = 0x08,
// TODO: find a better place to keep this (#4105)
// https://critic.hoppipolla.co.uk/showcomment?chain=8873
@@ -172,7 +169,7 @@ bitflags! {
impl NodeFlags {
pub fn new() -> NodeFlags {
- IS_DIRTY
+ NodeFlags::empty()
}
}
@@ -428,14 +425,6 @@ impl Node {
self.flags.set(flags);
}
- pub fn is_dirty(&self) -> bool {
- self.get_flag(IS_DIRTY)
- }
-
- pub fn set_is_dirty(&self, state: bool) {
- self.set_flag(IS_DIRTY, state)
- }
-
pub fn has_dirty_descendants(&self) -> bool {
self.get_flag(HAS_DIRTY_DESCENDANTS)
}
diff --git a/components/script/layout_wrapper.rs b/components/script/layout_wrapper.rs
index 18d2bd092c0..a386d5c8563 100644
--- a/components/script/layout_wrapper.rs
+++ b/components/script/layout_wrapper.rs
@@ -36,7 +36,7 @@ use dom::bindings::js::LayoutJS;
use dom::characterdata::LayoutCharacterDataHelpers;
use dom::document::{Document, LayoutDocumentHelpers, PendingRestyle};
use dom::element::{Element, LayoutElementHelpers, RawLayoutElementHelpers};
-use dom::node::{CAN_BE_FRAGMENTED, DIRTY_ON_VIEWPORT_SIZE_CHANGE, HAS_DIRTY_DESCENDANTS, IS_DIRTY};
+use dom::node::{CAN_BE_FRAGMENTED, DIRTY_ON_VIEWPORT_SIZE_CHANGE, HAS_DIRTY_DESCENDANTS};
use dom::node::{LayoutNodeHelpers, Node};
use dom::text::Text;
use gfx_traits::ByteIndex;
@@ -53,11 +53,12 @@ use selectors::parser::{AttrSelector, NamespaceConstraint};
use servo_atoms::Atom;
use servo_url::ServoUrl;
use std::fmt;
+use std::fmt::Debug;
use std::marker::PhantomData;
use std::mem::transmute;
use std::sync::Arc;
use std::sync::atomic::Ordering;
-use style::atomic_refcell::{AtomicRef, AtomicRefCell};
+use style::atomic_refcell::AtomicRefCell;
use style::attr::AttrValue;
use style::computed_values::display;
use style::context::SharedStyleContext;
@@ -80,6 +81,16 @@ pub struct ServoLayoutNode<'a> {
chain: PhantomData<&'a ()>,
}
+impl<'ln> Debug for ServoLayoutNode<'ln> {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ if let Some(el) = self.as_element() {
+ el.fmt(f)
+ } else {
+ write!(f, "{:?} ({:#x})", self.type_id(), self.opaque().0)
+ }
+ }
+}
+
impl<'a> PartialEq for ServoLayoutNode<'a> {
#[inline]
fn eq(&self, other: &ServoLayoutNode) -> bool {
@@ -201,30 +212,6 @@ impl<'ln> TNode for ServoLayoutNode<'ln> {
self.node.parent_node_ref().map(|node| self.new_with_this_lifetime(&node))
}
}
-
- fn first_child(&self) -> Option<ServoLayoutNode<'ln>> {
- unsafe {
- self.node.first_child_ref().map(|node| self.new_with_this_lifetime(&node))
- }
- }
-
- fn last_child(&self) -> Option<ServoLayoutNode<'ln>> {
- unsafe {
- self.node.last_child_ref().map(|node| self.new_with_this_lifetime(&node))
- }
- }
-
- fn prev_sibling(&self) -> Option<ServoLayoutNode<'ln>> {
- unsafe {
- self.node.prev_sibling_ref().map(|node| self.new_with_this_lifetime(&node))
- }
- }
-
- fn next_sibling(&self) -> Option<ServoLayoutNode<'ln>> {
- unsafe {
- self.node.next_sibling_ref().map(|node| self.new_with_this_lifetime(&node))
- }
- }
}
pub struct ServoChildrenIterator<'a> {
@@ -259,9 +246,28 @@ impl<'ln> LayoutNode for ServoLayoutNode<'ln> {
self.get_jsmanaged().take_style_and_layout_data()
}
- unsafe fn clear_dirty_bits(&self) {
- self.node.set_flag(IS_DIRTY, false);
- self.node.set_flag(HAS_DIRTY_DESCENDANTS, false);
+ fn first_child(&self) -> Option<ServoLayoutNode<'ln>> {
+ unsafe {
+ self.node.first_child_ref().map(|node| self.new_with_this_lifetime(&node))
+ }
+ }
+
+ fn last_child(&self) -> Option<ServoLayoutNode<'ln>> {
+ unsafe {
+ self.node.last_child_ref().map(|node| self.new_with_this_lifetime(&node))
+ }
+ }
+
+ fn prev_sibling(&self) -> Option<ServoLayoutNode<'ln>> {
+ unsafe {
+ self.node.prev_sibling_ref().map(|node| self.new_with_this_lifetime(&node))
+ }
+ }
+
+ fn next_sibling(&self) -> Option<ServoLayoutNode<'ln>> {
+ unsafe {
+ self.node.next_sibling_ref().map(|node| self.new_with_this_lifetime(&node))
+ }
}
}
@@ -292,14 +298,6 @@ impl<'le> GetLayoutData for ServoThreadSafeLayoutElement<'le> {
}
impl<'ln> ServoLayoutNode<'ln> {
- pub fn is_dirty(&self) -> bool {
- unsafe { self.node.get_flag(IS_DIRTY) }
- }
-
- pub unsafe fn set_dirty(&self) {
- self.node.set_flag(IS_DIRTY, true)
- }
-
fn dump_indent(self, indent: u32) {
let mut s = String::new();
for _ in 0..indent {
@@ -330,9 +328,8 @@ impl<'ln> ServoLayoutNode<'ln> {
}
fn debug_str(self) -> String {
- format!("{:?}: dirty={} dirty_descendants={}",
+ format!("{:?}: dirty_descendants={}",
self.script_type_id(),
- self.as_element().map_or(false, |el| el.deprecated_dirty_bit_is_set()),
self.as_element().map_or(false, |el| el.has_dirty_descendants()))
}
@@ -406,7 +403,7 @@ impl<'le> fmt::Debug for ServoLayoutElement<'le> {
if let &Some(ref id) = unsafe { &*self.element.id_attribute() } {
try!(write!(f, " id={}", id));
}
- write!(f, ">")
+ write!(f, "> ({:#x})", self.as_node().opaque().0)
}
}
@@ -447,10 +444,6 @@ impl<'le> TElement for ServoLayoutElement<'le> {
self.get_attr(namespace, attr).map_or(false, |x| x == val)
}
- fn set_restyle_damage(self, damage: RestyleDamage) {
- self.get_partial_layout_data().unwrap().borrow_mut().restyle_damage |= damage;
- }
-
#[inline]
fn existing_style_for_restyle_damage<'a>(&'a self,
current_cv: Option<&'a Arc<ComputedValues>>,
@@ -459,10 +452,6 @@ impl<'le> TElement for ServoLayoutElement<'le> {
current_cv
}
- fn deprecated_dirty_bit_is_set(&self) -> bool {
- unsafe { self.as_node().node.get_flag(IS_DIRTY) }
- }
-
fn has_dirty_descendants(&self) -> bool {
unsafe { self.as_node().node.get_flag(HAS_DIRTY_DESCENDANTS) }
}
@@ -471,6 +460,10 @@ impl<'le> TElement for ServoLayoutElement<'le> {
self.as_node().node.set_flag(HAS_DIRTY_DESCENDANTS, true)
}
+ unsafe fn unset_dirty_descendants(&self) {
+ self.as_node().node.set_flag(HAS_DIRTY_DESCENDANTS, false)
+ }
+
fn store_children_to_process(&self, n: isize) {
let data = self.get_partial_layout_data().unwrap().borrow();
data.parallel.children_to_process.store(n, Ordering::Relaxed);
@@ -483,10 +476,6 @@ impl<'le> TElement for ServoLayoutElement<'le> {
old_value - 1
}
- fn borrow_data(&self) -> Option<AtomicRef<ElementData>> {
- self.get_data().map(|d| d.borrow())
- }
-
fn get_data(&self) -> Option<&AtomicRefCell<ElementData>> {
unsafe {
self.get_style_and_layout_data().map(|d| {
@@ -729,7 +718,7 @@ impl<'le> ::selectors::Element for ServoLayoutElement<'le> {
}
}
-#[derive(Copy, Clone)]
+#[derive(Copy, Clone, Debug)]
pub struct ServoThreadSafeLayoutNode<'ln> {
/// The wrapped node.
node: ServoLayoutNode<'ln>,
@@ -830,7 +819,7 @@ impl<'ln> ThreadSafeLayoutNode for ServoThreadSafeLayoutNode<'ln> {
debug_assert!(self.is_text_node());
let parent = self.node.parent_node().unwrap().as_element().unwrap();
let parent_data = parent.get_data().unwrap().borrow();
- parent_data.current_styles().primary.clone()
+ parent_data.current_styles().primary.values.clone()
}
fn debug_id(self) -> usize {
@@ -874,22 +863,14 @@ impl<'ln> ThreadSafeLayoutNode for ServoThreadSafeLayoutNode<'ln> {
}
fn restyle_damage(self) -> RestyleDamage {
- if self.is_text_node() {
- let parent = self.node.parent_node().unwrap().as_element().unwrap();
- let parent_data = parent.get_partial_layout_data().unwrap().borrow();
- parent_data.restyle_damage
+ let element = if self.is_text_node() {
+ self.node.parent_node().unwrap().as_element().unwrap()
} else {
- let el = self.as_element().unwrap().element;
- let damage = el.get_partial_layout_data().unwrap().borrow().restyle_damage.clone();
- damage
- }
- }
+ self.node.as_element().unwrap()
+ };
- fn clear_restyle_damage(self) {
- if let Some(el) = self.as_element() {
- let mut data = el.element.get_partial_layout_data().unwrap().borrow_mut();
- data.restyle_damage = RestyleDamage::empty();
- }
+ let damage = element.borrow_data().unwrap().damage();
+ damage
}
fn can_be_fragmented(&self) -> bool {