Introduce RENDER_OBJECT_TYPE_CASTS to replace manual toFoo() in child render object
[WebKit-https.git] / Source / WebCore / rendering / RenderBlockFlow.h
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2007 David Smith (catfish.man@gmail.com)
5  * Copyright (C) 2003-2013,  Apple Inc. All rights reserved.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this library; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  */
22
23 #ifndef RenderBlockFlow_h
24 #define RenderBlockFlow_h
25
26 #include "RenderBlock.h"
27 #include "RenderLineBoxList.h"
28
29 namespace WebCore {
30
31 class LineBreaker;
32 class RenderNamedFlowFragment;
33
34 class RenderBlockFlow : public RenderBlock {
35 public:
36     explicit RenderBlockFlow(Element&);
37     explicit RenderBlockFlow(Document&);
38     virtual ~RenderBlockFlow();
39         
40     virtual void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) OVERRIDE;
41
42 protected:
43     virtual void insertedIntoTree() OVERRIDE;
44     virtual void willBeDestroyed() OVERRIDE;
45     
46     // This method is called at the start of layout to wipe away all of the floats in our floating objects list. It also
47     // repopulates the list with any floats that intrude from previous siblings or parents. Floats that were added by
48     // descendants are gone when this call completes and will get added back later on after the children have gotten
49     // a relayout.
50     void clearFloats();
51
52     // RenderBlockFlow always contains either lines or paragraphs. When the children are all blocks (e.g. paragraphs), we call layoutBlockChildren.
53     // When the children are are all inline (e.g., lines), we call layoutInlineChildren.
54     void layoutBlockChildren(bool relayoutChildren, LayoutUnit& maxFloatLogicalBottom);
55     void layoutInlineChildren(bool relayoutChildren, LayoutUnit& repaintLogicalTop, LayoutUnit& repaintLogicalBottom);
56     
57     // RenderBlockFlows override these methods, since they are the only class that supports margin collapsing.
58     virtual LayoutUnit collapsedMarginBefore() const OVERRIDE FINAL { return maxPositiveMarginBefore() - maxNegativeMarginBefore(); }
59     virtual LayoutUnit collapsedMarginAfter() const OVERRIDE FINAL { return maxPositiveMarginAfter() - maxNegativeMarginAfter(); }
60
61     virtual void dirtyLinesFromChangedChild(RenderObject* child) OVERRIDE FINAL { lineBoxes().dirtyLinesFromChangedChild(this, child); }
62     virtual void updateLogicalHeight() OVERRIDE;
63
64 public:
65     class MarginValues {
66     public:
67         MarginValues(LayoutUnit beforePos, LayoutUnit beforeNeg, LayoutUnit afterPos, LayoutUnit afterNeg)
68             : m_positiveMarginBefore(beforePos)
69             , m_negativeMarginBefore(beforeNeg)
70             , m_positiveMarginAfter(afterPos)
71             , m_negativeMarginAfter(afterNeg)
72         { }
73         
74         LayoutUnit positiveMarginBefore() const { return m_positiveMarginBefore; }
75         LayoutUnit negativeMarginBefore() const { return m_negativeMarginBefore; }
76         LayoutUnit positiveMarginAfter() const { return m_positiveMarginAfter; }
77         LayoutUnit negativeMarginAfter() const { return m_negativeMarginAfter; }
78         
79         void setPositiveMarginBefore(LayoutUnit pos) { m_positiveMarginBefore = pos; }
80         void setNegativeMarginBefore(LayoutUnit neg) { m_negativeMarginBefore = neg; }
81         void setPositiveMarginAfter(LayoutUnit pos) { m_positiveMarginAfter = pos; }
82         void setNegativeMarginAfter(LayoutUnit neg) { m_negativeMarginAfter = neg; }
83     
84     private:
85         LayoutUnit m_positiveMarginBefore;
86         LayoutUnit m_negativeMarginBefore;
87         LayoutUnit m_positiveMarginAfter;
88         LayoutUnit m_negativeMarginAfter;
89     };
90     MarginValues marginValuesForChild(RenderBox& child) const;
91
92     // Allocated only when some of these fields have non-default values
93     struct RenderBlockFlowRareData {
94         WTF_MAKE_NONCOPYABLE(RenderBlockFlowRareData); WTF_MAKE_FAST_ALLOCATED;
95     public:
96         RenderBlockFlowRareData(const RenderBlockFlow& block)
97             : m_margins(positiveMarginBeforeDefault(block), negativeMarginBeforeDefault(block), positiveMarginAfterDefault(block), negativeMarginAfterDefault(block))
98             , m_lineBreakToAvoidWidow(-1)
99             , m_lineGridBox(nullptr)
100             , m_renderNamedFlowFragment(nullptr)
101             , m_discardMarginBefore(false)
102             , m_discardMarginAfter(false)
103             , m_didBreakAtLineToAvoidWidow(false)
104         { 
105         }
106
107         static LayoutUnit positiveMarginBeforeDefault(const RenderBlock& block)
108         { 
109             return std::max<LayoutUnit>(block.marginBefore(), 0);
110         }
111         static LayoutUnit negativeMarginBeforeDefault(const RenderBlock& block)
112         { 
113             return std::max<LayoutUnit>(-block.marginBefore(), 0);
114         }
115         static LayoutUnit positiveMarginAfterDefault(const RenderBlock& block)
116         {
117             return std::max<LayoutUnit>(block.marginAfter(), 0);
118         }
119         static LayoutUnit negativeMarginAfterDefault(const RenderBlock& block)
120         {
121             return std::max<LayoutUnit>(-block.marginAfter(), 0);
122         }
123         
124         MarginValues m_margins;
125         int m_lineBreakToAvoidWidow;
126         RootInlineBox* m_lineGridBox;
127         RenderNamedFlowFragment* m_renderNamedFlowFragment;
128
129         bool m_discardMarginBefore : 1;
130         bool m_discardMarginAfter : 1;
131         bool m_didBreakAtLineToAvoidWidow : 1;
132     };
133
134     class MarginInfo {
135         // Collapsing flags for whether we can collapse our margins with our children's margins.
136         bool m_canCollapseWithChildren : 1;
137         bool m_canCollapseMarginBeforeWithChildren : 1;
138         bool m_canCollapseMarginAfterWithChildren : 1;
139
140         // Whether or not we are a quirky container, i.e., do we collapse away top and bottom
141         // margins in our container. Table cells and the body are the common examples. We
142         // also have a custom style property for Safari RSS to deal with TypePad blog articles.
143         bool m_quirkContainer : 1;
144
145         // This flag tracks whether we are still looking at child margins that can all collapse together at the beginning of a block.  
146         // They may or may not collapse with the top margin of the block (|m_canCollapseTopWithChildren| tells us that), but they will
147         // always be collapsing with one another. This variable can remain set to true through multiple iterations 
148         // as long as we keep encountering self-collapsing blocks.
149         bool m_atBeforeSideOfBlock : 1;
150
151         // This flag is set when we know we're examining bottom margins and we know we're at the bottom of the block.
152         bool m_atAfterSideOfBlock : 1;
153
154         // These variables are used to detect quirky margins that we need to collapse away (in table cells
155         // and in the body element).
156         bool m_hasMarginBeforeQuirk : 1;
157         bool m_hasMarginAfterQuirk : 1;
158         bool m_determinedMarginBeforeQuirk : 1;
159
160         bool m_discardMargin : 1;
161
162         // These flags track the previous maximal positive and negative margins.
163         LayoutUnit m_positiveMargin;
164         LayoutUnit m_negativeMargin;
165
166     public:
167         MarginInfo(RenderBlockFlow&, LayoutUnit beforeBorderPadding, LayoutUnit afterBorderPadding);
168
169         void setAtBeforeSideOfBlock(bool b) { m_atBeforeSideOfBlock = b; }
170         void setAtAfterSideOfBlock(bool b) { m_atAfterSideOfBlock = b; }
171         void clearMargin()
172         {
173             m_positiveMargin = 0;
174             m_negativeMargin = 0;
175         }
176         void setHasMarginBeforeQuirk(bool b) { m_hasMarginBeforeQuirk = b; }
177         void setHasMarginAfterQuirk(bool b) { m_hasMarginAfterQuirk = b; }
178         void setDeterminedMarginBeforeQuirk(bool b) { m_determinedMarginBeforeQuirk = b; }
179         void setPositiveMargin(LayoutUnit p) { ASSERT(!m_discardMargin); m_positiveMargin = p; }
180         void setNegativeMargin(LayoutUnit n) { ASSERT(!m_discardMargin); m_negativeMargin = n; }
181         void setPositiveMarginIfLarger(LayoutUnit p)
182         {
183             ASSERT(!m_discardMargin);
184             if (p > m_positiveMargin)
185                 m_positiveMargin = p;
186         }
187         void setNegativeMarginIfLarger(LayoutUnit n)
188         {
189             ASSERT(!m_discardMargin);
190             if (n > m_negativeMargin)
191                 m_negativeMargin = n;
192         }
193
194         void setMargin(LayoutUnit p, LayoutUnit n) { ASSERT(!m_discardMargin); m_positiveMargin = p; m_negativeMargin = n; }
195         void setCanCollapseMarginAfterWithChildren(bool collapse) { m_canCollapseMarginAfterWithChildren = collapse; }
196         void setDiscardMargin(bool value) { m_discardMargin = value; }
197
198         bool atBeforeSideOfBlock() const { return m_atBeforeSideOfBlock; }
199         bool canCollapseWithMarginBefore() const { return m_atBeforeSideOfBlock && m_canCollapseMarginBeforeWithChildren; }
200         bool canCollapseWithMarginAfter() const { return m_atAfterSideOfBlock && m_canCollapseMarginAfterWithChildren; }
201         bool canCollapseMarginBeforeWithChildren() const { return m_canCollapseMarginBeforeWithChildren; }
202         bool canCollapseMarginAfterWithChildren() const { return m_canCollapseMarginAfterWithChildren; }
203         bool quirkContainer() const { return m_quirkContainer; }
204         bool determinedMarginBeforeQuirk() const { return m_determinedMarginBeforeQuirk; }
205         bool hasMarginBeforeQuirk() const { return m_hasMarginBeforeQuirk; }
206         bool hasMarginAfterQuirk() const { return m_hasMarginAfterQuirk; }
207         LayoutUnit positiveMargin() const { return m_positiveMargin; }
208         LayoutUnit negativeMargin() const { return m_negativeMargin; }
209         bool discardMargin() const { return m_discardMargin; }
210         LayoutUnit margin() const { return m_positiveMargin - m_negativeMargin; }
211     };
212
213     void layoutBlockChild(RenderBox& child, MarginInfo&, LayoutUnit& previousFloatLogicalBottom, LayoutUnit& maxFloatLogicalBottom);
214     void adjustPositionedBlock(RenderBox& child, const MarginInfo&);
215     void adjustFloatingBlock(const MarginInfo&);
216
217     void setStaticInlinePositionForChild(RenderBox& child, LayoutUnit blockOffset, LayoutUnit inlinePosition);
218     void updateStaticInlinePositionForChild(RenderBox& child, LayoutUnit logicalTop);
219
220     LayoutUnit collapseMargins(RenderBox& child, MarginInfo&);
221     LayoutUnit clearFloatsIfNeeded(RenderBox& child, MarginInfo&, LayoutUnit oldTopPosMargin, LayoutUnit oldTopNegMargin, LayoutUnit yPos);
222     LayoutUnit estimateLogicalTopPosition(RenderBox& child, const MarginInfo&, LayoutUnit& estimateWithoutPagination);
223     void marginBeforeEstimateForChild(RenderBox&, LayoutUnit&, LayoutUnit&, bool&) const;
224     void handleAfterSideOfBlock(LayoutUnit top, LayoutUnit bottom, MarginInfo&);
225     void setCollapsedBottomMargin(const MarginInfo&);
226
227     bool shouldBreakAtLineToAvoidWidow() const { return m_rareData && m_rareData->m_lineBreakToAvoidWidow >= 0; }
228     void clearShouldBreakAtLineToAvoidWidow() const;
229     int lineBreakToAvoidWidow() const { return m_rareData ? m_rareData->m_lineBreakToAvoidWidow : -1; }
230     void setBreakAtLineToAvoidWidow(int);
231     void clearDidBreakAtLineToAvoidWidow();
232     void setDidBreakAtLineToAvoidWidow();
233     bool didBreakAtLineToAvoidWidow() const { return m_rareData && m_rareData->m_didBreakAtLineToAvoidWidow; }
234     bool relayoutToAvoidWidows(LayoutStateMaintainer&);
235
236     virtual bool canHaveGeneratedChildren() const OVERRIDE;
237
238     RootInlineBox* lineGridBox() const { return m_rareData ? m_rareData->m_lineGridBox : 0; }
239     void setLineGridBox(RootInlineBox* box)
240     {
241         if (!m_rareData)
242             m_rareData = adoptPtr(new RenderBlockFlowRareData(*this));
243         if (m_rareData->m_lineGridBox)
244             m_rareData->m_lineGridBox->destroy(renderArena());
245         m_rareData->m_lineGridBox = box;
246     }
247     void layoutLineGridBox();
248
249     RenderNamedFlowFragment* renderNamedFlowFragment() const { return m_rareData ? m_rareData->m_renderNamedFlowFragment : 0; }
250     void setRenderNamedFlowFragment(RenderNamedFlowFragment*);
251
252     bool containsFloats() const OVERRIDE { return m_floatingObjects && !m_floatingObjects->set().isEmpty(); }
253     bool containsFloat(RenderBox&) const;
254
255     virtual void deleteLines() OVERRIDE;
256     virtual void computeOverflow(LayoutUnit oldClientAfterEdge, bool recomputeFloats = false) OVERRIDE;
257
258     void removeFloatingObjects();
259     void markAllDescendantsWithFloatsForLayout(RenderBox* floatToRemove = nullptr, bool inLayout = true);
260     void markSiblingsWithFloatsForLayout(RenderBox* floatToRemove = nullptr);
261
262     LayoutUnit logicalTopForFloat(const FloatingObject* floatingObject) const { return isHorizontalWritingMode() ? floatingObject->y() : floatingObject->x(); }
263     LayoutUnit logicalBottomForFloat(const FloatingObject* floatingObject) const { return isHorizontalWritingMode() ? floatingObject->maxY() : floatingObject->maxX(); }
264     LayoutUnit logicalLeftForFloat(const FloatingObject* floatingObject) const { return isHorizontalWritingMode() ? floatingObject->x() : floatingObject->y(); }
265     LayoutUnit logicalRightForFloat(const FloatingObject* floatingObject) const { return isHorizontalWritingMode() ? floatingObject->maxX() : floatingObject->maxY(); }
266     LayoutUnit logicalWidthForFloat(const FloatingObject* floatingObject) const { return isHorizontalWritingMode() ? floatingObject->width() : floatingObject->height(); }
267     LayoutUnit logicalHeightForFloat(const FloatingObject* floatingObject) const { return isHorizontalWritingMode() ? floatingObject->height() : floatingObject->width(); }
268     LayoutSize logicalSizeForFloat(const FloatingObject* floatingObject) const { return isHorizontalWritingMode() ? LayoutSize(floatingObject->width(), floatingObject->height()) : LayoutSize(floatingObject->height(), floatingObject->width()); }
269
270     int pixelSnappedLogicalTopForFloat(const FloatingObject* floatingObject) const { return isHorizontalWritingMode() ? floatingObject->frameRect().pixelSnappedY() : floatingObject->frameRect().pixelSnappedX(); }
271     int pixelSnappedLogicalBottomForFloat(const FloatingObject* floatingObject) const { return isHorizontalWritingMode() ? floatingObject->frameRect().pixelSnappedMaxY() : floatingObject->frameRect().pixelSnappedMaxX(); }
272     int pixelSnappedLogicalLeftForFloat(const FloatingObject* floatingObject) const { return isHorizontalWritingMode() ? floatingObject->frameRect().pixelSnappedX() : floatingObject->frameRect().pixelSnappedY(); }
273     int pixelSnappedLogicalRightForFloat(const FloatingObject* floatingObject) const { return isHorizontalWritingMode() ? floatingObject->frameRect().pixelSnappedMaxX() : floatingObject->frameRect().pixelSnappedMaxY(); }
274
275     void setLogicalTopForFloat(FloatingObject* floatingObject, LayoutUnit logicalTop)
276     {
277         if (isHorizontalWritingMode())
278             floatingObject->setY(logicalTop);
279         else
280             floatingObject->setX(logicalTop);
281     }
282     void setLogicalLeftForFloat(FloatingObject* floatingObject, LayoutUnit logicalLeft)
283     {
284         if (isHorizontalWritingMode())
285             floatingObject->setX(logicalLeft);
286         else
287             floatingObject->setY(logicalLeft);
288     }
289     void setLogicalHeightForFloat(FloatingObject* floatingObject, LayoutUnit logicalHeight)
290     {
291         if (isHorizontalWritingMode())
292             floatingObject->setHeight(logicalHeight);
293         else
294             floatingObject->setWidth(logicalHeight);
295     }
296     void setLogicalWidthForFloat(FloatingObject* floatingObject, LayoutUnit logicalWidth)
297     {
298         if (isHorizontalWritingMode())
299             floatingObject->setWidth(logicalWidth);
300         else
301             floatingObject->setHeight(logicalWidth);
302     }
303
304     RenderLineBoxList& lineBoxes() { return m_lineBoxes; }
305     const RenderLineBoxList& lineBoxes() const { return m_lineBoxes; }
306
307     InlineFlowBox* firstLineBox() const { return m_lineBoxes.firstLineBox(); }
308     InlineFlowBox* lastLineBox() const { return m_lineBoxes.lastLineBox(); }
309
310     RootInlineBox* firstRootBox() const { return static_cast<RootInlineBox*>(firstLineBox()); }
311     RootInlineBox* lastRootBox() const { return static_cast<RootInlineBox*>(lastLineBox()); }
312
313     virtual bool hasLines() const OVERRIDE FINAL { return firstLineBox(); }
314
315     // Helper methods for computing line counts and heights for line counts.
316     RootInlineBox* lineAtIndex(int) const;
317     int lineCount(const RootInlineBox* = nullptr, bool* = nullptr) const;
318     int heightForLineCount(int);
319     void clearTruncation();
320
321     void setHasMarkupTruncation(bool b) { m_hasMarkupTruncation = b; }
322     bool hasMarkupTruncation() const { return m_hasMarkupTruncation; }
323
324     bool containsNonZeroBidiLevel() const;
325
326 #ifndef NDEBUG
327     virtual void showLineTreeAndMark(const InlineBox* = nullptr, const char* = nullptr, const InlineBox* = nullptr, const char* = nullptr, const RenderObject* = nullptr) const OVERRIDE;
328 #endif
329
330 protected:
331     LayoutUnit maxPositiveMarginBefore() const { return m_rareData ? m_rareData->m_margins.positiveMarginBefore() : RenderBlockFlowRareData::positiveMarginBeforeDefault(*this); }
332     LayoutUnit maxNegativeMarginBefore() const { return m_rareData ? m_rareData->m_margins.negativeMarginBefore() : RenderBlockFlowRareData::negativeMarginBeforeDefault(*this); }
333     LayoutUnit maxPositiveMarginAfter() const { return m_rareData ? m_rareData->m_margins.positiveMarginAfter() : RenderBlockFlowRareData::positiveMarginAfterDefault(*this); }
334     LayoutUnit maxNegativeMarginAfter() const { return m_rareData ? m_rareData->m_margins.negativeMarginAfter() : RenderBlockFlowRareData::negativeMarginAfterDefault(*this); }
335
336     void initMaxMarginValues()
337     {
338         if (!m_rareData)
339             return;
340         m_rareData->m_margins = MarginValues(RenderBlockFlowRareData::positiveMarginBeforeDefault(*this) , RenderBlockFlowRareData::negativeMarginBeforeDefault(*this),
341             RenderBlockFlowRareData::positiveMarginAfterDefault(*this), RenderBlockFlowRareData::negativeMarginAfterDefault(*this));
342         m_rareData->m_discardMarginBefore = false;
343         m_rareData->m_discardMarginAfter = false;
344     }
345
346     void setMaxMarginBeforeValues(LayoutUnit pos, LayoutUnit neg);
347     void setMaxMarginAfterValues(LayoutUnit pos, LayoutUnit neg);
348
349     void setMustDiscardMarginBefore(bool = true);
350     void setMustDiscardMarginAfter(bool = true);
351
352     bool mustDiscardMarginBefore() const;
353     bool mustDiscardMarginAfter() const;
354
355     bool mustDiscardMarginBeforeForChild(const RenderBox&) const;
356     bool mustDiscardMarginAfterForChild(const RenderBox&) const;
357     bool mustSeparateMarginBeforeForChild(const RenderBox&) const;
358     bool mustSeparateMarginAfterForChild(const RenderBox&) const;
359
360     LayoutUnit applyBeforeBreak(RenderBox& child, LayoutUnit logicalOffset); // If the child has a before break, then return a new yPos that shifts to the top of the next page/column.
361     LayoutUnit applyAfterBreak(RenderBox& child, LayoutUnit logicalOffset, MarginInfo&); // If the child has an after break, then return a new offset that shifts to the top of the next page/column.
362     LayoutUnit adjustBlockChildForPagination(LayoutUnit logicalTopAfterClear, LayoutUnit estimateWithoutPagination, RenderBox& child, bool atBeforeSideOfBlock);
363
364     virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle) OVERRIDE;
365     virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle) OVERRIDE;
366
367     void createFloatingObjects();
368
369     virtual int firstLineBaseline() const OVERRIDE;
370     virtual int inlineBlockBaseline(LineDirectionMode) const OVERRIDE;
371
372 private:
373     virtual void paintInlineChildren(PaintInfo&, const LayoutPoint&) OVERRIDE;
374     virtual void paintFloats(PaintInfo&, const LayoutPoint&, bool preservePhase = false) OVERRIDE;
375
376     virtual void moveAllChildrenIncludingFloatsTo(RenderBlock* toBlock, bool fullRemoveInsert) OVERRIDE;
377     virtual void repaintOverhangingFloats(bool paintAllDescendants) OVERRIDE FINAL;
378     virtual void clipOutFloatingObjects(RenderBlock&, const PaintInfo*, const LayoutPoint&, const LayoutSize&) OVERRIDE;
379
380     FloatingObject* insertFloatingObject(RenderBox&);
381     void removeFloatingObject(RenderBox&);
382     void removeFloatingObjectsBelow(FloatingObject*, int logicalOffset);
383     LayoutPoint computeLogicalLocationForFloat(const FloatingObject*, LayoutUnit logicalTopOffset) const;
384
385     // Called from lineWidth, to position the floats added in the last line.
386     // Returns true if and only if it has positioned any floats.
387     bool positionNewFloats();
388
389     void newLine(EClear);
390
391     virtual LayoutUnit logicalRightFloatOffsetForLine(LayoutUnit logicalTop, LayoutUnit fixedOffset, LayoutUnit* heightRemaining, LayoutUnit logicalHeight, ShapeOutsideFloatOffsetMode) const OVERRIDE;
392     virtual LayoutUnit logicalLeftFloatOffsetForLine(LayoutUnit logicalTop, LayoutUnit fixedOffset, LayoutUnit* heightRemaining, LayoutUnit logicalHeight, ShapeOutsideFloatOffsetMode) const OVERRIDE;
393     LayoutUnit lowestFloatLogicalBottom(FloatingObject::Type = FloatingObject::FloatLeftRight) const; 
394     LayoutUnit nextFloatLogicalBottomBelow(LayoutUnit, ShapeOutsideFloatOffsetMode = ShapeOutsideFloatMarginBoxOffset) const;
395     
396     LayoutUnit addOverhangingFloats(RenderBlockFlow& child, bool makeChildPaintOtherFloats);
397     bool hasOverhangingFloat(RenderBox&);
398     void addIntrudingFloats(RenderBlockFlow* prev, LayoutUnit xoffset, LayoutUnit yoffset);
399     bool hasOverhangingFloats() { return parent() && !hasColumns() && containsFloats() && lowestFloatLogicalBottom() > logicalHeight(); }
400     LayoutUnit getClearDelta(RenderBox& child, LayoutUnit yPos);
401
402     virtual bool hitTestFloats(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset) OVERRIDE;
403     virtual bool hitTestInlineChildren(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction) OVERRIDE;
404
405     void addOverflowFromFloats();
406     virtual void addOverflowFromInlineChildren();
407     
408     void fitBorderToLinesIfNeeded(); // Shrink the box in which the border paints if border-fit is set.
409     void adjustForBorderFit(LayoutUnit x, LayoutUnit& left, LayoutUnit& right) const;
410
411     void markLinesDirtyInBlockRange(LayoutUnit logicalTop, LayoutUnit logicalBottom, RootInlineBox* highest = 0);
412
413     virtual GapRects inlineSelectionGaps(RenderBlock& rootBlock, const LayoutPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock,
414         LayoutUnit& lastLogicalTop, LayoutUnit& lastLogicalLeft, LayoutUnit& lastLogicalRight, const LogicalSelectionOffsetCaches&, const PaintInfo*) OVERRIDE;
415     
416     Position positionForBox(InlineBox*, bool start = true) const;
417     virtual VisiblePosition positionForPointWithInlineChildren(const LayoutPoint& pointInLogicalContents) OVERRIDE;
418     RenderBlockFlowRareData& ensureRareData();
419     virtual void addFocusRingRectsForInlineChildren(Vector<IntRect>& rects, const LayoutPoint& additionalOffset, const RenderLayerModelObject*) OVERRIDE;
420
421 // FIXME-BLOCKFLOW: These methods have implementations in
422 // RenderBlockLineLayout. They should be moved to the proper header once the
423 // line layout code is separated from RenderBlock and RenderBlockFlow.
424 // START METHODS DEFINED IN RenderBlockLineLayout
425 public:
426     static void appendRunsForObject(BidiRunList<BidiRun>&, int start, int end, RenderObject*, InlineBidiResolver&);
427     RootInlineBox* createAndAppendRootInlineBox();
428
429 private:
430     virtual RootInlineBox* createRootInlineBox(); // Subclassed by SVG and Ruby.
431     InlineFlowBox* createLineBoxes(RenderObject*, const LineInfo&, InlineBox* childBox, bool startsNewSegment);
432     RootInlineBox* constructLine(BidiRunList<BidiRun>&, const LineInfo&);
433     void setMarginsForRubyRun(BidiRun*, RenderRubyRun&, RenderObject*, const LineInfo&);
434     void computeInlineDirectionPositionsForLine(RootInlineBox*, const LineInfo&, BidiRun* firstRun, BidiRun* trailingSpaceRun, bool reachedEnd, GlyphOverflowAndFallbackFontsMap&, VerticalPositionCache&, WordMeasurements&);
435     BidiRun* computeInlineDirectionPositionsForSegment(RootInlineBox*, const LineInfo&, ETextAlign, float& logicalLeft,
436         float& availableLogicalWidth, BidiRun* firstRun, BidiRun* trailingSpaceRun, GlyphOverflowAndFallbackFontsMap& textBoxDataMap, VerticalPositionCache&, WordMeasurements&);
437     void computeBlockDirectionPositionsForLine(RootInlineBox*, BidiRun*, GlyphOverflowAndFallbackFontsMap&, VerticalPositionCache&);
438     BidiRun* handleTrailingSpaces(BidiRunList<BidiRun>&, BidiContext*);
439     void appendFloatingObjectToLastLine(FloatingObject*);
440     // Helper function for layoutInlineChildren()
441     RootInlineBox* createLineBoxesFromBidiRuns(BidiRunList<BidiRun>&, const InlineIterator& end, LineInfo&, VerticalPositionCache&, BidiRun* trailingSpaceRun, WordMeasurements&);
442     void layoutRunsAndFloats(LineLayoutState&, bool hasInlineChild);
443     const InlineIterator& restartLayoutRunsAndFloatsInRange(LayoutUnit oldLogicalHeight, LayoutUnit newLogicalHeight,  FloatingObject* lastFloatFromPreviousLine, InlineBidiResolver&,  const InlineIterator&);
444     void layoutRunsAndFloatsInRange(LineLayoutState&, InlineBidiResolver&, const InlineIterator& cleanLineStart, const BidiStatus& cleanLineBidiStatus, unsigned consecutiveHyphenatedLines);
445 #if ENABLE(CSS_SHAPES)
446     void updateShapeAndSegmentsForCurrentLine(ShapeInsideInfo*&, const LayoutSize&, LineLayoutState&);
447     void updateShapeAndSegmentsForCurrentLineInFlowThread(ShapeInsideInfo*&, LineLayoutState&);
448     bool adjustLogicalLineTopAndLogicalHeightIfNeeded(ShapeInsideInfo*, LayoutUnit, LineLayoutState&, InlineBidiResolver&, FloatingObject*, InlineIterator&, WordMeasurements&);
449 #endif
450     void linkToEndLineIfNeeded(LineLayoutState&);
451     static void repaintDirtyFloats(Vector<FloatWithRect>& floats);
452     void checkFloatsInCleanLine(RootInlineBox*, Vector<FloatWithRect>&, size_t& floatIndex, bool& encounteredNewFloat, bool& dirtiedByFloat);
453     RootInlineBox* determineStartPosition(LineLayoutState&, InlineBidiResolver&);
454     void determineEndPosition(LineLayoutState&, RootInlineBox* startBox, InlineIterator& cleanLineStart, BidiStatus& cleanLineBidiStatus);
455     bool checkPaginationAndFloatsAtEndLine(LineLayoutState&);
456     bool matchedEndLine(LineLayoutState&, const InlineBidiResolver&, const InlineIterator& endLineStart, const BidiStatus& endLineStatus);
457     void deleteEllipsisLineBoxes();
458     void checkLinesForTextOverflow();
459     // Positions new floats and also adjust all floats encountered on the line if any of them
460     // have to move to the next page/column.
461     bool positionNewFloatOnLine(FloatingObject* newFloat, FloatingObject* lastFloatFromPreviousLine, LineInfo&, LineWidth&);
462
463
464 // END METHODS DEFINED IN RenderBlockLineLayout
465
466     bool namedFlowFragmentNeedsUpdate() const;
467     virtual bool canHaveChildren() const OVERRIDE;
468
469 public:
470     // FIXME-BLOCKFLOW: These can be made protected again once all callers have been moved here.
471     void adjustLinePositionForPagination(RootInlineBox*, LayoutUnit& deltaOffset, RenderFlowThread*); // Computes a deltaOffset value that put a line at the top of the next page if it doesn't fit on the current page.
472     void updateRegionForLine(RootInlineBox*) const;
473     void createRenderNamedFlowFragmentIfNeeded();
474
475     // Pagination routines.
476     virtual bool relayoutForPagination(bool hasSpecifiedPageLogicalHeight, LayoutUnit pageLogicalHeight, LayoutStateMaintainer&);
477
478 protected:
479     OwnPtr<FloatingObjects> m_floatingObjects;
480     OwnPtr<RenderBlockFlowRareData> m_rareData;
481     RenderLineBoxList m_lineBoxes;
482
483     friend class BreakingContext;
484     friend class LineBreaker;
485     friend class LineWidth; // Needs to know FloatingObject
486 };
487
488 RENDER_OBJECT_TYPE_CASTS(RenderBlockFlow, isRenderBlockFlow())
489
490 inline bool RenderElement::isRenderNamedFlowFragmentContainer() const
491 {
492     return isRenderBlockFlow() && toRenderBlockFlow(this)->renderNamedFlowFragment();
493 }
494
495 } // namespace WebCore
496
497 #endif // RenderBlockFlow_h