/* * Copyright (C) 1999 Lars Knoll (knoll@kde.org) * (C) 1999 Antti Koivisto (koivisto@kde.org) * (C) 2007 David Smith (catfish.man@gmail.com) * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef RenderBlock_h #define RenderBlock_h #include "GapRects.h" #include "LineWidth.h" #include "RenderBox.h" #include "TextRun.h" #include #include namespace WebCore { class LayoutState; class LineLayoutState; class LogicalSelectionOffsetCaches; class RenderInline; class RenderText; struct BidiRun; struct PaintInfo; typedef WTF::ListHashSet TrackedRendererListHashSet; enum CaretType { CursorCaret, DragCaret }; enum ContainingBlockState { NewContainingBlock, SameContainingBlock }; enum TextRunFlag { DefaultTextRunFlags = 0, RespectDirection = 1 << 0, RespectDirectionOverride = 1 << 1 }; typedef unsigned TextRunFlags; class RenderBlock : public RenderBox { public: friend class LineLayoutState; protected: RenderBlock(Element&, Ref&&, BaseTypeFlags); RenderBlock(Document&, Ref&&, BaseTypeFlags); virtual ~RenderBlock(); public: // These two functions are overridden for inline-block. virtual LayoutUnit lineHeight(bool firstLine, LineDirectionMode, LinePositionMode = PositionOnContainingLine) const override final; virtual int baselinePosition(FontBaseline, bool firstLine, LineDirectionMode, LinePositionMode = PositionOnContainingLine) const override; LayoutUnit minLineHeightForReplacedRenderer(bool isFirstLine, LayoutUnit replacedHeight) const; // FIXME-BLOCKFLOW: Remove virtualizaion when all callers have moved to RenderBlockFlow virtual void deleteLines(); virtual void addChild(RenderObject* newChild, RenderObject* beforeChild = 0) override; virtual void removeChild(RenderObject&) override; virtual void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0); virtual void invalidateLineLayoutPath() { } void insertPositionedObject(RenderBox&); static void removePositionedObject(const RenderBox&); void removePositionedObjects(const RenderBlock*, ContainingBlockState = SameContainingBlock); TrackedRendererListHashSet* positionedObjects() const; bool hasPositionedObjects() const { TrackedRendererListHashSet* objects = positionedObjects(); return objects && !objects->isEmpty(); } void addPercentHeightDescendant(RenderBox&); static void removePercentHeightDescendant(RenderBox&); TrackedRendererListHashSet* percentHeightDescendants() const; static bool hasPercentHeightContainerMap(); static bool hasPercentHeightDescendant(RenderBox&); static void clearPercentHeightDescendantsFrom(RenderBox&); static void removePercentHeightDescendantIfNeeded(RenderBox&); void setHasMarginBeforeQuirk(bool b) { setRenderBlockHasMarginBeforeQuirk(b); } void setHasMarginAfterQuirk(bool b) { setRenderBlockHasMarginAfterQuirk(b); } void setHasBorderOrPaddingLogicalWidthChanged(bool b) { setRenderBlockHasBorderOrPaddingLogicalWidthChanged(b); } bool hasMarginBeforeQuirk() const { return renderBlockHasMarginBeforeQuirk(); } bool hasMarginAfterQuirk() const { return renderBlockHasMarginAfterQuirk(); } bool hasBorderOrPaddingLogicalWidthChanged() const { return renderBlockHasBorderOrPaddingLogicalWidthChanged(); } bool hasMarginBeforeQuirk(const RenderBox& child) const; bool hasMarginAfterQuirk(const RenderBox& child) const; bool generatesLineBoxesForInlineChild(RenderObject*); void markPositionedObjectsForLayout(); virtual void markForPaginationRelayoutIfNeeded() override; // FIXME-BLOCKFLOW: Remove virtualizaion when all of the line layout code has been moved out of RenderBlock virtual bool containsFloats() const { return false; } // Versions that can compute line offsets with the region and page offset passed in. Used for speed to avoid having to // compute the region all over again when you already know it. LayoutUnit availableLogicalWidthForLineInRegion(LayoutUnit position, IndentTextOrNot shouldIndentText, RenderRegion* region, LayoutUnit logicalHeight = 0) const { return std::max(0, logicalRightOffsetForLineInRegion(position, shouldIndentText, region, logicalHeight) - logicalLeftOffsetForLineInRegion(position, shouldIndentText, region, logicalHeight)); } LayoutUnit logicalRightOffsetForLineInRegion(LayoutUnit position, IndentTextOrNot shouldIndentText, RenderRegion* region, LayoutUnit logicalHeight = 0) const { return logicalRightOffsetForLine(position, logicalRightOffsetForContent(region), shouldIndentText, logicalHeight); } LayoutUnit logicalLeftOffsetForLineInRegion(LayoutUnit position, IndentTextOrNot shouldIndentText, RenderRegion* region, LayoutUnit logicalHeight = 0) const { return logicalLeftOffsetForLine(position, logicalLeftOffsetForContent(region), shouldIndentText, logicalHeight); } LayoutUnit startOffsetForLineInRegion(LayoutUnit position, IndentTextOrNot shouldIndentText, RenderRegion* region, LayoutUnit logicalHeight = 0) const { return style().isLeftToRightDirection() ? logicalLeftOffsetForLineInRegion(position, shouldIndentText, region, logicalHeight) : logicalWidth() - logicalRightOffsetForLineInRegion(position, shouldIndentText, region, logicalHeight); } LayoutUnit endOffsetForLineInRegion(LayoutUnit position, IndentTextOrNot shouldIndentText, RenderRegion* region, LayoutUnit logicalHeight = 0) const { return !style().isLeftToRightDirection() ? logicalLeftOffsetForLineInRegion(position, shouldIndentText, region, logicalHeight) : logicalWidth() - logicalRightOffsetForLineInRegion(position, shouldIndentText, region, logicalHeight); } LayoutUnit availableLogicalWidthForLine(LayoutUnit position, IndentTextOrNot shouldIndentText, LayoutUnit logicalHeight = 0) const { return availableLogicalWidthForLineInRegion(position, shouldIndentText, regionAtBlockOffset(position), logicalHeight); } LayoutUnit logicalRightOffsetForLine(LayoutUnit position, IndentTextOrNot shouldIndentText, LayoutUnit logicalHeight = 0) const { return logicalRightOffsetForLine(position, logicalRightOffsetForContent(position), shouldIndentText, logicalHeight); } LayoutUnit logicalLeftOffsetForLine(LayoutUnit position, IndentTextOrNot shouldIndentText, LayoutUnit logicalHeight = 0) const { return logicalLeftOffsetForLine(position, logicalLeftOffsetForContent(position), shouldIndentText, logicalHeight); } LayoutUnit startOffsetForLine(LayoutUnit position, IndentTextOrNot shouldIndentText, LayoutUnit logicalHeight = 0) const { return style().isLeftToRightDirection() ? logicalLeftOffsetForLine(position, shouldIndentText, logicalHeight) : logicalWidth() - logicalRightOffsetForLine(position, shouldIndentText, logicalHeight); } LayoutUnit endOffsetForLine(LayoutUnit position, IndentTextOrNot shouldIndentText, LayoutUnit logicalHeight = 0) const { return !style().isLeftToRightDirection() ? logicalLeftOffsetForLine(position, shouldIndentText, logicalHeight) : logicalWidth() - logicalRightOffsetForLine(position, shouldIndentText, logicalHeight); } LayoutUnit textIndentOffset() const; virtual VisiblePosition positionForPoint(const LayoutPoint&, const RenderRegion*) override; GapRects selectionGapRectsForRepaint(const RenderLayerModelObject* repaintContainer); LayoutRect logicalLeftSelectionGap(RenderBlock& rootBlock, const LayoutPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, RenderBoxModelObject* selObj, LayoutUnit logicalLeft, LayoutUnit logicalTop, LayoutUnit logicalHeight, const LogicalSelectionOffsetCaches&, const PaintInfo*); LayoutRect logicalRightSelectionGap(RenderBlock& rootBlock, const LayoutPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, RenderBoxModelObject* selObj, LayoutUnit logicalRight, LayoutUnit logicalTop, LayoutUnit logicalHeight, const LogicalSelectionOffsetCaches&, const PaintInfo*); void getSelectionGapInfo(SelectionState, bool& leftGap, bool& rightGap); RenderBlock* blockBeforeWithinSelectionRoot(LayoutSize& offset) const; LayoutRect logicalRectToPhysicalRect(const LayoutPoint& physicalPosition, const LayoutRect& logicalRect); void addContinuationWithOutline(RenderInline*); bool paintsContinuationOutline(RenderInline*); virtual RenderBoxModelObject* virtualContinuation() const override final { return continuation(); } bool isAnonymousBlockContinuation() const { return isAnonymousBlock() && continuation(); } WEBCORE_EXPORT RenderInline* inlineElementContinuation() const; RenderBlock* blockElementContinuation() const; using RenderBoxModelObject::continuation; using RenderBoxModelObject::setContinuation; static RenderBlock* createAnonymousWithParentRendererAndDisplay(const RenderObject*, EDisplay = BLOCK); RenderBlock* createAnonymousBlock(EDisplay display = BLOCK) const { return createAnonymousWithParentRendererAndDisplay(this, display); } static void dropAnonymousBoxChild(RenderBlock& parent, RenderBlock& child); virtual RenderBox* createAnonymousBoxWithSameTypeAs(const RenderObject* parent) const override; static bool shouldSkipCreatingRunsForObject(RenderObject& obj) { return obj.isFloating() || (obj.isOutOfFlowPositioned() && !obj.style().isOriginalDisplayInlineType() && !obj.container()->isRenderInline()); } static TextRun constructTextRun(RenderObject* context, const FontCascade&, StringView, const RenderStyle&, ExpansionBehavior = AllowTrailingExpansion | ForbidLeadingExpansion, TextRunFlags = DefaultTextRunFlags); static TextRun constructTextRun(RenderObject* context, const FontCascade&, const String&, const RenderStyle&, ExpansionBehavior = AllowTrailingExpansion | ForbidLeadingExpansion, TextRunFlags = DefaultTextRunFlags); static TextRun constructTextRun(RenderObject* context, const FontCascade&, const RenderText*, const RenderStyle&, ExpansionBehavior = AllowTrailingExpansion | ForbidLeadingExpansion); static TextRun constructTextRun(RenderObject* context, const FontCascade&, const RenderText*, unsigned offset, unsigned length, const RenderStyle&, ExpansionBehavior = AllowTrailingExpansion | ForbidLeadingExpansion); static TextRun constructTextRun(RenderObject* context, const FontCascade&, const LChar* characters, int length, const RenderStyle&, ExpansionBehavior = AllowTrailingExpansion | ForbidLeadingExpansion); static TextRun constructTextRun(RenderObject* context, const FontCascade&, const UChar* characters, int length, const RenderStyle&, ExpansionBehavior = AllowTrailingExpansion | ForbidLeadingExpansion); LayoutUnit paginationStrut() const; void setPaginationStrut(LayoutUnit); // The page logical offset is the object's offset from the top of the page in the page progression // direction (so an x-offset in vertical text and a y-offset for horizontal text). LayoutUnit pageLogicalOffset() const; void setPageLogicalOffset(LayoutUnit); // Accessors for logical width/height and margins in the containing block's block-flow direction. enum ApplyLayoutDeltaMode { ApplyLayoutDelta, DoNotApplyLayoutDelta }; LayoutUnit logicalWidthForChild(const RenderBox& child) const { return isHorizontalWritingMode() ? child.width() : child.height(); } LayoutUnit logicalHeightForChild(const RenderBox& child) const { return isHorizontalWritingMode() ? child.height() : child.width(); } LayoutSize logicalSizeForChild(const RenderBox& child) const { return isHorizontalWritingMode() ? child.size() : child.size().transposedSize(); } LayoutUnit logicalTopForChild(const RenderBox& child) const { return isHorizontalWritingMode() ? child.y() : child.x(); } void setLogicalLeftForChild(RenderBox& child, LayoutUnit logicalLeft, ApplyLayoutDeltaMode = DoNotApplyLayoutDelta); void setLogicalTopForChild(RenderBox& child, LayoutUnit logicalTop, ApplyLayoutDeltaMode = DoNotApplyLayoutDelta); LayoutUnit marginBeforeForChild(const RenderBoxModelObject& child) const { return child.marginBefore(&style()); } LayoutUnit marginAfterForChild(const RenderBoxModelObject& child) const { return child.marginAfter(&style()); } LayoutUnit marginStartForChild(const RenderBoxModelObject& child) const { return child.marginStart(&style()); } LayoutUnit marginEndForChild(const RenderBoxModelObject& child) const { return child.marginEnd(&style()); } void setMarginStartForChild(RenderBox& child, LayoutUnit value) const { child.setMarginStart(value, &style()); } void setMarginEndForChild(RenderBox& child, LayoutUnit value) const { child.setMarginEnd(value, &style()); } void setMarginBeforeForChild(RenderBox& child, LayoutUnit value) const { child.setMarginBefore(value, &style()); } void setMarginAfterForChild(RenderBox& child, LayoutUnit value) const { child.setMarginAfter(value, &style()); } LayoutUnit collapsedMarginBeforeForChild(const RenderBox& child) const; LayoutUnit collapsedMarginAfterForChild(const RenderBox& child) const; enum class RenderTreeMutationIsAllowed { Yes, No }; virtual void updateFirstLetter(RenderTreeMutationIsAllowed = RenderTreeMutationIsAllowed::Yes); void getFirstLetter(RenderObject*& firstLetter, RenderElement*& firstLetterContainer, RenderObject* skipObject = nullptr); virtual void scrollbarsChanged(bool /*horizontalScrollbarChanged*/, bool /*verticalScrollbarChanged*/) { } LayoutUnit logicalLeftOffsetForContent(RenderRegion*) const; LayoutUnit logicalRightOffsetForContent(RenderRegion*) const; LayoutUnit availableLogicalWidthForContent(RenderRegion* region) const { return std::max(0, logicalRightOffsetForContent(region) - logicalLeftOffsetForContent(region)); } LayoutUnit startOffsetForContent(RenderRegion* region) const { return style().isLeftToRightDirection() ? logicalLeftOffsetForContent(region) : logicalWidth() - logicalRightOffsetForContent(region); } LayoutUnit endOffsetForContent(RenderRegion* region) const { return !style().isLeftToRightDirection() ? logicalLeftOffsetForContent(region) : logicalWidth() - logicalRightOffsetForContent(region); } LayoutUnit logicalLeftOffsetForContent(LayoutUnit blockOffset) const { return logicalLeftOffsetForContent(regionAtBlockOffset(blockOffset)); } LayoutUnit logicalRightOffsetForContent(LayoutUnit blockOffset) const { return logicalRightOffsetForContent(regionAtBlockOffset(blockOffset)); } LayoutUnit availableLogicalWidthForContent(LayoutUnit blockOffset) const { return availableLogicalWidthForContent(regionAtBlockOffset(blockOffset)); } LayoutUnit startOffsetForContent(LayoutUnit blockOffset) const { return startOffsetForContent(regionAtBlockOffset(blockOffset)); } LayoutUnit endOffsetForContent(LayoutUnit blockOffset) const { return endOffsetForContent(regionAtBlockOffset(blockOffset)); } LayoutUnit logicalLeftOffsetForContent() const { return isHorizontalWritingMode() ? borderLeft() + paddingLeft() : borderTop() + paddingTop(); } LayoutUnit logicalRightOffsetForContent() const { return logicalLeftOffsetForContent() + availableLogicalWidth(); } LayoutUnit startOffsetForContent() const { return style().isLeftToRightDirection() ? logicalLeftOffsetForContent() : logicalWidth() - logicalRightOffsetForContent(); } LayoutUnit endOffsetForContent() const { return !style().isLeftToRightDirection() ? logicalLeftOffsetForContent() : logicalWidth() - logicalRightOffsetForContent(); } LayoutUnit logicalLeftSelectionOffset(RenderBlock& rootBlock, LayoutUnit position, const LogicalSelectionOffsetCaches&); LayoutUnit logicalRightSelectionOffset(RenderBlock& rootBlock, LayoutUnit position, const LogicalSelectionOffsetCaches&); LayoutUnit computeStartPositionDeltaForChildAvoidingFloats(const RenderBox& child, LayoutUnit childMarginStart, RenderRegion* = 0); #ifndef NDEBUG void checkPositionedObjectsNeedLayout(); #endif virtual void updateHitTestResult(HitTestResult&, const LayoutPoint&) override; virtual bool canHaveChildren() const override { return true; } virtual bool canDropAnonymousBlockChild() const { return true; } RenderFlowThread* cachedFlowThreadContainingBlock() const; void setCachedFlowThreadContainingBlockNeedsUpdate(); virtual bool cachedFlowThreadContainingBlockNeedsUpdate() const; protected: virtual RenderFlowThread* locateFlowThreadContainingBlock() const override; virtual void willBeDestroyed() override; virtual void layout() override; void layoutPositionedObjects(bool relayoutChildren, bool fixedPositionObjectsOnly = false); virtual void layoutPositionedObject(RenderBox&, bool relayoutChildren, bool fixedPositionObjectsOnly); void markFixedPositionObjectForLayoutIfNeeded(RenderBox& child); LayoutUnit marginIntrinsicLogicalWidthForChild(RenderBox&) const; virtual void paint(PaintInfo&, const LayoutPoint&) override; virtual void paintObject(PaintInfo&, const LayoutPoint&) override; virtual void paintChildren(PaintInfo& forSelf, const LayoutPoint&, PaintInfo& forChild, bool usePrintRect); enum PaintBlockType { PaintAsBlock, PaintAsInlineBlock }; bool paintChild(RenderBox&, PaintInfo& forSelf, const LayoutPoint&, PaintInfo& forChild, bool usePrintRect, PaintBlockType paintType = PaintAsBlock); LayoutUnit logicalRightOffsetForLine(LayoutUnit logicalTop, LayoutUnit fixedOffset, bool applyTextIndent, LayoutUnit logicalHeight = 0) const { return adjustLogicalRightOffsetForLine(logicalRightFloatOffsetForLine(logicalTop, fixedOffset, logicalHeight), applyTextIndent); } LayoutUnit logicalLeftOffsetForLine(LayoutUnit logicalTop, LayoutUnit fixedOffset, bool applyTextIndent, LayoutUnit logicalHeight = 0) const { return adjustLogicalLeftOffsetForLine(logicalLeftFloatOffsetForLine(logicalTop, fixedOffset, logicalHeight), applyTextIndent); } virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction) override; virtual void computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const override; virtual void computePreferredLogicalWidths() override; virtual Optional firstLineBaseline() const override; virtual Optional inlineBlockBaseline(LineDirectionMode) const override; // Delay updating scrollbars until endAndCommitUpdateScrollInfoAfterLayoutTransaction() is called. These functions are used // when a flexbox is laying out its descendants. If multiple calls are made to beginUpdateScrollInfoAfterLayoutTransaction() // then endAndCommitUpdateScrollInfoAfterLayoutTransaction() will do nothing until it is called the same number of times. void beginUpdateScrollInfoAfterLayoutTransaction(); void endAndCommitUpdateScrollInfoAfterLayoutTransaction(); void removeFromUpdateScrollInfoAfterLayoutTransaction(); void updateScrollInfoAfterLayout(); virtual void styleWillChange(StyleDifference, const RenderStyle& newStyle) override; virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle) override; virtual bool hasLineIfEmpty() const; bool simplifiedLayout(); virtual void simplifiedNormalFlowLayout(); bool childBoxIsUnsplittableForFragmentation(const RenderBox& child) const; public: virtual void computeOverflow(LayoutUnit oldClientAfterEdge, bool recomputeFloats = false); void clearLayoutOverflow(); // Adjust from painting offsets to the local coords of this renderer void offsetForContents(LayoutPoint&) const; // Obtains the nearest enclosing block (including this block) that contributes a first-line style to our inline // children. virtual RenderBlock* firstLineBlock() const override; protected: virtual void addOverflowFromChildren(); // FIXME-BLOCKFLOW: Remove virtualization when all callers have moved to RenderBlockFlow virtual void addOverflowFromInlineChildren() { } void addOverflowFromBlockChildren(); void addOverflowFromPositionedObjects(); void addVisualOverflowFromTheme(); virtual void addFocusRingRects(Vector&, const LayoutPoint& additionalOffset, const RenderLayerModelObject* paintContainer = 0) override; virtual void addFocusRingRectsForInlineChildren(Vector&, const LayoutPoint& additionalOffset, const RenderLayerModelObject* paintContainer); void computeRegionRangeForBoxChild(const RenderBox&) const; void estimateRegionRangeForBoxChild(const RenderBox&) const; bool updateRegionRangeForBoxChild(const RenderBox&) const; void updateBlockChildDirtyBitsBeforeLayout(bool relayoutChildren, RenderBox&); void preparePaginationBeforeBlockLayout(bool&); private: // FIXME-BLOCKFLOW: Remove virtualizaion when all callers have moved to RenderBlockFlow virtual LayoutUnit logicalRightFloatOffsetForLine(LayoutUnit, LayoutUnit fixedOffset, LayoutUnit) const { return fixedOffset; }; // FIXME-BLOCKFLOW: Remove virtualizaion when all callers have moved to RenderBlockFlow virtual LayoutUnit logicalLeftFloatOffsetForLine(LayoutUnit, LayoutUnit fixedOffset, LayoutUnit) const { return fixedOffset; } LayoutUnit adjustLogicalRightOffsetForLine(LayoutUnit offsetFromFloats, bool applyTextIndent) const; LayoutUnit adjustLogicalLeftOffsetForLine(LayoutUnit offsetFromFloats, bool applyTextIndent) const; virtual const char* renderName() const override; virtual bool isInlineBlockOrInlineTable() const override final { return isInline() && isReplaced(); } void makeChildrenNonInline(RenderObject* insertionPoint = nullptr); virtual void removeLeftoverAnonymousBlock(RenderBlock* child); // FIXME-BLOCKFLOW: Remove virtualizaion when all callers have moved to RenderBlockFlow virtual void moveAllChildrenIncludingFloatsTo(RenderBlock& toBlock, bool fullRemoveInsert) { moveAllChildrenTo(&toBlock, fullRemoveInsert); } void addChildToContinuation(RenderObject* newChild, RenderObject* beforeChild); virtual void addChildIgnoringContinuation(RenderObject* newChild, RenderObject* beforeChild) override; virtual bool isSelfCollapsingBlock() const override; virtual bool childrenPreventSelfCollapsing() const; void createFirstLetterRenderer(RenderElement* firstLetterBlock, RenderText* currentTextChild); void updateFirstLetterStyle(RenderElement* firstLetterBlock, RenderObject* firstLetterContainer); Node* nodeForHitTest() const; // FIXME-BLOCKFLOW: Remove virtualizaion when all callers have moved to RenderBlockFlow virtual void paintFloats(PaintInfo&, const LayoutPoint&, bool) { } virtual void paintInlineChildren(PaintInfo&, const LayoutPoint&) { } void paintContents(PaintInfo&, const LayoutPoint&); virtual void paintColumnRules(PaintInfo&, const LayoutPoint&) { }; void paintSelection(PaintInfo&, const LayoutPoint&); void paintCaret(PaintInfo&, const LayoutPoint&, CaretType); virtual bool avoidsFloats() const override; virtual bool hitTestContents(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction); // FIXME-BLOCKFLOW: Remove virtualization when all callers have moved to RenderBlockFlow virtual bool hitTestFloats(const HitTestRequest&, HitTestResult&, const HitTestLocation&, const LayoutPoint&) { return false; } virtual bool hitTestInlineChildren(const HitTestRequest&, HitTestResult&, const HitTestLocation&, const LayoutPoint&, HitTestAction) { return false; } virtual bool isPointInOverflowControl(HitTestResult&, const LayoutPoint& locationInContainer, const LayoutPoint& accumulatedOffset); void computeBlockPreferredLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const; virtual LayoutRect rectWithOutlineForRepaint(const RenderLayerModelObject* repaintContainer, LayoutUnit outlineWidth) const override final; virtual const RenderStyle& outlineStyleForRepaint() const override final; virtual RenderElement* hoverAncestor() const override final; virtual void updateDragState(bool dragOn) override final; virtual void childBecameNonInline(RenderElement&) override final; virtual LayoutRect selectionRectForRepaint(const RenderLayerModelObject* repaintContainer, bool /*clipToVisibleContent*/) override final { return selectionGapRectsForRepaint(repaintContainer); } virtual bool shouldPaintSelectionGaps() const override final; bool isSelectionRoot() const; GapRects selectionGaps(RenderBlock& rootBlock, const LayoutPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, LayoutUnit& lastLogicalTop, LayoutUnit& lastLogicalLeft, LayoutUnit& lastLogicalRight, const LogicalSelectionOffsetCaches&, const PaintInfo* = 0); // FIXME-BLOCKFLOW: Remove virtualizaion when all callers have moved to RenderBlockFlow virtual GapRects inlineSelectionGaps(RenderBlock& rootBlock, const LayoutPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, LayoutUnit& lastLogicalTop, LayoutUnit& lastLogicalLeft, LayoutUnit& lastLogicalRight, const LogicalSelectionOffsetCaches&, const PaintInfo*); GapRects blockSelectionGaps(RenderBlock& rootBlock, const LayoutPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, LayoutUnit& lastLogicalTop, LayoutUnit& lastLogicalLeft, LayoutUnit& lastLogicalRight, const LogicalSelectionOffsetCaches&, const PaintInfo*); LayoutRect blockSelectionGap(RenderBlock& rootBlock, const LayoutPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock, LayoutUnit lastLogicalTop, LayoutUnit lastLogicalLeft, LayoutUnit lastLogicalRight, LayoutUnit logicalBottom, const LogicalSelectionOffsetCaches&, const PaintInfo*); // FIXME-BLOCKFLOW: Remove virtualizaion when all callers have moved to RenderBlockFlow virtual void clipOutFloatingObjects(RenderBlock&, const PaintInfo*, const LayoutPoint&, const LayoutSize&) { }; friend class LogicalSelectionOffsetCaches; virtual void absoluteRects(Vector&, const LayoutPoint& accumulatedOffset) const override; virtual void absoluteQuads(Vector&, bool* wasFixed) const override; void paintContinuationOutlines(PaintInfo&, const LayoutPoint&); virtual LayoutRect localCaretRect(InlineBox*, int caretOffset, LayoutUnit* extraWidthToEndOfLine = 0) override final; // FIXME-BLOCKFLOW: Remove virtualizaion when all callers have moved to RenderBlockFlow virtual VisiblePosition positionForPointWithInlineChildren(const LayoutPoint&, const RenderRegion*); RenderPtr clone() const; RenderBlock* continuationBefore(RenderObject* beforeChild); RenderFlowThread* updateCachedFlowThreadContainingBlock(RenderFlowThread*) const; void removePositionedObjectsIfNeeded(const RenderStyle& oldStyle, const RenderStyle& newStyle); private: bool hasRareData() const; protected: void dirtyForLayoutFromPercentageHeightDescendants(); protected: bool recomputeLogicalWidth(); public: virtual LayoutUnit offsetFromLogicalTopOfFirstPage() const override; RenderRegion* regionAtBlockOffset(LayoutUnit) const; // FIXME: This is temporary to allow us to move code from RenderBlock into RenderBlockFlow that accesses member variables that we haven't moved out of // RenderBlock yet. friend class RenderBlockFlow; // FIXME-BLOCKFLOW: Remove this when the line layout stuff has all moved out of RenderBlock friend class LineBreaker; // RenderRubyBase objects need to be able to split and merge, moving their children around // (calling moveChildTo, moveAllChildrenTo, and makeChildrenNonInline). friend class RenderRubyBase; private: // Used to store state between styleWillChange and styleDidChange static bool s_canPropagateFloatIntoSibling; }; LayoutUnit blockDirectionOffset(RenderBlock& rootBlock, const LayoutSize& offsetFromRootBlock); LayoutUnit inlineDirectionOffset(RenderBlock& rootBlock, const LayoutSize& offsetFromRootBlock); VisiblePosition positionForPointRespectingEditingBoundaries(RenderBlock&, RenderBox&, const LayoutPoint&); } // namespace WebCore SPECIALIZE_TYPE_TRAITS_RENDER_OBJECT(RenderBlock, isRenderBlock()) #endif // RenderBlock_h