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

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutBox.cpp

Issue 2462643002: Be more restrictive about forcing relayout of children for pagination. (Closed)
Patch Set: No need to call updateFragmentationInfoForChild() when not paginated. Created 4 years, 1 month 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com)
5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com)
6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc.
7 * All rights reserved. 7 * All rights reserved.
8 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. 8 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved.
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 688 matching lines...) Expand 10 before | Expand all | Expand 10 after
699 m_frameRect.height().toFloat()); 699 m_frameRect.height().toFloat());
700 } 700 }
701 701
702 void LayoutBox::updateLayerTransformAfterLayout() { 702 void LayoutBox::updateLayerTransformAfterLayout() {
703 // Transform-origin depends on box size, so we need to update the layer 703 // Transform-origin depends on box size, so we need to update the layer
704 // transform after layout. 704 // transform after layout.
705 if (hasLayer()) 705 if (hasLayer())
706 layer()->updateTransformationMatrix(); 706 layer()->updateTransformationMatrix();
707 } 707 }
708 708
709 LayoutUnit LayoutBox::logicalHeightIncludingOverflow() const {
710 if (!m_overflow)
711 return logicalHeight();
712 LayoutRect overflow = layoutOverflowRect();
713 if (style()->isHorizontalWritingMode())
714 return overflow.maxY();
715 return overflow.maxX();
716 }
717
709 LayoutUnit LayoutBox::constrainLogicalWidthByMinMax(LayoutUnit logicalWidth, 718 LayoutUnit LayoutBox::constrainLogicalWidthByMinMax(LayoutUnit logicalWidth,
710 LayoutUnit availableWidth, 719 LayoutUnit availableWidth,
711 LayoutBlock* cb) const { 720 LayoutBlock* cb) const {
712 const ComputedStyle& styleToUse = styleRef(); 721 const ComputedStyle& styleToUse = styleRef();
713 if (!styleToUse.logicalMaxWidth().isMaxSizeNone()) 722 if (!styleToUse.logicalMaxWidth().isMaxSizeNone())
714 logicalWidth = 723 logicalWidth =
715 std::min(logicalWidth, 724 std::min(logicalWidth,
716 computeLogicalWidthUsing(MaxSize, styleToUse.logicalMaxWidth(), 725 computeLogicalWidthUsing(MaxSize, styleToUse.logicalMaxWidth(),
717 availableWidth, cb)); 726 availableWidth, cb));
718 return std::max(logicalWidth, computeLogicalWidthUsing( 727 return std::max(logicalWidth, computeLogicalWidthUsing(
(...skipping 3976 matching lines...) Expand 10 before | Expand all | Expand 10 after
4695 if (scrollableArea->hasHorizontalScrollbar() && 4704 if (scrollableArea->hasHorizontalScrollbar() &&
4696 !scrollableArea->layerForHorizontalScrollbar()) 4705 !scrollableArea->layerForHorizontalScrollbar())
4697 return true; 4706 return true;
4698 if (scrollableArea->hasVerticalScrollbar() && 4707 if (scrollableArea->hasVerticalScrollbar() &&
4699 !scrollableArea->layerForVerticalScrollbar()) 4708 !scrollableArea->layerForVerticalScrollbar())
4700 return true; 4709 return true;
4701 } 4710 }
4702 return false; 4711 return false;
4703 } 4712 }
4704 4713
4714 void LayoutBox::updateFragmentationInfoForChild(LayoutBox& child) {
4715 LayoutState* layoutState = view()->layoutState();
4716 DCHECK(layoutState->isPaginated());
4717 child.setOffsetToNextPage(LayoutUnit());
4718 if (!pageLogicalHeightForOffset(child.logicalTop()))
4719 return;
4720
4721 LayoutUnit logicalTop = child.logicalTop();
4722 LayoutUnit logicalHeight = child.logicalHeightIncludingOverflow();
4723 LayoutUnit spaceLeft =
4724 pageRemainingLogicalHeightForOffset(logicalTop, AssociateWithLatterPage);
4725 if (spaceLeft < logicalHeight)
4726 child.setOffsetToNextPage(spaceLeft);
4727 }
4728
4705 void LayoutBox::markChildForPaginationRelayoutIfNeeded( 4729 void LayoutBox::markChildForPaginationRelayoutIfNeeded(
4706 LayoutBox& child, 4730 LayoutBox& child,
4707 SubtreeLayoutScope& layoutScope) { 4731 SubtreeLayoutScope& layoutScope) {
4708 DCHECK(!child.needsLayout()); 4732 DCHECK(!child.needsLayout());
4709 LayoutState* layoutState = view()->layoutState(); 4733 LayoutState* layoutState = view()->layoutState();
4710 if (layoutState->paginationStateChanged()) { 4734 // TODO(mstensho): Should try to get this to work for floats too, instead of
4735 // just marking and bailing here.
4736 if (layoutState->paginationStateChanged() || child.isFloating()) {
4711 layoutScope.setChildNeedsLayout(&child); 4737 layoutScope.setChildNeedsLayout(&child);
4712 return; 4738 return;
4713 } 4739 }
4714 if (!layoutState->isPaginated()) 4740 if (!layoutState->isPaginated())
4715 return; 4741 return;
4716 4742
4717 if (layoutState->pageLogicalHeightChanged() || 4743 LayoutUnit logicalTop = child.logicalTop();
4718 (layoutState->pageLogicalHeight() && 4744 if (LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalTop)) {
4719 layoutState->pageLogicalOffset(child, child.logicalTop()) != 4745 // Figure out if we really need to force re-layout of the child. We only
4720 child.pageLogicalOffset())) 4746 // need to do this if there's a chance that we need to recalculate
4721 layoutScope.setChildNeedsLayout(&child); 4747 // pagination struts inside.
4748 LayoutUnit remainingSpace = pageRemainingLogicalHeightForOffset(
4749 logicalTop, AssociateWithLatterPage);
4750 LayoutUnit logicalHeight = child.logicalHeightIncludingOverflow();
4751 if ((!child.offsetToNextPage() && logicalHeight <= remainingSpace) ||
4752 child.offsetToNextPage() == remainingSpace) {
4753 // We don't need to relayout this child, either because the child wasn't
4754 // previously fragmented, and won't be fragmented now either, or because
4755 // it would fragment at the exact same position as before.
4756 //
4757 // We want to skip layout of this child, but we need to ask the flow
4758 // thread for permission first. We currently cannot skip over objects
4759 // containing column spanners.
4760 LayoutFlowThread* flowThread = child.flowThreadContainingBlock();
4761 if (!flowThread || flowThread->canSkipLayout(child))
4762 return;
4763 }
4764 }
4765
4766 layoutScope.setChildNeedsLayout(&child);
4722 } 4767 }
4723 4768
4724 void LayoutBox::markOrthogonalWritingModeRoot() { 4769 void LayoutBox::markOrthogonalWritingModeRoot() {
4725 ASSERT(frameView()); 4770 ASSERT(frameView());
4726 frameView()->addOrthogonalWritingModeRoot(*this); 4771 frameView()->addOrthogonalWritingModeRoot(*this);
4727 } 4772 }
4728 4773
4729 void LayoutBox::unmarkOrthogonalWritingModeRoot() { 4774 void LayoutBox::unmarkOrthogonalWritingModeRoot() {
4730 ASSERT(frameView()); 4775 ASSERT(frameView());
4731 frameView()->removeOrthogonalWritingModeRoot(*this); 4776 frameView()->removeOrthogonalWritingModeRoot(*this);
(...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after
5278 // meant to be called on the object currently being laid out. 5323 // meant to be called on the object currently being laid out.
5279 ASSERT(!isLayoutBlock()); 5324 ASSERT(!isLayoutBlock());
5280 5325
5281 // In case this box doesn't establish a layout state, try the containing 5326 // In case this box doesn't establish a layout state, try the containing
5282 // block. 5327 // block.
5283 LayoutBlock* containerBlock = containingBlock(); 5328 LayoutBlock* containerBlock = containingBlock();
5284 ASSERT(layoutState->layoutObject() == containerBlock); 5329 ASSERT(layoutState->layoutObject() == containerBlock);
5285 return containerBlock->offsetFromLogicalTopOfFirstPage() + logicalTop(); 5330 return containerBlock->offsetFromLogicalTopOfFirstPage() + logicalTop();
5286 } 5331 }
5287 5332
5288 void LayoutBox::setPageLogicalOffset(LayoutUnit offset) { 5333 void LayoutBox::setOffsetToNextPage(LayoutUnit offset) {
5289 if (!m_rareData && !offset) 5334 if (!m_rareData && !offset)
5290 return; 5335 return;
5291 ensureRareData().m_pageLogicalOffset = offset; 5336 ensureRareData().m_offsetToNextPage = offset;
5292 } 5337 }
5293 5338
5294 void LayoutBox::logicalExtentAfterUpdatingLogicalWidth( 5339 void LayoutBox::logicalExtentAfterUpdatingLogicalWidth(
5295 const LayoutUnit& newLogicalTop, 5340 const LayoutUnit& newLogicalTop,
5296 LayoutBox::LogicalExtentComputedValues& computedValues) { 5341 LayoutBox::LogicalExtentComputedValues& computedValues) {
5297 // FIXME: None of this is right for perpendicular writing-mode children. 5342 // FIXME: None of this is right for perpendicular writing-mode children.
5298 LayoutUnit oldLogicalWidth = logicalWidth(); 5343 LayoutUnit oldLogicalWidth = logicalWidth();
5299 LayoutUnit oldLogicalLeft = logicalLeft(); 5344 LayoutUnit oldLogicalLeft = logicalLeft();
5300 LayoutUnit oldMarginLeft = marginLeft(); 5345 LayoutUnit oldMarginLeft = marginLeft();
5301 LayoutUnit oldMarginRight = marginRight(); 5346 LayoutUnit oldMarginRight = marginRight();
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
5595 LayoutRect rect = frameRect(); 5640 LayoutRect rect = frameRect();
5596 5641
5597 LayoutBlock* block = containingBlock(); 5642 LayoutBlock* block = containingBlock();
5598 if (block) 5643 if (block)
5599 block->adjustChildDebugRect(rect); 5644 block->adjustChildDebugRect(rect);
5600 5645
5601 return rect; 5646 return rect;
5602 } 5647 }
5603 5648
5604 } // namespace blink 5649 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698