diff options
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Libraries/LibWeb/Layout/GridFormattingContext.cpp | 75 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/Layout/GridFormattingContext.h | 2 |
2 files changed, 49 insertions, 28 deletions
diff --git a/Userland/Libraries/LibWeb/Layout/GridFormattingContext.cpp b/Userland/Libraries/LibWeb/Layout/GridFormattingContext.cpp index 0adb0d1fe3..b34f37f3d4 100644 --- a/Userland/Libraries/LibWeb/Layout/GridFormattingContext.cpp +++ b/Userland/Libraries/LibWeb/Layout/GridFormattingContext.cpp @@ -1347,6 +1347,24 @@ void GridFormattingContext::determine_grid_container_height() m_automatic_content_height = total_y; } +void GridFormattingContext::resolve_grid_item_widths() +{ + for (auto& item : m_grid_items) { + CSSPixels containing_block_width = containing_block_size_for_item(item, GridDimension::Column); + + auto border_left = item.box().computed_values().border_left().width; + auto border_right = item.box().computed_values().border_right().width; + + auto& box_state = m_state.get_mutable(item.box()); + box_state.border_left = border_left; + box_state.border_right = border_right; + + auto const& computed_width = item.box().computed_values().width(); + auto used_width = computed_width.is_auto() ? (containing_block_width - box_state.border_left - box_state.border_right) : computed_width.to_px(grid_container(), containing_block_width); + box_state.set_content_width(used_width); + } +} + void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const& available_space) { place_grid_items(available_space); @@ -1355,7 +1373,27 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const initialize_gap_tracks(available_space); + for (auto& item : m_grid_items) { + auto& box_state = m_state.get_mutable(item.box()); + auto& computed_values = item.box().computed_values(); + + // NOTE: As the containing blocks of grid items are created by implicit grid areas that are not present in the + // layout tree, the initial value of has_definite_width/height computed by LayoutState::UsedValues::set_node + // will be incorrect for anything other (auto, percentage, calculated) than fixed lengths. + // Therefor, it becomes necessary to reset this value to indefinite. + // TODO: Handle this in LayoutState::UsedValues::set_node + if (!computed_values.width().is_length()) + box_state.set_indefinite_content_width(); + if (!computed_values.height().is_length()) + box_state.set_indefinite_content_height(); + } + run_track_sizing(available_space, GridDimension::Column); + + // Once the sizes of column tracks, which determine the widths of the grid areas forming the containing blocks + // for grid items, ara calculated, it becomes possible to determine the final widths of the grid items. + resolve_grid_item_widths(); + run_track_sizing(available_space, GridDimension::Row); determine_grid_container_height(); @@ -1384,11 +1422,9 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const } // A grid item containing block is created by the grid area to which it belongs. - auto containing_block_width = max(CSSPixels(0), x_end - x_start); auto containing_block_height = y_end - y_start; - auto computed_width = child_box.computed_values().width(); - auto computed_height = child_box.computed_values().height(); + auto const& computed_height = child_box.computed_values().height(); auto border_left = child_box.computed_values().border_left().width; auto border_right = child_box.computed_values().border_right().width; @@ -1400,10 +1436,8 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const child_box_state.border_top = border_top; child_box_state.border_bottom = border_bottom; - auto used_width = computed_width.is_auto() ? (containing_block_width - child_box_state.border_left - child_box_state.border_right) : computed_width.to_px(grid_container(), containing_block_width); auto used_height = computed_height.is_auto() ? (containing_block_height - child_box_state.border_top - child_box_state.border_bottom) : computed_height.to_px(grid_container(), containing_block_height); - child_box_state.set_content_width(used_width); child_box_state.set_content_height(used_height); child_box_state.offset = { x_start + border_left, y_start + border_top }; @@ -1629,33 +1663,18 @@ CSSPixels GridFormattingContext::calculate_max_content_size(GridItem const& item CSSPixels GridFormattingContext::containing_block_size_for_item(GridItem const& item, GridDimension const dimension) const { - auto const& tracks = dimension == GridDimension::Column ? m_grid_columns : m_grid_rows; - auto const track_index = item.raw_position(dimension); - return tracks[track_index].base_size; + CSSPixels containing_block_size = 0; + for_each_spanned_track_by_item(item, dimension, [&](TemporaryTrack const& track) { + containing_block_size += track.base_size; + }); + return containing_block_size; } AvailableSpace GridFormattingContext::get_available_space_for_item(GridItem const& item) const { - CSSPixels column_width = 0; - bool has_columns_with_definite_base_size = false; - for_each_spanned_track_by_item(item, GridDimension::Column, [&](TemporaryTrack const& track) { - column_width += track.base_size; - if (track.has_definite_base_size) - has_columns_with_definite_base_size = true; - }); - - AvailableSize available_width = has_columns_with_definite_base_size ? AvailableSize::make_definite(column_width) : AvailableSize::make_indefinite(); - - CSSPixels column_height = 0; - bool has_rows_with_definite_base_size = false; - for_each_spanned_track_by_item(item, GridDimension::Row, [&](TemporaryTrack const& track) { - column_height += track.base_size; - if (track.has_definite_base_size) - has_rows_with_definite_base_size = true; - }); - - AvailableSize available_height = has_rows_with_definite_base_size ? AvailableSize::make_definite(column_height) : AvailableSize::make_indefinite(); - + auto& item_box_state = m_state.get(item.box()); + AvailableSize available_width = item_box_state.has_definite_width() ? AvailableSize::make_definite(item_box_state.content_width()) : AvailableSize::make_indefinite(); + AvailableSize available_height = item_box_state.has_definite_height() ? AvailableSize::make_definite(item_box_state.content_height()) : AvailableSize::make_indefinite(); return AvailableSpace(available_width, available_height); } diff --git a/Userland/Libraries/LibWeb/Layout/GridFormattingContext.h b/Userland/Libraries/LibWeb/Layout/GridFormattingContext.h index 0cdf5dfe45..fcf397c626 100644 --- a/Userland/Libraries/LibWeb/Layout/GridFormattingContext.h +++ b/Userland/Libraries/LibWeb/Layout/GridFormattingContext.h @@ -199,6 +199,8 @@ private: void determine_grid_container_height(); void determine_intrinsic_size_of_grid_container(AvailableSpace const& available_space); + void resolve_grid_item_widths(); + AvailableSize get_free_space(AvailableSpace const&, GridDimension const) const; int get_line_index_by_line_name(String const& line_name, CSS::GridTrackSizeList); |