aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <metajack+bors@gmail.com>2014-09-26 22:24:32 -0600
committerbors-servo <metajack+bors@gmail.com>2014-09-26 22:24:32 -0600
commit33e2a7b3625c82e83c7767e81266c2a23f509bed (patch)
tree31872e53aab7f82c25c9feaf2babb6b84710f371
parent94b7c486b12a50298f0706fce42b70a6ca90cdcb (diff)
parent47fc64052cb4ca57259fdef0576d26b07bdbc8ca (diff)
downloadservo-33e2a7b3625c82e83c7767e81266c2a23f509bed.tar.gz
servo-33e2a7b3625c82e83c7767e81266c2a23f509bed.zip
Merge pull request #3492 from pcwalton/clear-generated-content-table
layout: Support any `display` property in generated content, and allow Reviewed-by: glennw
-rw-r--r--components/layout/construct.rs19
-rw-r--r--components/layout/css/node_util.rs6
-rw-r--r--components/layout/table_wrapper.rs6
-rw-r--r--components/layout/wrapper.rs86
-rw-r--r--tests/ref/basic.list1
-rw-r--r--tests/ref/clear_generated_content_table_a.html19
-rw-r--r--tests/ref/clear_generated_content_table_ref.html12
7 files changed, 99 insertions, 50 deletions
diff --git a/components/layout/construct.rs b/components/layout/construct.rs
index 3d023c009f2..a95caed9c9a 100644
--- a/components/layout/construct.rs
+++ b/components/layout/construct.rs
@@ -45,7 +45,7 @@ use table_cell::TableCellFlow;
use text::TextRunScanner;
use util::{LayoutDataAccess, OpaqueNodeMethods};
use wrapper::{PostorderNodeMutTraversal, TLayoutNode, ThreadSafeLayoutNode};
-use wrapper::{Before, BeforeBlock, After, AfterBlock, Normal};
+use wrapper::{Before, After, Normal};
use gfx::display_list::OpaqueNode;
use script::dom::element::{HTMLIFrameElementTypeId, HTMLImageElementTypeId};
@@ -887,8 +887,9 @@ impl<'a> PostorderNodeMutTraversal for FlowConstructor<'a> {
// Pseudo-element.
let style = node.style();
let display = match node.get_pseudo_element_type() {
- Normal | Before | After => display::inline,
- BeforeBlock | AfterBlock => display::block,
+ Normal => display::inline,
+ Before(display) => display,
+ After(display) => display,
};
(display, style.get_box().float, style.get_box().position)
}
@@ -1041,12 +1042,8 @@ impl<'ln> NodeUtils for ThreadSafeLayoutNode<'ln> {
match &mut *layout_data_ref {
&Some(ref mut layout_data) =>{
match self.get_pseudo_element_type() {
- Before | BeforeBlock => {
- layout_data.data.before_flow_construction_result = result
- },
- After | AfterBlock => {
- layout_data.data.after_flow_construction_result = result
- },
+ Before(_) => layout_data.data.before_flow_construction_result = result,
+ After(_) => layout_data.data.after_flow_construction_result = result,
Normal => layout_data.data.flow_construction_result = result,
}
},
@@ -1060,11 +1057,11 @@ impl<'ln> NodeUtils for ThreadSafeLayoutNode<'ln> {
match &mut *layout_data_ref {
&Some(ref mut layout_data) => {
match self.get_pseudo_element_type() {
- Before | BeforeBlock => {
+ Before(_) => {
mem::replace(&mut layout_data.data.before_flow_construction_result,
NoConstructionResult)
}
- After | AfterBlock => {
+ After(_) => {
mem::replace(&mut layout_data.data.after_flow_construction_result,
NoConstructionResult)
}
diff --git a/components/layout/css/node_util.rs b/components/layout/css/node_util.rs
index dcf1019440e..b16e1af589c 100644
--- a/components/layout/css/node_util.rs
+++ b/components/layout/css/node_util.rs
@@ -5,7 +5,7 @@
use incremental::RestyleDamage;
use util::LayoutDataAccess;
use wrapper::{TLayoutNode, ThreadSafeLayoutNode};
-use wrapper::{After, AfterBlock, Before, BeforeBlock, Normal};
+use wrapper::{After, Before, Normal};
use std::mem;
use style::ComputedValues;
use sync::Arc;
@@ -26,7 +26,7 @@ impl<'ln> NodeUtil for ThreadSafeLayoutNode<'ln> {
unsafe {
let layout_data_ref = self.borrow_layout_data();
match self.get_pseudo_element_type() {
- Before | BeforeBlock => {
+ Before(_) => {
mem::transmute(layout_data_ref.as_ref()
.unwrap()
.data
@@ -34,7 +34,7 @@ impl<'ln> NodeUtil for ThreadSafeLayoutNode<'ln> {
.as_ref()
.unwrap())
}
- After | AfterBlock => {
+ After(_) => {
mem::transmute(layout_data_ref.as_ref()
.unwrap()
.data
diff --git a/components/layout/table_wrapper.rs b/components/layout/table_wrapper.rs
index 88174b8e494..f1f47531afb 100644
--- a/components/layout/table_wrapper.rs
+++ b/components/layout/table_wrapper.rs
@@ -19,7 +19,7 @@ use wrapper::ThreadSafeLayoutNode;
use servo_util::geometry::Au;
use std::cmp::max;
use std::fmt;
-use style::computed_values::{float, table_layout};
+use style::computed_values::{clear, float, table_layout};
#[deriving(Encodable)]
pub enum TableLayout {
@@ -252,6 +252,10 @@ impl Flow for TableWrapperFlow {
&mut self.block_flow
}
+ fn float_clearance(&self) -> clear::T {
+ self.block_flow.float_clearance()
+ }
+
fn float_kind(&self) -> float::T {
self.block_flow.float_kind()
}
diff --git a/components/layout/wrapper.rs b/components/layout/wrapper.rs
index eb1eedfeaa2..034b77498b8 100644
--- a/components/layout/wrapper.rs
+++ b/components/layout/wrapper.rs
@@ -465,10 +465,24 @@ fn get_content(content_list: &content::T) -> String {
#[deriving(PartialEq, Clone)]
pub enum PseudoElementType {
Normal,
- Before,
- After,
- BeforeBlock,
- AfterBlock,
+ Before(display::T),
+ After(display::T),
+}
+
+impl PseudoElementType {
+ pub fn is_before(&self) -> bool {
+ match *self {
+ Before(_) => true,
+ _ => false,
+ }
+ }
+
+ pub fn is_after(&self) -> bool {
+ match *self {
+ After(_) => true,
+ _ => false,
+ }
+ }
}
/// A thread-safe version of `LayoutNode`, used during flow construction. This type of layout
@@ -516,12 +530,18 @@ impl<'ln> TLayoutNode for ThreadSafeLayoutNode<'ln> {
}
if self.has_before_pseudo() {
- if self.is_block(Before) && self.pseudo == Normal {
- let pseudo_before_node = self.with_pseudo(BeforeBlock);
- return Some(pseudo_before_node)
- } else if self.pseudo == Normal || self.pseudo == BeforeBlock {
- let pseudo_before_node = self.with_pseudo(Before);
- return Some(pseudo_before_node)
+ // FIXME(pcwalton): This logic looks weird. Is it right?
+ match self.pseudo {
+ Normal => {
+ let pseudo_before_node = self.with_pseudo(Before(self.get_before_display()));
+ return Some(pseudo_before_node)
+ }
+ Before(display::inline) => {}
+ Before(_) => {
+ let pseudo_before_node = self.with_pseudo(Before(display::inline));
+ return Some(pseudo_before_node)
+ }
+ _ => {}
}
}
@@ -535,7 +555,7 @@ impl<'ln> TLayoutNode for ThreadSafeLayoutNode<'ln> {
let layout_data_ref = self.borrow_layout_data();
let node_layout_data_wrapper = layout_data_ref.as_ref().unwrap();
- if self.pseudo == Before || self.pseudo == BeforeBlock {
+ if self.pseudo.is_before() {
let before_style = node_layout_data_wrapper.data.before_style.as_ref().unwrap();
return get_content(&before_style.get_box().content)
} else {
@@ -574,7 +594,7 @@ impl<'ln> ThreadSafeLayoutNode<'ln> {
/// Returns the next sibling of this node. Unsafe and private because this can lead to races.
unsafe fn next_sibling(&self) -> Option<ThreadSafeLayoutNode<'ln>> {
- if self.pseudo == Before || self.pseudo == BeforeBlock {
+ if self.pseudo.is_before() {
return self.get_jsmanaged().first_child_ref().map(|node| self.new_with_this_lifetime(&node))
}
@@ -608,26 +628,25 @@ impl<'ln> ThreadSafeLayoutNode<'ln> {
self.pseudo
}
- pub fn is_block(&self, kind: PseudoElementType) -> bool {
+ pub fn get_normal_display(&self) -> display::T {
let mut layout_data_ref = self.mutate_layout_data();
let node_layout_data_wrapper = layout_data_ref.as_mut().unwrap();
+ let style = node_layout_data_wrapper.shared_data.style.as_ref().unwrap();
+ style.get_box().display
+ }
- let display = match kind {
- Before | BeforeBlock => {
- let before_style = node_layout_data_wrapper.data.before_style.as_ref().unwrap();
- before_style.get_box().display
- }
- After | AfterBlock => {
- let after_style = node_layout_data_wrapper.data.after_style.as_ref().unwrap();
- after_style.get_box().display
- }
- Normal => {
- let after_style = node_layout_data_wrapper.shared_data.style.as_ref().unwrap();
- after_style.get_box().display
- }
- };
+ pub fn get_before_display(&self) -> display::T {
+ let mut layout_data_ref = self.mutate_layout_data();
+ let node_layout_data_wrapper = layout_data_ref.as_mut().unwrap();
+ let style = node_layout_data_wrapper.data.before_style.as_ref().unwrap();
+ style.get_box().display
+ }
- display == display::block
+ pub fn get_after_display(&self) -> display::T {
+ let mut layout_data_ref = self.mutate_layout_data();
+ let node_layout_data_wrapper = layout_data_ref.as_mut().unwrap();
+ let style = node_layout_data_wrapper.data.after_style.as_ref().unwrap();
+ style.get_box().display
}
pub fn has_before_pseudo(&self) -> bool {
@@ -722,7 +741,7 @@ impl<'a> Iterator<ThreadSafeLayoutNode<'a>> for ThreadSafeLayoutNodeChildrenIter
match node {
Some(ref node) => {
- if node.pseudo == After || node.pseudo == AfterBlock {
+ if node.pseudo.is_after() {
return None
}
@@ -745,12 +764,9 @@ impl<'a> Iterator<ThreadSafeLayoutNode<'a>> for ThreadSafeLayoutNodeChildrenIter
match self.parent_node {
Some(ref parent_node) => {
if parent_node.has_after_pseudo() {
- let pseudo_after_node = if parent_node.is_block(After) && parent_node.pseudo == Normal {
- let pseudo_after_node = parent_node.with_pseudo(AfterBlock);
- Some(pseudo_after_node)
- } else if parent_node.pseudo == Normal {
- let pseudo_after_node = parent_node.with_pseudo(After);
- Some(pseudo_after_node)
+ let pseudo_after_node = if parent_node.pseudo == Normal {
+ let pseudo = After(parent_node.get_after_display());
+ Some(parent_node.with_pseudo(pseudo))
} else {
None
};
diff --git a/tests/ref/basic.list b/tests/ref/basic.list
index e55fe1d4456..8a2654dac02 100644
--- a/tests/ref/basic.list
+++ b/tests/ref/basic.list
@@ -149,3 +149,4 @@ flaky_linux == acid2_noscroll.html acid2_ref_broken.html
== margins_inside_floats_a.html margins_inside_floats_ref.html
== block_formatting_context_complex_a.html block_formatting_context_complex_ref.html
== block_formatting_context_containing_floats_a.html block_formatting_context_containing_floats_ref.html
+== clear_generated_content_table_a.html clear_generated_content_table_ref.html
diff --git a/tests/ref/clear_generated_content_table_a.html b/tests/ref/clear_generated_content_table_a.html
new file mode 100644
index 00000000000..9b5a787cad0
--- /dev/null
+++ b/tests/ref/clear_generated_content_table_a.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style>
+.clearit:after {
+ content: "";
+ clear: both;
+ display: table;
+}
+</style>
+</head>
+<body>
+<div class=clearit>
+ <div style="float: left;">x</div>
+</div>
+<div style="float: left;">y</div>
+</body>
+</html>
+
diff --git a/tests/ref/clear_generated_content_table_ref.html b/tests/ref/clear_generated_content_table_ref.html
new file mode 100644
index 00000000000..abf1ace7513
--- /dev/null
+++ b/tests/ref/clear_generated_content_table_ref.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+<body>
+<div class=clearit>
+ <div style="float: left;">x</div>
+</div>
+<div style="display: table; clear: both;"></div>
+<div style="float: left;">y</div>
+</body>
+</html>
+
+