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

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutBox.cpp

Issue 1709963002: [css-align] New CSS Value 'normal' for Self Alignment (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Getting back the FullScreen fix, missed during the rebase. Created 4 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 unified diff | Download patch
OLDNEW
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 2381 matching lines...) Expand 10 before | Expand all | Expand 10 after
2392 LayoutUnit logicalWidthResult = fillAvailableMeasure(availableLogicalWidth, marginStart, marginEnd); 2392 LayoutUnit logicalWidthResult = fillAvailableMeasure(availableLogicalWidth, marginStart, marginEnd);
2393 2393
2394 if (shrinkToAvoidFloats() && cb->isLayoutBlockFlow() && toLayoutBlockFlow(cb )->containsFloats()) 2394 if (shrinkToAvoidFloats() && cb->isLayoutBlockFlow() && toLayoutBlockFlow(cb )->containsFloats())
2395 logicalWidthResult = std::min(logicalWidthResult, shrinkLogicalWidthToAv oidFloats(marginStart, marginEnd, toLayoutBlockFlow(cb))); 2395 logicalWidthResult = std::min(logicalWidthResult, shrinkLogicalWidthToAv oidFloats(marginStart, marginEnd, toLayoutBlockFlow(cb)));
2396 2396
2397 if (widthType == MainOrPreferredSize && sizesLogicalWidthToFitContent(logica lWidth)) 2397 if (widthType == MainOrPreferredSize && sizesLogicalWidthToFitContent(logica lWidth))
2398 return std::max(minPreferredLogicalWidth(), std::min(maxPreferredLogical Width(), logicalWidthResult)); 2398 return std::max(minPreferredLogicalWidth(), std::min(maxPreferredLogical Width(), logicalWidthResult));
2399 return logicalWidthResult; 2399 return logicalWidthResult;
2400 } 2400 }
2401 2401
2402 static bool columnFlexItemHasStretchAlignment(const LayoutObject* flexitem) 2402 bool LayoutBox::columnFlexItemHasStretchAlignment() const
2403 { 2403 {
2404 LayoutObject* parent = flexitem->parent();
2405 // auto margins mean we don't stretch. Note that this function will only be used for 2404 // auto margins mean we don't stretch. Note that this function will only be used for
2406 // widths, so we don't have to check marginBefore/marginAfter. 2405 // widths, so we don't have to check marginBefore/marginAfter.
2407 ASSERT(parent->style()->isColumnFlexDirection()); 2406 const auto& parentStyle = parent()->styleRef();
2408 if (flexitem->style()->marginStart().isAuto() || flexitem->style()->marginEn d().isAuto()) 2407 DCHECK(parentStyle.isColumnFlexDirection());
2408 if (styleRef().marginStart().isAuto() || styleRef().marginEnd().isAuto())
2409 return false; 2409 return false;
2410 return flexitem->style()->alignSelfPosition() == ItemPositionStretch || (fle xitem->style()->alignSelfPosition() == ItemPositionAuto && parent->style()->alig nItemsPosition() == ItemPositionStretch); 2410 return styleRef().resolvedAlignSelf(containingBlock()->selfAlignmentNormalBe havior(), isAnonymous() ? &parentStyle : nullptr).position() == ItemPositionStre tch;
2411 } 2411 }
2412 2412
2413 static bool isStretchingColumnFlexItem(const LayoutObject* flexitem) 2413 bool LayoutBox::isStretchingColumnFlexItem() const
2414 { 2414 {
2415 LayoutObject* parent = flexitem->parent(); 2415 LayoutObject* parent = this->parent();
2416 if (parent->isDeprecatedFlexibleBox() && parent->style()->boxOrient() == VER TICAL && parent->style()->boxAlign() == BSTRETCH) 2416 if (parent->isDeprecatedFlexibleBox() && parent->style()->boxOrient() == VER TICAL && parent->style()->boxAlign() == BSTRETCH)
2417 return true; 2417 return true;
2418 2418
2419 // We don't stretch multiline flexboxes because they need to apply line spac ing (align-content) first. 2419 // We don't stretch multiline flexboxes because they need to apply line spac ing (align-content) first.
2420 if (parent->isFlexibleBox() && parent->style()->flexWrap() == FlexNoWrap && parent->style()->isColumnFlexDirection() && columnFlexItemHasStretchAlignment(fl exitem)) 2420 if (parent->isFlexibleBox() && parent->style()->flexWrap() == FlexNoWrap && parent->style()->isColumnFlexDirection() && columnFlexItemHasStretchAlignment())
2421 return true; 2421 return true;
2422 return false; 2422 return false;
2423 } 2423 }
2424 2424
2425 // TODO (lajava) Can/Should we move this inside specific layout classes (flex. g rid)? Can we refactor columnFlexItemHasStretchAlignment logic? 2425 // TODO (lajava) Can/Should we move this inside specific layout classes (flex. g rid)? Can we refactor columnFlexItemHasStretchAlignment logic?
2426 bool LayoutBox::hasStretchedLogicalWidth() const 2426 bool LayoutBox::hasStretchedLogicalWidth() const
2427 { 2427 {
2428 const ComputedStyle& style = styleRef(); 2428 const ComputedStyle& style = styleRef();
2429 if (!style.logicalWidth().isAuto() || style.marginStart().isAuto() || style. marginEnd().isAuto()) 2429 if (!style.logicalWidth().isAuto() || style.marginStart().isAuto() || style. marginEnd().isAuto())
2430 return false; 2430 return false;
2431 LayoutBlock* cb = containingBlock(); 2431 LayoutBlock* cb = containingBlock();
2432 if (!cb) { 2432 if (!cb) {
2433 // We are evaluating align-self/justify-self, which default to 'normal' for the root element. 2433 // We are evaluating align-self/justify-self, which default to 'normal' for the root element.
2434 // The 'normal' value behaves like 'start' except for Flexbox Items, whi ch obviously should have a container. 2434 // The 'normal' value behaves like 'start' except for Flexbox Items, whi ch obviously should have a container.
2435 return false; 2435 return false;
2436 } 2436 }
2437 const ComputedStyle* parentStyle = isAnonymous() ? cb->style() : nullptr;
2437 if (cb->isHorizontalWritingMode() != isHorizontalWritingMode()) 2438 if (cb->isHorizontalWritingMode() != isHorizontalWritingMode())
2438 return ComputedStyle::resolveAlignment(cb->styleRef(), style, ItemPositi onStretch) == ItemPositionStretch; 2439 return style.resolvedAlignSelf(cb->selfAlignmentNormalBehavior(), parent Style).position() == ItemPositionStretch;
2439 return ComputedStyle::resolveJustification(cb->styleRef(), style, ItemPositi onStretch) == ItemPositionStretch; 2440 return style.resolvedJustifySelf(cb->selfAlignmentNormalBehavior(), parentSt yle).position() == ItemPositionStretch;
2440 } 2441 }
2441 2442
2442 bool LayoutBox::sizesLogicalWidthToFitContent(const Length& logicalWidth) const 2443 bool LayoutBox::sizesLogicalWidthToFitContent(const Length& logicalWidth) const
2443 { 2444 {
2444 if (isFloating() || isInlineBlockOrInlineTable()) 2445 if (isFloating() || isInlineBlockOrInlineTable())
2445 return true; 2446 return true;
2446 2447
2447 if (isGridItem()) 2448 if (isGridItem())
2448 return !hasStretchedLogicalWidth(); 2449 return !hasStretchedLogicalWidth();
2449 2450
2450 // Flexible box items should shrink wrap, so we lay them out at their intrin sic widths. 2451 // Flexible box items should shrink wrap, so we lay them out at their intrin sic widths.
2451 // In the case of columns that have a stretch alignment, we go ahead and lay out at the 2452 // In the case of columns that have a stretch alignment, we go ahead and lay out at the
2452 // stretched size to avoid an extra layout when applying alignment. 2453 // stretched size to avoid an extra layout when applying alignment.
2453 if (parent()->isFlexibleBox()) { 2454 if (parent()->isFlexibleBox()) {
2454 // For multiline columns, we need to apply align-content first, so we ca n't stretch now. 2455 // For multiline columns, we need to apply align-content first, so we ca n't stretch now.
2455 if (!parent()->style()->isColumnFlexDirection() || parent()->style()->fl exWrap() != FlexNoWrap) 2456 if (!parent()->style()->isColumnFlexDirection() || parent()->style()->fl exWrap() != FlexNoWrap)
2456 return true; 2457 return true;
2457 if (!columnFlexItemHasStretchAlignment(this)) 2458 if (!columnFlexItemHasStretchAlignment())
2458 return true; 2459 return true;
2459 } 2460 }
2460 2461
2461 // Flexible horizontal boxes lay out children at their intrinsic widths. Al so vertical boxes 2462 // Flexible horizontal boxes lay out children at their intrinsic widths. Al so vertical boxes
2462 // that don't stretch their kids lay out their children at their intrinsic w idths. 2463 // that don't stretch their kids lay out their children at their intrinsic w idths.
2463 // FIXME: Think about writing-mode here. 2464 // FIXME: Think about writing-mode here.
2464 // https://bugs.webkit.org/show_bug.cgi?id=46473 2465 // https://bugs.webkit.org/show_bug.cgi?id=46473
2465 if (parent()->isDeprecatedFlexibleBox() && (parent()->style()->boxOrient() = = HORIZONTAL || parent()->style()->boxAlign() != BSTRETCH)) 2466 if (parent()->isDeprecatedFlexibleBox() && (parent()->style()->boxOrient() = = HORIZONTAL || parent()->style()->boxAlign() != BSTRETCH))
2466 return true; 2467 return true;
2467 2468
2468 // Button, input, select, textarea, and legend treat width value of 'auto' a s 'intrinsic' unless it's in a 2469 // Button, input, select, textarea, and legend treat width value of 'auto' a s 'intrinsic' unless it's in a
2469 // stretching column flexbox. 2470 // stretching column flexbox.
2470 // FIXME: Think about writing-mode here. 2471 // FIXME: Think about writing-mode here.
2471 // https://bugs.webkit.org/show_bug.cgi?id=46473 2472 // https://bugs.webkit.org/show_bug.cgi?id=46473
2472 if (logicalWidth.isAuto() && !isStretchingColumnFlexItem(this) && autoWidthS houldFitContent()) 2473 if (logicalWidth.isAuto() && !isStretchingColumnFlexItem() && autoWidthShoul dFitContent())
2473 return true; 2474 return true;
2474 2475
2475 if (isHorizontalWritingMode() != containingBlock()->isHorizontalWritingMode( )) 2476 if (isHorizontalWritingMode() != containingBlock()->isHorizontalWritingMode( ))
2476 return true; 2477 return true;
2477 2478
2478 return false; 2479 return false;
2479 } 2480 }
2480 2481
2481 bool LayoutBox::autoWidthShouldFitContent() const 2482 bool LayoutBox::autoWidthShouldFitContent() const
2482 { 2483 {
(...skipping 2314 matching lines...) Expand 10 before | Expand all | Expand 10 after
4797 m_rareData->m_snapAreas->remove(&snapArea); 4798 m_rareData->m_snapAreas->remove(&snapArea);
4798 } 4799 }
4799 } 4800 }
4800 4801
4801 SnapAreaSet* LayoutBox::snapAreas() const 4802 SnapAreaSet* LayoutBox::snapAreas() const
4802 { 4803 {
4803 return m_rareData ? m_rareData->m_snapAreas.get() : nullptr; 4804 return m_rareData ? m_rareData->m_snapAreas.get() : nullptr;
4804 } 4805 }
4805 4806
4806 } // namespace blink 4807 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutBox.h ('k') | third_party/WebKit/Source/core/layout/LayoutButton.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698