mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 02:07:35 +00:00
LibWeb: Refactor should_skip_anonymous_text_runs
This same function was being copied in the {Flex,Grid}FormattingContext, so unify them in the parent FormattingContext.
This commit is contained in:
parent
97dde51a9b
commit
0bbf7a1b54
4 changed files with 21 additions and 29 deletions
|
@ -305,19 +305,8 @@ void FlexFormattingContext::generate_anonymous_flex_items()
|
||||||
HashMap<int, Vector<FlexItem>> order_item_bucket;
|
HashMap<int, Vector<FlexItem>> order_item_bucket;
|
||||||
|
|
||||||
flex_container().for_each_child_of_type<Box>([&](Box& child_box) {
|
flex_container().for_each_child_of_type<Box>([&](Box& child_box) {
|
||||||
// Skip anonymous text runs that are only whitespace.
|
if (can_skip_is_anonymous_text_run(child_box))
|
||||||
if (child_box.is_anonymous() && !child_box.is_generated() && !child_box.first_child_of_type<BlockContainer>()) {
|
return IterationDecision::Continue;
|
||||||
bool contains_only_white_space = true;
|
|
||||||
child_box.for_each_in_subtree([&](auto const& node) {
|
|
||||||
if (!is<TextNode>(node) || !static_cast<TextNode const&>(node).dom_node().data().is_whitespace()) {
|
|
||||||
contains_only_white_space = false;
|
|
||||||
return IterationDecision::Break;
|
|
||||||
}
|
|
||||||
return IterationDecision::Continue;
|
|
||||||
});
|
|
||||||
if (contains_only_white_space)
|
|
||||||
return IterationDecision::Continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip any "out-of-flow" children
|
// Skip any "out-of-flow" children
|
||||||
if (child_box.is_out_of_flow(*this))
|
if (child_box.is_out_of_flow(*this))
|
||||||
|
|
|
@ -1473,4 +1473,21 @@ bool FormattingContext::should_treat_height_as_auto(Box const& box, AvailableSpa
|
||||||
|| (box.computed_values().height().contains_percentage() && !available_space.height.is_definite());
|
|| (box.computed_values().height().contains_percentage() && !available_space.height.is_definite());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FormattingContext::can_skip_is_anonymous_text_run(Box& box)
|
||||||
|
{
|
||||||
|
if (box.is_anonymous() && !box.is_generated() && !box.first_child_of_type<BlockContainer>()) {
|
||||||
|
bool contains_only_white_space = true;
|
||||||
|
box.for_each_in_subtree([&](auto const& node) {
|
||||||
|
if (!is<TextNode>(node) || !static_cast<TextNode const&>(node).dom_node().data().is_whitespace()) {
|
||||||
|
contains_only_white_space = false;
|
||||||
|
return IterationDecision::Break;
|
||||||
|
}
|
||||||
|
return IterationDecision::Continue;
|
||||||
|
});
|
||||||
|
if (contains_only_white_space)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,6 +81,7 @@ public:
|
||||||
virtual void determine_height_of_child(Box const&, AvailableSpace const&) { }
|
virtual void determine_height_of_child(Box const&, AvailableSpace const&) { }
|
||||||
|
|
||||||
virtual Gfx::FloatPoint calculate_static_position(Box const&) const;
|
virtual Gfx::FloatPoint calculate_static_position(Box const&) const;
|
||||||
|
bool can_skip_is_anonymous_text_run(Box&);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
FormattingContext(Type, LayoutState&, Box const&, FormattingContext* parent = nullptr);
|
FormattingContext(Type, LayoutState&, Box const&, FormattingContext* parent = nullptr);
|
||||||
|
|
|
@ -22,21 +22,6 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const
|
||||||
auto& box_state = m_state.get_mutable(box);
|
auto& box_state = m_state.get_mutable(box);
|
||||||
auto grid_template_columns = box.computed_values().grid_template_columns();
|
auto grid_template_columns = box.computed_values().grid_template_columns();
|
||||||
auto grid_template_rows = box.computed_values().grid_template_rows();
|
auto grid_template_rows = box.computed_values().grid_template_rows();
|
||||||
auto should_skip_is_anonymous_text_run = [&](Box& child_box) -> bool {
|
|
||||||
if (child_box.is_anonymous() && !child_box.first_child_of_type<BlockContainer>()) {
|
|
||||||
bool contains_only_white_space = true;
|
|
||||||
child_box.for_each_in_subtree([&](auto const& node) {
|
|
||||||
if (!is<TextNode>(node) || !static_cast<TextNode const&>(node).dom_node().data().is_whitespace()) {
|
|
||||||
contains_only_white_space = false;
|
|
||||||
return IterationDecision::Break;
|
|
||||||
}
|
|
||||||
return IterationDecision::Continue;
|
|
||||||
});
|
|
||||||
if (contains_only_white_space)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
auto resolve_definite_track_size = [&](CSS::GridSize const& grid_size) -> float {
|
auto resolve_definite_track_size = [&](CSS::GridSize const& grid_size) -> float {
|
||||||
VERIFY(grid_size.is_definite());
|
VERIFY(grid_size.is_definite());
|
||||||
|
@ -110,7 +95,7 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const
|
||||||
Vector<PositionedBox> positioned_boxes;
|
Vector<PositionedBox> positioned_boxes;
|
||||||
Vector<Box const&> boxes_to_place;
|
Vector<Box const&> boxes_to_place;
|
||||||
box.for_each_child_of_type<Box>([&](Box& child_box) {
|
box.for_each_child_of_type<Box>([&](Box& child_box) {
|
||||||
if (should_skip_is_anonymous_text_run(child_box))
|
if (can_skip_is_anonymous_text_run(child_box))
|
||||||
return IterationDecision::Continue;
|
return IterationDecision::Continue;
|
||||||
boxes_to_place.append(child_box);
|
boxes_to_place.append(child_box);
|
||||||
return IterationDecision::Continue;
|
return IterationDecision::Continue;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue