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

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

Issue 1920453003: [css-flexbox] Implement new abspos handling (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix test Created 4 years, 8 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 | « third_party/WebKit/Source/core/layout/LayoutFlexibleBox.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
diff --git a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
index 68f6a44d1168e61c2dcbedb5a8fcebfbc8d3dc84..6082c29efc3ff114d957ea547fea0a38022b71e7 100644
--- a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
@@ -1354,17 +1354,72 @@ void LayoutFlexibleBox::setOverrideMainAxisSizeForChild(LayoutBox& child, Layout
child.setOverrideLogicalContentWidth(childPreferredSize - child.borderAndPaddingLogicalWidth());
}
-void LayoutFlexibleBox::prepareChildForPositionedLayout(LayoutBox& child, LayoutUnit mainAxisOffset, LayoutUnit crossAxisOffset, PositionedLayoutMode layoutMode)
+LayoutUnit LayoutFlexibleBox::staticMainAxisPositionForPositionedChild(const LayoutBox& child)
+{
+ const LayoutUnit availableSpace = mainAxisContentExtent(contentLogicalHeight()) - mainAxisExtentForChild(child);
+
+ ContentPosition position = styleRef().resolvedJustifyContentPosition(normalValueBehavior());
+ ContentDistributionType distribution = styleRef().resolvedJustifyContentDistribution(normalValueBehavior());
+ // TODO(cbiesinger): what should row-reverse/column-reverse do? https://lists.w3.org/Archives/Public/www-style/2016Apr/0387.html
+ return initialJustifyContentOffset(availableSpace, position, distribution, 1);
+}
+
+LayoutUnit LayoutFlexibleBox::staticCrossAxisPositionForPositionedChild(const LayoutBox& child)
+{
+ LayoutUnit availableSpace = crossAxisContentExtent() - crossAxisExtentForChild(child);
+ return alignmentOffset(availableSpace, alignmentForChild(child), LayoutUnit(), LayoutUnit(), styleRef().flexWrap() == FlexWrapReverse);
+}
+
+LayoutUnit LayoutFlexibleBox::staticInlinePositionForPositionedChild(const LayoutBox& child)
+{
+ LayoutUnit staticInlineOffset = flowAwareBorderStart() + flowAwarePaddingStart();
+ return staticInlineOffset + (isColumnFlow() ?
+ staticCrossAxisPositionForPositionedChild(child) :
+ staticMainAxisPositionForPositionedChild(child));
+}
+
+LayoutUnit LayoutFlexibleBox::staticBlockPositionForPositionedChild(const LayoutBox& child)
+{
+ LayoutUnit staticBlockOffset = flowAwareBorderBefore() + flowAwarePaddingBefore();
+ return staticBlockOffset + (isColumnFlow() ?
+ staticMainAxisPositionForPositionedChild(child) :
+ staticCrossAxisPositionForPositionedChild(child));
+}
+
+bool LayoutFlexibleBox::setStaticPositionForPositionedLayout(LayoutBox& child)
+{
+ bool positionChanged = false;
+ PaintLayer* childLayer = child.layer();
+ if (child.styleRef().hasStaticInlinePosition(styleRef().isHorizontalWritingMode())) {
+ LayoutUnit inlinePosition = staticInlinePositionForPositionedChild(child);
+ if (childLayer->staticInlinePosition() != inlinePosition) {
+ childLayer->setStaticInlinePosition(inlinePosition);
+ positionChanged = true;
+ }
+ }
+ if (child.styleRef().hasStaticBlockPosition(styleRef().isHorizontalWritingMode())) {
+ LayoutUnit blockPosition = staticBlockPositionForPositionedChild(child);
+ if (childLayer->staticBlockPosition() != blockPosition) {
+ childLayer->setStaticBlockPosition(blockPosition);
+ positionChanged = true;
+ }
+ }
+ return positionChanged;
+}
+
+void LayoutFlexibleBox::prepareChildForPositionedLayout(LayoutBox& child)
{
ASSERT(child.isOutOfFlowPositioned());
child.containingBlock()->insertPositionedObject(&child);
PaintLayer* childLayer = child.layer();
- LayoutUnit inlinePosition = isColumnFlow() ? crossAxisOffset : mainAxisOffset;
- if (layoutMode == FlipForRowReverse && style()->flexDirection() == FlowRowReverse)
- inlinePosition = mainAxisExtent() - mainAxisOffset;
- childLayer->setStaticInlinePosition(inlinePosition);
+ LayoutUnit staticInlinePosition = flowAwareBorderStart() + flowAwarePaddingStart();
+ if (childLayer->staticInlinePosition() != staticInlinePosition) {
+ childLayer->setStaticInlinePosition(staticInlinePosition);
+ if (child.style()->hasStaticInlinePosition(style()->isHorizontalWritingMode()))
+ child.setChildNeedsLayout(MarkOnlyThis);
+ }
- LayoutUnit staticBlockPosition = isColumnFlow() ? mainAxisOffset : crossAxisOffset;
+ LayoutUnit staticBlockPosition = flowAwareBorderBefore() + flowAwarePaddingBefore();
if (childLayer->staticBlockPosition() != staticBlockPosition) {
childLayer->setStaticBlockPosition(staticBlockPosition);
if (child.style()->hasStaticBlockPosition(style()->isHorizontalWritingMode()))
@@ -1486,7 +1541,7 @@ void LayoutFlexibleBox::layoutAndPlaceChildren(LayoutUnit& crossAxisOffset, cons
LayoutBox* child = children[i];
if (child->isOutOfFlowPositioned()) {
- prepareChildForPositionedLayout(*child, mainAxisOffset, crossAxisOffset, FlipForRowReverse);
+ prepareChildForPositionedLayout(*child);
continue;
}
@@ -1584,10 +1639,9 @@ void LayoutFlexibleBox::layoutColumnReverse(const OrderedFlexItemList& children,
for (size_t i = 0; i < children.size(); ++i) {
LayoutBox* child = children[i];
- if (child->isOutOfFlowPositioned()) {
- child->layer()->setStaticBlockPosition(mainAxisOffset);
+ if (child->isOutOfFlowPositioned())
continue;
- }
+
mainAxisOffset -= mainAxisExtentForChild(*child) + flowAwareMarginEndForChild(*child);
setFlowAwareLocationForChild(*child, LayoutPoint(mainAxisOffset, crossAxisOffset + flowAwareMarginBeforeForChild(*child)));
@@ -1664,15 +1718,8 @@ void LayoutFlexibleBox::alignFlexLines(Vector<LineContext>& lineContexts)
void LayoutFlexibleBox::adjustAlignmentForChild(LayoutBox& child, LayoutUnit delta)
{
- if (child.isOutOfFlowPositioned()) {
- LayoutUnit staticInlinePosition = child.layer()->staticInlinePosition();
- LayoutUnit staticBlockPosition = child.layer()->staticBlockPosition();
- LayoutUnit mainAxis = isColumnFlow() ? staticBlockPosition : staticInlinePosition;
- LayoutUnit crossAxis = isColumnFlow() ? staticInlinePosition : staticBlockPosition;
- crossAxis += delta;
- prepareChildForPositionedLayout(child, mainAxis, crossAxis, NoFlipForRowReverse);
+ if (child.isOutOfFlowPositioned())
return;
- }
setFlowAwareLocationForChild(child, flowAwareLocationForChild(child) + LayoutSize(LayoutUnit(), delta));
}
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutFlexibleBox.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698