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

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

Issue 1295933003: Add overflow:auto scrollbars to child flex basis. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Add all tests, even failing ones Created 5 years, 4 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: Source/core/layout/LayoutFlexibleBox.cpp
diff --git a/Source/core/layout/LayoutFlexibleBox.cpp b/Source/core/layout/LayoutFlexibleBox.cpp
index e1f9fede5c8486e6d1330b4978243dbf0ff78813..2f0d0d2d171db9215ecccdb272cfb77ee1168e33 100644
--- a/Source/core/layout/LayoutFlexibleBox.cpp
+++ b/Source/core/layout/LayoutFlexibleBox.cpp
@@ -411,8 +411,8 @@ LayoutUnit LayoutFlexibleBox::computeMainAxisExtentForChild(LayoutBox& child, Si
// Otherwise we need the logical height.
if (isHorizontalFlow() != child.styleRef().isHorizontalWritingMode()) {
// We don't have to check for "auto" here - computeContentLogicalHeight will just return -1 for that case anyway.
- if (size.isIntrinsic())
- child.layoutIfNeeded();
+ // It's safe to access scrollbarLogicalHeight here because computeNextFlexLine will have already
+ // forced layout on the child.
return child.computeContentLogicalHeight(sizeType, size, child.logicalHeight() - child.borderAndPaddingLogicalHeight()) + child.scrollbarLogicalHeight();
}
return child.computeLogicalWidthUsing(sizeType, size, contentLogicalWidth(), this) - child.borderAndPaddingLogicalWidth();
@@ -605,7 +605,8 @@ bool LayoutFlexibleBox::mainAxisLengthIsDefinite(LayoutBox& child, const Length&
bool LayoutFlexibleBox::childFlexBaseSizeRequiresLayout(LayoutBox& child) const
{
- return !mainAxisLengthIsDefinite(child, flexBasisForChild(child)) && hasOrthogonalFlow(child);
+ return !mainAxisLengthIsDefinite(child, flexBasisForChild(child)) && (
+ hasOrthogonalFlow(child) || crossAxisOverflowForChild(child) == OAUTO);
}
LayoutUnit LayoutFlexibleBox::computeInnerFlexBaseSizeForChild(LayoutBox& child, ChildLayoutType childLayoutType)
@@ -618,14 +619,14 @@ LayoutUnit LayoutFlexibleBox::computeInnerFlexBaseSizeForChild(LayoutBox& child,
Length flexBasis = flexBasisForChild(child);
if (!mainAxisLengthIsDefinite(child, flexBasis)) {
LayoutUnit mainAxisExtent;
- if (hasOrthogonalFlow(child)) {
+ if (childFlexBaseSizeRequiresLayout(child)) {
if (childLayoutType == NeverLayout)
return LayoutUnit();
if (child.needsLayout() || childLayoutType == ForceLayout || !m_intrinsicSizeAlongMainAxis.contains(&child)) {
m_intrinsicSizeAlongMainAxis.remove(&child);
child.forceChildLayout();
- m_intrinsicSizeAlongMainAxis.set(&child, child.logicalHeight());
+ m_intrinsicSizeAlongMainAxis.set(&child, hasOrthogonalFlow(child) ? child.logicalHeight() : child.logicalWidth());
}
mainAxisExtent = m_intrinsicSizeAlongMainAxis.get(&child);
} else {
@@ -898,6 +899,18 @@ bool LayoutFlexibleBox::computeNextFlexLine(OrderedFlexItemList& orderedChildren
continue;
}
+ // If this condition is true, then computeMainAxisExtentForChild will call
leviw_travelin_and_unemployed 2015/08/20 18:53:06 Extract into a named function?
szager1 2015/08/20 21:53:29 Done.
+ // child.contentLogicalHeight() and child.scrollbarLogicalHeight(), so...
+ if (isHorizontalFlow() != child->styleRef().isHorizontalWritingMode()) {
+ // ... if the child has intrinsic min/max/preferred size, run layout on it now to make
+ // sure its logical height and scroll bars are up-to-date.
+ Length childFlexBasis = flexBasisForChild(*child);
+ Length childMinSize = isHorizontalFlow() ? child->style()->minWidth() : child->style()->minHeight();
+ Length childMaxSize = isHorizontalFlow() ? child->style()->maxWidth() : child->style()->maxHeight();
+ if (childFlexBasis.isIntrinsic() || childMinSize.isIntrinsic() || childMaxSize.isIntrinsic())
+ child->layoutIfNeeded();
+ }
+
LayoutUnit childInnerFlexBaseSize = computeInnerFlexBaseSizeForChild(*child, relayoutChildren ? ForceLayout : LayoutIfNeeded);
LayoutUnit childMainAxisMarginBorderPadding = mainAxisBorderAndPaddingExtentForChild(*child)
+ (isHorizontalFlow() ? child->marginWidth() : child->marginHeight());
@@ -1102,6 +1115,12 @@ EOverflow LayoutFlexibleBox::mainAxisOverflowForChild(LayoutBox& child) const
return child.styleRef().overflowY();
}
+EOverflow LayoutFlexibleBox::crossAxisOverflowForChild(LayoutBox& child) const
+{
+ if (isHorizontalFlow())
+ return child.styleRef().overflowY();
+ return child.styleRef().overflowX();
+}
void LayoutFlexibleBox::layoutAndPlaceChildren(LayoutUnit& crossAxisOffset, const OrderedFlexItemList& children, const Vector<LayoutUnit, 16>& childSizes, LayoutUnit availableFreeSpace, bool relayoutChildren, SubtreeLayoutScope& layoutScope, Vector<LineContext>& lineContexts)
{
ASSERT(childSizes.size() == children.size());

Powered by Google App Engine
This is Rietveld 408576698