From fba0a8164dbbcd39011542f1d46ae08a169a3803 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Wed, 5 Aug 2015 12:27:17 -0700 Subject: [PATCH] layout: Take inline margins into account when determining the intrinsic sizes of fragments. Avoids a needless wrapped line in the repository name on GitHub. --- components/layout/fragment.rs | 4 +++- components/layout/model.rs | 15 +++++++++++++++ tests/ref/basic.list | 1 + tests/ref/inline_margins_intrinsic_size_a.html | 15 +++++++++++++++ tests/ref/inline_margins_intrinsic_size_ref.html | 15 +++++++++++++++ 5 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 tests/ref/inline_margins_intrinsic_size_a.html create mode 100644 tests/ref/inline_margins_intrinsic_size_ref.html diff --git a/components/layout/fragment.rs b/components/layout/fragment.rs index c7b29d6212a..68d1feea84b 100644 --- a/components/layout/fragment.rs +++ b/components/layout/fragment.rs @@ -1343,8 +1343,10 @@ impl Fragment { let border_width = node.style.logical_border_width().inline_start_end(); let padding_inline_size = model::padding_from_style(&*node.style, Au(0)).inline_start_end(); + let margin_inline_size = + model::specified_margin_from_style(&*node.style).inline_start_end(); result.surrounding_size = result.surrounding_size + border_width + - padding_inline_size; + padding_inline_size + margin_inline_size; } } } diff --git a/components/layout/model.rs b/components/layout/model.rs index 469d618cdfb..6b7fdcbb58e 100644 --- a/components/layout/model.rs +++ b/components/layout/model.rs @@ -297,6 +297,7 @@ impl IntrinsicISizes { } /// The temporary result of the computation of intrinsic inline-sizes. +#[derive(Debug)] pub struct IntrinsicISizesContribution { /// Intrinsic sizes for the content only (not counting borders, padding, or margins). pub content_intrinsic_sizes: IntrinsicISizes, @@ -430,6 +431,20 @@ pub fn padding_from_style(style: &ComputedValues, containing_block_inline_size: specified(padding_style.padding_left, containing_block_inline_size))) } +/// Returns the explicitly-specified margin lengths from the given style. Percentage and auto +/// margins are returned as zero. +/// +/// This is used when calculating intrinsic inline sizes. +#[inline] +pub fn specified_margin_from_style(style: &ComputedValues) -> LogicalMargin { + let margin_style = style.get_margin(); + LogicalMargin::from_physical(style.writing_mode, SideOffsets2D::new( + MaybeAuto::from_style(margin_style.margin_top, Au(0)).specified_or_zero(), + MaybeAuto::from_style(margin_style.margin_right, Au(0)).specified_or_zero(), + MaybeAuto::from_style(margin_style.margin_bottom, Au(0)).specified_or_zero(), + MaybeAuto::from_style(margin_style.margin_left, Au(0)).specified_or_zero())) +} + pub trait ToGfxMatrix { fn to_gfx_matrix(&self) -> Matrix4; } diff --git a/tests/ref/basic.list b/tests/ref/basic.list index 1318c9d6f4d..c59a3f7f04f 100644 --- a/tests/ref/basic.list +++ b/tests/ref/basic.list @@ -162,6 +162,7 @@ experimental == iframe/size_attributes_vertical_writing_mode.html iframe/size_at == inline_hypothetical_box_a.html inline_hypothetical_box_ref.html == inline_margin_multiple_fragments_a.html inline_margin_multiple_fragments_ref.html == inline_margins_a.html inline_margins_ref.html +== inline_margins_intrinsic_size_a.html inline_margins_intrinsic_size_ref.html == inline_padding_a.html inline_padding_b.html # inline_text_align_a.html inline_text_align_b.html == inline_whitespace_a.html inline_whitespace_ref.html diff --git a/tests/ref/inline_margins_intrinsic_size_a.html b/tests/ref/inline_margins_intrinsic_size_a.html new file mode 100644 index 00000000000..5a3e639a2dd --- /dev/null +++ b/tests/ref/inline_margins_intrinsic_size_a.html @@ -0,0 +1,15 @@ + + +
foo/bar
+ diff --git a/tests/ref/inline_margins_intrinsic_size_ref.html b/tests/ref/inline_margins_intrinsic_size_ref.html new file mode 100644 index 00000000000..e9bbbf6d29c --- /dev/null +++ b/tests/ref/inline_margins_intrinsic_size_ref.html @@ -0,0 +1,15 @@ + + +
foo/bar
+