aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJosh Matthews <josh@joshmatthews.net>2014-09-05 10:05:14 -0400
committerJosh Matthews <josh@joshmatthews.net>2014-09-05 10:05:14 -0400
commit64a9075535cbb70eb7b349d2226948747e2f7940 (patch)
tree96ffc3f8dffa28914a2429463941f897c578b7e8 /src
parentdfe4a707d4f53dc0ddad9e56f9c33c33c23d42ee (diff)
parent4cb9f32427acfed274d7d709ebc2d46f46326e59 (diff)
downloadservo-64a9075535cbb70eb7b349d2226948747e2f7940.tar.gz
servo-64a9075535cbb70eb7b349d2226948747e2f7940.zip
Merge pull request #3217 from glennw/layout-fixes
Fix inline size bubbling with fixed width block. Improve intrinsic inline size calculation for text fragments.
Diffstat (limited to 'src')
-rw-r--r--src/components/layout/block.rs23
-rw-r--r--src/components/layout/fragment.rs8
-rw-r--r--src/test/ref/basic.list3
-rw-r--r--src/test/ref/fixed_width_overrides_child_intrinsic_width_a.html33
-rw-r--r--src/test/ref/fixed_width_overrides_child_intrinsic_width_ref.html23
-rw-r--r--src/test/ref/float_intrinsic_width_a.html26
-rw-r--r--src/test/ref/float_intrinsic_width_ref.html25
-rw-r--r--src/test/ref/float_right_intrinsic_width_a.html25
-rw-r--r--src/test/ref/float_right_intrinsic_width_ref.html25
9 files changed, 180 insertions, 11 deletions
diff --git a/src/components/layout/block.rs b/src/components/layout/block.rs
index 5b433e44636..d5da5029dc6 100644
--- a/src/components/layout/block.rs
+++ b/src/components/layout/block.rs
@@ -1450,6 +1450,14 @@ impl Flow for BlockFlow {
flags.set_has_left_floated_descendants(false);
flags.set_has_right_floated_descendants(false);
+ // If this block has a fixed width, just use that for the minimum
+ // and preferred width, rather than bubbling up children inline
+ // width.
+ let fixed_width = match self.fragment.style().get_box().width {
+ LPA_Length(_) => true,
+ _ => false,
+ };
+
// Find the maximum inline-size from children.
let mut intrinsic_inline_sizes = IntrinsicISizes::new();
for child_ctx in self.base.child_iter() {
@@ -1458,12 +1466,15 @@ impl Flow for BlockFlow {
child_ctx.is_table_kind());
let child_base = flow::mut_base(child_ctx);
- intrinsic_inline_sizes.minimum_inline_size =
- geometry::max(intrinsic_inline_sizes.minimum_inline_size,
- child_base.intrinsic_inline_sizes.total_minimum_inline_size());
- intrinsic_inline_sizes.preferred_inline_size =
- geometry::max(intrinsic_inline_sizes.preferred_inline_size,
- child_base.intrinsic_inline_sizes.total_preferred_inline_size());
+
+ if !fixed_width {
+ intrinsic_inline_sizes.minimum_inline_size =
+ geometry::max(intrinsic_inline_sizes.minimum_inline_size,
+ child_base.intrinsic_inline_sizes.total_minimum_inline_size());
+ intrinsic_inline_sizes.preferred_inline_size =
+ geometry::max(intrinsic_inline_sizes.preferred_inline_size,
+ child_base.intrinsic_inline_sizes.total_preferred_inline_size());
+ }
flags.union_floated_descendants_flags(child_base.flags);
}
diff --git a/src/components/layout/fragment.rs b/src/components/layout/fragment.rs
index 876ca785107..09c76d05985 100644
--- a/src/components/layout/fragment.rs
+++ b/src/components/layout/fragment.rs
@@ -1105,11 +1105,9 @@ impl Fragment {
let range = &text_fragment_info.range;
let min_line_inline_size = text_fragment_info.run.min_width_for_range(range);
- let mut max_line_inline_size = Au::new(0);
- for line_range in text_fragment_info.run.iter_natural_lines_for_range(range) {
- let line_metrics = text_fragment_info.run.metrics_for_range(&line_range);
- max_line_inline_size = Au::max(max_line_inline_size, line_metrics.advance_width);
- }
+ // See http://dev.w3.org/csswg/css-sizing/#max-content-inline-size.
+ // TODO: Account for soft wrap opportunities.
+ let max_line_inline_size = text_fragment_info.run.metrics_for_range(range).advance_width;
result.minimum_inline_size = geometry::max(result.minimum_inline_size, min_line_inline_size);
result.preferred_inline_size = geometry::max(result.preferred_inline_size, max_line_inline_size);
diff --git a/src/test/ref/basic.list b/src/test/ref/basic.list
index 5cfa5619254..0ffafba5dca 100644
--- a/src/test/ref/basic.list
+++ b/src/test/ref/basic.list
@@ -107,3 +107,6 @@ flaky_gpu,flaky_linux == acid2_noscroll.html acid2_ref_broken.html
!= inline_background_a.html inline_background_ref.html
== inline_element_border_a.html inline_element_border_ref.html
+== float_intrinsic_width_a.html float_intrinsic_width_ref.html
+== float_right_intrinsic_width_a.html float_right_intrinsic_width_ref.html
+== fixed_width_overrides_child_intrinsic_width_a.html fixed_width_overrides_child_intrinsic_width_ref.html
diff --git a/src/test/ref/fixed_width_overrides_child_intrinsic_width_a.html b/src/test/ref/fixed_width_overrides_child_intrinsic_width_a.html
new file mode 100644
index 00000000000..9d7a94cbbf8
--- /dev/null
+++ b/src/test/ref/fixed_width_overrides_child_intrinsic_width_a.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <style type="text/css">
+ @font-face {
+ font-family: 'ahem';
+ src: url('fonts/ahem/ahem.ttf');
+ }
+ body {
+ font-family: 'ahem';
+ font-size: 100px;
+ margin: 0;
+ line-height: 1;
+ }
+ .fr {
+ float: right;
+ }
+ .green {
+ color: green;
+ }
+ .fixed {
+ width: 100px;
+ }
+ </style>
+ </head>
+ <body>
+ <div class="fr">
+ <div class="fixed">
+ <span class="green">X X</span>
+ </div>
+ </div>
+ </body>
+</html>
diff --git a/src/test/ref/fixed_width_overrides_child_intrinsic_width_ref.html b/src/test/ref/fixed_width_overrides_child_intrinsic_width_ref.html
new file mode 100644
index 00000000000..439e8a049fc
--- /dev/null
+++ b/src/test/ref/fixed_width_overrides_child_intrinsic_width_ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <style type="text/css">
+ .fr {
+ float: right;
+ }
+ .green {
+ background-color: green;
+ }
+ .fixed {
+ width: 100px;
+ height: 200px;
+ }
+ body {
+ margin: 0;
+ }
+ </style>
+ </head>
+ <body>
+ <div class="fr green fixed"></div>
+ </body>
+</html>
diff --git a/src/test/ref/float_intrinsic_width_a.html b/src/test/ref/float_intrinsic_width_a.html
new file mode 100644
index 00000000000..cd1f4da319e
--- /dev/null
+++ b/src/test/ref/float_intrinsic_width_a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <style type="text/css">
+ @font-face {
+ font-family: 'ahem';
+ src: url('fonts/ahem/ahem.ttf');
+ }
+ body {
+ font-family: 'ahem';
+ font-size: 100px;
+ margin: 0;
+ line-height: 1;
+ }
+ .fl {
+ float: left;
+ }
+ .green {
+ color: green;
+ }
+ </style>
+ </head>
+ <body>
+ <div class="fl green">X X</div>
+ </body>
+</html>
diff --git a/src/test/ref/float_intrinsic_width_ref.html b/src/test/ref/float_intrinsic_width_ref.html
new file mode 100644
index 00000000000..3e3865ab362
--- /dev/null
+++ b/src/test/ref/float_intrinsic_width_ref.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <style type="text/css">
+ .fl {
+ float: left;
+ }
+ .green {
+ background-color: green;
+ }
+ .fixed {
+ width: 100px;
+ height: 100px;
+ }
+ body {
+ margin: 0;
+ }
+ </style>
+ </head>
+ <body>
+ <div class="fl green fixed"></div>
+ <div class="fl fixed"></div>
+ <div class="fl green fixed"></div>
+ </body>
+</html>
diff --git a/src/test/ref/float_right_intrinsic_width_a.html b/src/test/ref/float_right_intrinsic_width_a.html
new file mode 100644
index 00000000000..5e503e34227
--- /dev/null
+++ b/src/test/ref/float_right_intrinsic_width_a.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <style type="text/css">
+ @font-face {
+ font-family: 'ahem';
+ src: url(fonts/ahem/ahem.ttf);
+ }
+ .fr {
+ float: right;
+ }
+ .green {
+ color: green;
+ }
+ body {
+ font-family: 'ahem';
+ font-size: 100px;
+ margin: 0;
+ }
+ </style>
+ </head>
+ <body>
+ <div class="fr green">X X</div>
+ </body>
+</html>
diff --git a/src/test/ref/float_right_intrinsic_width_ref.html b/src/test/ref/float_right_intrinsic_width_ref.html
new file mode 100644
index 00000000000..841fd0ca477
--- /dev/null
+++ b/src/test/ref/float_right_intrinsic_width_ref.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <style type="text/css">
+ .fr {
+ float: right;
+ }
+ .green {
+ background-color: green;
+ }
+ .fixed {
+ width: 100px;
+ height: 100px;
+ }
+ body {
+ margin: 0;
+ }
+ </style>
+ </head>
+ <body>
+ <div class="fr green fixed"></div>
+ <div class="fr fixed"></div>
+ <div class="fr green fixed"></div>
+ </body>
+</html>