diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 2856fef674..c1265a26fb 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -266,6 +266,7 @@ set(SOURCES Layout/FlexFormattingContext.cpp Layout/FormattingContext.cpp Layout/FrameBox.cpp + Layout/GridFormattingContext.cpp Layout/ImageBox.cpp Layout/InitialContainingBlock.cpp Layout/InlineFormattingContext.cpp diff --git a/Userland/Libraries/LibWeb/DOM/Element.cpp b/Userland/Libraries/LibWeb/DOM/Element.cpp index 2b9e8262ad..988ce36726 100644 --- a/Userland/Libraries/LibWeb/DOM/Element.cpp +++ b/Userland/Libraries/LibWeb/DOM/Element.cpp @@ -287,7 +287,7 @@ RefPtr Element::create_layout_node_for_display_type(DOM::Document& return adopt_ref(*new Layout::InlineNode(document, element, move(style))); } - if (display.is_flow_inside() || display.is_flow_root_inside() || display.is_flex_inside()) + if (display.is_flow_inside() || display.is_flow_root_inside() || display.is_flex_inside() || display.is_grid_inside()) return adopt_ref(*new Layout::BlockContainer(document, element, move(style))); TODO(); diff --git a/Userland/Libraries/LibWeb/Layout/FormattingContext.cpp b/Userland/Libraries/LibWeb/Layout/FormattingContext.cpp index a8e7f264a8..e0932e97ca 100644 --- a/Userland/Libraries/LibWeb/Layout/FormattingContext.cpp +++ b/Userland/Libraries/LibWeb/Layout/FormattingContext.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -74,12 +75,16 @@ bool FormattingContext::creates_block_formatting_context(Box const& box) if (!display.is_flex_inside()) return true; } + if (parent_display.is_grid_inside()) { + if (!display.is_grid_inside()) { + return true; + } + } } // FIXME: table-caption // FIXME: anonymous table cells // FIXME: Elements with contain: layout, content, or paint. - // FIXME: grid // FIXME: multicol // FIXME: column-span: all return false; @@ -120,6 +125,10 @@ OwnPtr FormattingContext::create_independent_formatting_conte if (child_display.is_table_inside()) return make(state, verify_cast(child_box), this); + if (child_display.is_grid_inside()) { + return make(state, verify_cast(child_box), this); + } + VERIFY(is_block_formatting_context()); VERIFY(!child_box.children_are_inline()); diff --git a/Userland/Libraries/LibWeb/Layout/GridFormattingContext.cpp b/Userland/Libraries/LibWeb/Layout/GridFormattingContext.cpp new file mode 100644 index 0000000000..8f13db2e4b --- /dev/null +++ b/Userland/Libraries/LibWeb/Layout/GridFormattingContext.cpp @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2022, Martin Falisse + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include + +namespace Web::Layout { + +GridFormattingContext::GridFormattingContext(LayoutState& state, BlockContainer const& block_container, FormattingContext* parent) + : BlockFormattingContext(state, block_container, parent) +{ +} + +GridFormattingContext::~GridFormattingContext() = default; + +void GridFormattingContext::run(Box const& box, LayoutMode) +{ + box.for_each_child_of_type([&](Box& child_box) { + (void)layout_inside(child_box, LayoutMode::Normal); + }); +} + +} diff --git a/Userland/Libraries/LibWeb/Layout/GridFormattingContext.h b/Userland/Libraries/LibWeb/Layout/GridFormattingContext.h new file mode 100644 index 0000000000..c0bf6ad72e --- /dev/null +++ b/Userland/Libraries/LibWeb/Layout/GridFormattingContext.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2022, Martin Falisse + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include + +namespace Web::Layout { + +class GridFormattingContext final : public BlockFormattingContext { +public: + explicit GridFormattingContext(LayoutState&, BlockContainer const&, FormattingContext* parent); + ~GridFormattingContext(); + + virtual void run(Box const&, LayoutMode) override; +}; + +}