7c9e29e0bd5609cfbe28f28479650ec2f8bd336b
[WebKit-https.git] / Source / WebCore / layout / inlineformatting / InlineFormattingContextGeometry.cpp
1 /*
2  * Copyright (C) 2018 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "InlineFormattingContext.h"
28
29 #if ENABLE(LAYOUT_FORMATTING_CONTEXT)
30
31 #include "FormattingContext.h"
32 #include "InlineFormattingState.h"
33 #include "LayoutBox.h"
34 #include "LayoutContainer.h"
35 #include "LayoutFormattingState.h"
36
37 namespace WebCore {
38 namespace Layout {
39
40 WidthAndMargin InlineFormattingContext::Geometry::inlineBlockWidthAndMargin(LayoutState& layoutState, const Box& formattingContextRoot)
41 {
42     ASSERT(formattingContextRoot.isInFlow());
43
44     // 10.3.10 'Inline-block', replaced elements in normal flow
45
46     // Exactly as inline replaced elements.
47     if (formattingContextRoot.replaced())
48         return inlineReplacedWidthAndMargin(layoutState, formattingContextRoot);
49
50     // 10.3.9 'Inline-block', non-replaced elements in normal flow
51
52     // If 'width' is 'auto', the used value is the shrink-to-fit width as for floating elements.
53     // A computed value of 'auto' for 'margin-left' or 'margin-right' becomes a used value of '0'.
54     auto& containingBlock = *formattingContextRoot.containingBlock();
55     auto containingBlockWidth = layoutState.displayBoxForLayoutBox(containingBlock).contentBoxWidth();
56     // #1
57     auto width = computedValueIfNotAuto(formattingContextRoot.style().logicalWidth(), containingBlockWidth);
58     if (!width)
59         width = shrinkToFitWidth(layoutState, formattingContextRoot);
60
61     // #2
62     auto margin = computedNonCollapsedHorizontalMarginValue(layoutState, formattingContextRoot);
63
64     return WidthAndMargin { *width, margin, margin };
65 }
66
67 HeightAndMargin InlineFormattingContext::Geometry::inlineBlockHeightAndMargin(const LayoutState& layoutState, const Box& layoutBox)
68 {
69     ASSERT(layoutBox.isInFlow());
70
71     // 10.6.2 Inline replaced elements, block-level replaced elements in normal flow, 'inline-block' replaced elements in normal flow and floating replaced elements
72     if (layoutBox.replaced())
73         return inlineReplacedHeightAndMargin(layoutState, layoutBox);
74
75     // 10.6.6 Complicated cases
76     // - 'Inline-block', non-replaced elements.
77     return complicatedCases(layoutState, layoutBox);
78 }
79
80 }
81 }
82
83 #endif