Auto merge of #5641 - pcwalton:absolute-auto-height, r=mbrubeck

Improves "Edit links" on the Wikipedia sidebar.

r? @mbrubeck
This commit is contained in:
bors-servo 2015-04-10 17:44:01 -05:00
commit 10c68e7519
4 changed files with 186 additions and 84 deletions

View file

@ -97,7 +97,11 @@ struct BSizeConstraintSolution {
} }
impl BSizeConstraintSolution { impl BSizeConstraintSolution {
fn new(block_start: Au, block_end: Au, block_size: Au, margin_block_start: Au, margin_block_end: Au) fn new(block_start: Au,
block_end: Au,
block_size: Au,
margin_block_start: Au,
margin_block_end: Au)
-> BSizeConstraintSolution { -> BSizeConstraintSolution {
BSizeConstraintSolution { BSizeConstraintSolution {
block_start: block_start, block_start: block_start,
@ -131,7 +135,8 @@ impl BSizeConstraintSolution {
// first box of the element. // first box of the element.
let static_position_block_start = static_b_offset; let static_position_block_start = static_b_offset;
let (block_start, block_end, block_size, margin_block_start, margin_block_end) = match (block_start, block_end, block_size) { let (block_start, block_end, block_size, margin_block_start, margin_block_end) =
match (block_start, block_end, block_size) {
(MaybeAuto::Auto, MaybeAuto::Auto, MaybeAuto::Auto) => { (MaybeAuto::Auto, MaybeAuto::Auto, MaybeAuto::Auto) => {
let margin_block_start = block_start_margin.specified_or_zero(); let margin_block_start = block_start_margin.specified_or_zero();
let margin_block_end = block_end_margin.specified_or_zero(); let margin_block_end = block_end_margin.specified_or_zero();
@ -141,28 +146,49 @@ impl BSizeConstraintSolution {
let block_size = content_block_size; let block_size = content_block_size;
let sum = block_start + block_size + margin_block_start + margin_block_end; let sum = block_start + block_size + margin_block_start + margin_block_end;
(block_start, available_block_size - sum, block_size, margin_block_start, margin_block_end) (block_start,
available_block_size - sum,
block_size,
margin_block_start,
margin_block_end)
} }
(MaybeAuto::Specified(block_start), MaybeAuto::Specified(block_end), MaybeAuto::Specified(block_size)) => { (MaybeAuto::Specified(block_start),
MaybeAuto::Specified(block_end),
MaybeAuto::Specified(block_size)) => {
match (block_start_margin, block_end_margin) { match (block_start_margin, block_end_margin) {
(MaybeAuto::Auto, MaybeAuto::Auto) => { (MaybeAuto::Auto, MaybeAuto::Auto) => {
let total_margin_val = available_block_size - block_start - block_end - block_size; let total_margin_val =
available_block_size - block_start - block_end - block_size;
(block_start, block_end, block_size, (block_start, block_end, block_size,
total_margin_val.scale_by(0.5), total_margin_val.scale_by(0.5),
total_margin_val.scale_by(0.5)) total_margin_val.scale_by(0.5))
} }
(MaybeAuto::Specified(margin_block_start), MaybeAuto::Auto) => { (MaybeAuto::Specified(margin_block_start), MaybeAuto::Auto) => {
let sum = block_start + block_end + block_size + margin_block_start; let sum = block_start + block_end + block_size + margin_block_start;
(block_start, block_end, block_size, margin_block_start, available_block_size - sum) (block_start,
block_end,
block_size,
margin_block_start,
available_block_size - sum)
} }
(MaybeAuto::Auto, MaybeAuto::Specified(margin_block_end)) => { (MaybeAuto::Auto, MaybeAuto::Specified(margin_block_end)) => {
let sum = block_start + block_end + block_size + margin_block_end; let sum = block_start + block_end + block_size + margin_block_end;
(block_start, block_end, block_size, available_block_size - sum, margin_block_end) (block_start,
block_end,
block_size,
available_block_size - sum,
margin_block_end)
} }
(MaybeAuto::Specified(margin_block_start), MaybeAuto::Specified(margin_block_end)) => { (MaybeAuto::Specified(margin_block_start),
MaybeAuto::Specified(margin_block_end)) => {
// Values are over-constrained. Ignore value for 'block-end'. // Values are over-constrained. Ignore value for 'block-end'.
let sum = block_start + block_size + margin_block_start + margin_block_end; let sum = block_start + block_size + margin_block_start +
(block_start, available_block_size - sum, block_size, margin_block_start, margin_block_end) margin_block_end;
(block_start,
available_block_size - sum,
block_size,
margin_block_start,
margin_block_end)
} }
} }
} }
@ -170,23 +196,41 @@ impl BSizeConstraintSolution {
// For the rest of the cases, auto values for margin are set to 0 // For the rest of the cases, auto values for margin are set to 0
// If only one is Auto, solve for it // If only one is Auto, solve for it
(MaybeAuto::Auto, MaybeAuto::Specified(block_end), MaybeAuto::Specified(block_size)) => { (MaybeAuto::Auto,
MaybeAuto::Specified(block_end),
MaybeAuto::Specified(block_size)) => {
let margin_block_start = block_start_margin.specified_or_zero(); let margin_block_start = block_start_margin.specified_or_zero();
let margin_block_end = block_end_margin.specified_or_zero(); let margin_block_end = block_end_margin.specified_or_zero();
let sum = block_end + block_size + margin_block_start + margin_block_end; let sum = block_end + block_size + margin_block_start + margin_block_end;
(available_block_size - sum, block_end, block_size, margin_block_start, margin_block_end) (available_block_size - sum,
block_end,
block_size,
margin_block_start,
margin_block_end)
} }
(MaybeAuto::Specified(block_start), MaybeAuto::Auto, MaybeAuto::Specified(block_size)) => { (MaybeAuto::Specified(block_start),
MaybeAuto::Auto,
MaybeAuto::Specified(block_size)) => {
let margin_block_start = block_start_margin.specified_or_zero(); let margin_block_start = block_start_margin.specified_or_zero();
let margin_block_end = block_end_margin.specified_or_zero(); let margin_block_end = block_end_margin.specified_or_zero();
let sum = block_start + block_size + margin_block_start + margin_block_end; let sum = block_start + block_size + margin_block_start + margin_block_end;
(block_start, available_block_size - sum, block_size, margin_block_start, margin_block_end) (block_start,
available_block_size - sum,
block_size,
margin_block_start,
margin_block_end)
} }
(MaybeAuto::Specified(block_start), MaybeAuto::Specified(block_end), MaybeAuto::Auto) => { (MaybeAuto::Specified(block_start),
MaybeAuto::Specified(block_end),
MaybeAuto::Auto) => {
let margin_block_start = block_start_margin.specified_or_zero(); let margin_block_start = block_start_margin.specified_or_zero();
let margin_block_end = block_end_margin.specified_or_zero(); let margin_block_end = block_end_margin.specified_or_zero();
let sum = block_start + block_end + margin_block_start + margin_block_end; let sum = block_start + block_end + margin_block_start + margin_block_end;
(block_start, block_end, available_block_size - sum, margin_block_start, margin_block_end) (block_start,
block_end,
available_block_size - sum,
margin_block_start,
margin_block_end)
} }
// If block-size is auto, then block-size is content block-size. Solve for the // If block-size is auto, then block-size is content block-size. Solve for the
@ -196,14 +240,22 @@ impl BSizeConstraintSolution {
let margin_block_end = block_end_margin.specified_or_zero(); let margin_block_end = block_end_margin.specified_or_zero();
let block_size = content_block_size; let block_size = content_block_size;
let sum = block_start + block_size + margin_block_start + margin_block_end; let sum = block_start + block_size + margin_block_start + margin_block_end;
(block_start, available_block_size - sum, block_size, margin_block_start, margin_block_end) (block_start,
available_block_size - sum,
block_size,
margin_block_start,
margin_block_end)
} }
(MaybeAuto::Auto, MaybeAuto::Specified(block_end), MaybeAuto::Auto) => { (MaybeAuto::Auto, MaybeAuto::Specified(block_end), MaybeAuto::Auto) => {
let margin_block_start = block_start_margin.specified_or_zero(); let margin_block_start = block_start_margin.specified_or_zero();
let margin_block_end = block_end_margin.specified_or_zero(); let margin_block_end = block_end_margin.specified_or_zero();
let block_size = content_block_size; let block_size = content_block_size;
let sum = block_end + block_size + margin_block_start + margin_block_end; let sum = block_end + block_size + margin_block_start + margin_block_end;
(available_block_size - sum, block_end, block_size, margin_block_start, margin_block_end) (available_block_size - sum,
block_end,
block_size,
margin_block_start,
margin_block_end)
} }
(MaybeAuto::Auto, MaybeAuto::Auto, MaybeAuto::Specified(block_size)) => { (MaybeAuto::Auto, MaybeAuto::Auto, MaybeAuto::Specified(block_size)) => {
@ -211,10 +263,19 @@ impl BSizeConstraintSolution {
let margin_block_end = block_end_margin.specified_or_zero(); let margin_block_end = block_end_margin.specified_or_zero();
let block_start = static_position_block_start; let block_start = static_position_block_start;
let sum = block_start + block_size + margin_block_start + margin_block_end; let sum = block_start + block_size + margin_block_start + margin_block_end;
(block_start, available_block_size - sum, block_size, margin_block_start, margin_block_end) (block_start,
available_block_size - sum,
block_size,
margin_block_start,
margin_block_end)
} }
}; };
BSizeConstraintSolution::new(block_start, block_end, block_size, margin_block_start, margin_block_end)
BSizeConstraintSolution::new(block_start,
block_end,
block_size,
margin_block_start,
margin_block_end)
} }
/// Solve the vertical constraint equation for absolute replaced elements. /// Solve the vertical constraint equation for absolute replaced elements.
@ -447,8 +508,8 @@ impl<'a> PreorderFlowTraversal for AbsoluteAssignBSizesTraversal<'a> {
return return
} }
let AbsoluteAssignBSizesTraversal(ref ctx) = *self; let AbsoluteAssignBSizesTraversal(ref layout_context) = *self;
block_flow.calculate_absolute_block_size_and_margins(*ctx); block_flow.calculate_absolute_block_size_and_margins(*layout_context);
} }
} }
@ -1112,7 +1173,7 @@ impl BlockFlow {
let static_b_offset = self.static_b_offset; let static_b_offset = self.static_b_offset;
// This is the stored content block-size value from assign-block-size // This is the stored content block-size value from assign-block-size
let content_block_size = self.fragment.content_box().size.block; let content_block_size = self.fragment.border_box.size.block;
let mut solution = None; let mut solution = None;
{ {
@ -1166,9 +1227,8 @@ impl BlockFlow {
loop { loop {
match candidate_block_size_iterator.next() { match candidate_block_size_iterator.next() {
Some(block_size_used_val) => { Some(block_size_used_val) => {
solution = solution = Some(
Some(BSizeConstraintSolution:: BSizeConstraintSolution::solve_vertical_constraints_abs_nonreplaced(
solve_vertical_constraints_abs_nonreplaced(
block_size_used_val, block_size_used_val,
margin_block_start, margin_block_start,
margin_block_end, margin_block_end,

View file

@ -0,0 +1,20 @@
<!DOCTYPE html>
<html>
<head>
<style>
section {
position: absolute;
background: peachpuff;
top: 0;
left: 0;
padding: 3em 0 0;
width: 10em;
height: auto;
}
</style>
</head>
<body>
<section>XXXXX</section>
</body>
</html>

View file

@ -0,0 +1,21 @@
<!DOCTYPE html>
<html>
<head>
<style>
html, body {
margin: 0;
padding: 0;
}
section {
background: peachpuff;
padding: 3em 0 0;
width: 10em;
height: auto;
}
</style>
</head>
<body>
<section>XXXXX</section>
</body>
</html>

View file

@ -39,6 +39,7 @@ fragment=top != ../html/acid2.html acid2_ref.html
== 2dcontext/transform_a.html 2dcontext/transform_ref.html == 2dcontext/transform_a.html 2dcontext/transform_ref.html
== abs_float_pref_width_a.html abs_float_pref_width_ref.html == abs_float_pref_width_a.html abs_float_pref_width_ref.html
== absolute_content_height_a.html absolute_content_height_ref.html
== acid1_a.html acid1_b.html == acid1_a.html acid1_b.html
== acid2_noscroll.html acid2_ref_broken.html == acid2_noscroll.html acid2_ref_broken.html
== after_block_iteration.html after_block_iteration_ref.html == after_block_iteration.html after_block_iteration_ref.html