Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(525)

Unified Diff: third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp

Issue 1642223002: Delete selection gap code. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
index 6041079e9fc0239551ff9cf3c13c68c1d41a5929..def8c0977ebf6e4227513d816b84d021de5f2c55 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
@@ -2103,11 +2103,6 @@ void LayoutBlockFlow::paintFloats(const PaintInfo& paintInfo, const LayoutPoint&
BlockFlowPainter(*this).paintFloats(paintInfo, paintOffset);
}
-void LayoutBlockFlow::paintSelection(const PaintInfo& paintInfo, const LayoutPoint& paintOffset) const
-{
- BlockFlowPainter(*this).paintSelection(paintInfo, paintOffset);
-}
-
void LayoutBlockFlow::clipOutFloatingObjects(const LayoutBlock* rootBlock, ClipScope& clipScope,
const LayoutPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock) const
{
@@ -2643,139 +2638,6 @@ LayoutUnit LayoutBlockFlow::logicalRightFloatOffsetForLine(LayoutUnit logicalTop
return fixedOffset;
}
-LayoutRect LayoutBlockFlow::selectionRectForPaintInvalidation(const LayoutBoxModelObject* paintInvalidationContainer) const
-{
- LayoutRect rect = selectionGapRectsForPaintInvalidation(paintInvalidationContainer);
- // FIXME: groupedMapping() leaks the squashing abstraction.
- if (paintInvalidationContainer->layer()->groupedMapping())
- PaintLayer::mapRectToPaintBackingCoordinates(paintInvalidationContainer, rect);
- return rect;
-}
-
-GapRects LayoutBlockFlow::selectionGapRectsForPaintInvalidation(const LayoutBoxModelObject* paintInvalidationContainer) const
-{
- ASSERT(!needsLayout());
-
- if (!shouldPaintSelectionGaps())
- return GapRects();
-
- TransformState transformState(TransformState::ApplyTransformDirection, FloatPoint());
- mapLocalToAncestor(paintInvalidationContainer, transformState, ApplyContainerFlip | UseTransforms);
- LayoutPoint offsetFromPaintInvalidationContainer = roundedLayoutPoint(transformState.mappedPoint());
-
- if (hasOverflowClip())
- offsetFromPaintInvalidationContainer -= scrolledContentOffset();
-
- LayoutUnit lastTop = 0;
- LayoutUnit lastLeft = logicalLeftSelectionOffset(this, lastTop);
- LayoutUnit lastRight = logicalRightSelectionOffset(this, lastTop);
-
- return selectionGaps(this, offsetFromPaintInvalidationContainer, LayoutSize(), lastTop, lastLeft, lastRight);
-}
-
-static void clipOutPositionedObjects(ClipScope& clipScope, const LayoutPoint& offset, TrackedLayoutBoxListHashSet* positionedObjects)
-{
- if (!positionedObjects)
- return;
-
- TrackedLayoutBoxListHashSet::const_iterator end = positionedObjects->end();
- for (TrackedLayoutBoxListHashSet::const_iterator it = positionedObjects->begin(); it != end; ++it) {
- LayoutBox* r = *it;
- clipScope.clip(LayoutRect(flooredIntPoint(r->location() + offset), flooredIntSize(r->size())), SkRegion::kDifference_Op);
- }
-}
-
-GapRects LayoutBlockFlow::selectionGaps(const LayoutBlock* rootBlock, const LayoutPoint& rootBlockPhysicalPosition,
- const LayoutSize& offsetFromRootBlock, LayoutUnit& lastLogicalTop, LayoutUnit& lastLogicalLeft, LayoutUnit& lastLogicalRight,
- const PaintInfo* paintInfo, ClipScope* clipScope) const
-{
- // IMPORTANT: Callers of this method that intend for painting to happen need to do a save/restore.
- if (clipScope) {
- // Note that we don't clip out overflow for positioned objects. We just stick to the border box.
- LayoutRect flippedBlockRect(LayoutPoint(offsetFromRootBlock), size());
- rootBlock->flipForWritingMode(flippedBlockRect);
- flippedBlockRect.moveBy(rootBlockPhysicalPosition);
- clipOutPositionedObjects(*clipScope, flippedBlockRect.location(), positionedObjects());
- if (isBody() || isDocumentElement()) // The <body> must make sure to examine its containingBlock's positioned objects.
- for (LayoutBlock* cb = containingBlock(); cb && !cb->isLayoutView(); cb = cb->containingBlock())
- clipOutPositionedObjects(*clipScope, cb->location(), cb->positionedObjects()); // FIXME: Not right for flipped writing modes.
- clipOutFloatingObjects(rootBlock, *clipScope, rootBlockPhysicalPosition, offsetFromRootBlock);
- }
-
- GapRects result;
-
- if (hasTransformRelatedProperty() || style()->columnSpan())
- return result;
-
- if (childrenInline())
- result = inlineSelectionGaps(rootBlock, rootBlockPhysicalPosition, offsetFromRootBlock, lastLogicalTop, lastLogicalLeft, lastLogicalRight, paintInfo);
- else
- result = blockSelectionGaps(rootBlock, rootBlockPhysicalPosition, offsetFromRootBlock, lastLogicalTop, lastLogicalLeft, lastLogicalRight, paintInfo);
-
- // Go ahead and fill the vertical gap all the way to the bottom of our block if the selection extends past our block.
- if (rootBlock == this && (selectionState() != SelectionBoth && selectionState() != SelectionEnd)) {
- result.uniteCenter(blockSelectionGap(rootBlock, rootBlockPhysicalPosition, offsetFromRootBlock,
- lastLogicalTop, lastLogicalLeft, lastLogicalRight, logicalHeight(), paintInfo));
- }
- return result;
-}
-
-
-GapRects LayoutBlockFlow::inlineSelectionGaps(const LayoutBlock* rootBlock, const LayoutPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock,
- LayoutUnit& lastLogicalTop, LayoutUnit& lastLogicalLeft, LayoutUnit& lastLogicalRight, const PaintInfo* paintInfo) const
-{
- GapRects result;
-
- bool containsStart = selectionState() == SelectionStart || selectionState() == SelectionBoth;
-
- if (!firstLineBox()) {
- if (containsStart) {
- // Go ahead and update our lastLogicalTop to be the bottom of the block. <hr>s or empty blocks with height can trip this
- // case.
- lastLogicalTop = rootBlock->blockDirectionOffset(offsetFromRootBlock) + logicalHeight();
- lastLogicalLeft = logicalLeftSelectionOffset(rootBlock, logicalHeight());
- lastLogicalRight = logicalRightSelectionOffset(rootBlock, logicalHeight());
- }
- return result;
- }
-
- RootInlineBox* lastSelectedLine = nullptr;
- RootInlineBox* curr;
- for (curr = firstRootBox(); curr && !curr->hasSelectedChildren(); curr = curr->nextRootBox()) { }
-
- // Now paint the gaps for the lines.
- for (; curr && curr->hasSelectedChildren(); curr = curr->nextRootBox()) {
- LayoutUnit selTop = curr->selectionTopAdjustedForPrecedingBlock();
- LayoutUnit selHeight = curr->selectionHeightAdjustedForPrecedingBlock();
-
- if (!containsStart && !lastSelectedLine && selectionState() != SelectionStart && selectionState() != SelectionBoth) {
- result.uniteCenter(blockSelectionGap(rootBlock, rootBlockPhysicalPosition, offsetFromRootBlock, lastLogicalTop,
- lastLogicalLeft, lastLogicalRight, selTop, paintInfo));
- }
-
- LayoutRect logicalRect(curr->logicalLeft(), selTop, curr->logicalWidth(), selTop + selHeight);
- logicalRect.move(isHorizontalWritingMode() ? offsetFromRootBlock : offsetFromRootBlock.transposedSize());
- LayoutRect physicalRect = rootBlock->logicalRectToPhysicalRect(rootBlockPhysicalPosition, logicalRect);
- if (!paintInfo || paintInfo->cullRect().intersectsCullRect(enclosingIntRect(physicalRect)))
- result.unite(curr->lineSelectionGap(rootBlock, rootBlockPhysicalPosition, offsetFromRootBlock, selTop, selHeight, paintInfo));
-
- lastSelectedLine = curr;
- }
-
- if (containsStart && !lastSelectedLine) {
- // VisibleSelection must start just after our last line.
- lastSelectedLine = lastRootBox();
- }
-
- if (lastSelectedLine && selectionState() != SelectionEnd && selectionState() != SelectionBoth) {
- // Go ahead and update our lastY to be the bottom of the last selected line.
- lastLogicalTop = rootBlock->blockDirectionOffset(offsetFromRootBlock) + lastSelectedLine->selectionBottom();
- lastLogicalLeft = logicalLeftSelectionOffset(rootBlock, lastSelectedLine->selectionBottom());
- lastLogicalRight = logicalRightSelectionOffset(rootBlock, lastSelectedLine->selectionBottom());
- }
- return result;
-}
-
IntRect alignSelectionRectToDevicePixels(LayoutRect& rect)
{
LayoutUnit roundedX = rect.x().round();
@@ -2784,147 +2646,6 @@ IntRect alignSelectionRectToDevicePixels(LayoutRect& rect)
snapSizeToPixel(rect.height(), rect.y()));
}
-bool LayoutBlockFlow::shouldPaintSelectionGaps() const
-{
- if (RuntimeEnabledFeatures::selectionPaintingWithoutSelectionGapsEnabled())
- return false;
- return selectionState() != SelectionNone && style()->visibility() == VISIBLE && isSelectionRoot();
-}
-
-LayoutRect LayoutBlockFlow::blockSelectionGap(const LayoutBlock* rootBlock, const LayoutPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock,
- LayoutUnit lastLogicalTop, LayoutUnit lastLogicalLeft, LayoutUnit lastLogicalRight, LayoutUnit logicalBottom, const PaintInfo* paintInfo) const
-{
- LayoutUnit logicalTop = lastLogicalTop;
- LayoutUnit logicalHeight = rootBlock->blockDirectionOffset(offsetFromRootBlock) + logicalBottom - logicalTop;
- if (logicalHeight <= 0)
- return LayoutRect();
-
- // Get the selection offsets for the bottom of the gap
- LayoutUnit logicalLeft = std::max(lastLogicalLeft, logicalLeftSelectionOffset(rootBlock, logicalBottom));
- LayoutUnit logicalRight = std::min(lastLogicalRight, logicalRightSelectionOffset(rootBlock, logicalBottom));
- LayoutUnit logicalWidth = logicalRight - logicalLeft;
- if (logicalWidth <= 0)
- return LayoutRect();
-
- LayoutRect gapRect = rootBlock->logicalRectToPhysicalRect(rootBlockPhysicalPosition, LayoutRect(logicalLeft, logicalTop, logicalWidth, logicalHeight));
- if (paintInfo) {
- IntRect selectionGapRect = alignSelectionRectToDevicePixels(gapRect);
- paintInfo->context.fillRect(selectionGapRect, selectionBackgroundColor());
- }
- return gapRect;
-}
-
-GapRects LayoutBlockFlow::blockSelectionGaps(const LayoutBlock* rootBlock, const LayoutPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock,
- LayoutUnit& lastLogicalTop, LayoutUnit& lastLogicalLeft, LayoutUnit& lastLogicalRight, const PaintInfo* paintInfo) const
-{
- GapRects result;
-
- // Go ahead and jump right to the first block child that contains some selected objects.
- LayoutBox* curr;
- for (curr = firstChildBox(); curr && curr->selectionState() == SelectionNone; curr = curr->nextSiblingBox()) { }
-
- for (bool sawSelectionEnd = false; curr && !sawSelectionEnd; curr = curr->nextSiblingBox()) {
- SelectionState childState = curr->selectionState();
- if (childState == SelectionBoth || childState == SelectionEnd)
- sawSelectionEnd = true;
-
- if (curr->isFloatingOrOutOfFlowPositioned())
- continue; // We must be a normal flow object in order to even be considered.
-
- if (curr->isInFlowPositioned() && curr->hasLayer()) {
- // If the relposition offset is anything other than 0, then treat this just like an absolute positioned element.
- // Just disregard it completely.
- LayoutSize relOffset = curr->layer()->offsetForInFlowPosition();
- if (relOffset.width() || relOffset.height())
- continue;
- }
-
- bool paintsOwnSelection = curr->shouldPaintSelectionGaps() || curr->isTable(); // FIXME: Eventually we won't special-case table like this.
- bool fillBlockGaps = paintsOwnSelection || (curr->canBeSelectionLeaf() && childState != SelectionNone);
- if (fillBlockGaps) {
- // We need to fill the vertical gap above this object.
- if (childState == SelectionEnd || childState == SelectionInside) {
- // Fill the gap above the object.
- result.uniteCenter(blockSelectionGap(rootBlock, rootBlockPhysicalPosition, offsetFromRootBlock, lastLogicalTop, lastLogicalLeft, lastLogicalRight,
- curr->logicalTop(), paintInfo));
- }
-
- // Only fill side gaps for objects that paint their own selection if we know for sure the selection is going to extend all the way *past*
- // our object. We know this if the selection did not end inside our object.
- if (paintsOwnSelection && (childState == SelectionStart || sawSelectionEnd))
- childState = SelectionNone;
-
- // Fill side gaps on this object based off its state.
- bool leftGap, rightGap;
- getSelectionGapInfo(childState, leftGap, rightGap);
-
- if (leftGap)
- result.uniteLeft(logicalLeftSelectionGap(rootBlock, rootBlockPhysicalPosition, offsetFromRootBlock, LineLayoutItem(const_cast<LayoutBlockFlow*>(this)), curr->logicalLeft(), curr->logicalTop(), curr->logicalHeight(), paintInfo));
- if (rightGap)
- result.uniteRight(logicalRightSelectionGap(rootBlock, rootBlockPhysicalPosition, offsetFromRootBlock, LineLayoutItem(const_cast<LayoutBlockFlow*>(this)), curr->logicalRight(), curr->logicalTop(), curr->logicalHeight(), paintInfo));
-
- // Update lastLogicalTop to be just underneath the object. lastLogicalLeft and lastLogicalRight extend as far as
- // they can without bumping into floating or positioned objects. Ideally they will go right up
- // to the border of the root selection block.
- lastLogicalTop = rootBlock->blockDirectionOffset(offsetFromRootBlock) + curr->logicalBottom();
- lastLogicalLeft = logicalLeftSelectionOffset(rootBlock, curr->logicalBottom());
- lastLogicalRight = logicalRightSelectionOffset(rootBlock, curr->logicalBottom());
- } else if (childState != SelectionNone && curr->isLayoutBlockFlow()) {
- // We must be a block that has some selected object inside it. Go ahead and recur.
- result.unite(toLayoutBlockFlow(curr)->selectionGaps(rootBlock, rootBlockPhysicalPosition, LayoutSize(offsetFromRootBlock.width() + curr->location().x(), offsetFromRootBlock.height() + curr->location().y()),
- lastLogicalTop, lastLogicalLeft, lastLogicalRight, paintInfo));
- }
- }
- return result;
-}
-
-LayoutRect LayoutBlockFlow::logicalLeftSelectionGap(const LayoutBlock* rootBlock, const LayoutPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock,
- const LineLayoutItem selObj, LayoutUnit logicalLeft, LayoutUnit logicalTop, LayoutUnit logicalHeight, const PaintInfo* paintInfo) const
-{
- LayoutUnit rootBlockLogicalTop = rootBlock->blockDirectionOffset(offsetFromRootBlock) + logicalTop;
- LayoutUnit rootBlockLogicalLeft = std::max(logicalLeftSelectionOffset(rootBlock, logicalTop), logicalLeftSelectionOffset(rootBlock, logicalTop + logicalHeight));
- LayoutUnit rootBlockLogicalRight = std::min(rootBlock->inlineDirectionOffset(offsetFromRootBlock) + logicalLeft, std::min(logicalRightSelectionOffset(rootBlock, logicalTop), logicalRightSelectionOffset(rootBlock, logicalTop + logicalHeight)));
- LayoutUnit rootBlockLogicalWidth = rootBlockLogicalRight - rootBlockLogicalLeft;
- if (rootBlockLogicalWidth <= 0)
- return LayoutRect();
-
- LayoutRect gapRect = rootBlock->logicalRectToPhysicalRect(rootBlockPhysicalPosition, LayoutRect(rootBlockLogicalLeft, rootBlockLogicalTop, rootBlockLogicalWidth, logicalHeight));
- if (paintInfo) {
- IntRect selectionGapRect = alignSelectionRectToDevicePixels(gapRect);
- paintInfo->context.fillRect(selectionGapRect, selObj.selectionBackgroundColor());
- }
- return gapRect;
-}
-
-LayoutRect LayoutBlockFlow::logicalRightSelectionGap(const LayoutBlock* rootBlock, const LayoutPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock,
- const LineLayoutItem selObj, LayoutUnit logicalRight, LayoutUnit logicalTop, LayoutUnit logicalHeight, const PaintInfo* paintInfo) const
-{
- LayoutUnit rootBlockLogicalTop = rootBlock->blockDirectionOffset(offsetFromRootBlock) + logicalTop;
- LayoutUnit rootBlockLogicalLeft = std::max(rootBlock->inlineDirectionOffset(offsetFromRootBlock) + logicalRight, max(logicalLeftSelectionOffset(rootBlock, logicalTop), logicalLeftSelectionOffset(rootBlock, logicalTop + logicalHeight)));
- LayoutUnit rootBlockLogicalRight = std::min(logicalRightSelectionOffset(rootBlock, logicalTop), logicalRightSelectionOffset(rootBlock, logicalTop + logicalHeight));
- LayoutUnit rootBlockLogicalWidth = rootBlockLogicalRight - rootBlockLogicalLeft;
- if (rootBlockLogicalWidth <= 0)
- return LayoutRect();
-
- LayoutRect gapRect = rootBlock->logicalRectToPhysicalRect(rootBlockPhysicalPosition, LayoutRect(rootBlockLogicalLeft, rootBlockLogicalTop, rootBlockLogicalWidth, logicalHeight));
- if (paintInfo) {
- IntRect selectionGapRect = alignSelectionRectToDevicePixels(gapRect);
- paintInfo->context.fillRect(selectionGapRect, selObj.selectionBackgroundColor());
- }
- return gapRect;
-}
-
-void LayoutBlockFlow::getSelectionGapInfo(SelectionState state, bool& leftGap, bool& rightGap) const
-{
- bool ltr = style()->isLeftToRightDirection();
- leftGap = (state == SelectionInside)
- || (state == SelectionEnd && ltr)
- || (state == SelectionStart && !ltr);
- rightGap = (state == SelectionInside)
- || (state == SelectionStart && ltr)
- || (state == SelectionEnd && !ltr);
-}
-
bool LayoutBlockFlow::allowsPaginationStrut() const
{
// The block needs to be contained by a LayoutBlockFlow (and not by e.g. a flexbox, grid, or a

Powered by Google App Engine
This is Rietveld 408576698