15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderFlexibleBox.h" 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/frame/UseCounter.h" 357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/paint/BlockPainter.h" 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderLayer.h" 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderView.h" 38c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/rendering/TextAutosizer.h" 3909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "platform/LengthFunctions.h" 4002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#include "wtf/MathExtras.h" 4109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include <limits> 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct RenderFlexibleBox::LineContext { 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LineContext(LayoutUnit crossAxisOffset, LayoutUnit crossAxisExtent, size_t numberOfChildren, LayoutUnit maxAscent) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : crossAxisOffset(crossAxisOffset) 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , crossAxisExtent(crossAxisExtent) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , numberOfChildren(numberOfChildren) 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , maxAscent(maxAscent) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit crossAxisOffset; 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit crossAxisExtent; 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t numberOfChildren; 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit maxAscent; 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct RenderFlexibleBox::Violation { 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Violation(RenderBox* child, LayoutUnit childSize) 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : child(child) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , childSize(childSize) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderBox* child; 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit childSize; 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)RenderFlexibleBox::RenderFlexibleBox(Element* element) 73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : RenderBlock(element) 74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_orderIterator(this) 75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_numberOfInFlowChildrenOnFirstLine(-1) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 77197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ASSERT(!childrenInline()); 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderFlexibleBox::~RenderFlexibleBox() 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)RenderFlexibleBox* RenderFlexibleBox::createAnonymous(Document* document) 85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 86f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) RenderFlexibleBox* renderer = new RenderFlexibleBox(0); 87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) renderer->setDocumentForAnonymous(document); 88926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return renderer; 89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const char* RenderFlexibleBox::renderName() const 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return "RenderFlexibleBox"; 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderFlexibleBox::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const 97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 9893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // FIXME: We're ignoring flex-basis here and we shouldn't. We can't start honoring it though until 9993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // the flex shorthand stops setting it to 0. 10093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // See https://bugs.webkit.org/show_bug.cgi?id=116117 and http://crbug.com/240765. 101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) { 102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (child->isOutOfFlowPositioned()) 103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) continue; 104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 10506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) LayoutUnit margin = marginIntrinsicLogicalWidthForChild(child); 106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool hasOrthogonalWritingMode = child->isHorizontalWritingMode() != isHorizontalWritingMode(); 107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LayoutUnit minPreferredLogicalWidth = hasOrthogonalWritingMode ? child->logicalHeight() : child->minPreferredLogicalWidth(); 108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LayoutUnit maxPreferredLogicalWidth = hasOrthogonalWritingMode ? child->logicalHeight() : child->maxPreferredLogicalWidth(); 109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) minPreferredLogicalWidth += margin; 110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) maxPreferredLogicalWidth += margin; 111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!isColumnFlow()) { 112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) maxLogicalWidth += maxPreferredLogicalWidth; 113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (isMultiline()) { 114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // For multiline, the min preferred width is if you put a break between each item. 115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) minLogicalWidth = std::max(minLogicalWidth, minPreferredLogicalWidth); 116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } else 117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) minLogicalWidth += minPreferredLogicalWidth; 118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } else { 119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) minLogicalWidth = std::max(minPreferredLogicalWidth, minLogicalWidth); 120c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) maxLogicalWidth = std::max(maxPreferredLogicalWidth, maxLogicalWidth); 121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) maxLogicalWidth = std::max(minLogicalWidth, maxLogicalWidth); 125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LayoutUnit scrollbarWidth = instrinsicScrollbarLogicalWidth(); 127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) maxLogicalWidth += scrollbarWidth; 128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) minLogicalWidth += scrollbarWidth; 129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccistatic int synthesizedBaselineFromContentBox(const RenderBox& box, LineDirectionMode direction) 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return direction == HorizontalLine ? box.borderTop() + box.paddingTop() + box.contentHeight() : box.borderRight() + box.paddingRight() + box.contentWidth(); 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)int RenderFlexibleBox::baselinePosition(FontBaseline, bool, LineDirectionMode direction, LinePositionMode mode) const 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) ASSERT(mode == PositionOnContainingLine); 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int baseline = firstLineBoxBaseline(); 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (baseline == -1) 1417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci baseline = synthesizedBaselineFromContentBox(*this, direction); 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return beforeMarginInLineDirection(direction) + baseline; 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int RenderFlexibleBox::firstLineBoxBaseline() const 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (isWritingModeRoot() || m_numberOfInFlowChildrenOnFirstLine <= 0) 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return -1; 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderBox* baselineChild = 0; 151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) int childNumber = 0; 152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (RenderBox* child = m_orderIterator.first(); child; child = m_orderIterator.next()) { 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (child->isOutOfFlowPositioned()) 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 1557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (alignmentForChild(*child) == ItemPositionBaseline && !hasAutoMarginsInCrossAxis(*child)) { 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) baselineChild = child; 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!baselineChild) 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) baselineChild = child; 161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ++childNumber; 163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (childNumber == m_numberOfInFlowChildrenOnFirstLine) 164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!baselineChild) 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return -1; 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!isColumnFlow() && hasOrthogonalFlow(*baselineChild)) 1717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return crossAxisExtentForChild(*baselineChild) + baselineChild->logicalTop(); 1727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (isColumnFlow() && !hasOrthogonalFlow(*baselineChild)) 1737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return mainAxisExtentForChild(*baselineChild) + baselineChild->logicalTop(); 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int baseline = baselineChild->firstLineBoxBaseline(); 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (baseline == -1) { 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: We should pass |direction| into firstLineBoxBaseline and stop bailing out if we're a writing mode root. 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This would also fix some cases where the flexbox is orthogonal to its container. 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LineDirectionMode direction = isHorizontalWritingMode() ? HorizontalLine : VerticalLine; 1807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return synthesizedBaselineFromContentBox(*baselineChild, direction) + baselineChild->logicalTop(); 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return baseline + baselineChild->logicalTop(); 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int RenderFlexibleBox::inlineBlockBaseline(LineDirectionMode direction) const 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int baseline = firstLineBoxBaseline(); 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (baseline != -1) 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return baseline; 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int marginAscent = direction == HorizontalLine ? marginTop() : marginRight(); 1937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return synthesizedBaselineFromContentBox(*this, direction) + marginAscent; 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static ItemPosition resolveAlignment(const RenderStyle* parentStyle, const RenderStyle* childStyle) 197926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 19809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ItemPosition align = childStyle->alignSelf(); 19909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (align == ItemPositionAuto) 200c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) align = (parentStyle->alignItems() == ItemPositionAuto) ? ItemPositionStretch : parentStyle->alignItems(); 201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return align; 202926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 203926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 20409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void RenderFlexibleBox::removeChild(RenderObject* child) 20509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 20609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) RenderBlock::removeChild(child); 20709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_intrinsicSizeAlongMainAxis.remove(child); 20809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 20909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderFlexibleBox::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) 211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RenderBlock::styleDidChange(diff, oldStyle); 213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 21410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (oldStyle && oldStyle->alignItems() == ItemPositionStretch && diff.needsFullLayout()) { 215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Flex items that were previously stretching need to be relayed out so we can compute new available cross axis space. 216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // This is only necessary for stretching since other alignment values don't change the size of the box. 217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) { 21809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ItemPosition previousAlignment = resolveAlignment(oldStyle, child->style()); 21909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (previousAlignment == ItemPositionStretch && previousAlignment != resolveAlignment(style(), child->style())) 2203c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch child->setChildNeedsLayout(MarkOnlyThis); 221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 22509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void RenderFlexibleBox::layoutBlock(bool relayoutChildren) 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(needsLayout()); 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!relayoutChildren && simplifiedLayout()) 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 232926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (updateLogicalWidthAndColumnWidth()) 233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) relayoutChildren = true; 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LayoutUnit previousHeight = logicalHeight(); 236926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setLogicalHeight(borderAndPaddingLogicalHeight() + scrollbarLogicalHeight()); 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch { 239c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) TextAutosizer::LayoutScope textAutosizerLayoutScope(this); 2405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) LayoutState state(*this, locationOffset()); 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch m_numberOfInFlowChildrenOnFirstLine = -1; 243926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 24407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch RenderBlock::startDelayUpdateScrollInfo(); 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch prepareOrderIteratorAndMargins(); 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch ChildFrameRects oldChildRects; 24907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch appendChildFrameRects(oldChildRects); 250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 25107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch layoutFlexItems(relayoutChildren); 252e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 25307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch RenderBlock::finishDelayUpdateScrollInfo(); 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (logicalHeight() != previousHeight) 25607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch relayoutChildren = true; 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2586f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch layoutPositionedObjects(relayoutChildren || isDocumentElement()); 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2609e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) // FIXME: css3/flexbox/repaint-rtl-column.html seems to issue paint invalidations for more overflow than it needs to. 26107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch computeOverflow(clientLogicalBottomAfterRepositioning()); 26207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) updateLayerTransformAfterLayout(); 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Update our scroll information if we're overflow:auto/scroll/hidden now that we know if 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // we overflow or not. 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) updateScrollInfoAfterLayout(); 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2703c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch clearNeedsLayout(); 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 273926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderFlexibleBox::appendChildFrameRects(ChildFrameRects& childFrameRects) 274926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 275926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (RenderBox* child = m_orderIterator.first(); child; child = m_orderIterator.next()) { 276926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!child->isOutOfFlowPositioned()) 277926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) childFrameRects.append(child->frameRect()); 278926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 279926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 280926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 28193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void RenderFlexibleBox::paintChildren(PaintInfo& paintInfo, const LayoutPoint& paintOffset) 282926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 2837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci BlockPainter::paintChildrenOfFlexibleBox(*this, paintInfo, paintOffset); 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 286926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderFlexibleBox::repositionLogicalHeightDependentFlexItems(Vector<LineContext>& lineContexts) 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit crossAxisStartEdge = lineContexts.isEmpty() ? LayoutUnit() : lineContexts[0].crossAxisOffset; 289926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) alignFlexLines(lineContexts); 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 291926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) alignChildren(lineContexts); 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 293926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (style()->flexWrap() == FlexWrapReverse) 294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) flipForWrapReverse(lineContexts, crossAxisStartEdge); 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // direction:rtl + flex-direction:column means the cross-axis direction is flipped. 297926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) flipForRightToLeftColumn(); 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 300926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)LayoutUnit RenderFlexibleBox::clientLogicalBottomAfterRepositioning() 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 302926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LayoutUnit maxChildLogicalBottom = 0; 303926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) { 304926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (child->isOutOfFlowPositioned()) 305926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) continue; 306926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LayoutUnit childLogicalBottom = logicalTopForChild(child) + logicalHeightForChild(child) + marginAfterForChild(child); 307926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) maxChildLogicalBottom = std::max(maxChildLogicalBottom, childLogicalBottom); 308926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 30909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return std::max(clientLogicalBottom(), maxChildLogicalBottom + paddingAfter()); 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccibool RenderFlexibleBox::hasOrthogonalFlow(RenderBox& child) const 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: If the child is a flexbox, then we need to check isHorizontalFlow. 3157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return isHorizontalFlow() != child.isHorizontalWritingMode(); 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderFlexibleBox::isColumnFlow() const 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style()->isColumnFlexDirection(); 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderFlexibleBox::isHorizontalFlow() const 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isHorizontalWritingMode()) 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !isColumnFlow(); 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isColumnFlow(); 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderFlexibleBox::isLeftToRightFlow() const 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isColumnFlow()) 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style()->writingMode() == TopToBottomWritingMode || style()->writingMode() == LeftToRightWritingMode; 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style()->isLeftToRightDirection() ^ (style()->flexDirection() == FlowRowReverse); 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderFlexibleBox::isMultiline() const 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style()->flexWrap() != FlexNoWrap; 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciLength RenderFlexibleBox::flexBasisForChild(RenderBox& child) const 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Length flexLength = child.style()->flexBasis(); 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (flexLength.isAuto()) 3467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci flexLength = isHorizontalFlow() ? child.style()->width() : child.style()->height(); 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return flexLength; 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciLayoutUnit RenderFlexibleBox::crossAxisExtentForChild(RenderBox& child) const 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return isHorizontalFlow() ? child.height() : child.width(); 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccistatic inline LayoutUnit constrainedChildIntrinsicContentLogicalHeight(RenderBox& child) 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LayoutUnit childIntrinsicContentLogicalHeight = child.intrinsicContentLogicalHeight(); 3587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return child.constrainLogicalHeightByMinMax(childIntrinsicContentLogicalHeight + child.borderAndPaddingLogicalHeight(), childIntrinsicContentLogicalHeight); 35910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 36010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 3617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciLayoutUnit RenderFlexibleBox::childIntrinsicHeight(RenderBox& child) const 36210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 3637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (child.isHorizontalWritingMode() && needToStretchChildLogicalHeight(child)) 36410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return constrainedChildIntrinsicContentLogicalHeight(child); 3657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return child.height(); 36610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 36710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 3687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciLayoutUnit RenderFlexibleBox::childIntrinsicWidth(RenderBox& child) const 36910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 3707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!child.isHorizontalWritingMode() && needToStretchChildLogicalHeight(child)) 37110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return constrainedChildIntrinsicContentLogicalHeight(child); 3727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return child.width(); 37310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 37410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 3757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciLayoutUnit RenderFlexibleBox::crossAxisIntrinsicExtentForChild(RenderBox& child) const 37610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 37710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return isHorizontalFlow() ? childIntrinsicHeight(child) : childIntrinsicWidth(child); 3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciLayoutUnit RenderFlexibleBox::mainAxisExtentForChild(RenderBox& child) const 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return isHorizontalFlow() ? child.width() : child.height(); 3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutUnit RenderFlexibleBox::crossAxisExtent() const 3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isHorizontalFlow() ? height() : width(); 3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutUnit RenderFlexibleBox::mainAxisExtent() const 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isHorizontalFlow() ? width() : height(); 3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutUnit RenderFlexibleBox::crossAxisContentExtent() const 3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isHorizontalFlow() ? contentHeight() : contentWidth(); 3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutUnit RenderFlexibleBox::mainAxisContentExtent(LayoutUnit contentLogicalHeight) 4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isColumnFlow()) { 4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LogicalExtentComputedValues computedValues; 404926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LayoutUnit borderPaddingAndScrollbar = borderAndPaddingLogicalHeight() + scrollbarLogicalHeight(); 4057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LayoutUnit borderBoxLogicalHeight = contentLogicalHeight + borderPaddingAndScrollbar; 406926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) computeLogicalHeight(borderBoxLogicalHeight, logicalTop(), computedValues); 40793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (computedValues.m_extent == LayoutUnit::max()) 40893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return computedValues.m_extent; 409926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return std::max(LayoutUnit(0), computedValues.m_extent - borderPaddingAndScrollbar); 4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return contentLogicalWidth(); 4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciLayoutUnit RenderFlexibleBox::computeMainAxisExtentForChild(RenderBox& child, SizeType sizeType, const Length& size) 4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: This is wrong for orthogonal flows. It should use the flexbox's writing-mode, not the child's in order 4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to figure out the logical height/width. 41853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (isColumnFlow()) { 41993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // We don't have to check for "auto" here - computeContentLogicalHeight will just return -1 for that case anyway. 42093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (size.isIntrinsic()) 4217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.layoutIfNeeded(); 4227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return child.computeContentLogicalHeight(size, child.logicalHeight() - child.borderAndPaddingLogicalHeight()) + child.scrollbarLogicalHeight(); 42353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 4247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return child.computeLogicalWidthUsing(sizeType, size, contentLogicalWidth(), this) - child.borderAndPaddingLogicalWidth(); 4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WritingMode RenderFlexibleBox::transformedWritingMode() const 4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WritingMode mode = style()->writingMode(); 4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!isColumnFlow()) 4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return mode; 4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (mode) { 4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case TopToBottomWritingMode: 4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case BottomToTopWritingMode: 4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style()->isLeftToRightDirection() ? LeftToRightWritingMode : RightToLeftWritingMode; 4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case LeftToRightWritingMode: 4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case RightToLeftWritingMode: 4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style()->isLeftToRightDirection() ? TopToBottomWritingMode : BottomToTopWritingMode; 4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return TopToBottomWritingMode; 4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutUnit RenderFlexibleBox::flowAwareBorderStart() const 4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isHorizontalFlow()) 4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isLeftToRightFlow() ? borderLeft() : borderRight(); 4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isLeftToRightFlow() ? borderTop() : borderBottom(); 4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutUnit RenderFlexibleBox::flowAwareBorderEnd() const 4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isHorizontalFlow()) 4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isLeftToRightFlow() ? borderRight() : borderLeft(); 4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isLeftToRightFlow() ? borderBottom() : borderTop(); 4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutUnit RenderFlexibleBox::flowAwareBorderBefore() const 4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (transformedWritingMode()) { 4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case TopToBottomWritingMode: 4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return borderTop(); 4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case BottomToTopWritingMode: 4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return borderBottom(); 4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case LeftToRightWritingMode: 4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return borderLeft(); 4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case RightToLeftWritingMode: 4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return borderRight(); 4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return borderTop(); 4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutUnit RenderFlexibleBox::flowAwareBorderAfter() const 4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (transformedWritingMode()) { 4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case TopToBottomWritingMode: 4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return borderBottom(); 4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case BottomToTopWritingMode: 4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return borderTop(); 4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case LeftToRightWritingMode: 4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return borderRight(); 4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case RightToLeftWritingMode: 4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return borderLeft(); 4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return borderTop(); 4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutUnit RenderFlexibleBox::flowAwarePaddingStart() const 4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isHorizontalFlow()) 4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isLeftToRightFlow() ? paddingLeft() : paddingRight(); 4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isLeftToRightFlow() ? paddingTop() : paddingBottom(); 4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutUnit RenderFlexibleBox::flowAwarePaddingEnd() const 4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isHorizontalFlow()) 5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isLeftToRightFlow() ? paddingRight() : paddingLeft(); 5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isLeftToRightFlow() ? paddingBottom() : paddingTop(); 5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutUnit RenderFlexibleBox::flowAwarePaddingBefore() const 5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (transformedWritingMode()) { 5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case TopToBottomWritingMode: 5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return paddingTop(); 5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case BottomToTopWritingMode: 5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return paddingBottom(); 5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case LeftToRightWritingMode: 5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return paddingLeft(); 5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case RightToLeftWritingMode: 5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return paddingRight(); 5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return paddingTop(); 5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutUnit RenderFlexibleBox::flowAwarePaddingAfter() const 5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (transformedWritingMode()) { 5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case TopToBottomWritingMode: 5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return paddingBottom(); 5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case BottomToTopWritingMode: 5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return paddingTop(); 5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case LeftToRightWritingMode: 5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return paddingRight(); 5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case RightToLeftWritingMode: 5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return paddingLeft(); 5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return paddingTop(); 5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciLayoutUnit RenderFlexibleBox::flowAwareMarginStartForChild(RenderBox& child) const 5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isHorizontalFlow()) 5407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return isLeftToRightFlow() ? child.marginLeft() : child.marginRight(); 5417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return isLeftToRightFlow() ? child.marginTop() : child.marginBottom(); 5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciLayoutUnit RenderFlexibleBox::flowAwareMarginEndForChild(RenderBox& child) const 5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isHorizontalFlow()) 5477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return isLeftToRightFlow() ? child.marginRight() : child.marginLeft(); 5487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return isLeftToRightFlow() ? child.marginBottom() : child.marginTop(); 5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciLayoutUnit RenderFlexibleBox::flowAwareMarginBeforeForChild(RenderBox& child) const 5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (transformedWritingMode()) { 5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case TopToBottomWritingMode: 5557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return child.marginTop(); 5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case BottomToTopWritingMode: 5577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return child.marginBottom(); 5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case LeftToRightWritingMode: 5597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return child.marginLeft(); 5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case RightToLeftWritingMode: 5617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return child.marginRight(); 5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return marginTop(); 5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciLayoutUnit RenderFlexibleBox::crossAxisMarginExtentForChild(RenderBox& child) const 5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return isHorizontalFlow() ? child.marginHeight() : child.marginWidth(); 5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutUnit RenderFlexibleBox::crossAxisScrollbarExtent() const 5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isHorizontalFlow() ? horizontalScrollbarHeight() : verticalScrollbarWidth(); 5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciLayoutUnit RenderFlexibleBox::crossAxisScrollbarExtentForChild(RenderBox& child) const 578e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){ 5797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return isHorizontalFlow() ? child.horizontalScrollbarHeight() : child.verticalScrollbarWidth(); 580e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)} 581e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 5827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciLayoutPoint RenderFlexibleBox::flowAwareLocationForChild(RenderBox& child) const 5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return isHorizontalFlow() ? child.location() : child.location().transposedPoint(); 5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid RenderFlexibleBox::setFlowAwareLocationForChild(RenderBox& child, const LayoutPoint& location) 5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isHorizontalFlow()) 5907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setLocation(location); 5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 5927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setLocation(location.transposedPoint()); 5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciLayoutUnit RenderFlexibleBox::mainAxisBorderAndPaddingExtentForChild(RenderBox& child) const 5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return isHorizontalFlow() ? child.borderAndPaddingWidth() : child.borderAndPaddingHeight(); 5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 60009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static inline bool preferredMainAxisExtentDependsOnLayout(const Length& flexBasis, bool hasInfiniteLineLength) 6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return flexBasis.isAuto() || (flexBasis.isPercent() && hasInfiniteLineLength); 60309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 60409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 6057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccibool RenderFlexibleBox::childPreferredMainAxisContentExtentRequiresLayout(RenderBox& child, bool hasInfiniteLineLength) const 60609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 60709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return preferredMainAxisExtentDependsOnLayout(flexBasisForChild(child), hasInfiniteLineLength) && hasOrthogonalFlow(child); 60809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 60909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 6107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciLayoutUnit RenderFlexibleBox::preferredMainAxisContentExtentForChild(RenderBox& child, bool hasInfiniteLineLength, bool relayoutChildren) 61109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 612697ef0c10ac944be8499480c025020e4c282c980Ben Murdoch child.clearOverrideSize(); 61393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 6147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (child.style()->hasAspectRatio() || child.isImage() || child.isVideo() || child.isCanvas()) 615197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch UseCounter::count(document(), UseCounter::AspectRatioFlexItem); 616197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Length flexBasis = flexBasisForChild(child); 61809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (preferredMainAxisExtentDependsOnLayout(flexBasis, hasInfiniteLineLength)) { 61909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) LayoutUnit mainAxisExtent; 62093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (hasOrthogonalFlow(child)) { 6217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (child.needsLayout() || relayoutChildren) { 6227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_intrinsicSizeAlongMainAxis.remove(&child); 6237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.forceChildLayout(); 6247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_intrinsicSizeAlongMainAxis.set(&child, child.logicalHeight()); 62509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 6267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(m_intrinsicSizeAlongMainAxis.contains(&child)); 6277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci mainAxisExtent = m_intrinsicSizeAlongMainAxis.get(&child); 62809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } else { 6297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci mainAxisExtent = child.maxPreferredLogicalWidth(); 63093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) } 6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(mainAxisExtent - mainAxisBorderAndPaddingExtentForChild(child) >= 0); 6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return mainAxisExtent - mainAxisBorderAndPaddingExtentForChild(child); 6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return std::max(LayoutUnit(0), computeMainAxisExtentForChild(child, MainOrPreferredSize, flexBasis)); 6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 63707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid RenderFlexibleBox::layoutFlexItems(bool relayoutChildren) 6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 63907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch Vector<LineContext> lineContexts; 6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OrderedFlexItemList orderedChildren; 641591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch LayoutUnit sumFlexBaseSize; 6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double totalFlexGrow; 6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double totalWeightedFlexShrink; 644591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch LayoutUnit sumHypotheticalMainSize; 6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 64609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) Vector<LayoutUnit, 16> childSizes; 64709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 648926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_orderIterator.first(); 6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit crossAxisOffset = flowAwareBorderBefore() + flowAwarePaddingBefore(); 65093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) bool hasInfiniteLineLength = false; 65109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) while (computeNextFlexLine(orderedChildren, sumFlexBaseSize, totalFlexGrow, totalWeightedFlexShrink, sumHypotheticalMainSize, hasInfiniteLineLength, relayoutChildren)) { 652591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch LayoutUnit containerMainInnerSize = mainAxisContentExtent(sumHypotheticalMainSize); 653591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch LayoutUnit availableFreeSpace = containerMainInnerSize - sumFlexBaseSize; 654591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch FlexSign flexSign = (sumHypotheticalMainSize < containerMainInnerSize) ? PositiveFlexibility : NegativeFlexibility; 6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InflexibleFlexItemSize inflexibleItems; 65609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) childSizes.reserveCapacity(orderedChildren.size()); 65793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) while (!resolveFlexibleLengths(flexSign, orderedChildren, availableFreeSpace, totalFlexGrow, totalWeightedFlexShrink, inflexibleItems, childSizes, hasInfiniteLineLength)) { 6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(totalFlexGrow >= 0 && totalWeightedFlexShrink >= 0); 6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(inflexibleItems.size() > 0); 6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 66209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) layoutAndPlaceChildren(crossAxisOffset, orderedChildren, childSizes, availableFreeSpace, relayoutChildren, lineContexts, hasInfiniteLineLength); 663926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 664926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (hasLineIfEmpty()) { 665926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Even if computeNextFlexLine returns true, the flexbox might not have 666926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // a line because all our children might be out of flow positioned. 667926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Instead of just checking if we have a line, make sure the flexbox 668926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // has at least a line's worth of height to cover this case. 669926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LayoutUnit minHeight = borderAndPaddingLogicalHeight() 670926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) + lineHeight(true, isHorizontalWritingMode() ? HorizontalLine : VerticalLine, PositionOfInteriorLineBoxes) 671926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) + scrollbarLogicalHeight(); 672926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (height() < minHeight) 673926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setLogicalHeight(minHeight); 6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 67507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 67607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch updateLogicalHeight(); 67707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch repositionLogicalHeightDependentFlexItems(lineContexts); 6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutUnit RenderFlexibleBox::autoMarginOffsetInMainAxis(const OrderedFlexItemList& children, LayoutUnit& availableFreeSpace) 6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (availableFreeSpace <= 0) 6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int numberOfAutoMargins = 0; 6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isHorizontal = isHorizontalFlow(); 6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < children.size(); ++i) { 6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderBox* child = children[i]; 6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (child->isOutOfFlowPositioned()) 6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isHorizontal) { 6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (child->style()->marginLeft().isAuto()) 6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++numberOfAutoMargins; 6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (child->style()->marginRight().isAuto()) 6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++numberOfAutoMargins; 6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (child->style()->marginTop().isAuto()) 6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++numberOfAutoMargins; 6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (child->style()->marginBottom().isAuto()) 7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++numberOfAutoMargins; 7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!numberOfAutoMargins) 7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit sizeOfAutoMargin = availableFreeSpace / numberOfAutoMargins; 7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) availableFreeSpace = 0; 7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return sizeOfAutoMargin; 7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid RenderFlexibleBox::updateAutoMarginsInMainAxis(RenderBox& child, LayoutUnit autoMarginOffset) 7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 713926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(autoMarginOffset >= 0); 714926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isHorizontalFlow()) { 7167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (child.style()->marginLeft().isAuto()) 7177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setMarginLeft(autoMarginOffset); 7187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (child.style()->marginRight().isAuto()) 7197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setMarginRight(autoMarginOffset); 7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 7217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (child.style()->marginTop().isAuto()) 7227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setMarginTop(autoMarginOffset); 7237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (child.style()->marginBottom().isAuto()) 7247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setMarginBottom(autoMarginOffset); 7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccibool RenderFlexibleBox::hasAutoMarginsInCrossAxis(RenderBox& child) const 7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isHorizontalFlow()) 7317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return child.style()->marginTop().isAuto() || child.style()->marginBottom().isAuto(); 7327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return child.style()->marginLeft().isAuto() || child.style()->marginRight().isAuto(); 7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciLayoutUnit RenderFlexibleBox::availableAlignmentSpaceForChild(LayoutUnit lineCrossAxisExtent, RenderBox& child) 7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(!child.isOutOfFlowPositioned()); 7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit childCrossExtent = crossAxisMarginExtentForChild(child) + crossAxisExtentForChild(child); 7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return lineCrossAxisExtent - childCrossExtent; 7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciLayoutUnit RenderFlexibleBox::availableAlignmentSpaceForChildBeforeStretching(LayoutUnit lineCrossAxisExtent, RenderBox& child) 74310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 7447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(!child.isOutOfFlowPositioned()); 74510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch LayoutUnit childCrossExtent = crossAxisMarginExtentForChild(child) + crossAxisIntrinsicExtentForChild(child); 74610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return lineCrossAxisExtent - childCrossExtent; 74710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 74810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 7497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccibool RenderFlexibleBox::updateAutoMarginsInCrossAxis(RenderBox& child, LayoutUnit availableAlignmentSpace) 7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(!child.isOutOfFlowPositioned()); 752926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(availableAlignmentSpace >= 0); 7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isHorizontal = isHorizontalFlow(); 7557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Length topOrLeft = isHorizontal ? child.style()->marginTop() : child.style()->marginLeft(); 7567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Length bottomOrRight = isHorizontal ? child.style()->marginBottom() : child.style()->marginRight(); 7575267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (topOrLeft.isAuto() && bottomOrRight.isAuto()) { 7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) adjustAlignmentForChild(child, availableAlignmentSpace / 2); 7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isHorizontal) { 7607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setMarginTop(availableAlignmentSpace / 2); 7617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setMarginBottom(availableAlignmentSpace / 2); 7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 7637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setMarginLeft(availableAlignmentSpace / 2); 7647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setMarginRight(availableAlignmentSpace / 2); 7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7685267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) bool shouldAdjustTopOrLeft = true; 7697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (isColumnFlow() && !child.style()->isLeftToRightDirection()) { 7705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) // For column flows, only make this adjustment if topOrLeft corresponds to the "before" margin, 7715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) // so that flipForRightToLeftColumn will do the right thing. 7725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) shouldAdjustTopOrLeft = false; 7735267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 7747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!isColumnFlow() && child.style()->isFlippedBlocksWritingMode()) { 7755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) // If we are a flipped writing mode, we need to adjust the opposite side. This is only needed 7765267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) // for row flows because this only affects the block-direction axis. 7775267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) shouldAdjustTopOrLeft = false; 7785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 7795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 7805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (topOrLeft.isAuto()) { 7815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (shouldAdjustTopOrLeft) 7825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) adjustAlignmentForChild(child, availableAlignmentSpace); 7835267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isHorizontal) 7857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setMarginTop(availableAlignmentSpace); 7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 7877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setMarginLeft(availableAlignmentSpace); 7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (bottomOrRight.isAuto()) { 7915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (!shouldAdjustTopOrLeft) 7925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) adjustAlignmentForChild(child, availableAlignmentSpace); 7935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isHorizontal) 7957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setMarginBottom(availableAlignmentSpace); 7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 7977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setMarginRight(availableAlignmentSpace); 7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciLayoutUnit RenderFlexibleBox::marginBoxAscentForChild(RenderBox& child) 8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LayoutUnit ascent = child.firstLineBoxBaseline(); 8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (ascent == -1) 8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ascent = crossAxisExtentForChild(child); 8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ascent + flowAwareMarginBeforeForChild(child); 8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 81109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)LayoutUnit RenderFlexibleBox::computeChildMarginValue(Length margin) 8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // When resolving the margins, we use the content size for resolving percent and calc (for percents in calc expressions) margins. 8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Fortunately, percent margins are always computed with respect to the block's width, even for margin-top and margin-bottom. 8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit availableSize = contentLogicalWidth(); 81609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return minimumValueForLength(margin, availableSize); 8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 819e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochvoid RenderFlexibleBox::prepareOrderIteratorAndMargins() 8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 821e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch OrderIteratorPopulator populator(m_orderIterator); 822591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) { 824e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch populator.collectChild(child); 8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (child->isOutOfFlowPositioned()) 8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Before running the flex algorithm, 'auto' has a margin of 0. 8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Also, if we're not auto sizing, we don't do a layout that computes the start/end margins. 8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isHorizontalFlow()) { 83209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) child->setMarginLeft(computeChildMarginValue(child->style()->marginLeft())); 83309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) child->setMarginRight(computeChildMarginValue(child->style()->marginRight())); 8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 83509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) child->setMarginTop(computeChildMarginValue(child->style()->marginTop())); 83609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) child->setMarginBottom(computeChildMarginValue(child->style()->marginBottom())); 8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciLayoutUnit RenderFlexibleBox::adjustChildSizeForMinAndMax(RenderBox& child, LayoutUnit childSize) 8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Length max = isHorizontalFlow() ? child.style()->maxWidth() : child.style()->maxHeight(); 844926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (max.isSpecifiedOrIntrinsic()) { 8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit maxExtent = computeMainAxisExtentForChild(child, MaxSize, max); 8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (maxExtent != -1 && childSize > maxExtent) 8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) childSize = maxExtent; 8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci Length min = isHorizontalFlow() ? child.style()->minWidth() : child.style()->minHeight(); 8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit minExtent = 0; 852926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (min.isSpecifiedOrIntrinsic()) 8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) minExtent = computeMainAxisExtentForChild(child, MinSize, min); 8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return std::max(childSize, minExtent); 8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 85709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool RenderFlexibleBox::computeNextFlexLine(OrderedFlexItemList& orderedChildren, LayoutUnit& sumFlexBaseSize, double& totalFlexGrow, double& totalWeightedFlexShrink, LayoutUnit& sumHypotheticalMainSize, bool& hasInfiniteLineLength, bool relayoutChildren) 8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) orderedChildren.clear(); 860591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch sumFlexBaseSize = 0; 8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) totalFlexGrow = totalWeightedFlexShrink = 0; 862591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch sumHypotheticalMainSize = 0; 8635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 864926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_orderIterator.currentChild()) 8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit lineBreakLength = mainAxisContentExtent(LayoutUnit::max()); 86893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) hasInfiniteLineLength = lineBreakLength == LayoutUnit::max(); 86993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool lineHasInFlowItem = false; 8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 872926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (RenderBox* child = m_orderIterator.currentChild(); child; child = m_orderIterator.next()) { 8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (child->isOutOfFlowPositioned()) { 8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) orderedChildren.append(child); 8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LayoutUnit childMainAxisExtent = preferredMainAxisContentExtentForChild(*child, hasInfiniteLineLength, relayoutChildren); 8797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LayoutUnit childMainAxisMarginBorderPadding = mainAxisBorderAndPaddingExtentForChild(*child) 880591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch + (isHorizontalFlow() ? child->marginWidth() : child->marginHeight()); 881e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) LayoutUnit childFlexBaseSize = childMainAxisExtent + childMainAxisMarginBorderPadding; 8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LayoutUnit childMinMaxAppliedMainAxisExtent = adjustChildSizeForMinAndMax(*child, childMainAxisExtent); 884e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) LayoutUnit childHypotheticalMainSize = childMinMaxAppliedMainAxisExtent + childMainAxisMarginBorderPadding; 885e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 886e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (isMultiline() && sumHypotheticalMainSize + childHypotheticalMainSize > lineBreakLength && lineHasInFlowItem) 8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) orderedChildren.append(child); 8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) lineHasInFlowItem = true; 890e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) sumFlexBaseSize += childFlexBaseSize; 8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) totalFlexGrow += child->style()->flexGrow(); 8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) totalWeightedFlexShrink += child->style()->flexShrink() * childMainAxisExtent; 893e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) sumHypotheticalMainSize += childHypotheticalMainSize; 8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 89893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void RenderFlexibleBox::freezeViolations(const Vector<Violation>& violations, LayoutUnit& availableFreeSpace, double& totalFlexGrow, double& totalWeightedFlexShrink, InflexibleFlexItemSize& inflexibleItems, bool hasInfiniteLineLength) 8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < violations.size(); ++i) { 9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderBox* child = violations[i].child; 9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit childSize = violations[i].childSize; 9037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LayoutUnit preferredChildSize = preferredMainAxisContentExtentForChild(*child, hasInfiniteLineLength); 9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) availableFreeSpace -= childSize - preferredChildSize; 9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) totalFlexGrow -= child->style()->flexGrow(); 9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) totalWeightedFlexShrink -= child->style()->flexShrink() * preferredChildSize; 9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inflexibleItems.set(child, childSize); 9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Returns true if we successfully ran the algorithm and sized the flex items. 91209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool RenderFlexibleBox::resolveFlexibleLengths(FlexSign flexSign, const OrderedFlexItemList& children, LayoutUnit& availableFreeSpace, double& totalFlexGrow, double& totalWeightedFlexShrink, InflexibleFlexItemSize& inflexibleItems, Vector<LayoutUnit, 16>& childSizes, bool hasInfiniteLineLength) 9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 91409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) childSizes.resize(0); 9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit totalViolation = 0; 9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit usedFreeSpace = 0; 917926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Vector<Violation> minViolations; 918926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Vector<Violation> maxViolations; 9195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < children.size(); ++i) { 9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderBox* child = children[i]; 9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (child->isOutOfFlowPositioned()) { 9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) childSizes.append(0); 9235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (inflexibleItems.contains(child)) 9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) childSizes.append(inflexibleItems.get(child)); 9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else { 9297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LayoutUnit preferredChildSize = preferredMainAxisContentExtentForChild(*child, hasInfiniteLineLength); 9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit childSize = preferredChildSize; 931926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) double extraSpace = 0; 932926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (availableFreeSpace > 0 && totalFlexGrow > 0 && flexSign == PositiveFlexibility && std::isfinite(totalFlexGrow)) 933926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) extraSpace = availableFreeSpace * child->style()->flexGrow() / totalFlexGrow; 934926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (availableFreeSpace < 0 && totalWeightedFlexShrink > 0 && flexSign == NegativeFlexibility && std::isfinite(totalWeightedFlexShrink)) 935926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) extraSpace = availableFreeSpace * child->style()->flexShrink() * preferredChildSize / totalWeightedFlexShrink; 936926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (std::isfinite(extraSpace)) 93793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) childSize += LayoutUnit::fromFloatRound(extraSpace); 9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LayoutUnit adjustedChildSize = adjustChildSizeForMinAndMax(*child, childSize); 9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) childSizes.append(adjustedChildSize); 9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) usedFreeSpace += adjustedChildSize - preferredChildSize; 9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit violation = adjustedChildSize - childSize; 9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (violation > 0) 9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) minViolations.append(Violation(child, adjustedChildSize)); 9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (violation < 0) 9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) maxViolations.append(Violation(child, adjustedChildSize)); 9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) totalViolation += violation; 9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (totalViolation) 95393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) freezeViolations(totalViolation < 0 ? maxViolations : minViolations, availableFreeSpace, totalFlexGrow, totalWeightedFlexShrink, inflexibleItems, hasInfiniteLineLength); 9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) availableFreeSpace -= usedFreeSpace; 9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !totalViolation; 9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static LayoutUnit initialJustifyContentOffset(LayoutUnit availableFreeSpace, EJustifyContent justifyContent, unsigned numberOfChildren) 9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (justifyContent == JustifyFlexEnd) 9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return availableFreeSpace; 9645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (justifyContent == JustifyCenter) 9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return availableFreeSpace / 2; 9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (justifyContent == JustifySpaceAround) { 9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (availableFreeSpace > 0 && numberOfChildren) 9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return availableFreeSpace / (2 * numberOfChildren); 9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return availableFreeSpace / 2; 9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static LayoutUnit justifyContentSpaceBetweenChildren(LayoutUnit availableFreeSpace, EJustifyContent justifyContent, unsigned numberOfChildren) 9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (availableFreeSpace > 0 && numberOfChildren > 1) { 9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (justifyContent == JustifySpaceBetween) 9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return availableFreeSpace / (numberOfChildren - 1); 9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (justifyContent == JustifySpaceAround) 9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return availableFreeSpace / numberOfChildren; 9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 9845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid RenderFlexibleBox::setLogicalOverrideSize(RenderBox& child, LayoutUnit childPreferredSize) 9877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 9887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (hasOrthogonalFlow(child)) 9897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setOverrideLogicalContentHeight(childPreferredSize - child.borderAndPaddingLogicalHeight()); 9907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci else 9917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setOverrideLogicalContentWidth(childPreferredSize - child.borderAndPaddingLogicalWidth()); 9927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 9937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 9947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid RenderFlexibleBox::prepareChildForPositionedLayout(RenderBox& child, LayoutUnit mainAxisOffset, LayoutUnit crossAxisOffset, PositionedLayoutMode layoutMode) 9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(child.isOutOfFlowPositioned()); 9977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.containingBlock()->insertPositionedObject(&child); 9987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RenderLayer* childLayer = child.layer(); 9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit inlinePosition = isColumnFlow() ? crossAxisOffset : mainAxisOffset; 10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (layoutMode == FlipForRowReverse && style()->flexDirection() == FlowRowReverse) 10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inlinePosition = mainAxisExtent() - mainAxisOffset; 100209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) childLayer->setStaticInlinePosition(inlinePosition); 10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit staticBlockPosition = isColumnFlow() ? mainAxisOffset : crossAxisOffset; 10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (childLayer->staticBlockPosition() != staticBlockPosition) { 10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) childLayer->setStaticBlockPosition(staticBlockPosition); 10077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (child.style()->hasStaticBlockPosition(style()->isHorizontalWritingMode())) 10087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setChildNeedsLayout(MarkOnlyThis); 10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciItemPosition RenderFlexibleBox::alignmentForChild(RenderBox& child) const 10135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ItemPosition align = resolveAlignment(style(), child.style()); 10155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 101609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (align == ItemPositionBaseline && hasOrthogonalFlow(child)) 101709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) align = ItemPositionFlexStart; 10185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (style()->flexWrap() == FlexWrapReverse) { 102009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (align == ItemPositionFlexStart) 102109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) align = ItemPositionFlexEnd; 102209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) else if (align == ItemPositionFlexEnd) 102309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) align = ItemPositionFlexStart; 10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return align; 10275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)size_t RenderFlexibleBox::numberOfInFlowPositionedChildren(const OrderedFlexItemList& children) const 10305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t count = 0; 10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < children.size(); ++i) { 10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderBox* child = children[i]; 10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!child->isOutOfFlowPositioned()) 10355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++count; 10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return count; 10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid RenderFlexibleBox::resetAutoMarginsAndLogicalTopInCrossAxis(RenderBox& child) 1041926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 104209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (hasAutoMarginsInCrossAxis(child)) { 10437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.updateLogicalHeight(); 104409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (isHorizontalFlow()) { 10457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (child.style()->marginTop().isAuto()) 10467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setMarginTop(0); 10477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (child.style()->marginBottom().isAuto()) 10487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setMarginBottom(0); 104909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } else { 10507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (child.style()->marginLeft().isAuto()) 10517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setMarginLeft(0); 10527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (child.style()->marginRight().isAuto()) 10537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setMarginRight(0); 105409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 105509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 1056926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 1057926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 10587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccibool RenderFlexibleBox::needToStretchChildLogicalHeight(RenderBox& child) const 105910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 106010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (alignmentForChild(child) != ItemPositionStretch) 106110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return false; 106210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 10637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return isHorizontalFlow() && child.style()->height().isAuto(); 106410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 106510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 106609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void RenderFlexibleBox::layoutAndPlaceChildren(LayoutUnit& crossAxisOffset, const OrderedFlexItemList& children, const Vector<LayoutUnit, 16>& childSizes, LayoutUnit availableFreeSpace, bool relayoutChildren, Vector<LineContext>& lineContexts, bool hasInfiniteLineLength) 10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(childSizes.size() == children.size()); 10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t numberOfChildrenForJustifyContent = numberOfInFlowPositionedChildren(children); 10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit autoMarginOffset = autoMarginOffsetInMainAxis(children, availableFreeSpace); 10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit mainAxisOffset = flowAwareBorderStart() + flowAwarePaddingStart(); 10735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mainAxisOffset += initialJustifyContentOffset(availableFreeSpace, style()->justifyContent(), numberOfChildrenForJustifyContent); 10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (style()->flexDirection() == FlowRowReverse) 10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mainAxisOffset += isHorizontalFlow() ? verticalScrollbarWidth() : horizontalScrollbarHeight(); 10765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit totalMainExtent = mainAxisExtent(); 10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit maxAscent = 0, maxDescent = 0; // Used when align-items: baseline. 10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit maxChildCrossAxisExtent = 0; 10805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t seenInFlowPositionedChildren = 0; 10815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool shouldFlipMainAxis = !isColumnFlow() && !isLeftToRightFlow(); 10825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < children.size(); ++i) { 10835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderBox* child = children[i]; 108409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 10855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (child->isOutOfFlowPositioned()) { 10867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci prepareChildForPositionedLayout(*child, mainAxisOffset, crossAxisOffset, FlipForRowReverse); 10875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 10885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1089926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1090323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // FIXME Investigate if this can be removed based on other flags. crbug.com/370010 1091f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) child->setMayNeedPaintInvalidation(true); 1092323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 10937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LayoutUnit childPreferredSize = childSizes[i] + mainAxisBorderAndPaddingExtentForChild(*child); 10947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setLogicalOverrideSize(*child, childPreferredSize); 10957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (childPreferredSize != mainAxisExtentForChild(*child)) { 10963c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch child->setChildNeedsLayout(MarkOnlyThis); 109709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } else { 1098926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // To avoid double applying margin changes in updateAutoMarginsInCrossAxis, we reset the margins here. 10997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci resetAutoMarginsAndLogicalTopInCrossAxis(*child); 1100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 110109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // We may have already forced relayout for orthogonal flowing children in preferredMainAxisContentExtentForChild. 11027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bool forceChildRelayout = relayoutChildren && !childPreferredMainAxisContentExtentRequiresLayout(*child, hasInfiniteLineLength); 110309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) updateBlockChildDirtyBitsBeforeLayout(forceChildRelayout, child); 11045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) child->layoutIfNeeded(); 11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci updateAutoMarginsInMainAxis(*child, autoMarginOffset); 11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit childCrossAxisMarginBoxExtent; 11097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (alignmentForChild(*child) == ItemPositionBaseline && !hasAutoMarginsInCrossAxis(*child)) { 11107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LayoutUnit ascent = marginBoxAscentForChild(*child); 11117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LayoutUnit descent = (crossAxisMarginExtentForChild(*child) + crossAxisExtentForChild(*child)) - ascent; 11125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) maxAscent = std::max(maxAscent, ascent); 11145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) maxDescent = std::max(maxDescent, descent); 11155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) childCrossAxisMarginBoxExtent = maxAscent + maxDescent; 111710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch } else { 11187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci childCrossAxisMarginBoxExtent = crossAxisIntrinsicExtentForChild(*child) + crossAxisMarginExtentForChild(*child) + crossAxisScrollbarExtentForChild(*child); 111910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch } 1120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!isColumnFlow()) 11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setLogicalHeight(std::max(logicalHeight(), crossAxisOffset + flowAwareBorderAfter() + flowAwarePaddingAfter() + childCrossAxisMarginBoxExtent + crossAxisScrollbarExtent())); 11225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) maxChildCrossAxisExtent = std::max(maxChildCrossAxisExtent, childCrossAxisMarginBoxExtent); 11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci mainAxisOffset += flowAwareMarginStartForChild(*child); 11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LayoutUnit childMainExtent = mainAxisExtentForChild(*child); 11275267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) // In an RTL column situation, this will apply the margin-right/margin-end on the left. 11285267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) // This will be fixed later in flipForRightToLeftColumn. 11295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutPoint childLocation(shouldFlipMainAxis ? totalMainExtent - mainAxisOffset - childMainExtent : mainAxisOffset, 11307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci crossAxisOffset + flowAwareMarginBeforeForChild(*child)); 11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Supporting layout deltas. 11337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setFlowAwareLocationForChild(*child, childLocation); 11347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci mainAxisOffset += childMainExtent + flowAwareMarginEndForChild(*child); 11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++seenInFlowPositionedChildren; 11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (seenInFlowPositionedChildren < numberOfChildrenForJustifyContent) 11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mainAxisOffset += justifyContentSpaceBetweenChildren(availableFreeSpace, style()->justifyContent(), numberOfChildrenForJustifyContent); 11395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isColumnFlow()) 11425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setLogicalHeight(mainAxisOffset + flowAwareBorderEnd() + flowAwarePaddingEnd() + scrollbarLogicalHeight()); 11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (style()->flexDirection() == FlowColumnReverse) { 11455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We have to do an extra pass for column-reverse to reposition the flex items since the start depends 11465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // on the height of the flexbox, which we only know after we've positioned all the flex items. 11475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) updateLogicalHeight(); 11485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) layoutColumnReverse(children, crossAxisOffset, availableFreeSpace); 11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 11505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_numberOfInFlowChildrenOnFirstLine == -1) 1152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_numberOfInFlowChildrenOnFirstLine = seenInFlowPositionedChildren; 11535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) lineContexts.append(LineContext(crossAxisOffset, maxChildCrossAxisExtent, children.size(), maxAscent)); 11545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) crossAxisOffset += maxChildCrossAxisExtent; 11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderFlexibleBox::layoutColumnReverse(const OrderedFlexItemList& children, LayoutUnit crossAxisOffset, LayoutUnit availableFreeSpace) 11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This is similar to the logic in layoutAndPlaceChildren, except we place the children 11605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // starting from the end of the flexbox. We also don't need to layout anything since we're 11615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // just moving the children to a new position. 11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t numberOfChildrenForJustifyContent = numberOfInFlowPositionedChildren(children); 11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit mainAxisOffset = logicalHeight() - flowAwareBorderEnd() - flowAwarePaddingEnd(); 11645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mainAxisOffset -= initialJustifyContentOffset(availableFreeSpace, style()->justifyContent(), numberOfChildrenForJustifyContent); 11655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mainAxisOffset -= isHorizontalFlow() ? verticalScrollbarWidth() : horizontalScrollbarHeight(); 11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t seenInFlowPositionedChildren = 0; 11685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < children.size(); ++i) { 11695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderBox* child = children[i]; 117009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 11715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (child->isOutOfFlowPositioned()) { 11725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) child->layer()->setStaticBlockPosition(mainAxisOffset); 11735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 11745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 11757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci mainAxisOffset -= mainAxisExtentForChild(*child) + flowAwareMarginEndForChild(*child); 11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setFlowAwareLocationForChild(*child, LayoutPoint(mainAxisOffset, crossAxisOffset + flowAwareMarginBeforeForChild(*child))); 11785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci mainAxisOffset -= flowAwareMarginStartForChild(*child); 11805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++seenInFlowPositionedChildren; 11825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (seenInFlowPositionedChildren < numberOfChildrenForJustifyContent) 11835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mainAxisOffset -= justifyContentSpaceBetweenChildren(availableFreeSpace, style()->justifyContent(), numberOfChildrenForJustifyContent); 11845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 11855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static LayoutUnit initialAlignContentOffset(LayoutUnit availableFreeSpace, EAlignContent alignContent, unsigned numberOfLines) 11885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1189d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (numberOfLines <= 1) 1190d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return 0; 11915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (alignContent == AlignContentFlexEnd) 11925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return availableFreeSpace; 11935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (alignContent == AlignContentCenter) 11945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return availableFreeSpace / 2; 11955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (alignContent == AlignContentSpaceAround) { 11965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (availableFreeSpace > 0 && numberOfLines) 11975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return availableFreeSpace / (2 * numberOfLines); 11985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (availableFreeSpace < 0) 11995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return availableFreeSpace / 2; 12005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 12025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static LayoutUnit alignContentSpaceBetweenChildren(LayoutUnit availableFreeSpace, EAlignContent alignContent, unsigned numberOfLines) 12055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (availableFreeSpace > 0 && numberOfLines > 1) { 12075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (alignContent == AlignContentSpaceBetween) 12085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return availableFreeSpace / (numberOfLines - 1); 12095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (alignContent == AlignContentSpaceAround || alignContent == AlignContentStretch) 12105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return availableFreeSpace / numberOfLines; 12115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 12135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderFlexibleBox::alignFlexLines(Vector<LineContext>& lineContexts) 12165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // If we have a single line flexbox or a multiline line flexbox with only one flex line, 12185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // the line height is all the available space. 12195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // For flex-direction: row, this means we need to use the height, so we do this after calling updateLogicalHeight. 12205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (lineContexts.size() == 1) { 12215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) lineContexts[0].crossAxisExtent = crossAxisContentExtent(); 12225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return; 12235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 12245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 12255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (style()->alignContent() == AlignContentFlexStart) 12265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 12275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit availableCrossAxisSpace = crossAxisContentExtent(); 12295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < lineContexts.size(); ++i) 12305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) availableCrossAxisSpace -= lineContexts[i].crossAxisExtent; 12315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1232926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RenderBox* child = m_orderIterator.first(); 12335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit lineOffset = initialAlignContentOffset(availableCrossAxisSpace, style()->alignContent(), lineContexts.size()); 12345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber) { 12355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) lineContexts[lineNumber].crossAxisOffset += lineOffset; 1236926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numberOfChildren; ++childNumber, child = m_orderIterator.next()) 12377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci adjustAlignmentForChild(*child, lineOffset); 12385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (style()->alignContent() == AlignContentStretch && availableCrossAxisSpace > 0) 12405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) lineContexts[lineNumber].crossAxisExtent += availableCrossAxisSpace / static_cast<unsigned>(lineContexts.size()); 12415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) lineOffset += alignContentSpaceBetweenChildren(availableCrossAxisSpace, style()->alignContent(), lineContexts.size()); 12435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid RenderFlexibleBox::adjustAlignmentForChild(RenderBox& child, LayoutUnit delta) 12475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (child.isOutOfFlowPositioned()) { 12497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LayoutUnit staticInlinePosition = child.layer()->staticInlinePosition(); 12507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LayoutUnit staticBlockPosition = child.layer()->staticBlockPosition(); 12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit mainAxis = isColumnFlow() ? staticBlockPosition : staticInlinePosition; 12525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit crossAxis = isColumnFlow() ? staticInlinePosition : staticBlockPosition; 12535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) crossAxis += delta; 12545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) prepareChildForPositionedLayout(child, mainAxis, crossAxis, NoFlipForRowReverse); 12555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 12565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setFlowAwareLocationForChild(child, flowAwareLocationForChild(child) + LayoutSize(0, delta)); 12595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1261926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderFlexibleBox::alignChildren(const Vector<LineContext>& lineContexts) 12625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Keep track of the space between the baseline edge and the after edge of the box for each line. 1264926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Vector<LayoutUnit> minMarginAfterBaselines; 12655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1266926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RenderBox* child = m_orderIterator.first(); 12675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber) { 12685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit minMarginAfterBaseline = LayoutUnit::max(); 12695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisExtent; 12705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit maxAscent = lineContexts[lineNumber].maxAscent; 12715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1272926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numberOfChildren; ++childNumber, child = m_orderIterator.next()) { 12735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(child); 12745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (child->isOutOfFlowPositioned()) { 12755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (style()->flexWrap() == FlexWrapReverse) 12767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci adjustAlignmentForChild(*child, lineCrossAxisExtent); 12775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 12785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (updateAutoMarginsInCrossAxis(*child, std::max(LayoutUnit(0), availableAlignmentSpaceForChild(lineCrossAxisExtent, *child)))) 12815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 12825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci switch (alignmentForChild(*child)) { 128409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) case ItemPositionAuto: 12855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 12865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 128709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) case ItemPositionStretch: { 12887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci applyStretchAlignmentToChild(*child, lineCrossAxisExtent); 12895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Since wrap-reverse flips cross start and cross end, strech children should be aligned with the cross end. 12905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (style()->flexWrap() == FlexWrapReverse) 12917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci adjustAlignmentForChild(*child, availableAlignmentSpaceForChild(lineCrossAxisExtent, *child)); 12925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 12935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 129409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) case ItemPositionFlexStart: 12955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 129609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) case ItemPositionFlexEnd: 12977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci adjustAlignmentForChild(*child, availableAlignmentSpaceForChild(lineCrossAxisExtent, *child)); 12985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 129909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) case ItemPositionCenter: 13007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci adjustAlignmentForChild(*child, availableAlignmentSpaceForChild(lineCrossAxisExtent, *child) / 2); 13015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 130209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) case ItemPositionBaseline: { 13035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: If we get here in columns, we want the use the descent, except we currently can't get the ascent/descent of orthogonal children. 13045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // https://bugs.webkit.org/show_bug.cgi?id=98076 13057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LayoutUnit ascent = marginBoxAscentForChild(*child); 13065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit startOffset = maxAscent - ascent; 13077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci adjustAlignmentForChild(*child, startOffset); 13085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (style()->flexWrap() == FlexWrapReverse) 13107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci minMarginAfterBaseline = std::min(minMarginAfterBaseline, availableAlignmentSpaceForChild(lineCrossAxisExtent, *child) - startOffset); 13115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 13125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1313197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch case ItemPositionLastBaseline: 131409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) case ItemPositionSelfStart: 131509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) case ItemPositionSelfEnd: 131609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) case ItemPositionStart: 131709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) case ItemPositionEnd: 131809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) case ItemPositionLeft: 131909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) case ItemPositionRight: 132009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // FIXME: File a bug about implementing that. The extended grammar 132109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // is not enabled by default so we shouldn't hit this codepath. 132209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT_NOT_REACHED(); 132309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) break; 13245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) minMarginAfterBaselines.append(minMarginAfterBaseline); 13275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (style()->flexWrap() != FlexWrapReverse) 13305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 13315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // wrap-reverse flips the cross axis start and end. For baseline alignment, this means we 13335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // need to align the after edge of baseline elements with the after edge of the flex line. 1334926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) child = m_orderIterator.first(); 13355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber) { 13365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit minMarginAfterBaseline = minMarginAfterBaselines[lineNumber]; 1337926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numberOfChildren; ++childNumber, child = m_orderIterator.next()) { 13385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(child); 13397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (alignmentForChild(*child) == ItemPositionBaseline && !hasAutoMarginsInCrossAxis(*child) && minMarginAfterBaseline) 13407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci adjustAlignmentForChild(*child, minMarginAfterBaseline); 13415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid RenderFlexibleBox::applyStretchAlignmentToChild(RenderBox& child, LayoutUnit lineCrossAxisExtent) 13465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!isColumnFlow() && child.style()->logicalHeight().isAuto()) { 13485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: If the child has orthogonal flow, then it already has an override height set, so use it. 13495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!hasOrthogonalFlow(child)) { 13507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LayoutUnit heightBeforeStretching = needToStretchChildLogicalHeight(child) ? constrainedChildIntrinsicContentLogicalHeight(child) : child.logicalHeight(); 135110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch LayoutUnit stretchedLogicalHeight = heightBeforeStretching + availableAlignmentSpaceForChildBeforeStretching(lineCrossAxisExtent, child); 13527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(!child.needsLayout()); 13537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LayoutUnit desiredLogicalHeight = child.constrainLogicalHeightByMinMax(stretchedLogicalHeight, heightBeforeStretching - child.borderAndPaddingLogicalHeight()); 13545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Can avoid laying out here in some cases. See https://webkit.org/b/87905. 1356697ef0c10ac944be8499480c025020e4c282c980Ben Murdoch if (desiredLogicalHeight != child.logicalHeight()) { 1357697ef0c10ac944be8499480c025020e4c282c980Ben Murdoch child.setOverrideLogicalContentHeight(desiredLogicalHeight - child.borderAndPaddingLogicalHeight()); 13587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setLogicalHeight(0); 1359018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch // We cache the child's intrinsic content logical height to avoid it being reset to the stretched height. 1360018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch // FIXME: This is fragile. RenderBoxes should be smart enough to determine their intrinsic content logical 1361018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch // height correctly even when there's an overrideHeight. 1362018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch LayoutUnit childIntrinsicContentLogicalHeight = child.intrinsicContentLogicalHeight(); 13637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.forceChildLayout(); 1364018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch child.updateIntrinsicContentLogicalHeight(childIntrinsicContentLogicalHeight); 13655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } else if (isColumnFlow() && child.style()->logicalWidth().isAuto()) { 13685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: If the child doesn't have orthogonal flow, then it already has an override width set, so use it. 13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (hasOrthogonalFlow(child)) { 13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit childWidth = std::max<LayoutUnit>(0, lineCrossAxisExtent - crossAxisMarginExtentForChild(child)); 13717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci childWidth = child.constrainLogicalWidthByMinMax(childWidth, childWidth, this); 13725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (childWidth != child.logicalWidth()) { 13747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.setOverrideLogicalContentWidth(childWidth - child.borderAndPaddingLogicalWidth()); 13757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci child.forceChildLayout(); 13765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1381926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderFlexibleBox::flipForRightToLeftColumn() 13825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (style()->isLeftToRightDirection() || !isColumnFlow()) 13845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 13855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit crossExtent = crossAxisExtent(); 1387926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (RenderBox* child = m_orderIterator.first(); child; child = m_orderIterator.next()) { 13885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (child->isOutOfFlowPositioned()) 13895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 13907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LayoutPoint location = flowAwareLocationForChild(*child); 13915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) // For vertical flows, setFlowAwareLocationForChild will transpose x and y, 13925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) // so using the y axis for a column cross axis extent is correct. 13937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci location.setY(crossExtent - crossAxisExtentForChild(*child) - location.y()); 13947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setFlowAwareLocationForChild(*child, location); 13955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1398926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderFlexibleBox::flipForWrapReverse(const Vector<LineContext>& lineContexts, LayoutUnit crossAxisStartEdge) 13995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit contentExtent = crossAxisContentExtent(); 1401926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RenderBox* child = m_orderIterator.first(); 14025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber) { 1403926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numberOfChildren; ++childNumber, child = m_orderIterator.next()) { 14045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(child); 14055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisExtent; 14065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit originalOffset = lineContexts[lineNumber].crossAxisOffset - crossAxisStartEdge; 14075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit newOffset = contentExtent - originalOffset - lineCrossAxisExtent; 14087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci adjustAlignmentForChild(*child, newOffset - originalOffset); 14095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1414