BlockFormattingContext.h [plain text]
#pragma once
#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
#include "FormattingContext.h"
#include <wtf/IsoMalloc.h>
namespace WebCore {
class LayoutUnit;
namespace Layout {
class BlockFormattingState;
class Box;
class FloatingContext;
class BlockFormattingContext : public FormattingContext {
WTF_MAKE_ISO_ALLOCATED(BlockFormattingContext);
public:
BlockFormattingContext(const Box& formattingContextRoot, FormattingState& formattingState);
void layout() const override;
private:
void layoutFormattingContextRoot(FloatingContext&, const Box&) const;
void placeInFlowPositionedChildren(const Container&) const;
void computeWidthAndMargin(const Box&) const;
void computeHeightAndMargin(const Box&) const;
void computeStaticPosition(const Box&) const;
void computeFloatingPosition(const FloatingContext&, const Box&) const;
void computePositionToAvoidFloats(const FloatingContext&, const Box&) const;
void computeVerticalPositionForFloatClear(const FloatingContext&, const Box&) const;
void computeEstimatedMarginBeforeForAncestors(const Box&) const;
void computeEstimatedMarginBefore(const Box&) const;
void precomputeVerticalPositionForFormattingRootIfNeeded(const Box&) const;
InstrinsicWidthConstraints instrinsicWidthConstraints() const override;
class Geometry : public FormattingContext::Geometry {
public:
static HeightAndMargin inFlowHeightAndMargin(const LayoutState&, const Box&, Optional<LayoutUnit> usedHeight = { });
static WidthAndMargin inFlowWidthAndMargin(const LayoutState&, const Box&, Optional<LayoutUnit> usedWidth = { });
static Point staticPosition(const LayoutState&, const Box&);
static bool instrinsicWidthConstraintsNeedChildrenWidth(const Box&);
static InstrinsicWidthConstraints instrinsicWidthConstraints(const LayoutState&, const Box&);
static LayoutUnit estimatedMarginBefore(const LayoutState&, const Box&);
static LayoutUnit estimatedMarginAfter(const LayoutState&, const Box&);
private:
static HeightAndMargin inFlowNonReplacedHeightAndMargin(const LayoutState&, const Box&, Optional<LayoutUnit> usedHeight = { });
static WidthAndMargin inFlowNonReplacedWidthAndMargin(const LayoutState&, const Box&, Optional<LayoutUnit> usedWidth = { });
static WidthAndMargin inFlowReplacedWidthAndMargin(const LayoutState&, const Box&, Optional<LayoutUnit> usedWidth = { });
static Point staticPositionForOutOfFlowPositioned(const LayoutState&, const Box&);
};
class MarginCollapse {
public:
static LayoutUnit marginBefore(const LayoutState&, const Box&);
static LayoutUnit marginAfter(const LayoutState&, const Box&);
static bool marginBeforeCollapsesWithParentMarginAfter(const LayoutState&, const Box&);
static bool marginAfterCollapsesWithParentMarginAfter(const LayoutState&, const Box&);
private:
static LayoutUnit collapsedMarginAfterFromLastChild(const LayoutState&, const Box&);
static LayoutUnit nonCollapsedMarginAfter(const LayoutState&, const Box&);
static LayoutUnit computedNonCollapsedMarginBefore(const LayoutState&, const Box&);
static LayoutUnit computedNonCollapsedMarginAfter(const LayoutState&, const Box&);
static LayoutUnit collapsedMarginBeforeFromFirstChild(const LayoutState&, const Box&);
static LayoutUnit nonCollapsedMarginBefore(const LayoutState&, const Box&);
static bool marginBeforeCollapsesWithParentMarginBefore(const LayoutState&, const Box&);
static bool marginBeforeCollapsesWithPreviousSibling(const Box&);
static bool marginAfterCollapsesWithNextSibling(const Box&);
static bool marginAfterCollapsesWithSiblingMarginBeforeWithClearance(const LayoutState&, const Box&);
static bool marginAfterCollapsesWithParentMarginBefore(const LayoutState&, const Box&);
static bool marginsCollapseThrough(const LayoutState&, const Box&);
};
class Quirks {
public:
static bool needsStretching(const LayoutState&, const Box&);
static HeightAndMargin stretchedHeight(const LayoutState&, const Box&, HeightAndMargin);
static bool shouldIgnoreMarginBefore(const LayoutState&, const Box&);
};
};
}
}
#endif