Fix explicit height edge case with absolute / relative nested divs.

Needed for #6643.
This commit is contained in:
Glenn Watson 2015-08-11 11:07:18 +10:00
parent 41166fdb5b
commit e83091d918
4 changed files with 75 additions and 7 deletions

View file

@ -1104,7 +1104,8 @@ impl BlockFlow {
let screen_size = LogicalSize::from_physical(self.fragment.style.writing_mode,
layout_context.shared.screen_size);
Some(screen_size.block)
} else if self.base.flags.contains(IS_ABSOLUTELY_POSITIONED) {
} else if self.base.flags.contains(IS_ABSOLUTELY_POSITIONED) &&
self.base.block_container_explicit_block_size.is_none() {
self.base.absolute_cb.explicit_block_containing_size(layout_context)
} else {
self.base.block_container_explicit_block_size
@ -1329,12 +1330,7 @@ impl BlockFlow {
let mut iterator = self.base.child_iter().enumerate().peekable();
while let Some((i, kid)) = iterator.next() {
{
let kid_base = flow::mut_base(kid);
if !kid_base.flags.contains(IS_ABSOLUTELY_POSITIONED) {
kid_base.block_container_explicit_block_size = explicit_content_size;
}
}
flow::mut_base(kid).block_container_explicit_block_size = explicit_content_size;
// Determine float impaction, and update the inline size speculations if necessary.
if flow::base(kid).flags.contains(CLEARS_LEFT) {

View file

@ -0,0 +1,51 @@
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
* {
margin: 0;
}
html, body {
position: relative;
height: 100%;
}
#div0 {
position: absolute;
height: 100%;
width: 100%;
}
#div1 {
position: relative;
height: 100px;
}
#div2 {
position: absolute;
width: 100%;
height: 100%;
}
#div3 {
position: relative;
width: 100%;
height: 100%;
}
#div4 {
position: absolute;
width: 100%;
height: 100%;
background-color: green;
}
</style>
</head>
<body>
<div id="div0">
<div id="div1">
<div id="div2">
<div id="div3">
<div id="div4">
</div>
</div>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,20 @@
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
* {
margin: 0;
}
#div0 {
position: absolute;
height: 100px;
width: 100%;
background-color: green;
}
</style>
</head>
<body>
<div id="div0">
</div>
</body>
</html>

View file

@ -9,6 +9,7 @@
# Should be == with expected failure:
fragment=top != ../html/acid2.html acid2_ref.html
== abs_rel_explicit_height.html abs_rel_explicit_height_ref.html
== absolute_inline_containing_block_a.html absolute_inline_containing_block_ref.html
== acid1_a.html acid1_b.html
== acid2_noscroll.html acid2_ref_broken.html