layout: If the border style is "none", treat its width as 0.

Closes #1383.
This commit is contained in:
Patrick Walton 2013-12-11 17:46:36 -08:00
parent acb3d9f533
commit 511d2b11d4
6 changed files with 97 additions and 23 deletions

View file

@ -763,17 +763,17 @@ impl Flow for BlockFlow {
}
fn debug_str(&self) -> ~str {
if self.is_root {
~"BlockFlow(root)"
let txt = if self.is_float() {
~"FloatFlow: "
} else if self.is_root {
~"RootFlow: "
} else {
let txt = if self.is_float() { ~"FloatFlow: " } else { ~"BlockFlow: " };
txt.append(match self.box {
Some(ref rb) => {
rb.debug_str()
}
None => { ~"" }
})
}
~"BlockFlow: "
};
txt.append(match self.box {
Some(ref rb) => rb.debug_str(),
None => ~"",
})
}
}

View file

@ -281,10 +281,23 @@ impl Box {
///
/// FIXME(pcwalton): This should not be necessary. Just go to the style.
pub fn compute_borders(&self, style: &ComputedValues) {
self.border.set(SideOffsets2D::new(style.Border.border_top_width,
style.Border.border_right_width,
style.Border.border_bottom_width,
style.Border.border_left_width))
#[inline]
fn width(width: Au, style: border_style::T) -> Au {
if style == border_style::none {
Au(0)
} else {
width
}
}
self.border.set(SideOffsets2D::new(width(style.Border.border_top_width,
style.Border.border_top_style),
width(style.Border.border_right_width,
style.Border.border_right_style),
width(style.Border.border_bottom_width,
style.Border.border_bottom_style),
width(style.Border.border_left_width,
style.Border.border_left_style)))
}
/// Populates the box model padding parameters from the given computed style.
@ -983,12 +996,33 @@ impl Box {
/// Returns a debugging string describing this box.
pub fn debug_str(&self) -> ~str {
match self.specific {
GenericBox => "(GenericBox)",
ImageBox(_) => "(ImageBox)",
ScannedTextBox(_) => "(ScannedTextBox)",
UnscannedTextBox(_) => "(UnscannedTextBox)",
}.to_str()
let class_name = match self.specific {
GenericBox => "GenericBox",
ImageBox(_) => "ImageBox",
ScannedTextBox(_) => "ScannedTextBox",
UnscannedTextBox(_) => "UnscannedTextBox",
};
format!("({}{}{}{})",
class_name,
self.side_offsets_debug_string("b", self.border.get()),
self.side_offsets_debug_string("p", self.padding.get()),
self.side_offsets_debug_string("m", self.margin.get()))
}
/// A helper function to return a debug string describing the side offsets for one of the rect
/// box model properties (border, padding, or margin).
fn side_offsets_debug_string(&self, name: &str, value: SideOffsets2D<Au>) -> ~str {
let zero: SideOffsets2D<Au> = Zero::zero();
if value == zero {
return "".to_str()
}
format!(" {}{},{},{},{}",
name,
*value.top,
*value.right,
*value.bottom,
*value.left)
}
}

View file

@ -448,15 +448,15 @@ impl LayoutTask {
});
layout_root.traverse_postorder(&mut ComputeDamageTraversal.clone());
debug!("layout: constructed Flow tree");
debug!("{:?}", layout_root.dump());
// Perform the primary layout passes over the flow tree to compute the locations of all
// the boxes.
do profile(time::LayoutMainCategory, self.profiler_chan.clone()) {
self.solve_constraints(layout_root, &mut layout_ctx)
}
debug!("layout: constraint solving done:");
debug!("{:?}", layout_root.dump());
// Build the display list if necessary, and send it to the renderer.
if data.goal == ReflowForDisplay {
do profile(time::LayoutDispListBuildCategory, self.profiler_chan.clone()) {

View file

@ -15,3 +15,4 @@
== visibility_hidden.html visibility_hidden_ref.html
== root_height_a.html root_height_b.html
== png_rgba_colorspace_a.html png_rgba_colorspace_b.html
== border_style_none_a.html border_style_none_b.html

View file

@ -0,0 +1,20 @@
<!DOCTYPE html>
<html>
<head>
<style>
html {
margin: 0;
padding: 0;
background-color: blue;
}
body {
margin: 0;
padding: 0;
border-top-width: 3px;
border-top-style: none;
}
</style>
</head>
<body><img src="png_rgba_colorspace_a.png"></body>
</html>

View file

@ -0,0 +1,19 @@
<!DOCTYPE html>
<html>
<head>
<style>
html {
margin: 0;
padding: 0;
background-color: blue;
}
body {
margin: 0;
padding: 0;
border-top-width: 0px;
}
</style>
</head>
<body><img src="png_rgba_colorspace_a.png"></body>
</html>