/* * Copyright (C) 1999 Lars Knoll ([email protected]) * (C) 1999 Antti Koivisto ([email protected]) * Copyright (C) 2003, 2006, 2007 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * */ #ifdef UNSAFE_BUFFERS_BUILD // TODO(crbug.com/351564777): Remove this and convert code to safer constructs. #pragma allow_unsafe_buffers #endif #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LAYOUT_BOX_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LAYOUT_BOX_H_ #include <memory> #include "base/check_op.h" #include "base/dcheck_is_on.h" #include "base/gtest_prod_util.h" #include "base/notreached.h" #include "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom-blink-forward.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/layout/geometry/physical_rect.h" #include "third_party/blink/renderer/core/layout/layout_box_model_object.h" #include "third_party/blink/renderer/core/layout/layout_object.h" #include "third_party/blink/renderer/core/layout/min_max_sizes.h" #include "third_party/blink/renderer/core/layout/min_max_sizes_cache.h" #include "third_party/blink/renderer/core/layout/overflow_model.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/scroll/scrollbar_theme.h" #include "third_party/blink/renderer/core/style/style_overflow_clip_margin.h" #include "third_party/blink/renderer/platform/graphics/overlay_scrollbar_clip_behavior.h" #include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_set.h" namespace blink { class AnchorPositionScrollData; class BlockBreakToken; class ColumnSpannerPath; class ConstraintSpace; class CustomLayoutChild; class EarlyBreak; class Element; class LayoutMultiColumnSpannerPlaceholder; class LayoutResult; class MeasureCache; class PhysicalBoxFragment; class ShapeOutsideInfo; class WritingModeConverter; enum class LayoutCacheStatus; struct FragmentGeometry; struct NonOverflowingScrollRange; struct PaintInfo; struct PhysicalBoxStrut; enum BackgroundRectType { … }; enum ShouldClampToContentBox { … }; enum ShouldIncludeScrollbarGutter { … }; struct LayoutBoxRareData final : public GarbageCollected<LayoutBoxRareData> { … }; // LayoutBox implements the full CSS box model. // // LayoutBoxModelObject only introduces some abstractions for LayoutInline and // LayoutBox. The logic for the model is in LayoutBox, e.g. the storage for the // rectangle and offset forming the CSS box (frame_location_ and frame_size_) // and the getters for the different boxes. // // LayoutBox is also the uppermost class to support scrollbars, however the // logic is delegated to PaintLayerScrollableArea. // Per the CSS specification, scrollbars should "be inserted between the inner // border edge and the outer padding edge". // (see http://www.w3.org/TR/CSS21/visufx.html#overflow) // Also the scrollbar width / height are removed from the content box. Taking // the following example: // // <!DOCTYPE html> // <style> // ::-webkit-scrollbar { // /* Force non-overlay scrollbars */ // width: 10px; // height: 20px; // } // </style> // <div style="overflow:scroll; width: 100px; height: 100px"> // // The <div>'s content box is not 100x100 as specified in the style but 90x80 as // we remove the scrollbars from the box. // // The presence of scrollbars is determined by the 'overflow' property and can // be conditioned on having scrollable overflow (see OverflowModel for more // details on how we track overflow). // // There are 2 types of scrollbars: // - non-overlay scrollbars take space from the content box. // - overlay scrollbars don't and just overlay hang off from the border box, // potentially overlapping with the padding box's content. // For more details on scrollbars, see PaintLayerScrollableArea. // // // ***** THE BOX MODEL ***** // The CSS box model is based on a series of nested boxes: // http://www.w3.org/TR/CSS21/box.html // // |----------------------------------------------------| // | | // | margin-top | // | | // | |-----------------------------------------| | // | | | | // | | border-top | | // | | | | // | | |--------------------------|----| | | // | | | | | | | // | | | padding-top |####| | | // | | | |####| | | // | | | |----------------| |####| | | // | | | | | | | | | // | ML | BL | PL | content box | PR | SW | BR | MR | // | | | | | | | | | // | | | |----------------| | | | | // | | | | | | | // | | | padding-bottom | | | | // | | |--------------------------|----| | | // | | | ####| | | | // | | | scrollbar height ####| SC | | | // | | | ####| | | | // | | |-------------------------------| | | // | | | | // | | border-bottom | | // | | | | // | |-----------------------------------------| | // | | // | margin-bottom | // | | // |----------------------------------------------------| // // BL = border-left // BR = border-right // ML = margin-left // MR = margin-right // PL = padding-left // PR = padding-right // SC = scroll corner (contains UI for resizing (see the 'resize' property) // SW = scrollbar width // // Note that the vertical scrollbar (if existing) will be on the left in // right-to-left direction and horizontal writing-mode. The horizontal scrollbar // (if existing) is always at the bottom. // // Those are just the boxes from the CSS model. Extra boxes are tracked by Blink // (e.g. the overflows). Thus it is paramount to know which box a function is // manipulating. Also of critical importance is the coordinate system used (see // the COORDINATE SYSTEMS section in LayoutBoxModelObject). class CORE_EXPORT LayoutBox : public LayoutBoxModelObject { … }; template <> struct DowncastTraits<LayoutBox> { … }; inline LayoutBox* LayoutBox::PreviousSiblingBox() const { … } inline LayoutBox* LayoutBox::NextSiblingBox() const { … } inline LayoutBox* LayoutBox::ParentBox() const { … } inline LayoutBox* LayoutBox::FirstChildBox() const { … } inline LayoutBox* LayoutBox::LastChildBox() const { … } inline LayoutBox* LayoutBox::PreviousSiblingMultiColumnBox() const { … } inline LayoutBox* LayoutBox::NextSiblingMultiColumnBox() const { … } inline wtf_size_t LayoutBox::FirstInlineFragmentItemIndex() const { … } } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LAYOUT_BOX_H_