OLD | NEW |
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. All rights reserv
ed. | 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv
ed. |
7 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. | 7 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. |
8 * | 8 * |
9 * This library is free software; you can redistribute it and/or | 9 * This library is free software; you can redistribute it and/or |
10 * modify it under the terms of the GNU Library General Public | 10 * modify it under the terms of the GNU Library General Public |
(...skipping 2342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2353 if (shrinkToAvoidFloats() && cb->isLayoutBlockFlow() && toLayoutBlockFlow(cb
)->containsFloats()) | 2353 if (shrinkToAvoidFloats() && cb->isLayoutBlockFlow() && toLayoutBlockFlow(cb
)->containsFloats()) |
2354 logicalWidthResult = std::min(logicalWidthResult, shrinkLogicalWidthToAv
oidFloats(marginStart, marginEnd, toLayoutBlockFlow(cb))); | 2354 logicalWidthResult = std::min(logicalWidthResult, shrinkLogicalWidthToAv
oidFloats(marginStart, marginEnd, toLayoutBlockFlow(cb))); |
2355 | 2355 |
2356 if (widthType == MainOrPreferredSize && sizesLogicalWidthToFitContent(logica
lWidth)) | 2356 if (widthType == MainOrPreferredSize && sizesLogicalWidthToFitContent(logica
lWidth)) |
2357 return std::max(minPreferredLogicalWidth(), std::min(maxPreferredLogical
Width(), logicalWidthResult)); | 2357 return std::max(minPreferredLogicalWidth(), std::min(maxPreferredLogical
Width(), logicalWidthResult)); |
2358 return logicalWidthResult; | 2358 return logicalWidthResult; |
2359 } | 2359 } |
2360 | 2360 |
2361 static bool columnFlexItemHasStretchAlignment(const LayoutObject* flexitem) | 2361 static bool columnFlexItemHasStretchAlignment(const LayoutObject* flexitem) |
2362 { | 2362 { |
2363 LayoutObject* parent = flexitem->parent(); | |
2364 // auto margins mean we don't stretch. Note that this function will only be
used for | 2363 // auto margins mean we don't stretch. Note that this function will only be
used for |
2365 // widths, so we don't have to check marginBefore/marginAfter. | 2364 // widths, so we don't have to check marginBefore/marginAfter. |
2366 ASSERT(parent->style()->isColumnFlexDirection()); | 2365 DCHECK(flexitem->parent()->style()->isColumnFlexDirection()); |
2367 if (flexitem->style()->marginStart().isAuto() || flexitem->style()->marginEn
d().isAuto()) | 2366 if (flexitem->style()->marginStart().isAuto() || flexitem->style()->marginEn
d().isAuto()) |
2368 return false; | 2367 return false; |
2369 return flexitem->style()->alignSelfPosition() == ItemPositionStretch || (fle
xitem->style()->alignSelfPosition() == ItemPositionAuto && parent->style()->alig
nItemsPosition() == ItemPositionStretch); | 2368 return flexitem->styleRef().resolvedAlignSelf(ItemPositionStretch).position(
) == ItemPositionStretch; |
2370 } | 2369 } |
2371 | 2370 |
2372 static bool isStretchingColumnFlexItem(const LayoutObject* flexitem) | 2371 static bool isStretchingColumnFlexItem(const LayoutObject* flexitem) |
2373 { | 2372 { |
2374 LayoutObject* parent = flexitem->parent(); | 2373 LayoutObject* parent = flexitem->parent(); |
2375 if (parent->isDeprecatedFlexibleBox() && parent->style()->boxOrient() == VER
TICAL && parent->style()->boxAlign() == BSTRETCH) | 2374 if (parent->isDeprecatedFlexibleBox() && parent->style()->boxOrient() == VER
TICAL && parent->style()->boxAlign() == BSTRETCH) |
2376 return true; | 2375 return true; |
2377 | 2376 |
2378 // We don't stretch multiline flexboxes because they need to apply line spac
ing (align-content) first. | 2377 // We don't stretch multiline flexboxes because they need to apply line spac
ing (align-content) first. |
2379 if (parent->isFlexibleBox() && parent->style()->flexWrap() == FlexNoWrap &&
parent->style()->isColumnFlexDirection() && columnFlexItemHasStretchAlignment(fl
exitem)) | 2378 if (parent->isFlexibleBox() && parent->style()->flexWrap() == FlexNoWrap &&
parent->style()->isColumnFlexDirection() && columnFlexItemHasStretchAlignment(fl
exitem)) |
2380 return true; | 2379 return true; |
2381 return false; | 2380 return false; |
2382 } | 2381 } |
2383 | 2382 |
2384 // TODO (lajava) Can/Should we move this inside specific layout classes (flex. g
rid)? Can we refactor columnFlexItemHasStretchAlignment logic? | 2383 // TODO (lajava) Can/Should we move this inside specific layout classes (flex. g
rid)? Can we refactor columnFlexItemHasStretchAlignment logic? |
2385 bool LayoutBox::hasStretchedLogicalWidth() const | 2384 bool LayoutBox::hasStretchedLogicalWidth() const |
2386 { | 2385 { |
2387 const ComputedStyle& style = styleRef(); | 2386 const ComputedStyle& style = styleRef(); |
2388 if (!style.logicalWidth().isAuto() || style.marginStart().isAuto() || style.
marginEnd().isAuto()) | 2387 if (!style.logicalWidth().isAuto() || style.marginStart().isAuto() || style.
marginEnd().isAuto()) |
2389 return false; | 2388 return false; |
2390 LayoutBlock* cb = containingBlock(); | 2389 LayoutBlock* cb = containingBlock(); |
2391 if (!cb) { | 2390 if (!cb) { |
2392 // We are evaluating align-self/justify-self, which default to 'normal'
for the root element. | 2391 // We are evaluating align-self/justify-self, which default to 'normal'
for the root element. |
2393 // The 'normal' value behaves like 'start' except for Flexbox Items, whi
ch obviously should have a container. | 2392 // The 'normal' value behaves like 'start' except for Flexbox Items, whi
ch obviously should have a container. |
2394 return false; | 2393 return false; |
2395 } | 2394 } |
2396 if (cb->isHorizontalWritingMode() != isHorizontalWritingMode()) | 2395 if (cb->isHorizontalWritingMode() != isHorizontalWritingMode()) |
2397 return ComputedStyle::resolveAlignment(cb->styleRef(), style, ItemPositi
onStretch) == ItemPositionStretch; | 2396 return style.resolvedAlignSelf(ItemPositionStretch).position() == ItemPo
sitionStretch; |
2398 return ComputedStyle::resolveJustification(cb->styleRef(), style, ItemPositi
onStretch) == ItemPositionStretch; | 2397 return style.resolvedJustifySelf(ItemPositionStretch).position() == ItemPosi
tionStretch; |
2399 } | 2398 } |
2400 | 2399 |
2401 bool LayoutBox::sizesLogicalWidthToFitContent(const Length& logicalWidth) const | 2400 bool LayoutBox::sizesLogicalWidthToFitContent(const Length& logicalWidth) const |
2402 { | 2401 { |
2403 if (isFloating() || isInlineBlockOrInlineTable()) | 2402 if (isFloating() || isInlineBlockOrInlineTable()) |
2404 return true; | 2403 return true; |
2405 | 2404 |
2406 if (isGridItem()) | 2405 if (isGridItem()) |
2407 return !hasStretchedLogicalWidth(); | 2406 return !hasStretchedLogicalWidth(); |
2408 | 2407 |
(...skipping 2541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4950 m_rareData->m_snapAreas->remove(&snapArea); | 4949 m_rareData->m_snapAreas->remove(&snapArea); |
4951 } | 4950 } |
4952 } | 4951 } |
4953 | 4952 |
4954 SnapAreaSet* LayoutBox::snapAreas() const | 4953 SnapAreaSet* LayoutBox::snapAreas() const |
4955 { | 4954 { |
4956 return m_rareData ? m_rareData->m_snapAreas.get() : nullptr; | 4955 return m_rareData ? m_rareData->m_snapAreas.get() : nullptr; |
4957 } | 4956 } |
4958 | 4957 |
4959 } // namespace blink | 4958 } // namespace blink |
OLD | NEW |