Remove "virtual" from all lines that have both "virtual" and "override".
[WebKit-https.git] / Source / WebCore / rendering / RootInlineBox.h
1 /*
2  * Copyright (C) 2003, 2006, 2007, 2008, 2013 Apple Inc. All rights reserved.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  *
19  */
20
21 #ifndef RootInlineBox_h
22 #define RootInlineBox_h
23
24 #include "BidiContext.h"
25 #include "InlineFlowBox.h"
26
27 namespace WebCore {
28
29 class EllipsisBox;
30 class HitTestResult;
31 class LogicalSelectionOffsetCaches;
32 class RenderBlockFlow;
33 class RenderRegion;
34
35 struct BidiStatus;
36 struct GapRects;
37
38 class RootInlineBox : public InlineFlowBox {
39 public:
40     explicit RootInlineBox(RenderBlockFlow&);
41     virtual ~RootInlineBox();
42
43     RenderBlockFlow& blockFlow() const;
44
45     void detachEllipsisBox();
46
47     RootInlineBox* nextRootBox() const;
48     RootInlineBox* prevRootBox() const;
49
50     void adjustPosition(float dx, float dy) override final;
51
52     LayoutUnit lineTop() const { return m_lineTop; }
53     LayoutUnit lineBottom() const { return m_lineBottom; }
54
55     LayoutUnit lineTopWithLeading() const { return m_lineTopWithLeading; }
56     LayoutUnit lineBottomWithLeading() const { return m_lineBottomWithLeading; }
57     
58     LayoutUnit paginationStrut() const { return m_paginationStrut; }
59     void setPaginationStrut(LayoutUnit strut) { m_paginationStrut = strut; }
60
61     bool isFirstAfterPageBreak() const { return m_isFirstAfterPageBreak; }
62     void setIsFirstAfterPageBreak(bool isFirstAfterPageBreak) { m_isFirstAfterPageBreak = isFirstAfterPageBreak; }
63
64     LayoutUnit paginatedLineWidth() const { return m_paginatedLineWidth; }
65     void setPaginatedLineWidth(LayoutUnit width) { m_paginatedLineWidth = width; }
66
67     // It should not be assumed the containingRegion() is always valid.
68     // It can also be nullptr if the flow has no region chain.
69     RenderRegion* containingRegion() const;
70     void setContainingRegion(RenderRegion&);
71     void clearContainingRegion();
72
73     LayoutUnit selectionTop() const;
74     LayoutUnit selectionBottom() const;
75     LayoutUnit selectionHeight() const { return std::max<LayoutUnit>(0, selectionBottom() - selectionTop()); }
76
77     LayoutUnit selectionTopAdjustedForPrecedingBlock() const;
78     LayoutUnit selectionHeightAdjustedForPrecedingBlock() const { return std::max<LayoutUnit>(0, selectionBottom() - selectionTopAdjustedForPrecedingBlock()); }
79
80     int blockDirectionPointInLine() const;
81
82     LayoutUnit alignBoxesInBlockDirection(LayoutUnit heightOfBlock, GlyphOverflowAndFallbackFontsMap&, VerticalPositionCache&);
83     void setLineTopBottomPositions(LayoutUnit top, LayoutUnit bottom, LayoutUnit topWithLeading, LayoutUnit bottomWithLeading)
84     { 
85         m_lineTop = top; 
86         m_lineBottom = bottom;
87         m_lineTopWithLeading = topWithLeading;
88         m_lineBottomWithLeading = bottomWithLeading;
89     }
90
91     RenderObject* lineBreakObj() const { return m_lineBreakObj; }
92     BidiStatus lineBreakBidiStatus() const;
93     void setLineBreakInfo(RenderObject*, unsigned breakPos, const BidiStatus&);
94
95     unsigned lineBreakPos() const { return m_lineBreakPos; }
96     void setLineBreakPos(unsigned p) { m_lineBreakPos = p; }
97
98     using InlineBox::endsWithBreak;
99     using InlineBox::setEndsWithBreak;
100
101     void childRemoved(InlineBox* box);
102
103     bool lineCanAccommodateEllipsis(bool ltr, int blockEdge, int lineBoxEdge, int ellipsisWidth);
104     // Return the truncatedWidth, the width of the truncated text + ellipsis.
105     float placeEllipsis(const AtomicString& ellipsisStr, bool ltr, float blockLeftEdge, float blockRightEdge, float ellipsisWidth, InlineBox* markupBox = nullptr);
106     // Return the position of the EllipsisBox or -1.
107     float placeEllipsisBox(bool ltr, float blockLeftEdge, float blockRightEdge, float ellipsisWidth, float &truncatedWidth, bool& foundBox) override final;
108
109     using InlineBox::hasEllipsisBox;
110     EllipsisBox* ellipsisBox() const;
111
112     void paintEllipsisBox(PaintInfo&, const LayoutPoint&, LayoutUnit lineTop, LayoutUnit lineBottom) const;
113
114     void clearTruncation() override final;
115
116     bool isHyphenated() const;
117
118     int baselinePosition(FontBaseline baselineType) const override final;
119     LayoutUnit lineHeight() const override final;
120
121     void paint(PaintInfo&, const LayoutPoint&, LayoutUnit lineTop, LayoutUnit lineBottom) override;
122     bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, LayoutUnit lineTop, LayoutUnit lineBottom, HitTestAction) override;
123
124     using InlineBox::hasSelectedChildren;
125     using InlineBox::setHasSelectedChildren;
126
127     RenderObject::SelectionState selectionState() override final;
128     InlineBox* firstSelectedBox();
129     InlineBox* lastSelectedBox();
130
131     GapRects lineSelectionGap(RenderBlock& rootBlock, const LayoutPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock,
132         LayoutUnit selTop, LayoutUnit selHeight, const LogicalSelectionOffsetCaches&, const PaintInfo*);
133
134     IntRect computeCaretRect(float logicalLeftPosition, unsigned caretWidth, LayoutUnit* extraWidthToEndOfLine) const;
135
136     InlineBox* closestLeafChildForPoint(const IntPoint&, bool onlyEditableLeaves);
137     InlineBox* closestLeafChildForLogicalLeftPosition(int, bool onlyEditableLeaves = false);
138
139     void appendFloat(RenderBox& floatingBox)
140     {
141         ASSERT(!isDirty());
142         if (m_floats)
143             m_floats->append(&floatingBox);
144         else
145             m_floats = std::make_unique<Vector<RenderBox*>>(1, &floatingBox);
146     }
147
148     void removeFloat(RenderBox& floatingBox)
149     {
150         ASSERT(m_floats);
151         ASSERT(m_floats->contains(&floatingBox));
152         m_floats->remove(m_floats->find(&floatingBox));
153     }
154
155     Vector<RenderBox*>* floatsPtr() { ASSERT(!isDirty()); return m_floats.get(); }
156
157     void extractLineBoxFromRenderObject() override final;
158     void attachLineBoxToRenderObject() override final;
159     void removeLineBoxFromRenderObject() override final;
160     
161     FontBaseline baselineType() const { return static_cast<FontBaseline>(m_baselineType); }
162
163     bool hasAnnotationsBefore() const { return m_hasAnnotationsBefore; }
164     bool hasAnnotationsAfter() const { return m_hasAnnotationsAfter; }
165
166     LayoutRect paddedLayoutOverflowRect(LayoutUnit endPadding) const;
167
168     void ascentAndDescentForBox(InlineBox&, GlyphOverflowAndFallbackFontsMap&, int& ascent, int& descent, bool& affectsAscent, bool& affectsDescent) const;
169     LayoutUnit verticalPositionForBox(InlineBox*, VerticalPositionCache&);
170     bool fitsToGlyphs() const;
171     bool includesRootLineBoxFontOrLeading() const;
172     
173     LayoutUnit logicalTopVisualOverflow() const
174     {
175         return InlineFlowBox::logicalTopVisualOverflow(lineTop());
176     }
177     LayoutUnit logicalBottomVisualOverflow() const
178     {
179         return InlineFlowBox::logicalBottomVisualOverflow(lineBottom());
180     }
181     LayoutUnit logicalTopLayoutOverflow() const
182     {
183         return InlineFlowBox::logicalTopLayoutOverflow(lineTop());
184     }
185     LayoutUnit logicalBottomLayoutOverflow() const
186     {
187         return InlineFlowBox::logicalBottomLayoutOverflow(lineBottom());
188     }
189
190     Node* getLogicalStartBoxWithNode(InlineBox*&) const;
191     Node* getLogicalEndBoxWithNode(InlineBox*&) const;
192
193 #if ENABLE(TREE_DEBUGGING)
194     const char* boxName() const override final;
195 #endif
196 private:
197     bool isRootInlineBox() const override final { return true; }
198
199     bool includeLeadingForBox(InlineBox&) const;
200     bool includeFontForBox(InlineBox&) const;
201     bool includeGlyphsForBox(InlineBox&) const;
202     bool includeInitialLetterForBox(InlineBox&) const;
203     bool includeMarginForBox(InlineBox&) const;
204
205     LayoutUnit lineSnapAdjustment(LayoutUnit delta = 0) const;
206
207     LayoutUnit beforeAnnotationsAdjustment() const;
208
209     // This folds into the padding at the end of InlineFlowBox on 64-bit.
210     unsigned m_lineBreakPos;
211
212     // Where this line ended.  The exact object and the position within that object are stored so that
213     // we can create an InlineIterator beginning just after the end of this line.
214     RenderObject* m_lineBreakObj;
215     RefPtr<BidiContext> m_lineBreakContext;
216
217     LayoutUnit m_lineTop;
218     LayoutUnit m_lineBottom;
219
220     LayoutUnit m_lineTopWithLeading;
221     LayoutUnit m_lineBottomWithLeading;
222
223     LayoutUnit m_paginationStrut;
224     LayoutUnit m_paginatedLineWidth;
225
226     // Floats hanging off the line are pushed into this vector during layout. It is only
227     // good for as long as the line has not been marked dirty.
228     std::unique_ptr<Vector<RenderBox*>> m_floats;
229 };
230
231 inline RootInlineBox* RootInlineBox::nextRootBox() const
232 {
233     return downcast<RootInlineBox>(m_nextLineBox);
234 }
235
236 inline RootInlineBox* RootInlineBox::prevRootBox() const
237 {
238     return downcast<RootInlineBox>(m_prevLineBox);
239 }
240
241 } // namespace WebCore
242
243 SPECIALIZE_TYPE_TRAITS_INLINE_BOX(RootInlineBox, isRootInlineBox())
244
245 #endif // RootInlineBox_h