From 8abefd7e5e3d43991ff166e5d9cfe36b13f4b1c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 13 Apr 2016 03:57:11 +0200 Subject: [PATCH 1/4] layout: Take in account max inline size for inline fragments --- components/layout/fragment.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/components/layout/fragment.rs b/components/layout/fragment.rs index 439e8a79f60..0fcb7acc2c4 100644 --- a/components/layout/fragment.rs +++ b/components/layout/fragment.rs @@ -1030,8 +1030,13 @@ impl Fragment { let flags = self.quantities_included_in_intrinsic_inline_size(); let style = self.style(); let specified = if flags.contains(INTRINSIC_INLINE_SIZE_INCLUDES_SPECIFIED) { - max(model::specified(style.min_inline_size(), Au(0)), - MaybeAuto::from_style(style.content_inline_size(), Au(0)).specified_or_zero()) + let specified = MaybeAuto::from_style(style.content_inline_size(), Au(0)).specified_or_zero(); + let min_or_specified = max(model::specified(style.min_inline_size(), Au(0)), specified); + if let Some(max) = model::specified_or_none(style.max_inline_size(), Au(0)) { + min(min_or_specified, max) + } else { + min_or_specified + } } else { Au(0) }; From 3c105082b863120701ba55714ebd46d96c582adf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 13 Apr 2016 04:14:22 +0200 Subject: [PATCH 2/4] layout: take into account max and min inline size for canvas and images --- components/layout/fragment.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/components/layout/fragment.rs b/components/layout/fragment.rs index 0fcb7acc2c4..1b02054e5c3 100644 --- a/components/layout/fragment.rs +++ b/components/layout/fragment.rs @@ -1380,7 +1380,7 @@ impl Fragment { result.union_block(&block_flow.base.intrinsic_inline_sizes) } SpecificFragmentInfo::Image(ref mut image_fragment_info) => { - let image_inline_size = match self.style.content_inline_size() { + let mut image_inline_size = match self.style.content_inline_size() { LengthOrPercentageOrAuto::Auto | LengthOrPercentageOrAuto::Percentage(_) => { image_fragment_info.image_inline_size() @@ -1388,13 +1388,19 @@ impl Fragment { LengthOrPercentageOrAuto::Length(length) => length, LengthOrPercentageOrAuto::Calc(calc) => calc.length(), }; + + image_inline_size = max(model::specified(self.style.min_inline_size(), Au(0)), image_inline_size); + if let Some(max) = model::specified_or_none(self.style.max_inline_size(), Au(0)) { + image_inline_size = min(image_inline_size, max) + } + result.union_block(&IntrinsicISizes { minimum_inline_size: image_inline_size, preferred_inline_size: image_inline_size, }); } SpecificFragmentInfo::Canvas(ref mut canvas_fragment_info) => { - let canvas_inline_size = match self.style.content_inline_size() { + let mut canvas_inline_size = match self.style.content_inline_size() { LengthOrPercentageOrAuto::Auto | LengthOrPercentageOrAuto::Percentage(_) => { canvas_fragment_info.canvas_inline_size() @@ -1402,6 +1408,12 @@ impl Fragment { LengthOrPercentageOrAuto::Length(length) => length, LengthOrPercentageOrAuto::Calc(calc) => calc.length(), }; + + canvas_inline_size = max(model::specified(self.style.min_inline_size(), Au(0)), canvas_inline_size); + if let Some(max) = model::specified_or_none(self.style.max_inline_size(), Au(0)) { + canvas_inline_size = min(canvas_inline_size, max) + } + result.union_block(&IntrinsicISizes { minimum_inline_size: canvas_inline_size, preferred_inline_size: canvas_inline_size, From 3d4aa46bcf4cecde2b5fa239b0ace5c6280b43b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 13 Apr 2016 04:41:30 +0200 Subject: [PATCH 3/4] layout: tests: Add tests for max/min inline block size And update existing expectations --- .../css21_dev/html4/max-width-110.htm.ini | 3 - tests/wpt/mozilla/meta/MANIFEST.json | 96 ++++++++++++++++++ tests/wpt/mozilla/tests/css/250x250_green.png | Bin 0 -> 628 bytes .../tests/css/max_inline_block_size.html | 21 ++++ .../css/max_inline_block_size_canvas.html | 24 +++++ .../css/max_inline_block_size_image.html | 18 ++++ .../tests/css/max_inline_block_size_ref.html | 20 ++++ 7 files changed, 179 insertions(+), 3 deletions(-) delete mode 100644 tests/wpt/metadata-css/css21_dev/html4/max-width-110.htm.ini create mode 100644 tests/wpt/mozilla/tests/css/250x250_green.png create mode 100644 tests/wpt/mozilla/tests/css/max_inline_block_size.html create mode 100644 tests/wpt/mozilla/tests/css/max_inline_block_size_canvas.html create mode 100644 tests/wpt/mozilla/tests/css/max_inline_block_size_image.html create mode 100644 tests/wpt/mozilla/tests/css/max_inline_block_size_ref.html diff --git a/tests/wpt/metadata-css/css21_dev/html4/max-width-110.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/max-width-110.htm.ini deleted file mode 100644 index bbc6b87885f..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/max-width-110.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[max-width-110.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index 25c5cd18688..df6a6e7ad41 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -3179,6 +3179,54 @@ "url": "/_mozilla/css/marker_block_direction_placement_a.html" } ], + "css/max_inline_block_size.html": [ + { + "path": "css/max_inline_block_size.html", + "references": [ + [ + "/_mozilla/css/max_inline_block_size_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/max_inline_block_size.html" + } + ], + "css/max_inline_block_size_canvas.html": [ + { + "path": "css/max_inline_block_size_canvas.html", + "references": [ + [ + "/_mozilla/css/max_inline_block_size_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/max_inline_block_size_canvas.html" + } + ], + "css/max_inline_block_size_image.html": [ + { + "path": "css/max_inline_block_size_image.html", + "references": [ + [ + "/_mozilla/css/max_inline_block_size_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/max_inline_block_size_image.html" + } + ], + "css/max_inline_block_size_ref.html": [ + { + "path": "css/max_inline_block_size_ref.html", + "references": [ + [ + "/_mozilla/css/max_inline_block_size_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/max_inline_block_size_ref.html" + } + ], "css/max_width_float_simple_a.html": [ { "path": "css/max_width_float_simple_a.html", @@ -9709,6 +9757,54 @@ "url": "/_mozilla/css/marker_block_direction_placement_a.html" } ], + "css/max_inline_block_size.html": [ + { + "path": "css/max_inline_block_size.html", + "references": [ + [ + "/_mozilla/css/max_inline_block_size_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/max_inline_block_size.html" + } + ], + "css/max_inline_block_size_canvas.html": [ + { + "path": "css/max_inline_block_size_canvas.html", + "references": [ + [ + "/_mozilla/css/max_inline_block_size_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/max_inline_block_size_canvas.html" + } + ], + "css/max_inline_block_size_image.html": [ + { + "path": "css/max_inline_block_size_image.html", + "references": [ + [ + "/_mozilla/css/max_inline_block_size_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/max_inline_block_size_image.html" + } + ], + "css/max_inline_block_size_ref.html": [ + { + "path": "css/max_inline_block_size_ref.html", + "references": [ + [ + "/_mozilla/css/max_inline_block_size_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/max_inline_block_size_ref.html" + } + ], "css/max_width_float_simple_a.html": [ { "path": "css/max_width_float_simple_a.html", diff --git a/tests/wpt/mozilla/tests/css/250x250_green.png b/tests/wpt/mozilla/tests/css/250x250_green.png new file mode 100644 index 0000000000000000000000000000000000000000..586ef3d69d6b868dc4adc83f4e0a1f15e477d9b6 GIT binary patch literal 628 zcmeAS@N?(olHy`uVBq!ia0vp^zd)FS2}rW{oy`JLoCO|{#S9GG!XV7ZFl&wkNUp@w z*OmPN3onzZfcCE2mw-aDnIRD+&iT2ysd*(pE(3#eQEFmIYKlU6W=V#EyQgnJie4%^ z0|VnLPZ!6Kid%0lG4e7na2(#yTz~!na}?)kE#Znqst4XBly9)UA^V1}jD2_W-Gg8* z5)&@75nT~brVpwft_Y+Z#U!{4McR`wop?hQ?pnAVxNIj{JBms0P@zcsabm;w;5%%# e6RjN-zIl=FTA4oEg);epl7pwKpUXO@geCxbQzR1r literal 0 HcmV?d00001 diff --git a/tests/wpt/mozilla/tests/css/max_inline_block_size.html b/tests/wpt/mozilla/tests/css/max_inline_block_size.html new file mode 100644 index 00000000000..f0f23893143 --- /dev/null +++ b/tests/wpt/mozilla/tests/css/max_inline_block_size.html @@ -0,0 +1,21 @@ + + +Max inline-block size inside another inline-block element + + +
diff --git a/tests/wpt/mozilla/tests/css/max_inline_block_size_canvas.html b/tests/wpt/mozilla/tests/css/max_inline_block_size_canvas.html new file mode 100644 index 00000000000..48cd896a2b7 --- /dev/null +++ b/tests/wpt/mozilla/tests/css/max_inline_block_size_canvas.html @@ -0,0 +1,24 @@ + + +Max inline-block size inside another inline-block element + + +
+ diff --git a/tests/wpt/mozilla/tests/css/max_inline_block_size_image.html b/tests/wpt/mozilla/tests/css/max_inline_block_size_image.html new file mode 100644 index 00000000000..283bbd43256 --- /dev/null +++ b/tests/wpt/mozilla/tests/css/max_inline_block_size_image.html @@ -0,0 +1,18 @@ + + +Max inline-block size inside another inline-block element + + +
diff --git a/tests/wpt/mozilla/tests/css/max_inline_block_size_ref.html b/tests/wpt/mozilla/tests/css/max_inline_block_size_ref.html new file mode 100644 index 00000000000..7fa1370faf7 --- /dev/null +++ b/tests/wpt/mozilla/tests/css/max_inline_block_size_ref.html @@ -0,0 +1,20 @@ + + +Max inline-block size inside another inline-block element + + +
From 7712affd2c4c8b06c3b0df2b48bd448acd0e251b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Wed, 13 Apr 2016 04:45:41 +0200 Subject: [PATCH 4/4] layout: Minimal refactor in style_specified_intrinsic_inline_size to improve legibility. --- components/layout/fragment.rs | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/components/layout/fragment.rs b/components/layout/fragment.rs index 1b02054e5c3..03638be5fab 100644 --- a/components/layout/fragment.rs +++ b/components/layout/fragment.rs @@ -1029,17 +1029,15 @@ impl Fragment { fn style_specified_intrinsic_inline_size(&self) -> IntrinsicISizesContribution { let flags = self.quantities_included_in_intrinsic_inline_size(); let style = self.style(); - let specified = if flags.contains(INTRINSIC_INLINE_SIZE_INCLUDES_SPECIFIED) { - let specified = MaybeAuto::from_style(style.content_inline_size(), Au(0)).specified_or_zero(); - let min_or_specified = max(model::specified(style.min_inline_size(), Au(0)), specified); + let mut specified = Au(0); + + if flags.contains(INTRINSIC_INLINE_SIZE_INCLUDES_SPECIFIED) { + specified = MaybeAuto::from_style(style.content_inline_size(), Au(0)).specified_or_zero(); + specified = max(model::specified(style.min_inline_size(), Au(0)), specified); if let Some(max) = model::specified_or_none(style.max_inline_size(), Au(0)) { - min(min_or_specified, max) - } else { - min_or_specified + specified = min(specified, max) } - } else { - Au(0) - }; + } // FIXME(#2261, pcwalton): This won't work well for inlines: is this OK? let surrounding_inline_size = self.surrounding_intrinsic_inline_size();