Home | History | Annotate | Download | only in rendering
      1 /*
      2  * Copyright (C) 1999 Lars Knoll (knoll (at) kde.org)
      3  *           (C) 1999 Antti Koivisto (koivisto (at) kde.org)
      4  *           (C) 2007 David Smith (catfish.man (at) gmail.com)
      5  * Copyright (C) 2003-2013 Apple Inc. All rights reserved.
      6  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
      7  * Copyright (C) 2013 Google Inc. All rights reserved.
      8  *
      9  * Redistribution and use in source and binary forms, with or without
     10  * modification, are permitted provided that the following conditions are
     11  * met:
     12  *
     13  *     * Redistributions of source code must retain the above copyright
     14  * notice, this list of conditions and the following disclaimer.
     15  *     * Redistributions in binary form must reproduce the above
     16  * copyright notice, this list of conditions and the following disclaimer
     17  * in the documentation and/or other materials provided with the
     18  * distribution.
     19  *     * Neither the name of Google Inc. nor the names of its
     20  * contributors may be used to endorse or promote products derived from
     21  * this software without specific prior written permission.
     22  *
     23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     24  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     25  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     26  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     27  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     28  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     29  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     30  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     31  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     32  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     33  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     34  */
     35 
     36 #ifndef RenderBlockFlow_h
     37 #define RenderBlockFlow_h
     38 
     39 #include "core/rendering/FloatingObjects.h"
     40 #include "core/rendering/RenderBlock.h"
     41 #include "core/rendering/style/RenderStyleConstants.h"
     42 
     43 namespace WebCore {
     44 
     45 class MarginInfo;
     46 class LineBreaker;
     47 class LineWidth;
     48 class RenderNamedFlowFragment;
     49 
     50 class RenderBlockFlow : public RenderBlock {
     51 public:
     52     explicit RenderBlockFlow(ContainerNode*);
     53     virtual ~RenderBlockFlow();
     54 
     55     static RenderBlockFlow* createAnonymous(Document*);
     56     RenderBlockFlow* createAnonymousBlockFlow() const;
     57 
     58     virtual bool isRenderBlockFlow() const OVERRIDE FINAL { return true; }
     59 
     60     virtual void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) OVERRIDE;
     61 
     62     virtual void computeOverflow(LayoutUnit oldClientAfterEdge, bool recomputeFloats = false) OVERRIDE;
     63     virtual void deleteLineBoxTree() OVERRIDE FINAL;
     64 
     65     void markAllDescendantsWithFloatsForLayout(RenderBox* floatToRemove = 0, bool inLayout = true);
     66     void markSiblingsWithFloatsForLayout(RenderBox* floatToRemove = 0);
     67 
     68     virtual bool containsFloats() const OVERRIDE FINAL { return m_floatingObjects && !m_floatingObjects->set().isEmpty(); }
     69     bool containsFloat(RenderBox*) const;
     70 
     71     void removeFloatingObjects();
     72 
     73     bool generatesLineBoxesForInlineChild(RenderObject*);
     74 
     75     LayoutUnit logicalTopForFloat(const FloatingObject* floatingObject) const { return isHorizontalWritingMode() ? floatingObject->y() : floatingObject->x(); }
     76     LayoutUnit logicalBottomForFloat(const FloatingObject* floatingObject) const { return isHorizontalWritingMode() ? floatingObject->maxY() : floatingObject->maxX(); }
     77     LayoutUnit logicalLeftForFloat(const FloatingObject* floatingObject) const { return isHorizontalWritingMode() ? floatingObject->x() : floatingObject->y(); }
     78     LayoutUnit logicalRightForFloat(const FloatingObject* floatingObject) const { return isHorizontalWritingMode() ? floatingObject->maxX() : floatingObject->maxY(); }
     79     LayoutUnit logicalWidthForFloat(const FloatingObject* floatingObject) const { return isHorizontalWritingMode() ? floatingObject->width() : floatingObject->height(); }
     80     LayoutUnit logicalHeightForFloat(const FloatingObject* floatingObject) const { return isHorizontalWritingMode() ? floatingObject->height() : floatingObject->width(); }
     81     LayoutSize logicalSizeForFloat(const FloatingObject* floatingObject) const { return isHorizontalWritingMode() ? LayoutSize(floatingObject->width(), floatingObject->height()) : LayoutSize(floatingObject->height(), floatingObject->width()); }
     82 
     83     int pixelSnappedLogicalTopForFloat(const FloatingObject* floatingObject) const { return isHorizontalWritingMode() ? floatingObject->frameRect().pixelSnappedY() : floatingObject->frameRect().pixelSnappedX(); }
     84     int pixelSnappedLogicalBottomForFloat(const FloatingObject* floatingObject) const { return isHorizontalWritingMode() ? floatingObject->frameRect().pixelSnappedMaxY() : floatingObject->frameRect().pixelSnappedMaxX(); }
     85     int pixelSnappedLogicalLeftForFloat(const FloatingObject* floatingObject) const { return isHorizontalWritingMode() ? floatingObject->frameRect().pixelSnappedX() : floatingObject->frameRect().pixelSnappedY(); }
     86     int pixelSnappedLogicalRightForFloat(const FloatingObject* floatingObject) const { return isHorizontalWritingMode() ? floatingObject->frameRect().pixelSnappedMaxX() : floatingObject->frameRect().pixelSnappedMaxY(); }
     87 
     88     void setLogicalTopForFloat(FloatingObject* floatingObject, LayoutUnit logicalTop)
     89     {
     90         if (isHorizontalWritingMode())
     91             floatingObject->setY(logicalTop);
     92         else
     93             floatingObject->setX(logicalTop);
     94     }
     95     void setLogicalLeftForFloat(FloatingObject* floatingObject, LayoutUnit logicalLeft)
     96     {
     97         if (isHorizontalWritingMode())
     98             floatingObject->setX(logicalLeft);
     99         else
    100             floatingObject->setY(logicalLeft);
    101     }
    102     void setLogicalHeightForFloat(FloatingObject* floatingObject, LayoutUnit logicalHeight)
    103     {
    104         if (isHorizontalWritingMode())
    105             floatingObject->setHeight(logicalHeight);
    106         else
    107             floatingObject->setWidth(logicalHeight);
    108     }
    109     void setLogicalWidthForFloat(FloatingObject* floatingObject, LayoutUnit logicalWidth)
    110     {
    111         if (isHorizontalWritingMode())
    112             floatingObject->setWidth(logicalWidth);
    113         else
    114             floatingObject->setHeight(logicalWidth);
    115     }
    116 
    117     LayoutUnit startAlignedOffsetForLine(LayoutUnit position, bool shouldIndentText);
    118 
    119     void setStaticInlinePositionForChild(RenderBox*, LayoutUnit blockOffset, LayoutUnit inlinePosition);
    120     void updateStaticInlinePositionForChild(RenderBox*, LayoutUnit logicalTop);
    121 
    122     static bool shouldSkipCreatingRunsForObject(RenderObject* obj)
    123     {
    124         return obj->isFloating() || (obj->isOutOfFlowPositioned() && !obj->style()->isOriginalDisplayInlineType() && !obj->container()->isRenderInline());
    125     }
    126 
    127     static TextRun constructTextRun(RenderObject* context, const Font&, const String&, RenderStyle*,
    128         TextRun::ExpansionBehavior = TextRun::AllowTrailingExpansion | TextRun::ForbidLeadingExpansion, TextRunFlags = DefaultTextRunFlags);
    129 
    130     static TextRun constructTextRun(RenderObject* context, const Font&, const RenderText*, RenderStyle*,
    131         TextRun::ExpansionBehavior = TextRun::AllowTrailingExpansion | TextRun::ForbidLeadingExpansion);
    132 
    133     static TextRun constructTextRun(RenderObject* context, const Font&, const RenderText*, unsigned offset, unsigned length, RenderStyle*,
    134         TextRun::ExpansionBehavior = TextRun::AllowTrailingExpansion | TextRun::ForbidLeadingExpansion);
    135 
    136     static TextRun constructTextRun(RenderObject* context, const Font&, const RenderText*, unsigned offset, RenderStyle*,
    137         TextRun::ExpansionBehavior = TextRun::AllowTrailingExpansion | TextRun::ForbidLeadingExpansion);
    138 
    139     static TextRun constructTextRun(RenderObject* context, const Font&, const LChar* characters, int length, RenderStyle*,
    140         TextRun::ExpansionBehavior = TextRun::AllowTrailingExpansion | TextRun::ForbidLeadingExpansion);
    141 
    142     static TextRun constructTextRun(RenderObject* context, const Font&, const UChar* characters, int length, RenderStyle*,
    143         TextRun::ExpansionBehavior = TextRun::AllowTrailingExpansion | TextRun::ForbidLeadingExpansion);
    144 
    145     RootInlineBox* lineGridBox() const { return m_rareData ? m_rareData->m_lineGridBox : 0; }
    146     void setLineGridBox(RootInlineBox* box)
    147     {
    148         RenderBlockFlow::RenderBlockFlowRareData& rareData = ensureRareData();
    149         if (rareData.m_lineGridBox)
    150             rareData.m_lineGridBox->destroy();
    151         rareData.m_lineGridBox = box;
    152     }
    153     void layoutLineGridBox();
    154 
    155     void addOverflowFromInlineChildren();
    156 
    157     GapRects inlineSelectionGaps(RenderBlock* rootBlock, const LayoutPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock,
    158         LayoutUnit& lastLogicalTop, LayoutUnit& lastLogicalLeft, LayoutUnit& lastLogicalRight, const PaintInfo*);
    159 protected:
    160     // Only used by RenderSVGText, which explicitly overrides RenderBlock::layoutBlock(), do NOT use for anything else.
    161     void forceLayoutInlineChildren()
    162     {
    163         LayoutUnit repaintLogicalTop = 0;
    164         LayoutUnit repaintLogicalBottom = 0;
    165         rebuildFloatsFromIntruding();
    166         layoutInlineChildren(true, repaintLogicalTop, repaintLogicalBottom);
    167     }
    168 
    169     void createFloatingObjects();
    170 
    171     virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle) OVERRIDE;
    172     virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle) OVERRIDE;
    173 
    174     void addOverflowFromFloats();
    175 
    176     virtual void insertedIntoTree() OVERRIDE;
    177     virtual void willBeDestroyed() OVERRIDE;
    178 private:
    179     void layoutBlockChildren(bool relayoutChildren, LayoutUnit& maxFloatLogicalBottom, SubtreeLayoutScope&);
    180     void layoutInlineChildren(bool relayoutChildren, LayoutUnit& repaintLogicalTop, LayoutUnit& repaintLogicalBottom);
    181 
    182     void layoutBlockChild(RenderBox* child, MarginInfo&, LayoutUnit& previousFloatLogicalBottom, LayoutUnit& maxFloatLogicalBottom);
    183     void adjustPositionedBlock(RenderBox* child, const MarginInfo&);
    184     void adjustFloatingBlock(const MarginInfo&);
    185 
    186     void rebuildFloatsFromIntruding();
    187 
    188     LayoutPoint flipFloatForWritingModeForChild(const FloatingObject*, const LayoutPoint&) const;
    189 
    190     LayoutUnit xPositionForFloatIncludingMargin(const FloatingObject* child) const
    191     {
    192         if (isHorizontalWritingMode())
    193             return child->x() + child->renderer()->marginLeft();
    194 
    195         return child->x() + marginBeforeForChild(child->renderer());
    196     }
    197 
    198     LayoutUnit yPositionForFloatIncludingMargin(const FloatingObject* child) const
    199     {
    200         if (isHorizontalWritingMode())
    201             return child->y() + marginBeforeForChild(child->renderer());
    202 
    203         return child->y() + child->renderer()->marginTop();
    204     }
    205 
    206     LayoutPoint computeLogicalLocationForFloat(const FloatingObject*, LayoutUnit logicalTopOffset) const;
    207 
    208     FloatingObject* insertFloatingObject(RenderBox*);
    209     void removeFloatingObject(RenderBox*);
    210     void removeFloatingObjectsBelow(FloatingObject*, int logicalOffset);
    211 
    212     // Called from lineWidth, to position the floats added in the last line.
    213     // Returns true if and only if it has positioned any floats.
    214     bool positionNewFloats();
    215 
    216     LayoutUnit getClearDelta(RenderBox* child, LayoutUnit yPos);
    217 
    218     bool hasOverhangingFloats() { return parent() && !hasColumns() && containsFloats() && lowestFloatLogicalBottom() > logicalHeight(); }
    219     bool hasOverhangingFloat(RenderBox*);
    220     void addIntrudingFloats(RenderBlockFlow* prev, LayoutUnit xoffset, LayoutUnit yoffset);
    221     LayoutUnit addOverhangingFloats(RenderBlockFlow* child, bool makeChildPaintOtherFloats);
    222 
    223     LayoutUnit lowestFloatLogicalBottom(FloatingObject::Type = FloatingObject::FloatLeftRight) const;
    224     LayoutUnit nextFloatLogicalBottomBelow(LayoutUnit, ShapeOutsideFloatOffsetMode = ShapeOutsideFloatMarginBoxOffset) const;
    225 
    226     virtual bool hitTestFloats(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset) OVERRIDE FINAL;
    227 
    228     virtual void moveAllChildrenIncludingFloatsTo(RenderBlock* toBlock, bool fullRemoveInsert) OVERRIDE;
    229     virtual void repaintOverhangingFloats(bool paintAllDescendants) OVERRIDE FINAL;
    230     virtual void repaintOverflow() OVERRIDE;
    231     virtual void paintFloats(PaintInfo&, const LayoutPoint&, bool preservePhase = false) OVERRIDE FINAL;
    232     virtual void clipOutFloatingObjects(RenderBlock*, const PaintInfo*, const LayoutPoint&, const LayoutSize&) OVERRIDE;
    233     void clearFloats(EClear);
    234 
    235     virtual LayoutUnit logicalRightFloatOffsetForLine(LayoutUnit logicalTop, LayoutUnit fixedOffset, LayoutUnit logicalHeight) const OVERRIDE;
    236     virtual LayoutUnit logicalLeftFloatOffsetForLine(LayoutUnit logicalTop, LayoutUnit fixedOffset, LayoutUnit logicalHeight) const OVERRIDE;
    237 
    238     LayoutUnit logicalRightOffsetForPositioningFloat(LayoutUnit logicalTop, LayoutUnit fixedOffset, bool applyTextIndent, LayoutUnit* heightRemaining) const;
    239     LayoutUnit logicalLeftOffsetForPositioningFloat(LayoutUnit logicalTop, LayoutUnit fixedOffset, bool applyTextIndent, LayoutUnit* heightRemaining) const;
    240 
    241     virtual void adjustForBorderFit(LayoutUnit x, LayoutUnit& left, LayoutUnit& right) const OVERRIDE; // Helper function for borderFitAdjust
    242 
    243     virtual RootInlineBox* createRootInlineBox() OVERRIDE;
    244 
    245     void updateLogicalWidthForAlignment(const ETextAlign&, const RootInlineBox*, BidiRun* trailingSpaceRun, float& logicalLeft, float& totalLogicalWidth, float& availableLogicalWidth, int expansionOpportunityCount);
    246     virtual bool relayoutForPagination(bool hasSpecifiedPageLogicalHeight, LayoutUnit pageLogicalHeight, LayoutStateMaintainer&);
    247 public:
    248     struct FloatWithRect {
    249         FloatWithRect(RenderBox* f)
    250             : object(f)
    251             , rect(LayoutRect(f->x() - f->marginLeft(), f->y() - f->marginTop(), f->width() + f->marginWidth(), f->height() + f->marginHeight()))
    252             , everHadLayout(f->everHadLayout())
    253         {
    254         }
    255 
    256         RenderBox* object;
    257         LayoutRect rect;
    258         bool everHadLayout;
    259     };
    260 
    261     class MarginValues {
    262     public:
    263         MarginValues(LayoutUnit beforePos, LayoutUnit beforeNeg, LayoutUnit afterPos, LayoutUnit afterNeg)
    264             : m_positiveMarginBefore(beforePos)
    265             , m_negativeMarginBefore(beforeNeg)
    266             , m_positiveMarginAfter(afterPos)
    267             , m_negativeMarginAfter(afterNeg)
    268         { }
    269 
    270         LayoutUnit positiveMarginBefore() const { return m_positiveMarginBefore; }
    271         LayoutUnit negativeMarginBefore() const { return m_negativeMarginBefore; }
    272         LayoutUnit positiveMarginAfter() const { return m_positiveMarginAfter; }
    273         LayoutUnit negativeMarginAfter() const { return m_negativeMarginAfter; }
    274 
    275         void setPositiveMarginBefore(LayoutUnit pos) { m_positiveMarginBefore = pos; }
    276         void setNegativeMarginBefore(LayoutUnit neg) { m_negativeMarginBefore = neg; }
    277         void setPositiveMarginAfter(LayoutUnit pos) { m_positiveMarginAfter = pos; }
    278         void setNegativeMarginAfter(LayoutUnit neg) { m_negativeMarginAfter = neg; }
    279 
    280     private:
    281         LayoutUnit m_positiveMarginBefore;
    282         LayoutUnit m_negativeMarginBefore;
    283         LayoutUnit m_positiveMarginAfter;
    284         LayoutUnit m_negativeMarginAfter;
    285     };
    286     MarginValues marginValuesForChild(RenderBox* child) const;
    287 
    288     virtual void updateLogicalHeight() OVERRIDE;
    289 
    290     // Allocated only when some of these fields have non-default values
    291     struct RenderBlockFlowRareData {
    292         WTF_MAKE_NONCOPYABLE(RenderBlockFlowRareData); WTF_MAKE_FAST_ALLOCATED;
    293     public:
    294         RenderBlockFlowRareData(const RenderBlockFlow* block)
    295             : m_margins(positiveMarginBeforeDefault(block), negativeMarginBeforeDefault(block), positiveMarginAfterDefault(block), negativeMarginAfterDefault(block))
    296             , m_lineGridBox(0)
    297             , m_discardMarginBefore(false)
    298             , m_discardMarginAfter(false)
    299             , m_renderNamedFlowFragment(0)
    300         {
    301         }
    302 
    303         static LayoutUnit positiveMarginBeforeDefault(const RenderBlockFlow* block)
    304         {
    305             return std::max<LayoutUnit>(block->marginBefore(), 0);
    306         }
    307         static LayoutUnit negativeMarginBeforeDefault(const RenderBlockFlow* block)
    308         {
    309             return std::max<LayoutUnit>(-block->marginBefore(), 0);
    310         }
    311         static LayoutUnit positiveMarginAfterDefault(const RenderBlockFlow* block)
    312         {
    313             return std::max<LayoutUnit>(block->marginAfter(), 0);
    314         }
    315         static LayoutUnit negativeMarginAfterDefault(const RenderBlockFlow* block)
    316         {
    317             return std::max<LayoutUnit>(-block->marginAfter(), 0);
    318         }
    319 
    320         MarginValues m_margins;
    321 
    322         RootInlineBox* m_lineGridBox;
    323 
    324         bool m_discardMarginBefore : 1;
    325         bool m_discardMarginAfter : 1;
    326         RenderNamedFlowFragment* m_renderNamedFlowFragment;
    327     };
    328     LayoutUnit marginOffsetForSelfCollapsingBlock();
    329 
    330     RenderNamedFlowFragment* renderNamedFlowFragment() const { return m_rareData ? m_rareData->m_renderNamedFlowFragment : 0; }
    331     void setRenderNamedFlowFragment(RenderNamedFlowFragment*);
    332 
    333 protected:
    334     LayoutUnit maxPositiveMarginBefore() const { return m_rareData ? m_rareData->m_margins.positiveMarginBefore() : RenderBlockFlowRareData::positiveMarginBeforeDefault(this); }
    335     LayoutUnit maxNegativeMarginBefore() const { return m_rareData ? m_rareData->m_margins.negativeMarginBefore() : RenderBlockFlowRareData::negativeMarginBeforeDefault(this); }
    336     LayoutUnit maxPositiveMarginAfter() const { return m_rareData ? m_rareData->m_margins.positiveMarginAfter() : RenderBlockFlowRareData::positiveMarginAfterDefault(this); }
    337     LayoutUnit maxNegativeMarginAfter() const { return m_rareData ? m_rareData->m_margins.negativeMarginAfter() : RenderBlockFlowRareData::negativeMarginAfterDefault(this); }
    338 
    339     void setMaxMarginBeforeValues(LayoutUnit pos, LayoutUnit neg);
    340     void setMaxMarginAfterValues(LayoutUnit pos, LayoutUnit neg);
    341 
    342     void setMustDiscardMarginBefore(bool = true);
    343     void setMustDiscardMarginAfter(bool = true);
    344 
    345     bool mustDiscardMarginBefore() const;
    346     bool mustDiscardMarginAfter() const;
    347 
    348     bool mustDiscardMarginBeforeForChild(const RenderBox*) const;
    349     bool mustDiscardMarginAfterForChild(const RenderBox*) const;
    350 
    351     bool mustSeparateMarginBeforeForChild(const RenderBox*) const;
    352     bool mustSeparateMarginAfterForChild(const RenderBox*) const;
    353 
    354     void initMaxMarginValues()
    355     {
    356         if (m_rareData) {
    357             m_rareData->m_margins = MarginValues(RenderBlockFlowRareData::positiveMarginBeforeDefault(this) , RenderBlockFlowRareData::negativeMarginBeforeDefault(this),
    358                 RenderBlockFlowRareData::positiveMarginAfterDefault(this), RenderBlockFlowRareData::negativeMarginAfterDefault(this));
    359 
    360             m_rareData->m_discardMarginBefore = false;
    361             m_rareData->m_discardMarginAfter = false;
    362         }
    363     }
    364 
    365     virtual ETextAlign textAlignmentForLine(bool endsWithSoftBreak) const;
    366 private:
    367     virtual LayoutUnit collapsedMarginBefore() const OVERRIDE FINAL { return maxPositiveMarginBefore() - maxNegativeMarginBefore(); }
    368     virtual LayoutUnit collapsedMarginAfter() const OVERRIDE FINAL { return maxPositiveMarginAfter() - maxNegativeMarginAfter(); }
    369 
    370     LayoutUnit collapseMargins(RenderBox* child, MarginInfo&);
    371     LayoutUnit clearFloatsIfNeeded(RenderBox* child, MarginInfo&, LayoutUnit oldTopPosMargin, LayoutUnit oldTopNegMargin, LayoutUnit yPos);
    372     LayoutUnit estimateLogicalTopPosition(RenderBox* child, const MarginInfo&, LayoutUnit& estimateWithoutPagination);
    373     void marginBeforeEstimateForChild(RenderBox*, LayoutUnit&, LayoutUnit&, bool&) const;
    374     void handleAfterSideOfBlock(LayoutUnit top, LayoutUnit bottom, MarginInfo&);
    375     void setCollapsedBottomMargin(const MarginInfo&);
    376 
    377     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.
    378     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.
    379 
    380     LayoutUnit adjustBlockChildForPagination(LayoutUnit logicalTopAfterClear, LayoutUnit estimateWithoutPagination, RenderBox* child, bool atBeforeSideOfBlock);
    381 
    382     // Used to store state between styleWillChange and styleDidChange
    383     static bool s_canPropagateFloatIntoSibling;
    384 
    385     virtual bool canHaveChildren() const OVERRIDE;
    386     virtual bool canHaveGeneratedChildren() const OVERRIDE;
    387 
    388     void createRenderNamedFlowFragmentIfNeeded();
    389 
    390     RenderBlockFlowRareData& ensureRareData();
    391 
    392     LayoutUnit m_repaintLogicalTop;
    393     LayoutUnit m_repaintLogicalBottom;
    394 
    395 protected:
    396     OwnPtr<RenderBlockFlowRareData> m_rareData;
    397     OwnPtr<FloatingObjects> m_floatingObjects;
    398 
    399     friend class BreakingContext; // FIXME: It uses insertFloatingObject and positionNewFloatOnLine, if we move those out from the private scope/add a helper to LineBreaker, we can remove this friend
    400     friend class MarginInfo;
    401     friend class LineBreaker;
    402     friend class LineWidth; // needs to know FloatingObject
    403 
    404 // FIXME-BLOCKFLOW: These methods have implementations in
    405 // RenderBlockLineLayout. They should be moved to the proper header once the
    406 // line layout code is separated from RenderBlock and RenderBlockFlow.
    407 // START METHODS DEFINED IN RenderBlockLineLayout
    408 private:
    409     InlineFlowBox* createLineBoxes(RenderObject*, const LineInfo&, InlineBox* childBox, bool startsNewSegment);
    410     RootInlineBox* constructLine(BidiRunList<BidiRun>&, const LineInfo&);
    411     void setMarginsForRubyRun(BidiRun*, RenderRubyRun*, RenderObject*, const LineInfo&);
    412     void computeInlineDirectionPositionsForLine(RootInlineBox*, const LineInfo&, BidiRun* firstRun, BidiRun* trailingSpaceRun, bool reachedEnd, GlyphOverflowAndFallbackFontsMap&, VerticalPositionCache&, WordMeasurements&);
    413     BidiRun* computeInlineDirectionPositionsForSegment(RootInlineBox*, const LineInfo&, ETextAlign, float& logicalLeft,
    414         float& availableLogicalWidth, BidiRun* firstRun, BidiRun* trailingSpaceRun, GlyphOverflowAndFallbackFontsMap& textBoxDataMap, VerticalPositionCache&, WordMeasurements&);
    415     void computeBlockDirectionPositionsForLine(RootInlineBox*, BidiRun*, GlyphOverflowAndFallbackFontsMap&, VerticalPositionCache&);
    416     BidiRun* handleTrailingSpaces(BidiRunList<BidiRun>&, BidiContext*);
    417     void appendFloatingObjectToLastLine(FloatingObject*);
    418     // Helper function for layoutInlineChildren()
    419     RootInlineBox* createLineBoxesFromBidiRuns(unsigned bidiLevel, BidiRunList<BidiRun>&, const InlineIterator& end, LineInfo&, VerticalPositionCache&, BidiRun* trailingSpaceRun, WordMeasurements&);
    420     void layoutRunsAndFloats(LineLayoutState&, bool hasInlineChild);
    421     const InlineIterator& restartLayoutRunsAndFloatsInRange(LayoutUnit oldLogicalHeight, LayoutUnit newLogicalHeight,  FloatingObject* lastFloatFromPreviousLine, InlineBidiResolver&,  const InlineIterator&);
    422     void layoutRunsAndFloatsInRange(LineLayoutState&, InlineBidiResolver&, const InlineIterator& cleanLineStart, const BidiStatus& cleanLineBidiStatus, unsigned consecutiveHyphenatedLines);
    423     void updateShapeAndSegmentsForCurrentLine(ShapeInsideInfo*&, const LayoutSize&, LineLayoutState&);
    424     void updateShapeAndSegmentsForCurrentLineInFlowThread(ShapeInsideInfo*&, LineLayoutState&);
    425     bool adjustLogicalLineTopAndLogicalHeightIfNeeded(ShapeInsideInfo*, LayoutUnit, LineLayoutState&, InlineBidiResolver&, FloatingObject*, InlineIterator&, WordMeasurements&);
    426     void linkToEndLineIfNeeded(LineLayoutState&);
    427     static void repaintDirtyFloats(Vector<FloatWithRect>& floats);
    428     void checkFloatsInCleanLine(RootInlineBox*, Vector<FloatWithRect>&, size_t& floatIndex, bool& encounteredNewFloat, bool& dirtiedByFloat);
    429     RootInlineBox* determineStartPosition(LineLayoutState&, InlineBidiResolver&);
    430     void determineEndPosition(LineLayoutState&, RootInlineBox* startBox, InlineIterator& cleanLineStart, BidiStatus& cleanLineBidiStatus);
    431     bool checkPaginationAndFloatsAtEndLine(LineLayoutState&);
    432     bool matchedEndLine(LineLayoutState&, const InlineBidiResolver&, const InlineIterator& endLineStart, const BidiStatus& endLineStatus);
    433     void deleteEllipsisLineBoxes();
    434     void checkLinesForTextOverflow();
    435     // Positions new floats and also adjust all floats encountered on the line if any of them
    436     // have to move to the next page/column.
    437     bool positionNewFloatOnLine(FloatingObject* newFloat, FloatingObject* lastFloatFromPreviousLine, LineInfo&, LineWidth&);
    438 
    439 
    440 // END METHODS DEFINED IN RenderBlockLineLayout
    441 
    442 };
    443 
    444 DEFINE_RENDER_OBJECT_TYPE_CASTS(RenderBlockFlow, isRenderBlockFlow());
    445 
    446 } // namespace WebCore
    447 
    448 #endif // RenderBlockFlow_h
    449