diff options
author | Simon Sapin <simon.sapin@exyr.org> | 2020-06-09 19:58:00 +0200 |
---|---|---|
committer | Simon Sapin <simon.sapin@exyr.org> | 2020-06-10 09:03:18 +0200 |
commit | 08f008a0111020d5207bd0fd598213461f69fa42 (patch) | |
tree | f6e6ad32b9ac93aaa9afc7153ed7dcb7b210abbc /components/layout_2020/flow/construct.rs | |
parent | 554af02ab44f6dc96b8ebc570cdb01708a5a44bb (diff) | |
download | servo-08f008a0111020d5207bd0fd598213461f69fa42.tar.gz servo-08f008a0111020d5207bd0fd598213461f69fa42.zip |
Use the writing mode of the containing block when accessing CSS properties
… and converting them to flow-relative geometric values.
These values are almost always used to size and position a fragment within its containing block, so using the mode of the containing block seems more correct.
Note that the `writing-mode` and `direction` properties are disabled in Servo at the moment, so this PR by itself should have no effect: the writing mode of an element is always the same of that of its containing block since they’re both horizontal rtl.
Diffstat (limited to 'components/layout_2020/flow/construct.rs')
-rw-r--r-- | components/layout_2020/flow/construct.rs | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/components/layout_2020/flow/construct.rs b/components/layout_2020/flow/construct.rs index bd2d0bce23d..f72bbf1ad13 100644 --- a/components/layout_2020/flow/construct.rs +++ b/components/layout_2020/flow/construct.rs @@ -21,6 +21,7 @@ use rayon_croissant::ParallelIteratorExt; use servo_arc::Arc; use std::borrow::Cow; use std::convert::{TryFrom, TryInto}; +use style::logical_geometry::WritingMode; use style::properties::ComputedValues; use style::selector_parser::PseudoElement; use style::values::specified::text::TextDecorationLine; @@ -67,7 +68,12 @@ impl BlockFormattingContext { inline_level_boxes, text_decoration_line, }; - let content_sizes = content_sizes.compute(|| ifc.inline_content_sizes(context)); + // FIXME: this is the wrong writing mode + // but we plan to remove eager content size computation. + let not_actually_containing_block_writing_mode = WritingMode::empty(); + let content_sizes = content_sizes.compute(|| { + ifc.inline_content_sizes(context, not_actually_containing_block_writing_mode) + }); let contents = BlockContainer::InlineFormattingContext(ifc); let bfc = Self { contents, @@ -203,10 +209,13 @@ impl BlockContainer { .is_empty() { if builder.block_level_boxes.is_empty() { + // FIXME: this is the wrong writing mode + // but we plan to remove eager content size computation. + let not_actually_containing_block_writing_mode = info.style.writing_mode; let content_sizes = content_sizes.compute(|| { builder .ongoing_inline_formatting_context - .inline_content_sizes(context) + .inline_content_sizes(context, not_actually_containing_block_writing_mode) }); let container = BlockContainer::InlineFormattingContext( builder.ongoing_inline_formatting_context, @@ -678,6 +687,9 @@ where max_assign_in_flow_outer_content_sizes_to: Option<&mut ContentSizes>, ) -> (ArcRefCell<BlockLevelBox>, ContainsFloats) { let info = &self.info; + // FIXME: this is the wrong writing mode + // but we plan to remove eager content size computation. + let not_actually_containing_block_writing_mode = info.style.writing_mode; let (block_level_box, contains_floats) = match self.kind { BlockLevelCreator::SameFormattingContextBlock(contents) => { let (contents, contains_floats, box_content_sizes) = contents.finish( @@ -689,7 +701,10 @@ where ), ); if let Some(to) = max_assign_in_flow_outer_content_sizes_to { - to.max_assign(&box_content_sizes.outer_inline(&info.style)) + to.max_assign( + &box_content_sizes + .outer_inline(&info.style, not_actually_containing_block_writing_mode), + ) } let block_level_box = ArcRefCell::new(BlockLevelBox::SameFormattingContextBlock { tag: Tag::from_node_and_style_info(info), @@ -716,7 +731,12 @@ where propagated_text_decoration_line, ); if let Some(to) = max_assign_in_flow_outer_content_sizes_to { - to.max_assign(&contents.content_sizes.outer_inline(&contents.style)) + to.max_assign( + &contents.content_sizes.outer_inline( + &contents.style, + not_actually_containing_block_writing_mode, + ), + ) } ( ArcRefCell::new(BlockLevelBox::Independent(contents)), @@ -771,7 +791,12 @@ impl IntermediateBlockContainer { ) }, IntermediateBlockContainer::InlineFormattingContext(ifc) => { - let content_sizes = content_sizes.compute(|| ifc.inline_content_sizes(context)); + // FIXME: this is the wrong writing mode + // but we plan to remove eager content size computation. + let not_actually_containing_block_writing_mode = info.style.writing_mode; + let content_sizes = content_sizes.compute(|| { + ifc.inline_content_sizes(context, not_actually_containing_block_writing_mode) + }); // If that inline formatting context contained any float, those // were already taken into account during the first phase of // box construction. |