aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout
diff options
context:
space:
mode:
authorbors-servo <metajack+bors@gmail.com>2015-05-04 13:37:24 -0500
committerbors-servo <metajack+bors@gmail.com>2015-05-04 13:37:24 -0500
commit7b87085c1880c60aa3be5b3ec4572a0d93fd5537 (patch)
treeca5da0b5d6e59d24357a94999206d07ca3fedc0c /components/layout
parent89f90d930d172366d72fdd9f3363c80a5a56f552 (diff)
parent33087497ac7fc012830a237323391d13f4bb221e (diff)
downloadservo-7b87085c1880c60aa3be5b3ec4572a0d93fd5537.tar.gz
servo-7b87085c1880c60aa3be5b3ec4572a0d93fd5537.zip
Auto merge of #5919 - pcwalton:inline-block-intrinsic-widths, r=mbrubeck
* Stop double-counting border and padding for inline-block fragments. (Test case: `inline_block_border_intrinsic_size_a.html`.) * Take clearance into account when determining intrinsic widths of blocks containing floats. Improves the Amazon headers. r? @mbrubeck <!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/5919) <!-- Reviewable:end -->
Diffstat (limited to 'components/layout')
-rw-r--r--components/layout/block.rs19
-rw-r--r--components/layout/construct.rs2
-rw-r--r--components/layout/fragment.rs6
3 files changed, 19 insertions, 8 deletions
diff --git a/components/layout/block.rs b/components/layout/block.rs
index e61ad3104c8..b01a31804b2 100644
--- a/components/layout/block.rs
+++ b/components/layout/block.rs
@@ -1465,8 +1465,8 @@ impl Flow for BlockFlow {
// Find the maximum inline-size from children.
let mut computation = self.fragment.compute_intrinsic_inline_sizes();
- let mut left_float_width = Au(0);
- let mut right_float_width = Au(0);
+ let (mut left_float_width, mut right_float_width) = (Au(0), Au(0));
+ let (mut left_float_width_accumulator, mut right_float_width_accumulator) = (Au(0), Au(0));
for kid in self.base.child_iter() {
let is_absolutely_positioned =
flow::base(kid).flags.contains(IS_ABSOLUTELY_POSITIONED);
@@ -1477,6 +1477,15 @@ impl Flow for BlockFlow {
max(computation.content_intrinsic_sizes.minimum_inline_size,
child_base.intrinsic_inline_sizes.minimum_inline_size);
+ if child_base.flags.contains(CLEARS_LEFT) {
+ left_float_width = Au::max(left_float_width, left_float_width_accumulator);
+ left_float_width_accumulator = Au(0)
+ }
+ if child_base.flags.contains(CLEARS_RIGHT) {
+ right_float_width = Au::max(right_float_width, right_float_width_accumulator);
+ right_float_width_accumulator = Au(0)
+ }
+
match float_kind {
float::T::none => {
computation.content_intrinsic_sizes.preferred_inline_size =
@@ -1484,11 +1493,11 @@ impl Flow for BlockFlow {
child_base.intrinsic_inline_sizes.preferred_inline_size);
}
float::T::left => {
- left_float_width = left_float_width +
+ left_float_width_accumulator = left_float_width_accumulator +
child_base.intrinsic_inline_sizes.preferred_inline_size;
}
float::T::right => {
- right_float_width = right_float_width +
+ right_float_width_accumulator = right_float_width_accumulator +
child_base.intrinsic_inline_sizes.preferred_inline_size;
}
}
@@ -1500,6 +1509,8 @@ impl Flow for BlockFlow {
// FIXME(pcwalton): This should consider all float descendants, not just children.
// FIXME(pcwalton): This is not well-spec'd; INTRINSIC specifies to do this, but CSS-SIZING
// says not to. In practice, Gecko and WebKit both do this.
+ left_float_width = Au::max(left_float_width, left_float_width_accumulator);
+ right_float_width = Au::max(right_float_width, right_float_width_accumulator);
computation.content_intrinsic_sizes.preferred_inline_size =
max(computation.content_intrinsic_sizes.preferred_inline_size,
left_float_width + right_float_width);
diff --git a/components/layout/construct.rs b/components/layout/construct.rs
index c72de1d122a..c0480e8562c 100644
--- a/components/layout/construct.rs
+++ b/components/layout/construct.rs
@@ -822,7 +822,7 @@ impl<'a> FlowConstructor<'a> {
block_flow));
let fragment = Fragment::new(node, fragment_info);
- let mut fragment_accumulator = InlineFragmentsAccumulator::from_inline_node(node);
+ let mut fragment_accumulator = InlineFragmentsAccumulator::new();
fragment_accumulator.fragments.push_back(fragment);
let construction_item =
diff --git a/components/layout/fragment.rs b/components/layout/fragment.rs
index 8b60b4cfc72..7ad0e8895ad 100644
--- a/components/layout/fragment.rs
+++ b/components/layout/fragment.rs
@@ -882,8 +882,7 @@ impl Fragment {
SpecificFragmentInfo::Generic |
SpecificFragmentInfo::GeneratedContent(_) |
SpecificFragmentInfo::Iframe(_) |
- SpecificFragmentInfo::Image(_) |
- SpecificFragmentInfo::InlineBlock(_) => {
+ SpecificFragmentInfo::Image(_) => {
QuantitiesIncludedInIntrinsicInlineSizes::all()
}
SpecificFragmentInfo::Table | SpecificFragmentInfo::TableCell => {
@@ -918,7 +917,8 @@ impl Fragment {
SpecificFragmentInfo::ScannedText(_) |
SpecificFragmentInfo::TableColumn(_) |
SpecificFragmentInfo::UnscannedText(_) |
- SpecificFragmentInfo::InlineAbsoluteHypothetical(_) => {
+ SpecificFragmentInfo::InlineAbsoluteHypothetical(_) |
+ SpecificFragmentInfo::InlineBlock(_) => {
QuantitiesIncludedInIntrinsicInlineSizes::empty()
}
}