diff --git a/components/layout_2020/flow/inline.rs b/components/layout_2020/flow/inline.rs index fdb795ea8b5..045d5aaceba 100644 --- a/components/layout_2020/flow/inline.rs +++ b/components/layout_2020/flow/inline.rs @@ -23,6 +23,7 @@ use app_units::Au; use atomic_refcell::AtomicRef; use gfx::text::text_run::GlyphRun; use servo_arc::Arc; +use style::computed_values::white_space::T as WhiteSpace; use style::logical_geometry::WritingMode; use style::properties::ComputedValues; use style::values::computed::{Length, LengthPercentage, Percentage}; @@ -74,6 +75,7 @@ struct InlineNestingLevelState<'box_tree> { inline_start: Length, max_block_size_of_fragments_so_far: Length, positioning_context: Option, + white_space: WhiteSpace, /// Indicates whether this nesting level have text decorations in effect. /// From https://drafts.csswg.org/css-text-decor/#line-decoration // "When specified on or propagated to a block container that establishes @@ -125,6 +127,34 @@ impl<'box_tree, 'a, 'b> InlineFormattingContextState<'box_tree, 'a, 'b> { self.positioning_context.push(hoisted_box); } + + /// Finish layout of all the partial inline boxes in the current line, + /// finish current line and start a new one. + fn finish_line_and_reset(&mut self, layout_context: &LayoutContext) { + self.current_nesting_level.inline_start = Length::zero(); + let mut nesting_level = &mut self.current_nesting_level; + for partial in self.partial_inline_boxes_stack.iter_mut().rev() { + partial.finish_layout( + layout_context, + nesting_level, + &mut self.inline_position, + true, + ); + partial.start_corner.inline = Length::zero(); + partial.padding.inline_start = Length::zero(); + partial.border.inline_start = Length::zero(); + partial.margin.inline_start = Length::zero(); + partial.parent_nesting_level.inline_start = Length::zero(); + nesting_level = &mut partial.parent_nesting_level; + } + self.lines.finish_line( + nesting_level, + self.containing_block, + self.sequential_layout_state.as_mut().map(|c| &mut **c), + self.inline_position, + ); + self.inline_position = Length::zero(); + } } struct Lines { @@ -297,6 +327,7 @@ impl InlineFormattingContext { inline_start: Length::zero(), max_block_size_of_fragments_so_far: Length::zero(), positioning_context: None, + white_space: containing_block.style.clone_inherited_text().white_space, text_decoration_line: self.text_decoration_line, }, sequential_layout_state, @@ -503,6 +534,7 @@ impl InlineBox { start_corner += &relative_adjustement(&style, ifc.containing_block) } let positioning_context = PositioningContext::new_for_style(&style); + let white_space = style.clone_inherited_text().white_space; let text_decoration_line = ifc.current_nesting_level.text_decoration_line | style.clone_text_decoration_line(); PartialInlineBoxFragment { @@ -523,6 +555,7 @@ impl InlineBox { inline_start: ifc.inline_position, max_block_size_of_fragments_so_far: Length::zero(), positioning_context, + white_space, text_decoration_line: text_decoration_line, }, ), @@ -590,16 +623,12 @@ fn layout_atomic( let pbm = style.padding_border_margin(&ifc.containing_block); let margin = pbm.margin.auto_is(Length::zero); let pbm_sums = &(&pbm.padding + &pbm.border) + &margin; - ifc.inline_position += pbm_sums.inline_start; - let mut start_corner = Vec2 { - block: pbm_sums.block_start, - inline: ifc.inline_position - ifc.current_nesting_level.inline_start, - }; - if style.clone_position().is_relative() { - start_corner += &relative_adjustement(&style, ifc.containing_block) - } + let position = style.clone_position(); - let fragment = match atomic { + let mut child_positioning_context = None; + + // We need to know the inline size of the atomic before deciding whether to do the line break. + let mut fragment = match atomic { IndependentFormattingContext::Replaced(replaced) => { let size = replaced.contents.used_size_as_if_inline_element( ifc.containing_block, @@ -610,7 +639,10 @@ fn layout_atomic( let fragments = replaced .contents .make_fragments(&replaced.style, size.clone()); - let content_rect = Rect { start_corner, size }; + let content_rect = Rect { + start_corner: Vec2::zero(), + size, + }; BoxFragment::new( replaced.base_fragment_info, replaced.style.clone(), @@ -663,16 +695,14 @@ fn layout_atomic( let collects_for_nearest_positioned_ancestor = ifc .positioning_context .collects_for_nearest_positioned_ancestor(); - let mut child_positioning_context = - PositioningContext::new_for_subtree(collects_for_nearest_positioned_ancestor); + child_positioning_context = Some(PositioningContext::new_for_subtree( + collects_for_nearest_positioned_ancestor, + )); let independent_layout = non_replaced.layout( layout_context, - &mut child_positioning_context, + child_positioning_context.as_mut().unwrap(), &containing_block_for_children, ); - child_positioning_context - .adjust_static_position_of_hoisted_fragments_with_offset(&start_corner); - ifc.positioning_context.append(child_positioning_context); // https://drafts.csswg.org/css2/visudet.html#block-root-margin let tentative_block_size = box_size @@ -686,7 +716,7 @@ fn layout_atomic( .clamp_between_extremums(min_box_size.block, max_box_size.block); let content_rect = Rect { - start_corner, + start_corner: Vec2::zero(), size: Vec2 { block: block_size, inline: inline_size, @@ -707,6 +737,31 @@ fn layout_atomic( }, }; + if fragment.content_rect.size.inline + pbm_sums.inline_sum() > + ifc.containing_block.inline_size - ifc.inline_position && + ifc.current_nesting_level.white_space.allow_wrap() && + ifc.current_nesting_level.fragments_so_far.len() != 0 + { + ifc.finish_line_and_reset(layout_context); + } + + ifc.inline_position += pbm_sums.inline_start; + let mut start_corner = Vec2 { + block: pbm_sums.block_start, + inline: ifc.inline_position - ifc.current_nesting_level.inline_start, + }; + if position.is_relative() { + start_corner += &relative_adjustement(atomic.style(), ifc.containing_block) + } + + if let Some(mut child_positioning_context) = child_positioning_context.take() { + child_positioning_context + .adjust_static_position_of_hoisted_fragments_with_offset(&start_corner); + ifc.positioning_context.append(child_positioning_context); + } + + fragment.content_rect.start_corner = start_corner; + ifc.inline_position += pbm_sums.inline_end + fragment.content_rect.size.inline; ifc.current_nesting_level .max_block_size_of_fragments_so_far @@ -888,30 +943,7 @@ impl TextRun { if runs.as_slice().is_empty() && !force_line_break { break; } else { - // New line - ifc.current_nesting_level.inline_start = Length::zero(); - let mut nesting_level = &mut ifc.current_nesting_level; - for partial in ifc.partial_inline_boxes_stack.iter_mut().rev() { - partial.finish_layout( - layout_context, - nesting_level, - &mut ifc.inline_position, - true, - ); - partial.start_corner.inline = Length::zero(); - partial.padding.inline_start = Length::zero(); - partial.border.inline_start = Length::zero(); - partial.margin.inline_start = Length::zero(); - partial.parent_nesting_level.inline_start = Length::zero(); - nesting_level = &mut partial.parent_nesting_level; - } - ifc.lines.finish_line( - nesting_level, - ifc.containing_block, - ifc.sequential_layout_state.as_mut().map(|c| &mut **c), - ifc.inline_position, - ); - ifc.inline_position = Length::zero(); + ifc.finish_line_and_reset(layout_context); } } } diff --git a/tests/wpt/meta/css/CSS2/floats-clear/floats-026.xht.ini b/tests/wpt/meta/css/CSS2/floats-clear/floats-026.xht.ini deleted file mode 100644 index 192e79f5e10..00000000000 --- a/tests/wpt/meta/css/CSS2/floats-clear/floats-026.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[floats-026.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/floats-clear/floats-027.xht.ini b/tests/wpt/meta/css/CSS2/floats-clear/floats-027.xht.ini deleted file mode 100644 index 284c5e1dedf..00000000000 --- a/tests/wpt/meta/css/CSS2/floats-clear/floats-027.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[floats-027.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/margin-padding-clear/margin-collapse-014.xht.ini b/tests/wpt/meta/css/CSS2/margin-padding-clear/margin-collapse-014.xht.ini deleted file mode 100644 index 97881d480c2..00000000000 --- a/tests/wpt/meta/css/CSS2/margin-padding-clear/margin-collapse-014.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[margin-collapse-014.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-height-003.xht.ini b/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-height-003.xht.ini deleted file mode 100644 index a7c02218dae..00000000000 --- a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-height-003.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[absolute-non-replaced-height-003.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-height-004.xht.ini b/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-height-004.xht.ini deleted file mode 100644 index d5edb75b0ee..00000000000 --- a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-height-004.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[absolute-non-replaced-height-004.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-height-005.xht.ini b/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-height-005.xht.ini deleted file mode 100644 index acbe4a16f4d..00000000000 --- a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-height-005.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[absolute-non-replaced-height-005.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-height-006.xht.ini b/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-height-006.xht.ini deleted file mode 100644 index e259855a28e..00000000000 --- a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-height-006.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[absolute-non-replaced-height-006.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-height-010.xht.ini b/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-height-010.xht.ini deleted file mode 100644 index ffa0aa5f51d..00000000000 --- a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-height-010.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[absolute-non-replaced-height-010.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-height-011.xht.ini b/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-height-011.xht.ini deleted file mode 100644 index ff562b47bae..00000000000 --- a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-height-011.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[absolute-non-replaced-height-011.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-height-012.xht.ini b/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-height-012.xht.ini deleted file mode 100644 index 5cd0779a01b..00000000000 --- a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-height-012.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[absolute-non-replaced-height-012.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-max-height-004.xht.ini b/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-max-height-004.xht.ini deleted file mode 100644 index 520f8f51740..00000000000 --- a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-max-height-004.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[absolute-non-replaced-max-height-004.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-max-height-005.xht.ini b/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-max-height-005.xht.ini deleted file mode 100644 index f0a70485254..00000000000 --- a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-max-height-005.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[absolute-non-replaced-max-height-005.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-max-height-006.xht.ini b/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-max-height-006.xht.ini deleted file mode 100644 index b49a7b20e06..00000000000 --- a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-max-height-006.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[absolute-non-replaced-max-height-006.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-max-height-010.xht.ini b/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-max-height-010.xht.ini deleted file mode 100644 index 26bf546864a..00000000000 --- a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-max-height-010.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[absolute-non-replaced-max-height-010.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-max-height-012.xht.ini b/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-max-height-012.xht.ini deleted file mode 100644 index bbeee78f08a..00000000000 --- a/tests/wpt/meta/css/CSS2/positioning/absolute-non-replaced-max-height-012.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[absolute-non-replaced-max-height-012.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/text/text-indent-on-blank-line-rtl-left-align.html.ini b/tests/wpt/meta/css/CSS2/text/text-indent-on-blank-line-rtl-left-align.html.ini deleted file mode 100644 index 1baeb7c20a0..00000000000 --- a/tests/wpt/meta/css/CSS2/text/text-indent-on-blank-line-rtl-left-align.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[text-indent-on-blank-line-rtl-left-align.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-backgrounds/background-size-026.html.ini b/tests/wpt/meta/css/css-backgrounds/background-size-026.html.ini deleted file mode 100644 index 8c77678547c..00000000000 --- a/tests/wpt/meta/css/css-backgrounds/background-size-026.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[background-size-026.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/flexbox-flex-direction-default.htm.ini b/tests/wpt/meta/css/css-flexbox/flexbox-flex-direction-default.htm.ini deleted file mode 100644 index 5a5af1a82b1..00000000000 --- a/tests/wpt/meta/css/css-flexbox/flexbox-flex-direction-default.htm.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-flex-direction-default.htm] - expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/flexbox-flex-direction-row-reverse.htm.ini b/tests/wpt/meta/css/css-flexbox/flexbox-flex-direction-row-reverse.htm.ini deleted file mode 100644 index 5118614648b..00000000000 --- a/tests/wpt/meta/css/css-flexbox/flexbox-flex-direction-row-reverse.htm.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-flex-direction-row-reverse.htm] - expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/flexbox-flex-direction-row.htm.ini b/tests/wpt/meta/css/css-flexbox/flexbox-flex-direction-row.htm.ini deleted file mode 100644 index 199bc34f9e9..00000000000 --- a/tests/wpt/meta/css/css-flexbox/flexbox-flex-direction-row.htm.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-flex-direction-row.htm] - expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/flexbox-flex-wrap-wrap-reverse.htm.ini b/tests/wpt/meta/css/css-flexbox/flexbox-flex-wrap-wrap-reverse.htm.ini deleted file mode 100644 index f4112003a28..00000000000 --- a/tests/wpt/meta/css/css-flexbox/flexbox-flex-wrap-wrap-reverse.htm.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-flex-wrap-wrap-reverse.htm] - expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/flexbox-flex-wrap-wrap.htm.ini b/tests/wpt/meta/css/css-flexbox/flexbox-flex-wrap-wrap.htm.ini deleted file mode 100644 index 10565c42ad2..00000000000 --- a/tests/wpt/meta/css/css-flexbox/flexbox-flex-wrap-wrap.htm.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-flex-wrap-wrap.htm] - expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/flexbox_first-line.html.ini b/tests/wpt/meta/css/css-flexbox/flexbox_first-line.html.ini deleted file mode 100644 index 05377a25c4c..00000000000 --- a/tests/wpt/meta/css/css-flexbox/flexbox_first-line.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox_first-line.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/stretch-obeys-min-max-001.html.ini b/tests/wpt/meta/css/css-flexbox/stretch-obeys-min-max-001.html.ini deleted file mode 100644 index 4c9cbcc8ff4..00000000000 --- a/tests/wpt/meta/css/css-flexbox/stretch-obeys-min-max-001.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[stretch-obeys-min-max-001.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-ui/text-overflow-ruby.html.ini b/tests/wpt/meta/css/css-ui/text-overflow-ruby.html.ini new file mode 100644 index 00000000000..d32ece38913 --- /dev/null +++ b/tests/wpt/meta/css/css-ui/text-overflow-ruby.html.ini @@ -0,0 +1,2 @@ +[text-overflow-ruby.html] + expected: FAIL diff --git a/tests/wpt/mozilla/meta/css/percentage_width_inline_block_a.html.ini b/tests/wpt/mozilla/meta/css/percentage_width_inline_block_a.html.ini deleted file mode 100644 index b72cd703910..00000000000 --- a/tests/wpt/mozilla/meta/css/percentage_width_inline_block_a.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[percentage_width_inline_block_a.html] - expected: FAIL