#include "third_party/blink/renderer/core/layout/fragmentation_utils.h"
#include "base/containers/adapters.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/dom/element.h"
#include "third_party/blink/renderer/core/layout/block_break_token.h"
#include "third_party/blink/renderer/core/layout/box_fragment_builder.h"
#include "third_party/blink/renderer/core/layout/constraint_space.h"
#include "third_party/blink/renderer/core/layout/constraint_space_builder.h"
#include "third_party/blink/renderer/core/layout/length_utils.h"
#include "third_party/blink/renderer/core/layout/logical_box_fragment.h"
#include "third_party/blink/renderer/core/layout/physical_box_fragment.h"
#include "third_party/blink/renderer/core/style/computed_style.h"
#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
namespace blink {
namespace {
inline int FragmentainerBreakPrecedence(EBreakBetween break_value) { … }
bool ShouldCloneBlockStartBorderPadding(const BoxFragmentBuilder& builder) { … }
}
EBreakBetween JoinFragmentainerBreakValues(EBreakBetween first_value,
EBreakBetween second_value) { … }
bool IsForcedBreakValue(const ConstraintSpace& constraint_space,
EBreakBetween break_value) { … }
template <typename Property>
bool IsAvoidBreakValue(const ConstraintSpace& constraint_space,
Property break_value) { … }
template bool CORE_TEMPLATE_EXPORT IsAvoidBreakValue(const ConstraintSpace&,
EBreakBetween);
template bool CORE_TEMPLATE_EXPORT IsAvoidBreakValue(const ConstraintSpace&,
EBreakInside);
EBreakBetween CalculateBreakBetweenValue(LayoutInputNode child,
const LayoutResult& layout_result,
const BoxFragmentBuilder& builder) { … }
bool IsBreakableAtStartOfResumedContainer(
const ConstraintSpace& space,
const LayoutResult& child_layout_result,
const BoxFragmentBuilder& builder) { … }
bool IsBreakableAtStartOfResumedContainer(const ConstraintSpace& space,
const BoxFragmentBuilder& builder,
bool is_first_for_node) { … }
BreakAppeal CalculateBreakAppealBefore(const ConstraintSpace& space,
LayoutInputNode child,
const LayoutResult& layout_result,
const BoxFragmentBuilder& builder,
bool has_container_separation) { … }
BreakAppeal CalculateBreakAppealBefore(
const ConstraintSpace& space,
LayoutResult::EStatus layout_result_status,
EBreakBetween break_between,
bool has_container_separation,
bool breakable_at_start_of_container) { … }
BreakAppeal CalculateBreakAppealInside(
const ConstraintSpace& space,
const LayoutResult& layout_result,
std::optional<BreakAppeal> hypothetical_appeal) { … }
LogicalSize FragmentainerLogicalCapacity(
const PhysicalBoxFragment& fragmentainer) { … }
LogicalOffset GetFragmentainerProgression(const BoxFragmentBuilder& builder,
FragmentationType type) { … }
void SetupSpaceBuilderForFragmentation(const ConstraintSpace& parent_space,
const LayoutInputNode& child,
LayoutUnit fragmentainer_offset,
LayoutUnit fragmentainer_block_size,
bool requires_content_before_breaking,
ConstraintSpaceBuilder* builder) { … }
void SetupSpaceBuilderForFragmentation(
const BoxFragmentBuilder& parent_fragment_builder,
const LayoutInputNode& child,
LayoutUnit fragmentainer_offset_delta,
ConstraintSpaceBuilder* builder) { … }
void SetupFragmentBuilderForFragmentation(
const ConstraintSpace& space,
const LayoutInputNode& node,
const BlockBreakToken* previous_break_token,
BoxFragmentBuilder* builder) { … }
bool ShouldIncludeBlockStartBorderPadding(const BoxFragmentBuilder& builder) { … }
bool ShouldIncludeBlockEndBorderPadding(const BoxFragmentBuilder& builder) { … }
BreakStatus FinishFragmentation(BoxFragmentBuilder* builder) { … }
BreakStatus FinishFragmentationForFragmentainer(BoxFragmentBuilder* builder) { … }
bool HasBreakOpportunityBeforeNextChild(
const PhysicalFragment& child_fragment,
const BreakToken* incoming_child_break_token) { … }
BreakStatus BreakBeforeChildIfNeeded(
const ConstraintSpace& space,
LayoutInputNode child,
const LayoutResult& layout_result,
LayoutUnit fragmentainer_block_offset,
LayoutUnit fragmentainer_block_size,
bool has_container_separation,
BoxFragmentBuilder* builder,
bool is_row_item,
FlexColumnBreakInfo* flex_column_break_info) { … }
void BreakBeforeChild(const ConstraintSpace& space,
LayoutInputNode child,
const LayoutResult* layout_result,
LayoutUnit fragmentainer_block_offset,
LayoutUnit fragmentainer_block_size,
std::optional<BreakAppeal> appeal,
bool is_forced_break,
BoxFragmentBuilder* builder,
std::optional<LayoutUnit> block_size_override) { … }
void PropagateSpaceShortage(const ConstraintSpace& space,
const LayoutResult* layout_result,
LayoutUnit fragmentainer_block_offset,
LayoutUnit fragmentainer_block_size,
FragmentBuilder* builder,
std::optional<LayoutUnit> block_size_override) { … }
LayoutUnit CalculateSpaceShortage(
const ConstraintSpace& space,
const LayoutResult* layout_result,
LayoutUnit fragmentainer_block_offset,
LayoutUnit fragmentainer_block_size,
std::optional<LayoutUnit> block_size_override) { … }
void UpdateMinimalSpaceShortage(std::optional<LayoutUnit> new_space_shortage,
LayoutUnit* minimal_space_shortage) { … }
bool MovePastBreakpoint(const ConstraintSpace& space,
LayoutInputNode child,
const LayoutResult& layout_result,
LayoutUnit fragmentainer_block_offset,
LayoutUnit fragmentainer_block_size,
BreakAppeal appeal_before,
BoxFragmentBuilder* builder,
bool is_row_item,
FlexColumnBreakInfo* flex_column_break_info) { … }
bool MovePastBreakpoint(const ConstraintSpace& space,
const LayoutResult& layout_result,
LayoutUnit fragmentainer_block_offset,
LayoutUnit fragmentainer_block_size,
BreakAppeal appeal_before,
BoxFragmentBuilder* builder,
bool is_row_item,
FlexColumnBreakInfo* flex_column_break_info) { … }
void UpdateEarlyBreakAtBlockChild(const ConstraintSpace& space,
BlockNode child,
const LayoutResult& layout_result,
BreakAppeal appeal_before,
BoxFragmentBuilder* builder,
FlexColumnBreakInfo* flex_column_break_info) { … }
bool AttemptSoftBreak(const ConstraintSpace& space,
LayoutInputNode child,
const LayoutResult* layout_result,
LayoutUnit fragmentainer_block_offset,
LayoutUnit fragmentainer_block_size,
BreakAppeal appeal_before,
BoxFragmentBuilder* builder,
std::optional<LayoutUnit> block_size_override,
FlexColumnBreakInfo* flex_column_break_info) { … }
const EarlyBreak* EnterEarlyBreakInChild(const BlockNode& child,
const EarlyBreak& early_break) { … }
bool IsEarlyBreakTarget(const EarlyBreak& early_break,
const BoxFragmentBuilder& builder,
const LayoutInputNode& child) { … }
ConstraintSpace CreateConstraintSpaceForFragmentainer(
const ConstraintSpace& parent_space,
FragmentationType fragmentation_type,
LogicalSize fragmentainer_size,
LogicalSize percentage_resolution_size,
bool balance_columns,
BreakAppeal min_break_appeal) { … }
BoxFragmentBuilder CreateContainerBuilderForMulticol(
const BlockNode& multicol,
const ConstraintSpace& space,
const FragmentGeometry& fragment_geometry) { … }
ConstraintSpace CreateConstraintSpaceForMulticol(const BlockNode& multicol) { … }
const BlockBreakToken* FindPreviousBreakToken(
const PhysicalBoxFragment& fragment) { … }
wtf_size_t BoxFragmentIndex(const PhysicalBoxFragment& fragment) { … }
wtf_size_t PreviousInnerFragmentainerIndex(
const PhysicalBoxFragment& fragment) { … }
PhysicalOffset OffsetInStitchedFragments(
const PhysicalBoxFragment& fragment,
PhysicalSize* out_stitched_fragments_size) { … }
LayoutUnit BlockSizeForFragmentation(
const LayoutResult& result,
WritingDirectionMode container_writing_direction) { … }
bool CanPaintMultipleFragments(const PhysicalBoxFragment& fragment) { … }
bool CanPaintMultipleFragments(const LayoutObject& layout_object) { … }
}