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

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: better comments 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
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 865c52edd13b30c58097534f46551aec07ee7312..ebb82fdfa089c63307b4bfe0bef8e1831b1d6002 100644
--- a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
@@ -1314,17 +1314,122 @@ 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 mainAxisExtent = mainAxisContentExtent(contentLogicalHeight());
+
+ ContentPosition position = styleRef().resolvedJustifyContentPosition(normalValueBehavior());
+ ContentDistributionType distribution = styleRef().resolvedJustifyContentDistribution(normalValueBehavior());
+ // TODO(cbiesinger): Support the other values for these properties (we're not shipping them yet)
+ // TODO(cbiesinger): what should row-reverse/column-reverse do? https://lists.w3.org/Archives/Public/www-style/2016Apr/0387.html
+ switch (position) {
+ case ContentPositionFlexEnd:
+ return (mainAxisExtent - mainAxisExtentForChild(child));
+ case ContentPositionCenter:
+ return (mainAxisExtent - mainAxisExtentForChild(child)) / 2;
+ default:
+ break;
+ }
+ switch (distribution) {
eae 2016/04/25 02:37:28 Probably easier to use a regular if statement here
cbiesinger 2016/04/26 18:21:56 I realized I can simplify this by reusing code, so
+ case ContentDistributionSpaceAround:
+ return (mainAxisExtent - mainAxisExtentForChild(child)) / 2;
+ default:
+ break;
+ }
+ return LayoutUnit();
+}
+
+LayoutUnit LayoutFlexibleBox::staticCrossAxisPositionForPositionedChild(const LayoutBox& child)
+{
+ switch (alignmentForChild(child)) {
+ case ItemPositionAuto:
+ case ItemPositionStretch:
+ return LayoutUnit(); // static position is unaffected by stretching
+ case ItemPositionBaseline:
+ case ItemPositionLastBaseline:
+ return LayoutUnit();
+ case ItemPositionCenter:
+ return (crossAxisContentExtent() - crossAxisExtentForChild(child)) / 2;
+ case ItemPositionStart:
+ case ItemPositionFlexStart:
+ // These are equivalent here because alignmentForChild maps
+ // flex-start to flex-end when they would be different.
+ return LayoutUnit();
+ case ItemPositionEnd:
+ case ItemPositionFlexEnd:
+ return (crossAxisContentExtent() - crossAxisExtentForChild(child));
+ case ItemPositionSelfStart:
+ // TODO(cbiesinger): Support this value (not shipped yet)
+ return LayoutUnit();
+ case ItemPositionSelfEnd:
+ // TODO(cbiesinger): Support this value (not shipped yet)
+ return LayoutUnit();
+ case ItemPositionLeft:
+ if (!isHorizontalFlow())
+ return LayoutUnit();
+ if (styleRef().isLeftToRightDirection())
+ return LayoutUnit();
+ return (crossAxisContentExtent() - crossAxisExtentForChild(child));
+ case ItemPositionRight:
+ if (!isHorizontalFlow())
+ return LayoutUnit();
+ if (!styleRef().isLeftToRightDirection())
+ return LayoutUnit();
+ return (crossAxisContentExtent() - crossAxisExtentForChild(child));
+ }
+ return LayoutUnit();
+}
+
+LayoutUnit LayoutFlexibleBox::staticInlinePositionForPositionedChild(const LayoutBox& child)
+{
+ LayoutUnit staticInlineOffset = flowAwareBorderStart() + flowAwarePaddingStart();
+ if (isColumnFlow())
eae 2016/04/25 02:37:28 (optional) There is a bit of code duplication here
cbiesinger 2016/04/26 18:21:56 I like the second idea, thanks! Changed, modulo so
+ return staticInlineOffset + staticCrossAxisPositionForPositionedChild(child);
+ return staticInlineOffset + staticMainAxisPositionForPositionedChild(child);
+}
+
+LayoutUnit LayoutFlexibleBox::staticBlockPositionForPositionedChild(const LayoutBox& child)
+{
+ LayoutUnit staticBlockOffset = flowAwareBorderBefore() + flowAwarePaddingBefore();
+ if (isColumnFlow())
+ return staticBlockOffset + staticMainAxisPositionForPositionedChild(child);
+ return staticBlockOffset + 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()))
@@ -1446,7 +1551,7 @@ void LayoutFlexibleBox::layoutAndPlaceChildren(LayoutUnit& crossAxisOffset, cons
LayoutBox* child = children[i];
if (child->isOutOfFlowPositioned()) {
- prepareChildForPositionedLayout(*child, mainAxisOffset, crossAxisOffset, FlipForRowReverse);
+ prepareChildForPositionedLayout(*child);
continue;
}
@@ -1544,10 +1649,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)));
@@ -1624,15 +1728,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));
}

Powered by Google App Engine
This is Rietveld 408576698