[Media] Allow access to MediaElement id from MediaPlayerPrivate
[WebKit-https.git] / Source / WebCore / layout / inlineformatting / InlineFormattingContext.h
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 #pragma once
27
28 #if ENABLE(LAYOUT_FORMATTING_CONTEXT)
29
30 #include "FormattingContext.h"
31 #include "InlineLineBuilder.h"
32 #include <wtf/IsoMalloc.h>
33
34 namespace WebCore {
35 namespace Layout {
36
37 class InlineFormattingState;
38 class InvalidationState;
39 class LineBox;
40
41 // This class implements the layout logic for inline formatting contexts.
42 // https://www.w3.org/TR/CSS22/visuren.html#inline-formatting
43 class InlineFormattingContext final : public FormattingContext {
44     WTF_MAKE_ISO_ALLOCATED(InlineFormattingContext);
45 public:
46     InlineFormattingContext(const ContainerBox& formattingContextRoot, InlineFormattingState&);
47     void layoutInFlowContent(InvalidationState&, const ConstraintsForInFlowContent&) override;
48     LayoutUnit usedContentHeight() const override;
49
50     class Quirks : public FormattingContext::Quirks {
51     public:
52         InlineLayoutUnit initialLineHeight() const;
53         bool hasSoftWrapOpportunityAtImage() const;
54         bool inlineLevelBoxAffectsLineBox(const LineBox::InlineLevelBox&, const LineBox&) const;
55
56     private:
57         friend class InlineFormattingContext;
58         Quirks(const InlineFormattingContext&);
59
60         const InlineFormattingContext& formattingContext() const { return downcast<InlineFormattingContext>(FormattingContext::Quirks::formattingContext()); }
61
62     };
63     InlineFormattingContext::Quirks quirks() const { return Quirks(*this); }
64
65     const InlineFormattingState& formattingState() const { return downcast<InlineFormattingState>(FormattingContext::formattingState()); }
66     InlineFormattingState& formattingState() { return downcast<InlineFormattingState>(FormattingContext::formattingState()); }
67
68     void lineLayoutForIntergration(InvalidationState&, const ConstraintsForInFlowContent&);
69
70 private:
71     IntrinsicWidthConstraints computedIntrinsicWidthConstraints() override;
72
73     class Geometry : public FormattingContext::Geometry {
74     public:
75         LineBox lineBoxForLineContent(const LineBuilder::LineContent&);
76         InlineLayoutUnit logicalTopForNextLine(const LineBuilder::LineContent&, InlineLayoutUnit previousLineLogicalBottom, const FloatingContext&) const;
77
78         ContentHeightAndMargin inlineBlockContentHeightAndMargin(const Box&, const HorizontalConstraints&, const OverriddenVerticalValues&) const;
79         ContentWidthAndMargin inlineBlockContentWidthAndMargin(const Box&, const HorizontalConstraints&, const OverriddenHorizontalValues&);
80
81     private:
82         friend class InlineFormattingContext;
83         Geometry(const InlineFormattingContext&);
84
85         const InlineFormattingContext& formattingContext() const { return downcast<InlineFormattingContext>(FormattingContext::Geometry::formattingContext()); }
86
87     };
88     InlineFormattingContext::Geometry geometry() const { return Geometry(*this); }
89
90     void lineLayout(InlineItems&, LineBuilder::InlineItemRange, const ConstraintsForInFlowContent&);
91
92     void computeIntrinsicWidthForFormattingRoot(const Box&);
93     InlineLayoutUnit computedIntrinsicWidthForConstraint(InlineLayoutUnit availableWidth) const;
94
95     void computeHorizontalMargin(const Box&, const HorizontalConstraints&);
96     void computeHeightAndMargin(const Box&, const HorizontalConstraints&);
97     void computeWidthAndMargin(const Box&, const HorizontalConstraints&);
98
99     void collectInlineContentIfNeeded();
100     InlineRect computeGeometryForLineContent(const LineBuilder::LineContent&, const HorizontalConstraints&);
101     void invalidateFormattingState(const InvalidationState&);
102 };
103
104 inline InlineFormattingContext::Geometry::Geometry(const InlineFormattingContext& inlineFormattingContext)
105     : FormattingContext::Geometry(inlineFormattingContext)
106 {
107 }
108
109 inline InlineFormattingContext::Quirks::Quirks(const InlineFormattingContext& inlineFormattingContext)
110     : FormattingContext::Quirks(inlineFormattingContext)
111 {
112 }
113
114 }
115 }
116
117 SPECIALIZE_TYPE_TRAITS_LAYOUT_FORMATTING_CONTEXT(InlineFormattingContext, isInlineFormattingContext())
118
119 #endif