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

Unified Diff: Source/core/rendering/RenderBlockFlow.cpp

Issue 551263005: *** DO NOT LAND *** Implement column-span:all without reparenting renderers. Work in progress. (Closed) Base URL: git:blink.git@new-multicol-no-renderer-reparenting
Patch Set: Copy margin properties from a spanner to its spanner set, to simplify code. Created 6 years, 3 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
« no previous file with comments | « no previous file | Source/core/rendering/RenderBox.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/RenderBlockFlow.cpp
diff --git a/Source/core/rendering/RenderBlockFlow.cpp b/Source/core/rendering/RenderBlockFlow.cpp
index 61db8cc0f25e4d307e353709688fabd97d6d00e3..7dfe8dfd2287cd8a1630d12fa636e3851e376cb1 100644
--- a/Source/core/rendering/RenderBlockFlow.cpp
+++ b/Source/core/rendering/RenderBlockFlow.cpp
@@ -548,6 +548,15 @@ void RenderBlockFlow::layoutBlockChild(RenderBox* child, MarginInfo& marginInfo,
{
LayoutUnit oldPosMarginBefore = maxPositiveMarginBefore();
LayoutUnit oldNegMarginBefore = maxNegativeMarginBefore();
+ bool isColumnSpanner = child->isColumnSpanAll();
+
+ if (isColumnSpanner) {
+ // Margins of a column spanner cannot collapse with anything.
+ setLogicalHeight(logicalHeight() + marginInfo.margin());
+ marginInfo.clearMargin();
+ LayoutUnit adjustment = flowThreadContainingBlock()->enterColumnSpanner(child, logicalHeight());
+ setLogicalHeight(logicalHeight() + adjustment);
+ }
// The child is a normal flow object. Compute the margins we will use for collapsing now.
child->computeAndSetBlockDirectionMargins(this);
@@ -558,14 +567,6 @@ void RenderBlockFlow::layoutBlockChild(RenderBox* child, MarginInfo& marginInfo,
LayoutUnit estimateWithoutPagination;
LayoutUnit logicalTopEstimate = estimateLogicalTopPosition(child, marginInfo, estimateWithoutPagination);
- bool isColumnSpanner = child->isColumnSpanAll();
- if (isColumnSpanner) {
- LayoutUnit margin = child->marginBefore();
- logicalTopEstimate -= margin;
- flowThreadContainingBlock()->enterColumnSpanner(child, logicalTopEstimate);
- logicalTopEstimate += margin;
- }
-
// Cache our old rect so that we can dirty the proper paint invalidation rects if the child moves.
LayoutRect oldRect = child->frameRect();
LayoutUnit oldLogicalTop = logicalTopForChild(child);
@@ -733,9 +734,6 @@ LayoutUnit RenderBlockFlow::adjustBlockChildForPagination(LayoutUnit logicalTopA
// If the object has a page or column break value of "before", then we should shift to the top of the next page.
LayoutUnit result = applyBeforeBreak(child, logicalTopAfterClear);
- if (child->isColumnSpanAll())
- result += flowThreadContainingBlock()->spannerLogicalTopAdjustment(child, result - child->marginBefore());
-
// For replaced elements and scrolled elements, we want to shift them to the next page if they don't fit on the current one.
LayoutUnit logicalTopBeforeUnsplittableAdjustment = result;
LayoutUnit logicalTopAfterUnsplittableAdjustment = adjustForUnsplittableChild(child, result);
@@ -1183,7 +1181,7 @@ LayoutUnit RenderBlockFlow::collapseMargins(RenderBox* child, MarginInfo& margin
// margins that will collapse with us.
bool topQuirk = hasMarginBeforeQuirk(child);
- if (marginInfo.canCollapseWithMarginBefore() && !mustSeparateMarginBeforeForChild(child)) {
+ if (marginInfo.canCollapseWithMarginBefore()) {
if (!childDiscardMarginBefore && !marginInfo.discardMargin()) {
// This child is collapsing with the top of the
// block. If it has larger margin values, then we need to update
@@ -1468,9 +1466,6 @@ void RenderBlockFlow::marginBeforeEstimateForChild(RenderBox* child, LayoutUnit&
if (!grandchildBox || grandchildBox->style()->clear() != CNONE)
return;
- if (childBlockFlow->mustSeparateMarginBeforeForChild(grandchildBox))
- return;
-
// Make sure to update the block margins now for the grandchild box so that we're looking at current values.
if (grandchildBox->needsLayout()) {
grandchildBox->computeAndSetBlockDirectionMargins(this);
@@ -1490,7 +1485,7 @@ LayoutUnit RenderBlockFlow::estimateLogicalTopPosition(RenderBox* child, const M
// FIXME: We need to eliminate the estimation of vertical position, because when it's wrong we sometimes trigger a pathological
// relayout if there are intruding floats.
LayoutUnit logicalTopEstimate = logicalHeight();
- if (!marginInfo.canCollapseWithMarginBefore() || mustSeparateMarginBeforeForChild(child)) {
+ if (!marginInfo.canCollapseWithMarginBefore()) {
LayoutUnit positiveMarginBefore = 0;
LayoutUnit negativeMarginBefore = 0;
bool discardMarginBefore = false;
@@ -1685,8 +1680,7 @@ void RenderBlockFlow::setMaxMarginAfterValues(LayoutUnit pos, LayoutUnit neg)
bool RenderBlockFlow::mustSeparateMarginBeforeForChild(const RenderBox* child) const
{
- if (child->isColumnSpanAll())
- return true;
+ ASSERT(!child->selfNeedsLayout());
const RenderStyle* childStyle = child->style();
if (!child->isWritingModeRoot())
return childStyle->marginBeforeCollapse() == MSEPARATE;
@@ -1699,8 +1693,7 @@ bool RenderBlockFlow::mustSeparateMarginBeforeForChild(const RenderBox* child) c
bool RenderBlockFlow::mustSeparateMarginAfterForChild(const RenderBox* child) const
{
- if (child->isColumnSpanAll())
- return true;
+ ASSERT(!child->selfNeedsLayout());
const RenderStyle* childStyle = child->style();
if (!child->isWritingModeRoot())
return childStyle->marginAfterCollapse() == MSEPARATE;
« no previous file with comments | « no previous file | Source/core/rendering/RenderBox.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698