/* * Copyright (c) 2018-2020, Andreas Kling * Copyright (c) 2021-2022, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include #include namespace Web::Layout { GC_DEFINE_ALLOCATOR(Box); Box::Box(DOM::Document& document, DOM::Node* node, GC::Ref style) : NodeWithStyleAndBoxModelMetrics(document, node, move(style)) { } Box::Box(DOM::Document& document, DOM::Node* node, NonnullOwnPtr computed_values) : NodeWithStyleAndBoxModelMetrics(document, node, move(computed_values)) { } Box::~Box() { } CSS::SizeWithAspectRatio Box::auto_content_box_size() const { // https://drafts.csswg.org/css-contain-2/#containment-size // Replaced elements must be treated as having a natural width and height of 0 and no natural aspect // ratio. if (has_size_containment()) return { 0, 0, {} }; return compute_auto_content_box_size(); } void Box::visit_edges(Cell::Visitor& visitor) { Base::visit_edges(visitor); visitor.visit(m_contained_abspos_children); } GC::Ptr Box::create_paintable() const { return Painting::PaintableBox::create(*this); } Painting::PaintableBox* Box::paintable_box() { return static_cast(Node::first_paintable()); } Painting::PaintableBox const* Box::paintable_box() const { return static_cast(Node::first_paintable()); } Optional Box::preferred_aspect_ratio() const { auto const& computed_aspect_ratio = computed_values().aspect_ratio(); // https://www.w3.org/TR/css-contain-2/#containment-size if (!has_size_containment() && computed_aspect_ratio.use_natural_aspect_ratio_if_available) { if (auto auto_size = auto_content_box_size(); auto_size.has_aspect_ratio()) return auto_size.aspect_ratio; } if (!computed_aspect_ratio.preferred_ratio.has_value()) return {}; auto ratio = computed_aspect_ratio.preferred_ratio.value(); if (ratio.is_degenerate()) return {}; auto fraction = CSSPixelFraction(ratio.numerator(), ratio.denominator()); // ratio.is_degenerate() operates on doubles while CSSPixelFraction uses CSSPixels, so we need to check again here. if (fraction == 0) return {}; return fraction; } }