Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(432)

Unified Diff: third_party/WebKit/Source/core/layout/ng/ng_constraint_space_builder.cc

Issue 2681783004: Use Initial Containing Block size for vertical (Closed)
Patch Set: Final CR fixes Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/layout/ng/ng_constraint_space_builder.cc
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_builder.cc b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_builder.cc
index 949178e1af96c65a9aee083be486ab5fb6e4f695..6bbcc3711ea2ab22f2b72ad509cc6c394e562ad6 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_builder.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_builder.cc
@@ -12,6 +12,8 @@ NGConstraintSpaceBuilder::NGConstraintSpaceBuilder(
const NGConstraintSpace* parent_space)
: available_size_(parent_space->AvailableSize()),
percentage_resolution_size_(parent_space->PercentageResolutionSize()),
+ initial_containing_block_size_(
+ parent_space->InitialContainingBlockSize()),
fragmentainer_space_available_(NGSizeIndefinite),
writing_mode_(parent_space->WritingMode()),
parent_writing_mode_(parent_space->WritingMode()),
@@ -27,7 +29,8 @@ NGConstraintSpaceBuilder::NGConstraintSpaceBuilder(
exclusions_(parent_space->Exclusions()) {}
NGConstraintSpaceBuilder::NGConstraintSpaceBuilder(NGWritingMode writing_mode)
- : fragmentainer_space_available_(NGSizeIndefinite),
+ : initial_containing_block_size_{NGSizeIndefinite, NGSizeIndefinite},
+ fragmentainer_space_available_(NGSizeIndefinite),
writing_mode_(writing_mode),
parent_writing_mode_(writing_mode_),
is_fixed_size_inline_(false),
@@ -52,6 +55,12 @@ NGConstraintSpaceBuilder& NGConstraintSpaceBuilder::SetPercentageResolutionSize(
return *this;
}
+NGConstraintSpaceBuilder&
+NGConstraintSpaceBuilder::SetInitialContainingBlockSize(NGPhysicalSize size) {
+ initial_containing_block_size_ = size;
+ return *this;
+}
+
NGConstraintSpaceBuilder& NGConstraintSpaceBuilder::SetTextDirection(
TextDirection text_direction) {
text_direction_ = static_cast<unsigned>(text_direction);
@@ -117,25 +126,52 @@ NGConstraintSpaceBuilder& NGConstraintSpaceBuilder::SetWritingMode(
}
NGConstraintSpace* NGConstraintSpaceBuilder::ToConstraintSpace() {
- // Exclusions do not pass the formatting context boundary.
- std::shared_ptr<NGExclusions> exclusions(
- is_new_fc_ ? std::make_shared<NGExclusions>() : exclusions_);
// Whether the child and the containing block are parallel to each other.
// Example: vertical-rl and vertical-lr
bool is_in_parallel_flow = (parent_writing_mode_ == kHorizontalTopBottom) ==
(writing_mode_ == kHorizontalTopBottom);
+ NGLogicalSize available_size = available_size_;
+ NGLogicalSize percentage_resolution_size = percentage_resolution_size_;
+ if (!is_in_parallel_flow) {
+ std::swap(available_size.inline_size, available_size.block_size);
+ std::swap(percentage_resolution_size.inline_size,
+ percentage_resolution_size.block_size);
+ }
+
+ // If inline size is indefinite, use size of initial containing block.
+ // https://www.w3.org/TR/css-writing-modes-3/#orthogonal-auto
+ if (available_size.inline_size == NGSizeIndefinite) {
+ DCHECK(!is_in_parallel_flow);
+ if (writing_mode_ == kHorizontalTopBottom) {
+ available_size.inline_size = initial_containing_block_size_.width;
+ } else {
+ available_size.inline_size = initial_containing_block_size_.height;
+ }
+ }
+ if (percentage_resolution_size.inline_size == NGSizeIndefinite) {
+ DCHECK(!is_in_parallel_flow);
+ if (writing_mode_ == kHorizontalTopBottom) {
+ percentage_resolution_size.inline_size =
+ initial_containing_block_size_.width;
+ } else {
+ percentage_resolution_size.inline_size =
+ initial_containing_block_size_.height;
+ }
+ }
+
+ // Exclusions do not pass the formatting context boundary.
+ std::shared_ptr<NGExclusions> exclusions(
+ is_new_fc_ ? std::make_shared<NGExclusions>() : exclusions_);
NGLogicalOffset bfc_offset = is_new_fc_ ? NGLogicalOffset() : bfc_offset_;
NGMarginStrut margin_strut = is_new_fc_ ? NGMarginStrut() : margin_strut_;
if (is_in_parallel_flow) {
return new NGConstraintSpace(
static_cast<NGWritingMode>(writing_mode_),
- static_cast<TextDirection>(text_direction_),
- {available_size_.inline_size, available_size_.block_size},
- {percentage_resolution_size_.inline_size,
- percentage_resolution_size_.block_size},
+ static_cast<TextDirection>(text_direction_), available_size,
+ percentage_resolution_size, initial_containing_block_size_,
fragmentainer_space_available_, is_fixed_size_inline_,
is_fixed_size_block_, is_shrink_to_fit_,
is_inline_direction_triggers_scrollbar_,
@@ -143,13 +179,10 @@ NGConstraintSpace* NGConstraintSpaceBuilder::ToConstraintSpace() {
static_cast<NGFragmentationType>(fragmentation_type_), is_new_fc_,
margin_strut, bfc_offset, exclusions);
}
-
return new NGConstraintSpace(
static_cast<NGWritingMode>(writing_mode_),
- static_cast<TextDirection>(text_direction_),
- {available_size_.block_size, available_size_.inline_size},
- {percentage_resolution_size_.block_size,
- percentage_resolution_size_.inline_size},
+ static_cast<TextDirection>(text_direction_), available_size,
+ percentage_resolution_size, initial_containing_block_size_,
fragmentainer_space_available_, is_fixed_size_block_,
is_fixed_size_inline_, is_shrink_to_fit_,
is_block_direction_triggers_scrollbar_,

Powered by Google App Engine
This is Rietveld 408576698