Kill InlineFlowBox::rendererLineBoxes().
[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     virtual 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     RenderRegion* containingRegion() const;
68     void setContainingRegion(RenderRegion*);
69
70     LayoutUnit selectionTop() const;
71     LayoutUnit selectionBottom() const;
72     LayoutUnit selectionHeight() const { return std::max<LayoutUnit>(0, selectionBottom() - selectionTop()); }
73
74     LayoutUnit selectionTopAdjustedForPrecedingBlock() const;
75     LayoutUnit selectionHeightAdjustedForPrecedingBlock() const { return std::max<LayoutUnit>(0, selectionBottom() - selectionTopAdjustedForPrecedingBlock()); }
76
77     int blockDirectionPointInLine() const;
78
79     LayoutUnit alignBoxesInBlockDirection(LayoutUnit heightOfBlock, GlyphOverflowAndFallbackFontsMap&, VerticalPositionCache&);
80     void setLineTopBottomPositions(LayoutUnit top, LayoutUnit bottom, LayoutUnit topWithLeading, LayoutUnit bottomWithLeading)
81     { 
82         m_lineTop = top; 
83         m_lineBottom = bottom;
84         m_lineTopWithLeading = topWithLeading;
85         m_lineBottomWithLeading = bottomWithLeading;
86     }
87
88     RenderObject* lineBreakObj() const { return m_lineBreakObj; }
89     BidiStatus lineBreakBidiStatus() const;
90     void setLineBreakInfo(RenderObject*, unsigned breakPos, const BidiStatus&);
91
92     unsigned lineBreakPos() const { return m_lineBreakPos; }
93     void setLineBreakPos(unsigned p) { m_lineBreakPos = p; }
94
95     using InlineBox::endsWithBreak;
96     using InlineBox::setEndsWithBreak;
97
98     void childRemoved(InlineBox* box);
99
100     bool lineCanAccommodateEllipsis(bool ltr, int blockEdge, int lineBoxEdge, int ellipsisWidth);
101     // Return the truncatedWidth, the width of the truncated text + ellipsis.
102     float placeEllipsis(const AtomicString& ellipsisStr, bool ltr, float blockLeftEdge, float blockRightEdge, float ellipsisWidth, InlineBox* markupBox = 0);
103     // Return the position of the EllipsisBox or -1.
104     virtual float placeEllipsisBox(bool ltr, float blockLeftEdge, float blockRightEdge, float ellipsisWidth, float &truncatedWidth, bool& foundBox) OVERRIDE FINAL;
105
106     using InlineBox::hasEllipsisBox;
107     EllipsisBox* ellipsisBox() const;
108
109     void paintEllipsisBox(PaintInfo&, const LayoutPoint&, LayoutUnit lineTop, LayoutUnit lineBottom) const;
110
111     virtual void clearTruncation() OVERRIDE FINAL;
112
113     bool isHyphenated() const;
114
115     virtual int baselinePosition(FontBaseline baselineType) const OVERRIDE FINAL;
116     virtual LayoutUnit lineHeight() const OVERRIDE FINAL;
117
118 #if PLATFORM(MAC)
119     void addHighlightOverflow();
120     void paintCustomHighlight(PaintInfo&, const LayoutPoint&, const AtomicString& highlightType);
121 #endif
122
123     virtual void paint(PaintInfo&, const LayoutPoint&, LayoutUnit lineTop, LayoutUnit lineBottom) OVERRIDE;
124     virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, LayoutUnit lineTop, LayoutUnit lineBottom) OVERRIDE FINAL;
125
126     using InlineBox::hasSelectedChildren;
127     using InlineBox::setHasSelectedChildren;
128
129     virtual RenderObject::SelectionState selectionState() OVERRIDE FINAL;
130     InlineBox* firstSelectedBox();
131     InlineBox* lastSelectedBox();
132
133     GapRects lineSelectionGap(RenderBlock& rootBlock, const LayoutPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock,
134         LayoutUnit selTop, LayoutUnit selHeight, const LogicalSelectionOffsetCaches&, const PaintInfo*);
135
136     IntRect computeCaretRect(float logicalLeftPosition, unsigned caretWidth, LayoutUnit* extraWidthToEndOfLine) const;
137
138     InlineBox* closestLeafChildForPoint(const IntPoint&, bool onlyEditableLeaves);
139     InlineBox* closestLeafChildForLogicalLeftPosition(int, bool onlyEditableLeaves = false);
140
141     void appendFloat(RenderBox& floatingBox)
142     {
143         ASSERT(!isDirty());
144         if (m_floats)
145             m_floats->append(&floatingBox);
146         else
147             m_floats = adoptPtr(new Vector<RenderBox*>(1, &floatingBox));
148     }
149
150     Vector<RenderBox*>* floatsPtr() { ASSERT(!isDirty()); return m_floats.get(); }
151
152     virtual void extractLineBoxFromRenderObject() OVERRIDE FINAL;
153     virtual void attachLineBoxToRenderObject() OVERRIDE FINAL;
154     virtual void removeLineBoxFromRenderObject() OVERRIDE FINAL;
155     
156     FontBaseline baselineType() const { return static_cast<FontBaseline>(m_baselineType); }
157
158     bool hasAnnotationsBefore() const { return m_hasAnnotationsBefore; }
159     bool hasAnnotationsAfter() const { return m_hasAnnotationsAfter; }
160
161     LayoutRect paddedLayoutOverflowRect(LayoutUnit endPadding) const;
162
163     void ascentAndDescentForBox(InlineBox*, GlyphOverflowAndFallbackFontsMap&, int& ascent, int& descent, bool& affectsAscent, bool& affectsDescent) const;
164     LayoutUnit verticalPositionForBox(InlineBox*, VerticalPositionCache&);
165     bool includeLeadingForBox(InlineBox*) const;
166     bool includeFontForBox(InlineBox*) const;
167     bool includeGlyphsForBox(InlineBox*) const;
168     bool includeMarginForBox(InlineBox*) const;
169     bool fitsToGlyphs() const;
170     bool includesRootLineBoxFontOrLeading() const;
171     
172     LayoutUnit logicalTopVisualOverflow() const
173     {
174         return InlineFlowBox::logicalTopVisualOverflow(lineTop());
175     }
176     LayoutUnit logicalBottomVisualOverflow() const
177     {
178         return InlineFlowBox::logicalBottomVisualOverflow(lineBottom());
179     }
180     LayoutUnit logicalTopLayoutOverflow() const
181     {
182         return InlineFlowBox::logicalTopLayoutOverflow(lineTop());
183     }
184     LayoutUnit logicalBottomLayoutOverflow() const
185     {
186         return InlineFlowBox::logicalBottomLayoutOverflow(lineBottom());
187     }
188
189 #if ENABLE(CSS3_TEXT_DECORATION)
190     // Used to calculate the underline offset for TextUnderlinePositionUnder.
191     float maxLogicalTop() const;
192 #endif
193
194     Node* getLogicalStartBoxWithNode(InlineBox*&) const;
195     Node* getLogicalEndBoxWithNode(InlineBox*&) const;
196
197 #ifndef NDEBUG
198     virtual const char* boxName() const OVERRIDE;
199 #endif
200 private:
201     virtual bool isRootInlineBox() const OVERRIDE FINAL { return true; }
202
203     LayoutUnit lineSnapAdjustment(LayoutUnit delta = 0) const;
204
205     LayoutUnit beforeAnnotationsAdjustment() const;
206
207     // This folds into the padding at the end of InlineFlowBox on 64-bit.
208     unsigned m_lineBreakPos;
209
210     // Where this line ended.  The exact object and the position within that object are stored so that
211     // we can create an InlineIterator beginning just after the end of this line.
212     RenderObject* m_lineBreakObj;
213     RefPtr<BidiContext> m_lineBreakContext;
214
215     LayoutUnit m_lineTop;
216     LayoutUnit m_lineBottom;
217
218     LayoutUnit m_lineTopWithLeading;
219     LayoutUnit m_lineBottomWithLeading;
220
221     // It should not be assumed the |containingRegion| is always valid.
222     // It can also be nullptr if the flow has no region chain.
223     RenderRegion* m_containingRegion;
224
225     LayoutUnit m_paginationStrut;
226     LayoutUnit m_paginatedLineWidth;
227
228     // Floats hanging off the line are pushed into this vector during layout. It is only
229     // good for as long as the line has not been marked dirty.
230     OwnPtr<Vector<RenderBox*>> m_floats;
231 };
232
233 INLINE_BOX_OBJECT_TYPE_CASTS(RootInlineBox, isRootInlineBox())
234
235 inline RootInlineBox* RootInlineBox::nextRootBox() const
236 {
237     return toRootInlineBox(m_nextLineBox);
238 }
239
240 inline RootInlineBox* RootInlineBox::prevRootBox() const
241 {
242     return toRootInlineBox(m_prevLineBox);
243 }
244
245 } // namespace WebCore
246
247 #endif // RootInlineBox_h