#include "config.h"
#include "LayoutContext.h"
#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
#include "BlockFormattingContext.h"
#include "BlockFormattingState.h"
#include "FlexFormattingContext.h"
#include "FlexFormattingState.h"
#include "InlineFormattingContext.h"
#include "InlineFormattingState.h"
#include "InvalidationContext.h"
#include "InvalidationState.h"
#include "LayoutBox.h"
#include "LayoutBoxGeometry.h"
#include "LayoutContainerBox.h"
#include "LayoutPhase.h"
#include "LayoutTreeBuilder.h"
#include "RenderStyleConstants.h"
#include "RenderView.h"
#include "RuntimeEnabledFeatures.h"
#include "TableFormattingContext.h"
#include "TableFormattingState.h"
#include "TableWrapperBlockFormattingContext.h"
#include <wtf/IsoMallocInlines.h>
namespace WebCore {
namespace Layout {
WTF_MAKE_ISO_ALLOCATED_IMPL(LayoutContext);
LayoutContext::LayoutContext(LayoutState& layoutState)
: m_layoutState(layoutState)
{
}
void LayoutContext::layout(const LayoutSize& rootContentBoxSize, InvalidationState& invalidationState)
{
auto& boxGeometry = layoutState().geometryForRootBox();
boxGeometry.setHorizontalMargin({ });
boxGeometry.setVerticalMargin({ });
boxGeometry.setBorder({ });
boxGeometry.setPadding({ });
boxGeometry.setLogicalTopLeft({ });
boxGeometry.setContentBoxHeight(rootContentBoxSize.height());
boxGeometry.setContentBoxWidth(rootContentBoxSize.width());
layoutWithPreparedRootGeometry(invalidationState);
}
void LayoutContext::layoutWithPreparedRootGeometry(InvalidationState& invalidationState)
{
PhaseScope scope(Phase::Type::Layout);
auto& formattingContextRootsForLayout = invalidationState.formattingContextRoots();
if (formattingContextRootsForLayout.computesEmpty())
return layoutFormattingContextSubtree(m_layoutState.root(), invalidationState);
for (auto& formattingContextRoot : formattingContextRootsForLayout)
layoutFormattingContextSubtree(formattingContextRoot, invalidationState);
}
void LayoutContext::layoutFormattingContextSubtree(const ContainerBox& formattingContextRoot, InvalidationState& invalidationState)
{
RELEASE_ASSERT(formattingContextRoot.establishesFormattingContext());
if (!formattingContextRoot.hasChild())
return;
auto formattingContext = createFormattingContext(formattingContextRoot, layoutState());
auto& boxGeometry = layoutState().geometryForBox(formattingContextRoot);
if (formattingContextRoot.hasInFlowOrFloatingChild()) {
auto constraintsForInFlowContent = FormattingContext::ConstraintsForInFlowContent { { boxGeometry.contentBoxLeft(), boxGeometry.contentBoxWidth() }, { boxGeometry.contentBoxTop(), { } } };
formattingContext->layoutInFlowContent(invalidationState, constraintsForInFlowContent);
}
{
auto constraints = FormattingContext::ConstraintsForOutOfFlowContent { { boxGeometry.paddingBoxLeft(), boxGeometry.paddingBoxWidth() },
{ boxGeometry.paddingBoxTop(), boxGeometry.paddingBoxHeight() }, boxGeometry.contentBoxWidth() };
formattingContext->layoutOutOfFlowContent(invalidationState, constraints);
}
}
std::unique_ptr<FormattingContext> LayoutContext::createFormattingContext(const ContainerBox& formattingContextRoot, LayoutState& layoutState)
{
ASSERT(formattingContextRoot.establishesFormattingContext());
if (formattingContextRoot.establishesInlineFormattingContext()) {
auto& inlineFormattingState = layoutState.ensureInlineFormattingState(formattingContextRoot);
return makeUnique<InlineFormattingContext>(formattingContextRoot, inlineFormattingState);
}
if (formattingContextRoot.establishesBlockFormattingContext()) {
ASSERT(!formattingContextRoot.establishesInlineFormattingContext());
auto& blockFormattingState = layoutState.ensureBlockFormattingState(formattingContextRoot);
if (formattingContextRoot.isTableWrapperBox())
return makeUnique<TableWrapperBlockFormattingContext>(formattingContextRoot, blockFormattingState);
return makeUnique<BlockFormattingContext>(formattingContextRoot, blockFormattingState);
}
if (formattingContextRoot.establishesFlexFormattingContext()) {
auto& flexFormattingState = layoutState.ensureFlexFormattingState(formattingContextRoot);
return makeUnique<FlexFormattingContext>(formattingContextRoot, flexFormattingState);
}
if (formattingContextRoot.establishesTableFormattingContext()) {
auto& tableFormattingState = layoutState.ensureTableFormattingState(formattingContextRoot);
return makeUnique<TableFormattingContext>(formattingContextRoot, tableFormattingState);
}
CRASH();
}
}
}
#endif