| OLD | NEW |
| 1 /* | 1 /* |
| 2 * This file is part of the render object implementation for KHTML. | 2 * This file is part of the render object implementation for KHTML. |
| 3 * | 3 * |
| 4 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 4 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 5 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 5 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 6 * Copyright (C) 2003 Apple Computer, Inc. | 6 * Copyright (C) 2003 Apple Computer, Inc. |
| 7 * | 7 * |
| 8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
| 9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
| 10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 FlexBoxIterator(RenderDeprecatedFlexibleBox* parent) | 41 FlexBoxIterator(RenderDeprecatedFlexibleBox* parent) |
| 42 : m_box(parent) | 42 : m_box(parent) |
| 43 , m_largestOrdinal(1) | 43 , m_largestOrdinal(1) |
| 44 { | 44 { |
| 45 if (m_box->style()->boxOrient() == HORIZONTAL && !m_box->style()->isLeft
ToRightDirection()) | 45 if (m_box->style()->boxOrient() == HORIZONTAL && !m_box->style()->isLeft
ToRightDirection()) |
| 46 m_forward = m_box->style()->boxDirection() != BNORMAL; | 46 m_forward = m_box->style()->boxDirection() != BNORMAL; |
| 47 else | 47 else |
| 48 m_forward = m_box->style()->boxDirection() == BNORMAL; | 48 m_forward = m_box->style()->boxDirection() == BNORMAL; |
| 49 if (!m_forward) { | 49 if (!m_forward) { |
| 50 // No choice, since we're going backwards, we have to find out the h
ighest ordinal up front. | 50 // No choice, since we're going backwards, we have to find out the h
ighest ordinal up front. |
| 51 RenderBox* child = m_box->firstChildBox(); | 51 LayoutBox* child = m_box->firstChildBox(); |
| 52 while (child) { | 52 while (child) { |
| 53 if (child->style()->boxOrdinalGroup() > m_largestOrdinal) | 53 if (child->style()->boxOrdinalGroup() > m_largestOrdinal) |
| 54 m_largestOrdinal = child->style()->boxOrdinalGroup(); | 54 m_largestOrdinal = child->style()->boxOrdinalGroup(); |
| 55 child = child->nextSiblingBox(); | 55 child = child->nextSiblingBox(); |
| 56 } | 56 } |
| 57 } | 57 } |
| 58 | 58 |
| 59 reset(); | 59 reset(); |
| 60 } | 60 } |
| 61 | 61 |
| 62 void reset() | 62 void reset() |
| 63 { | 63 { |
| 64 m_currentChild = 0; | 64 m_currentChild = 0; |
| 65 m_ordinalIteration = -1; | 65 m_ordinalIteration = -1; |
| 66 } | 66 } |
| 67 | 67 |
| 68 RenderBox* first() | 68 LayoutBox* first() |
| 69 { | 69 { |
| 70 reset(); | 70 reset(); |
| 71 return next(); | 71 return next(); |
| 72 } | 72 } |
| 73 | 73 |
| 74 RenderBox* next() | 74 LayoutBox* next() |
| 75 { | 75 { |
| 76 do { | 76 do { |
| 77 if (!m_currentChild) { | 77 if (!m_currentChild) { |
| 78 ++m_ordinalIteration; | 78 ++m_ordinalIteration; |
| 79 | 79 |
| 80 if (!m_ordinalIteration) | 80 if (!m_ordinalIteration) |
| 81 m_currentOrdinal = m_forward ? 1 : m_largestOrdinal; | 81 m_currentOrdinal = m_forward ? 1 : m_largestOrdinal; |
| 82 else { | 82 else { |
| 83 if (static_cast<size_t>(m_ordinalIteration) >= m_ordinalValu
es.size() + 1) | 83 if (static_cast<size_t>(m_ordinalIteration) >= m_ordinalValu
es.size() + 1) |
| 84 return 0; | 84 return 0; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 103 } | 103 } |
| 104 | 104 |
| 105 private: | 105 private: |
| 106 bool notFirstOrdinalValue() | 106 bool notFirstOrdinalValue() |
| 107 { | 107 { |
| 108 unsigned int firstOrdinalValue = m_forward ? 1 : m_largestOrdinal; | 108 unsigned int firstOrdinalValue = m_forward ? 1 : m_largestOrdinal; |
| 109 return m_currentOrdinal == firstOrdinalValue && m_currentChild->style()-
>boxOrdinalGroup() != firstOrdinalValue; | 109 return m_currentOrdinal == firstOrdinalValue && m_currentChild->style()-
>boxOrdinalGroup() != firstOrdinalValue; |
| 110 } | 110 } |
| 111 | 111 |
| 112 RenderDeprecatedFlexibleBox* m_box; | 112 RenderDeprecatedFlexibleBox* m_box; |
| 113 RenderBox* m_currentChild; | 113 LayoutBox* m_currentChild; |
| 114 bool m_forward; | 114 bool m_forward; |
| 115 unsigned int m_currentOrdinal; | 115 unsigned int m_currentOrdinal; |
| 116 unsigned int m_largestOrdinal; | 116 unsigned int m_largestOrdinal; |
| 117 HashSet<unsigned int> m_ordinalValues; | 117 HashSet<unsigned int> m_ordinalValues; |
| 118 Vector<unsigned int> m_sortedOrdinalValues; | 118 Vector<unsigned int> m_sortedOrdinalValues; |
| 119 int m_ordinalIteration; | 119 int m_ordinalIteration; |
| 120 }; | 120 }; |
| 121 | 121 |
| 122 RenderDeprecatedFlexibleBox::RenderDeprecatedFlexibleBox(Element& element) | 122 RenderDeprecatedFlexibleBox::RenderDeprecatedFlexibleBox(Element& element) |
| 123 : RenderBlock(&element) | 123 : RenderBlock(&element) |
| 124 { | 124 { |
| 125 ASSERT(!childrenInline()); | 125 ASSERT(!childrenInline()); |
| 126 m_stretchingChildren = false; | 126 m_stretchingChildren = false; |
| 127 if (!isAnonymous()) { | 127 if (!isAnonymous()) { |
| 128 const KURL& url = document().url(); | 128 const KURL& url = document().url(); |
| 129 if (url.protocolIs("chrome")) | 129 if (url.protocolIs("chrome")) |
| 130 UseCounter::count(document(), UseCounter::DeprecatedFlexboxChrome); | 130 UseCounter::count(document(), UseCounter::DeprecatedFlexboxChrome); |
| 131 else if (url.protocolIs("chrome-extension")) | 131 else if (url.protocolIs("chrome-extension")) |
| 132 UseCounter::count(document(), UseCounter::DeprecatedFlexboxChromeExt
ension); | 132 UseCounter::count(document(), UseCounter::DeprecatedFlexboxChromeExt
ension); |
| 133 else | 133 else |
| 134 UseCounter::count(document(), UseCounter::DeprecatedFlexboxWebConten
t); | 134 UseCounter::count(document(), UseCounter::DeprecatedFlexboxWebConten
t); |
| 135 } | 135 } |
| 136 } | 136 } |
| 137 | 137 |
| 138 RenderDeprecatedFlexibleBox::~RenderDeprecatedFlexibleBox() | 138 RenderDeprecatedFlexibleBox::~RenderDeprecatedFlexibleBox() |
| 139 { | 139 { |
| 140 } | 140 } |
| 141 | 141 |
| 142 static LayoutUnit marginWidthForChild(RenderBox* child) | 142 static LayoutUnit marginWidthForChild(LayoutBox* child) |
| 143 { | 143 { |
| 144 // A margin basically has three types: fixed, percentage, and auto (variable
). | 144 // A margin basically has three types: fixed, percentage, and auto (variable
). |
| 145 // Auto and percentage margins simply become 0 when computing min/max width. | 145 // Auto and percentage margins simply become 0 when computing min/max width. |
| 146 // Fixed margins can be added in as is. | 146 // Fixed margins can be added in as is. |
| 147 Length marginLeft = child->style()->marginLeft(); | 147 Length marginLeft = child->style()->marginLeft(); |
| 148 Length marginRight = child->style()->marginRight(); | 148 Length marginRight = child->style()->marginRight(); |
| 149 LayoutUnit margin = 0; | 149 LayoutUnit margin = 0; |
| 150 if (marginLeft.isFixed()) | 150 if (marginLeft.isFixed()) |
| 151 margin += marginLeft.value(); | 151 margin += marginLeft.value(); |
| 152 if (marginRight.isFixed()) | 152 if (marginRight.isFixed()) |
| 153 margin += marginRight.value(); | 153 margin += marginRight.value(); |
| 154 return margin; | 154 return margin; |
| 155 } | 155 } |
| 156 | 156 |
| 157 static bool childDoesNotAffectWidthOrFlexing(LayoutObject* child) | 157 static bool childDoesNotAffectWidthOrFlexing(LayoutObject* child) |
| 158 { | 158 { |
| 159 // Positioned children and collapsed children don't affect the min/max width
. | 159 // Positioned children and collapsed children don't affect the min/max width
. |
| 160 return child->isOutOfFlowPositioned() || child->style()->visibility() == COL
LAPSE; | 160 return child->isOutOfFlowPositioned() || child->style()->visibility() == COL
LAPSE; |
| 161 } | 161 } |
| 162 | 162 |
| 163 static LayoutUnit contentWidthForChild(RenderBox* child) | 163 static LayoutUnit contentWidthForChild(LayoutBox* child) |
| 164 { | 164 { |
| 165 if (child->hasOverrideWidth()) | 165 if (child->hasOverrideWidth()) |
| 166 return child->overrideLogicalContentWidth(); | 166 return child->overrideLogicalContentWidth(); |
| 167 return child->logicalWidth() - child->borderAndPaddingLogicalWidth(); | 167 return child->logicalWidth() - child->borderAndPaddingLogicalWidth(); |
| 168 } | 168 } |
| 169 | 169 |
| 170 static LayoutUnit contentHeightForChild(RenderBox* child) | 170 static LayoutUnit contentHeightForChild(LayoutBox* child) |
| 171 { | 171 { |
| 172 if (child->hasOverrideHeight()) | 172 if (child->hasOverrideHeight()) |
| 173 return child->overrideLogicalContentHeight(); | 173 return child->overrideLogicalContentHeight(); |
| 174 return child->logicalHeight() - child->borderAndPaddingLogicalHeight(); | 174 return child->logicalHeight() - child->borderAndPaddingLogicalHeight(); |
| 175 } | 175 } |
| 176 | 176 |
| 177 void RenderDeprecatedFlexibleBox::styleWillChange(StyleDifference diff, const La
youtStyle& newStyle) | 177 void RenderDeprecatedFlexibleBox::styleWillChange(StyleDifference diff, const La
youtStyle& newStyle) |
| 178 { | 178 { |
| 179 LayoutStyle* oldStyle = style(); | 179 LayoutStyle* oldStyle = style(); |
| 180 if (oldStyle && !oldStyle->lineClamp().isNone() && newStyle.lineClamp().isNo
ne()) | 180 if (oldStyle && !oldStyle->lineClamp().isNone() && newStyle.lineClamp().isNo
ne()) |
| 181 clearLineClamp(); | 181 clearLineClamp(); |
| 182 | 182 |
| 183 RenderBlock::styleWillChange(diff, newStyle); | 183 RenderBlock::styleWillChange(diff, newStyle); |
| 184 } | 184 } |
| 185 | 185 |
| 186 void RenderDeprecatedFlexibleBox::computeIntrinsicLogicalWidths(LayoutUnit& minL
ogicalWidth, LayoutUnit& maxLogicalWidth) const | 186 void RenderDeprecatedFlexibleBox::computeIntrinsicLogicalWidths(LayoutUnit& minL
ogicalWidth, LayoutUnit& maxLogicalWidth) const |
| 187 { | 187 { |
| 188 if (hasMultipleLines() || isVertical()) { | 188 if (hasMultipleLines() || isVertical()) { |
| 189 for (RenderBox* child = firstChildBox(); child; child = child->nextSibli
ngBox()) { | 189 for (LayoutBox* child = firstChildBox(); child; child = child->nextSibli
ngBox()) { |
| 190 if (childDoesNotAffectWidthOrFlexing(child)) | 190 if (childDoesNotAffectWidthOrFlexing(child)) |
| 191 continue; | 191 continue; |
| 192 | 192 |
| 193 LayoutUnit margin = marginWidthForChild(child); | 193 LayoutUnit margin = marginWidthForChild(child); |
| 194 LayoutUnit width = child->minPreferredLogicalWidth() + margin; | 194 LayoutUnit width = child->minPreferredLogicalWidth() + margin; |
| 195 minLogicalWidth = std::max(width, minLogicalWidth); | 195 minLogicalWidth = std::max(width, minLogicalWidth); |
| 196 | 196 |
| 197 width = child->maxPreferredLogicalWidth() + margin; | 197 width = child->maxPreferredLogicalWidth() + margin; |
| 198 maxLogicalWidth = std::max(width, maxLogicalWidth); | 198 maxLogicalWidth = std::max(width, maxLogicalWidth); |
| 199 } | 199 } |
| 200 } else { | 200 } else { |
| 201 for (RenderBox* child = firstChildBox(); child; child = child->nextSibli
ngBox()) { | 201 for (LayoutBox* child = firstChildBox(); child; child = child->nextSibli
ngBox()) { |
| 202 if (childDoesNotAffectWidthOrFlexing(child)) | 202 if (childDoesNotAffectWidthOrFlexing(child)) |
| 203 continue; | 203 continue; |
| 204 | 204 |
| 205 LayoutUnit margin = marginWidthForChild(child); | 205 LayoutUnit margin = marginWidthForChild(child); |
| 206 minLogicalWidth += child->minPreferredLogicalWidth() + margin; | 206 minLogicalWidth += child->minPreferredLogicalWidth() + margin; |
| 207 maxLogicalWidth += child->maxPreferredLogicalWidth() + margin; | 207 maxLogicalWidth += child->maxPreferredLogicalWidth() + margin; |
| 208 } | 208 } |
| 209 } | 209 } |
| 210 | 210 |
| 211 maxLogicalWidth = std::max(minLogicalWidth, maxLogicalWidth); | 211 maxLogicalWidth = std::max(minLogicalWidth, maxLogicalWidth); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 // we overflow or not. | 267 // we overflow or not. |
| 268 if (hasOverflowClip()) | 268 if (hasOverflowClip()) |
| 269 layer()->scrollableArea()->updateAfterLayout(); | 269 layer()->scrollableArea()->updateAfterLayout(); |
| 270 | 270 |
| 271 clearNeedsLayout(); | 271 clearNeedsLayout(); |
| 272 } | 272 } |
| 273 | 273 |
| 274 // The first walk over our kids is to find out if we have any flexible children. | 274 // The first walk over our kids is to find out if we have any flexible children. |
| 275 static void gatherFlexChildrenInfo(FlexBoxIterator& iterator, bool relayoutChild
ren, unsigned int& highestFlexGroup, unsigned int& lowestFlexGroup, bool& haveFl
ex) | 275 static void gatherFlexChildrenInfo(FlexBoxIterator& iterator, bool relayoutChild
ren, unsigned int& highestFlexGroup, unsigned int& lowestFlexGroup, bool& haveFl
ex) |
| 276 { | 276 { |
| 277 for (RenderBox* child = iterator.first(); child; child = iterator.next()) { | 277 for (LayoutBox* child = iterator.first(); child; child = iterator.next()) { |
| 278 // Check to see if this child flexes. | 278 // Check to see if this child flexes. |
| 279 if (!childDoesNotAffectWidthOrFlexing(child) && child->style()->boxFlex(
) > 0.0f) { | 279 if (!childDoesNotAffectWidthOrFlexing(child) && child->style()->boxFlex(
) > 0.0f) { |
| 280 // We always have to lay out flexible objects again, since the flex
distribution | 280 // We always have to lay out flexible objects again, since the flex
distribution |
| 281 // may have changed, and we need to reallocate space. | 281 // may have changed, and we need to reallocate space. |
| 282 child->clearOverrideSize(); | 282 child->clearOverrideSize(); |
| 283 if (!relayoutChildren) | 283 if (!relayoutChildren) |
| 284 child->setChildNeedsLayout(MarkOnlyThis); | 284 child->setChildNeedsLayout(MarkOnlyThis); |
| 285 haveFlex = true; | 285 haveFlex = true; |
| 286 unsigned int flexGroup = child->style()->boxFlexGroup(); | 286 unsigned int flexGroup = child->style()->boxFlexGroup(); |
| 287 if (lowestFlexGroup == 0) | 287 if (lowestFlexGroup == 0) |
| (...skipping 30 matching lines...) Expand all Loading... |
| 318 do { | 318 do { |
| 319 // Reset our height. | 319 // Reset our height. |
| 320 setHeight(yPos); | 320 setHeight(yPos); |
| 321 | 321 |
| 322 xPos = borderLeft() + paddingLeft(); | 322 xPos = borderLeft() + paddingLeft(); |
| 323 | 323 |
| 324 // Our first pass is done without flexing. We simply lay the children | 324 // Our first pass is done without flexing. We simply lay the children |
| 325 // out within the box. We have to do a layout first in order to determi
ne | 325 // out within the box. We have to do a layout first in order to determi
ne |
| 326 // our box's intrinsic height. | 326 // our box's intrinsic height. |
| 327 LayoutUnit maxAscent = 0, maxDescent = 0; | 327 LayoutUnit maxAscent = 0, maxDescent = 0; |
| 328 for (RenderBox* child = iterator.first(); child; child = iterator.next()
) { | 328 for (LayoutBox* child = iterator.first(); child; child = iterator.next()
) { |
| 329 if (child->isOutOfFlowPositioned()) | 329 if (child->isOutOfFlowPositioned()) |
| 330 continue; | 330 continue; |
| 331 | 331 |
| 332 SubtreeLayoutScope layoutScope(*child); | 332 SubtreeLayoutScope layoutScope(*child); |
| 333 if (relayoutChildren || (child->isReplaced() && (child->style()->wid
th().isPercent() || child->style()->height().isPercent()))) | 333 if (relayoutChildren || (child->isReplaced() && (child->style()->wid
th().isPercent() || child->style()->height().isPercent()))) |
| 334 layoutScope.setChildNeedsLayout(child); | 334 layoutScope.setChildNeedsLayout(child); |
| 335 | 335 |
| 336 // Compute the child's vertical margins. | 336 // Compute the child's vertical margins. |
| 337 child->computeAndSetBlockDirectionMargins(this); | 337 child->computeAndSetBlockDirectionMargins(this); |
| 338 | 338 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 370 | 370 |
| 371 oldHeight = size().height(); | 371 oldHeight = size().height(); |
| 372 updateLogicalHeight(); | 372 updateLogicalHeight(); |
| 373 | 373 |
| 374 relayoutChildren = false; | 374 relayoutChildren = false; |
| 375 if (oldHeight != size().height()) | 375 if (oldHeight != size().height()) |
| 376 heightSpecified = true; | 376 heightSpecified = true; |
| 377 | 377 |
| 378 // Now that our height is actually known, we can place our boxes. | 378 // Now that our height is actually known, we can place our boxes. |
| 379 m_stretchingChildren = (style()->boxAlign() == BSTRETCH); | 379 m_stretchingChildren = (style()->boxAlign() == BSTRETCH); |
| 380 for (RenderBox* child = iterator.first(); child; child = iterator.next()
) { | 380 for (LayoutBox* child = iterator.first(); child; child = iterator.next()
) { |
| 381 if (child->isOutOfFlowPositioned()) { | 381 if (child->isOutOfFlowPositioned()) { |
| 382 child->containingBlock()->insertPositionedObject(child); | 382 child->containingBlock()->insertPositionedObject(child); |
| 383 Layer* childLayer = child->layer(); | 383 Layer* childLayer = child->layer(); |
| 384 childLayer->setStaticInlinePosition(xPos); | 384 childLayer->setStaticInlinePosition(xPos); |
| 385 if (childLayer->staticBlockPosition() != yPos) { | 385 if (childLayer->staticBlockPosition() != yPos) { |
| 386 childLayer->setStaticBlockPosition(yPos); | 386 childLayer->setStaticBlockPosition(yPos); |
| 387 if (child->style()->hasStaticBlockPosition(style()->isHorizo
ntalWritingMode())) | 387 if (child->style()->hasStaticBlockPosition(style()->isHorizo
ntalWritingMode())) |
| 388 child->setChildNeedsLayout(MarkOnlyThis); | 388 child->setChildNeedsLayout(MarkOnlyThis); |
| 389 } | 389 } |
| 390 continue; | 390 continue; |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 459 for (unsigned i = start; i <= end && remainingSpace; i++) { | 459 for (unsigned i = start; i <= end && remainingSpace; i++) { |
| 460 // Always start off by assuming the group can get all the remain
ing space. | 460 // Always start off by assuming the group can get all the remain
ing space. |
| 461 LayoutUnit groupRemainingSpace = remainingSpace; | 461 LayoutUnit groupRemainingSpace = remainingSpace; |
| 462 do { | 462 do { |
| 463 // Flexing consists of multiple passes, since we have to cha
nge ratios every time an object hits its max/min-width | 463 // Flexing consists of multiple passes, since we have to cha
nge ratios every time an object hits its max/min-width |
| 464 // For a given pass, we always start off by computing the to
talFlex of all objects that can grow/shrink at all, and | 464 // For a given pass, we always start off by computing the to
talFlex of all objects that can grow/shrink at all, and |
| 465 // computing the allowed growth before an object hits its mi
n/max width (and thus | 465 // computing the allowed growth before an object hits its mi
n/max width (and thus |
| 466 // forces a totalFlex recomputation). | 466 // forces a totalFlex recomputation). |
| 467 LayoutUnit groupRemainingSpaceAtBeginning = groupRemainingSp
ace; | 467 LayoutUnit groupRemainingSpaceAtBeginning = groupRemainingSp
ace; |
| 468 float totalFlex = 0.0f; | 468 float totalFlex = 0.0f; |
| 469 for (RenderBox* child = iterator.first(); child; child = ite
rator.next()) { | 469 for (LayoutBox* child = iterator.first(); child; child = ite
rator.next()) { |
| 470 if (allowedChildFlex(child, expanding, i)) | 470 if (allowedChildFlex(child, expanding, i)) |
| 471 totalFlex += child->style()->boxFlex(); | 471 totalFlex += child->style()->boxFlex(); |
| 472 } | 472 } |
| 473 LayoutUnit spaceAvailableThisPass = groupRemainingSpace; | 473 LayoutUnit spaceAvailableThisPass = groupRemainingSpace; |
| 474 for (RenderBox* child = iterator.first(); child; child = ite
rator.next()) { | 474 for (LayoutBox* child = iterator.first(); child; child = ite
rator.next()) { |
| 475 LayoutUnit allowedFlex = allowedChildFlex(child, expandi
ng, i); | 475 LayoutUnit allowedFlex = allowedChildFlex(child, expandi
ng, i); |
| 476 if (allowedFlex) { | 476 if (allowedFlex) { |
| 477 LayoutUnit projectedFlex = (allowedFlex == LayoutUni
t::max()) ? allowedFlex : LayoutUnit(allowedFlex * (totalFlex / child->style()->
boxFlex())); | 477 LayoutUnit projectedFlex = (allowedFlex == LayoutUni
t::max()) ? allowedFlex : LayoutUnit(allowedFlex * (totalFlex / child->style()->
boxFlex())); |
| 478 spaceAvailableThisPass = expanding ? std::min(spaceA
vailableThisPass, projectedFlex) : std::max(spaceAvailableThisPass, projectedFle
x); | 478 spaceAvailableThisPass = expanding ? std::min(spaceA
vailableThisPass, projectedFlex) : std::max(spaceAvailableThisPass, projectedFle
x); |
| 479 } | 479 } |
| 480 } | 480 } |
| 481 | 481 |
| 482 // The flex groups may not have any flexible objects this ti
me around. | 482 // The flex groups may not have any flexible objects this ti
me around. |
| 483 if (!spaceAvailableThisPass || totalFlex == 0.0f) { | 483 if (!spaceAvailableThisPass || totalFlex == 0.0f) { |
| 484 // If we just couldn't grow/shrink any more, then it's t
ime to transition to the next flex group. | 484 // If we just couldn't grow/shrink any more, then it's t
ime to transition to the next flex group. |
| 485 groupRemainingSpace = 0; | 485 groupRemainingSpace = 0; |
| 486 continue; | 486 continue; |
| 487 } | 487 } |
| 488 | 488 |
| 489 // Now distribute the space to objects. | 489 // Now distribute the space to objects. |
| 490 for (RenderBox* child = iterator.first(); child && spaceAvai
lableThisPass && totalFlex; child = iterator.next()) { | 490 for (LayoutBox* child = iterator.first(); child && spaceAvai
lableThisPass && totalFlex; child = iterator.next()) { |
| 491 if (child->style()->visibility() == COLLAPSE) | 491 if (child->style()->visibility() == COLLAPSE) |
| 492 continue; | 492 continue; |
| 493 | 493 |
| 494 if (allowedChildFlex(child, expanding, i)) { | 494 if (allowedChildFlex(child, expanding, i)) { |
| 495 LayoutUnit spaceAdd = LayoutUnit(spaceAvailableThisP
ass * (child->style()->boxFlex() / totalFlex)); | 495 LayoutUnit spaceAdd = LayoutUnit(spaceAvailableThisP
ass * (child->style()->boxFlex() / totalFlex)); |
| 496 if (spaceAdd) { | 496 if (spaceAdd) { |
| 497 child->setOverrideLogicalContentWidth(contentWid
thForChild(child) + spaceAdd); | 497 child->setOverrideLogicalContentWidth(contentWid
thForChild(child) + spaceAdd); |
| 498 flexingChildren = true; | 498 flexingChildren = true; |
| 499 relayoutChildren = true; | 499 relayoutChildren = true; |
| 500 } | 500 } |
| 501 | 501 |
| 502 spaceAvailableThisPass -= spaceAdd; | 502 spaceAvailableThisPass -= spaceAdd; |
| 503 remainingSpace -= spaceAdd; | 503 remainingSpace -= spaceAdd; |
| 504 groupRemainingSpace -= spaceAdd; | 504 groupRemainingSpace -= spaceAdd; |
| 505 | 505 |
| 506 totalFlex -= child->style()->boxFlex(); | 506 totalFlex -= child->style()->boxFlex(); |
| 507 } | 507 } |
| 508 } | 508 } |
| 509 if (groupRemainingSpace == groupRemainingSpaceAtBeginning) { | 509 if (groupRemainingSpace == groupRemainingSpaceAtBeginning) { |
| 510 // This is not advancing, avoid getting stuck by distrib
uting the remaining pixels. | 510 // This is not advancing, avoid getting stuck by distrib
uting the remaining pixels. |
| 511 LayoutUnit spaceAdd = groupRemainingSpace > 0 ? 1 : -1; | 511 LayoutUnit spaceAdd = groupRemainingSpace > 0 ? 1 : -1; |
| 512 for (RenderBox* child = iterator.first(); child && group
RemainingSpace; child = iterator.next()) { | 512 for (LayoutBox* child = iterator.first(); child && group
RemainingSpace; child = iterator.next()) { |
| 513 if (allowedChildFlex(child, expanding, i)) { | 513 if (allowedChildFlex(child, expanding, i)) { |
| 514 child->setOverrideLogicalContentWidth(contentWid
thForChild(child) + spaceAdd); | 514 child->setOverrideLogicalContentWidth(contentWid
thForChild(child) + spaceAdd); |
| 515 flexingChildren = true; | 515 flexingChildren = true; |
| 516 relayoutChildren = true; | 516 relayoutChildren = true; |
| 517 remainingSpace -= spaceAdd; | 517 remainingSpace -= spaceAdd; |
| 518 groupRemainingSpace -= spaceAdd; | 518 groupRemainingSpace -= spaceAdd; |
| 519 } | 519 } |
| 520 } | 520 } |
| 521 } | 521 } |
| 522 } while (absoluteValue(groupRemainingSpace) >= 1); | 522 } while (absoluteValue(groupRemainingSpace) >= 1); |
| 523 } | 523 } |
| 524 | 524 |
| 525 // We didn't find any children that could grow. | 525 // We didn't find any children that could grow. |
| 526 if (haveFlex && !flexingChildren) | 526 if (haveFlex && !flexingChildren) |
| 527 haveFlex = false; | 527 haveFlex = false; |
| 528 } | 528 } |
| 529 } while (haveFlex); | 529 } while (haveFlex); |
| 530 | 530 |
| 531 RenderBlock::finishDelayUpdateScrollInfo(); | 531 RenderBlock::finishDelayUpdateScrollInfo(); |
| 532 | 532 |
| 533 if (remainingSpace > 0 && ((style()->isLeftToRightDirection() && style()->bo
xPack() != Start) | 533 if (remainingSpace > 0 && ((style()->isLeftToRightDirection() && style()->bo
xPack() != Start) |
| 534 || (!style()->isLeftToRightDirection() && style()->boxPack() != End))) { | 534 || (!style()->isLeftToRightDirection() && style()->boxPack() != End))) { |
| 535 // Children must be repositioned. | 535 // Children must be repositioned. |
| 536 LayoutUnit offset = 0; | 536 LayoutUnit offset = 0; |
| 537 if (style()->boxPack() == Justify) { | 537 if (style()->boxPack() == Justify) { |
| 538 // Determine the total number of children. | 538 // Determine the total number of children. |
| 539 int totalChildren = 0; | 539 int totalChildren = 0; |
| 540 for (RenderBox* child = iterator.first(); child; child = iterator.ne
xt()) { | 540 for (LayoutBox* child = iterator.first(); child; child = iterator.ne
xt()) { |
| 541 if (childDoesNotAffectWidthOrFlexing(child)) | 541 if (childDoesNotAffectWidthOrFlexing(child)) |
| 542 continue; | 542 continue; |
| 543 ++totalChildren; | 543 ++totalChildren; |
| 544 } | 544 } |
| 545 | 545 |
| 546 // Iterate over the children and space them out according to the | 546 // Iterate over the children and space them out according to the |
| 547 // justification level. | 547 // justification level. |
| 548 if (totalChildren > 1) { | 548 if (totalChildren > 1) { |
| 549 --totalChildren; | 549 --totalChildren; |
| 550 bool firstChild = true; | 550 bool firstChild = true; |
| 551 for (RenderBox* child = iterator.first(); child; child = iterato
r.next()) { | 551 for (LayoutBox* child = iterator.first(); child; child = iterato
r.next()) { |
| 552 if (childDoesNotAffectWidthOrFlexing(child)) | 552 if (childDoesNotAffectWidthOrFlexing(child)) |
| 553 continue; | 553 continue; |
| 554 | 554 |
| 555 if (firstChild) { | 555 if (firstChild) { |
| 556 firstChild = false; | 556 firstChild = false; |
| 557 continue; | 557 continue; |
| 558 } | 558 } |
| 559 | 559 |
| 560 offset += remainingSpace/totalChildren; | 560 offset += remainingSpace/totalChildren; |
| 561 remainingSpace -= (remainingSpace/totalChildren); | 561 remainingSpace -= (remainingSpace/totalChildren); |
| 562 --totalChildren; | 562 --totalChildren; |
| 563 | 563 |
| 564 placeChild(child, child->location() + LayoutSize(offset, 0))
; | 564 placeChild(child, child->location() + LayoutSize(offset, 0))
; |
| 565 } | 565 } |
| 566 } | 566 } |
| 567 } else { | 567 } else { |
| 568 if (style()->boxPack() == Center) | 568 if (style()->boxPack() == Center) |
| 569 offset += remainingSpace / 2; | 569 offset += remainingSpace / 2; |
| 570 else // END for LTR, START for RTL | 570 else // END for LTR, START for RTL |
| 571 offset += remainingSpace; | 571 offset += remainingSpace; |
| 572 for (RenderBox* child = iterator.first(); child; child = iterator.ne
xt()) { | 572 for (LayoutBox* child = iterator.first(); child; child = iterator.ne
xt()) { |
| 573 if (childDoesNotAffectWidthOrFlexing(child)) | 573 if (childDoesNotAffectWidthOrFlexing(child)) |
| 574 continue; | 574 continue; |
| 575 | 575 |
| 576 placeChild(child, child->location() + LayoutSize(offset, 0)); | 576 placeChild(child, child->location() + LayoutSize(offset, 0)); |
| 577 } | 577 } |
| 578 } | 578 } |
| 579 } | 579 } |
| 580 | 580 |
| 581 // So that the computeLogicalHeight in layoutBlock() knows to relayout posit
ioned objects because of | 581 // So that the computeLogicalHeight in layoutBlock() knows to relayout posit
ioned objects because of |
| 582 // a height change, we revert our height back to the intrinsic height before
returning. | 582 // a height change, we revert our height back to the intrinsic height before
returning. |
| (...skipping 25 matching lines...) Expand all Loading... |
| 608 RenderBlock::startDelayUpdateScrollInfo(); | 608 RenderBlock::startDelayUpdateScrollInfo(); |
| 609 | 609 |
| 610 // We do 2 passes. The first pass is simply to lay everyone out at | 610 // We do 2 passes. The first pass is simply to lay everyone out at |
| 611 // their preferred widths. The second pass handles flexing the children. | 611 // their preferred widths. The second pass handles flexing the children. |
| 612 // Our first pass is done without flexing. We simply lay the children | 612 // Our first pass is done without flexing. We simply lay the children |
| 613 // out within the box. | 613 // out within the box. |
| 614 do { | 614 do { |
| 615 setHeight(borderTop() + paddingTop()); | 615 setHeight(borderTop() + paddingTop()); |
| 616 LayoutUnit minHeight = size().height() + toAdd; | 616 LayoutUnit minHeight = size().height() + toAdd; |
| 617 | 617 |
| 618 for (RenderBox* child = iterator.first(); child; child = iterator.next()
) { | 618 for (LayoutBox* child = iterator.first(); child; child = iterator.next()
) { |
| 619 if (child->isOutOfFlowPositioned()) { | 619 if (child->isOutOfFlowPositioned()) { |
| 620 child->containingBlock()->insertPositionedObject(child); | 620 child->containingBlock()->insertPositionedObject(child); |
| 621 Layer* childLayer = child->layer(); | 621 Layer* childLayer = child->layer(); |
| 622 childLayer->setStaticInlinePosition(borderStart() + paddingStart
()); | 622 childLayer->setStaticInlinePosition(borderStart() + paddingStart
()); |
| 623 if (childLayer->staticBlockPosition() != size().height()) { | 623 if (childLayer->staticBlockPosition() != size().height()) { |
| 624 childLayer->setStaticBlockPosition(size().height()); | 624 childLayer->setStaticBlockPosition(size().height()); |
| 625 if (child->style()->hasStaticBlockPosition(style()->isHorizo
ntalWritingMode())) | 625 if (child->style()->hasStaticBlockPosition(style()->isHorizo
ntalWritingMode())) |
| 626 child->setChildNeedsLayout(MarkOnlyThis); | 626 child->setChildNeedsLayout(MarkOnlyThis); |
| 627 } | 627 } |
| 628 continue; | 628 continue; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 for (unsigned i = start; i <= end && remainingSpace; i++) { | 713 for (unsigned i = start; i <= end && remainingSpace; i++) { |
| 714 // Always start off by assuming the group can get all the remain
ing space. | 714 // Always start off by assuming the group can get all the remain
ing space. |
| 715 LayoutUnit groupRemainingSpace = remainingSpace; | 715 LayoutUnit groupRemainingSpace = remainingSpace; |
| 716 do { | 716 do { |
| 717 // Flexing consists of multiple passes, since we have to cha
nge ratios every time an object hits its max/min-width | 717 // Flexing consists of multiple passes, since we have to cha
nge ratios every time an object hits its max/min-width |
| 718 // For a given pass, we always start off by computing the to
talFlex of all objects that can grow/shrink at all, and | 718 // For a given pass, we always start off by computing the to
talFlex of all objects that can grow/shrink at all, and |
| 719 // computing the allowed growth before an object hits its mi
n/max width (and thus | 719 // computing the allowed growth before an object hits its mi
n/max width (and thus |
| 720 // forces a totalFlex recomputation). | 720 // forces a totalFlex recomputation). |
| 721 LayoutUnit groupRemainingSpaceAtBeginning = groupRemainingSp
ace; | 721 LayoutUnit groupRemainingSpaceAtBeginning = groupRemainingSp
ace; |
| 722 float totalFlex = 0.0f; | 722 float totalFlex = 0.0f; |
| 723 for (RenderBox* child = iterator.first(); child; child = ite
rator.next()) { | 723 for (LayoutBox* child = iterator.first(); child; child = ite
rator.next()) { |
| 724 if (allowedChildFlex(child, expanding, i)) | 724 if (allowedChildFlex(child, expanding, i)) |
| 725 totalFlex += child->style()->boxFlex(); | 725 totalFlex += child->style()->boxFlex(); |
| 726 } | 726 } |
| 727 LayoutUnit spaceAvailableThisPass = groupRemainingSpace; | 727 LayoutUnit spaceAvailableThisPass = groupRemainingSpace; |
| 728 for (RenderBox* child = iterator.first(); child; child = ite
rator.next()) { | 728 for (LayoutBox* child = iterator.first(); child; child = ite
rator.next()) { |
| 729 LayoutUnit allowedFlex = allowedChildFlex(child, expandi
ng, i); | 729 LayoutUnit allowedFlex = allowedChildFlex(child, expandi
ng, i); |
| 730 if (allowedFlex) { | 730 if (allowedFlex) { |
| 731 LayoutUnit projectedFlex = (allowedFlex == LayoutUni
t::max()) ? allowedFlex : static_cast<LayoutUnit>(allowedFlex * (totalFlex / chi
ld->style()->boxFlex())); | 731 LayoutUnit projectedFlex = (allowedFlex == LayoutUni
t::max()) ? allowedFlex : static_cast<LayoutUnit>(allowedFlex * (totalFlex / chi
ld->style()->boxFlex())); |
| 732 spaceAvailableThisPass = expanding ? std::min(spaceA
vailableThisPass, projectedFlex) : std::max(spaceAvailableThisPass, projectedFle
x); | 732 spaceAvailableThisPass = expanding ? std::min(spaceA
vailableThisPass, projectedFlex) : std::max(spaceAvailableThisPass, projectedFle
x); |
| 733 } | 733 } |
| 734 } | 734 } |
| 735 | 735 |
| 736 // The flex groups may not have any flexible objects this ti
me around. | 736 // The flex groups may not have any flexible objects this ti
me around. |
| 737 if (!spaceAvailableThisPass || totalFlex == 0.0f) { | 737 if (!spaceAvailableThisPass || totalFlex == 0.0f) { |
| 738 // If we just couldn't grow/shrink any more, then it's t
ime to transition to the next flex group. | 738 // If we just couldn't grow/shrink any more, then it's t
ime to transition to the next flex group. |
| 739 groupRemainingSpace = 0; | 739 groupRemainingSpace = 0; |
| 740 continue; | 740 continue; |
| 741 } | 741 } |
| 742 | 742 |
| 743 // Now distribute the space to objects. | 743 // Now distribute the space to objects. |
| 744 for (RenderBox* child = iterator.first(); child && spaceAvai
lableThisPass && totalFlex; child = iterator.next()) { | 744 for (LayoutBox* child = iterator.first(); child && spaceAvai
lableThisPass && totalFlex; child = iterator.next()) { |
| 745 if (allowedChildFlex(child, expanding, i)) { | 745 if (allowedChildFlex(child, expanding, i)) { |
| 746 LayoutUnit spaceAdd = static_cast<LayoutUnit>(spaceA
vailableThisPass * (child->style()->boxFlex() / totalFlex)); | 746 LayoutUnit spaceAdd = static_cast<LayoutUnit>(spaceA
vailableThisPass * (child->style()->boxFlex() / totalFlex)); |
| 747 if (spaceAdd) { | 747 if (spaceAdd) { |
| 748 child->setOverrideLogicalContentHeight(contentHe
ightForChild(child) + spaceAdd); | 748 child->setOverrideLogicalContentHeight(contentHe
ightForChild(child) + spaceAdd); |
| 749 flexingChildren = true; | 749 flexingChildren = true; |
| 750 relayoutChildren = true; | 750 relayoutChildren = true; |
| 751 } | 751 } |
| 752 | 752 |
| 753 spaceAvailableThisPass -= spaceAdd; | 753 spaceAvailableThisPass -= spaceAdd; |
| 754 remainingSpace -= spaceAdd; | 754 remainingSpace -= spaceAdd; |
| 755 groupRemainingSpace -= spaceAdd; | 755 groupRemainingSpace -= spaceAdd; |
| 756 | 756 |
| 757 totalFlex -= child->style()->boxFlex(); | 757 totalFlex -= child->style()->boxFlex(); |
| 758 } | 758 } |
| 759 } | 759 } |
| 760 if (groupRemainingSpace == groupRemainingSpaceAtBeginning) { | 760 if (groupRemainingSpace == groupRemainingSpaceAtBeginning) { |
| 761 // This is not advancing, avoid getting stuck by distrib
uting the remaining pixels. | 761 // This is not advancing, avoid getting stuck by distrib
uting the remaining pixels. |
| 762 LayoutUnit spaceAdd = groupRemainingSpace > 0 ? 1 : -1; | 762 LayoutUnit spaceAdd = groupRemainingSpace > 0 ? 1 : -1; |
| 763 for (RenderBox* child = iterator.first(); child && group
RemainingSpace; child = iterator.next()) { | 763 for (LayoutBox* child = iterator.first(); child && group
RemainingSpace; child = iterator.next()) { |
| 764 if (allowedChildFlex(child, expanding, i)) { | 764 if (allowedChildFlex(child, expanding, i)) { |
| 765 child->setOverrideLogicalContentHeight(contentHe
ightForChild(child) + spaceAdd); | 765 child->setOverrideLogicalContentHeight(contentHe
ightForChild(child) + spaceAdd); |
| 766 flexingChildren = true; | 766 flexingChildren = true; |
| 767 relayoutChildren = true; | 767 relayoutChildren = true; |
| 768 remainingSpace -= spaceAdd; | 768 remainingSpace -= spaceAdd; |
| 769 groupRemainingSpace -= spaceAdd; | 769 groupRemainingSpace -= spaceAdd; |
| 770 } | 770 } |
| 771 } | 771 } |
| 772 } | 772 } |
| 773 } while (absoluteValue(groupRemainingSpace) >= 1); | 773 } while (absoluteValue(groupRemainingSpace) >= 1); |
| 774 } | 774 } |
| 775 | 775 |
| 776 // We didn't find any children that could grow. | 776 // We didn't find any children that could grow. |
| 777 if (haveFlex && !flexingChildren) | 777 if (haveFlex && !flexingChildren) |
| 778 haveFlex = false; | 778 haveFlex = false; |
| 779 } | 779 } |
| 780 } while (haveFlex); | 780 } while (haveFlex); |
| 781 | 781 |
| 782 RenderBlock::finishDelayUpdateScrollInfo(); | 782 RenderBlock::finishDelayUpdateScrollInfo(); |
| 783 | 783 |
| 784 if (style()->boxPack() != Start && remainingSpace > 0) { | 784 if (style()->boxPack() != Start && remainingSpace > 0) { |
| 785 // Children must be repositioned. | 785 // Children must be repositioned. |
| 786 LayoutUnit offset = 0; | 786 LayoutUnit offset = 0; |
| 787 if (style()->boxPack() == Justify) { | 787 if (style()->boxPack() == Justify) { |
| 788 // Determine the total number of children. | 788 // Determine the total number of children. |
| 789 int totalChildren = 0; | 789 int totalChildren = 0; |
| 790 for (RenderBox* child = iterator.first(); child; child = iterator.ne
xt()) { | 790 for (LayoutBox* child = iterator.first(); child; child = iterator.ne
xt()) { |
| 791 if (childDoesNotAffectWidthOrFlexing(child)) | 791 if (childDoesNotAffectWidthOrFlexing(child)) |
| 792 continue; | 792 continue; |
| 793 | 793 |
| 794 ++totalChildren; | 794 ++totalChildren; |
| 795 } | 795 } |
| 796 | 796 |
| 797 // Iterate over the children and space them out according to the | 797 // Iterate over the children and space them out according to the |
| 798 // justification level. | 798 // justification level. |
| 799 if (totalChildren > 1) { | 799 if (totalChildren > 1) { |
| 800 --totalChildren; | 800 --totalChildren; |
| 801 bool firstChild = true; | 801 bool firstChild = true; |
| 802 for (RenderBox* child = iterator.first(); child; child = iterato
r.next()) { | 802 for (LayoutBox* child = iterator.first(); child; child = iterato
r.next()) { |
| 803 if (childDoesNotAffectWidthOrFlexing(child)) | 803 if (childDoesNotAffectWidthOrFlexing(child)) |
| 804 continue; | 804 continue; |
| 805 | 805 |
| 806 if (firstChild) { | 806 if (firstChild) { |
| 807 firstChild = false; | 807 firstChild = false; |
| 808 continue; | 808 continue; |
| 809 } | 809 } |
| 810 | 810 |
| 811 offset += remainingSpace/totalChildren; | 811 offset += remainingSpace/totalChildren; |
| 812 remainingSpace -= (remainingSpace/totalChildren); | 812 remainingSpace -= (remainingSpace/totalChildren); |
| 813 --totalChildren; | 813 --totalChildren; |
| 814 placeChild(child, child->location() + LayoutSize(0, offset))
; | 814 placeChild(child, child->location() + LayoutSize(0, offset))
; |
| 815 } | 815 } |
| 816 } | 816 } |
| 817 } else { | 817 } else { |
| 818 if (style()->boxPack() == Center) | 818 if (style()->boxPack() == Center) |
| 819 offset += remainingSpace / 2; | 819 offset += remainingSpace / 2; |
| 820 else // END | 820 else // END |
| 821 offset += remainingSpace; | 821 offset += remainingSpace; |
| 822 for (RenderBox* child = iterator.first(); child; child = iterator.ne
xt()) { | 822 for (LayoutBox* child = iterator.first(); child; child = iterator.ne
xt()) { |
| 823 if (childDoesNotAffectWidthOrFlexing(child)) | 823 if (childDoesNotAffectWidthOrFlexing(child)) |
| 824 continue; | 824 continue; |
| 825 placeChild(child, child->location() + LayoutSize(0, offset)); | 825 placeChild(child, child->location() + LayoutSize(0, offset)); |
| 826 } | 826 } |
| 827 } | 827 } |
| 828 } | 828 } |
| 829 | 829 |
| 830 // So that the computeLogicalHeight in layoutBlock() knows to relayout posit
ioned objects because of | 830 // So that the computeLogicalHeight in layoutBlock() knows to relayout posit
ioned objects because of |
| 831 // a height change, we revert our height back to the intrinsic height before
returning. | 831 // a height change, we revert our height back to the intrinsic height before
returning. |
| 832 if (heightSpecified) | 832 if (heightSpecified) |
| 833 setHeight(oldHeight); | 833 setHeight(oldHeight); |
| 834 } | 834 } |
| 835 | 835 |
| 836 void RenderDeprecatedFlexibleBox::applyLineClamp(FlexBoxIterator& iterator, bool
relayoutChildren) | 836 void RenderDeprecatedFlexibleBox::applyLineClamp(FlexBoxIterator& iterator, bool
relayoutChildren) |
| 837 { | 837 { |
| 838 UseCounter::count(document(), UseCounter::LineClamp); | 838 UseCounter::count(document(), UseCounter::LineClamp); |
| 839 | 839 |
| 840 int maxLineCount = 0; | 840 int maxLineCount = 0; |
| 841 for (RenderBox* child = iterator.first(); child; child = iterator.next()) { | 841 for (LayoutBox* child = iterator.first(); child; child = iterator.next()) { |
| 842 if (childDoesNotAffectWidthOrFlexing(child)) | 842 if (childDoesNotAffectWidthOrFlexing(child)) |
| 843 continue; | 843 continue; |
| 844 | 844 |
| 845 child->clearOverrideSize(); | 845 child->clearOverrideSize(); |
| 846 if (relayoutChildren || (child->isReplaced() && (child->style()->width()
.isPercent() || child->style()->height().isPercent())) | 846 if (relayoutChildren || (child->isReplaced() && (child->style()->width()
.isPercent() || child->style()->height().isPercent())) |
| 847 || (child->style()->height().isAuto() && child->isRenderBlock())) { | 847 || (child->style()->height().isAuto() && child->isRenderBlock())) { |
| 848 child->setChildNeedsLayout(MarkOnlyThis); | 848 child->setChildNeedsLayout(MarkOnlyThis); |
| 849 | 849 |
| 850 // Dirty all the positioned objects. | 850 // Dirty all the positioned objects. |
| 851 if (child->isRenderBlock()) { | 851 if (child->isRenderBlock()) { |
| 852 toRenderBlock(child)->markPositionedObjectsForLayout(); | 852 toRenderBlock(child)->markPositionedObjectsForLayout(); |
| 853 toRenderBlock(child)->clearTruncation(); | 853 toRenderBlock(child)->clearTruncation(); |
| 854 } | 854 } |
| 855 } | 855 } |
| 856 child->layoutIfNeeded(); | 856 child->layoutIfNeeded(); |
| 857 if (child->style()->height().isAuto() && child->isRenderBlock()) | 857 if (child->style()->height().isAuto() && child->isRenderBlock()) |
| 858 maxLineCount = std::max(maxLineCount, toRenderBlock(child)->lineCoun
t()); | 858 maxLineCount = std::max(maxLineCount, toRenderBlock(child)->lineCoun
t()); |
| 859 } | 859 } |
| 860 | 860 |
| 861 // Get the number of lines and then alter all block flow children with auto
height to use the | 861 // Get the number of lines and then alter all block flow children with auto
height to use the |
| 862 // specified height. We always try to leave room for at least one line. | 862 // specified height. We always try to leave room for at least one line. |
| 863 LineClampValue lineClamp = style()->lineClamp(); | 863 LineClampValue lineClamp = style()->lineClamp(); |
| 864 int numVisibleLines = lineClamp.isPercentage() ? std::max(1, (maxLineCount +
1) * lineClamp.value() / 100) : lineClamp.value(); | 864 int numVisibleLines = lineClamp.isPercentage() ? std::max(1, (maxLineCount +
1) * lineClamp.value() / 100) : lineClamp.value(); |
| 865 if (numVisibleLines >= maxLineCount) | 865 if (numVisibleLines >= maxLineCount) |
| 866 return; | 866 return; |
| 867 | 867 |
| 868 for (RenderBox* child = iterator.first(); child; child = iterator.next()) { | 868 for (LayoutBox* child = iterator.first(); child; child = iterator.next()) { |
| 869 if (childDoesNotAffectWidthOrFlexing(child) || !child->style()->height()
.isAuto() || !child->isRenderBlock()) | 869 if (childDoesNotAffectWidthOrFlexing(child) || !child->style()->height()
.isAuto() || !child->isRenderBlock()) |
| 870 continue; | 870 continue; |
| 871 | 871 |
| 872 RenderBlock* blockChild = toRenderBlock(child); | 872 RenderBlock* blockChild = toRenderBlock(child); |
| 873 int lineCount = blockChild->lineCount(); | 873 int lineCount = blockChild->lineCount(); |
| 874 if (lineCount <= numVisibleLines) | 874 if (lineCount <= numVisibleLines) |
| 875 continue; | 875 continue; |
| 876 | 876 |
| 877 LayoutUnit newHeight = blockChild->heightForLineCount(numVisibleLines); | 877 LayoutUnit newHeight = blockChild->heightForLineCount(numVisibleLines); |
| 878 if (newHeight == child->size().height()) | 878 if (newHeight == child->size().height()) |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 929 // FIXME: the text alignment should be recomputed after the width change
s due to truncation. | 929 // FIXME: the text alignment should be recomputed after the width change
s due to truncation. |
| 930 LayoutUnit blockLeftEdge = destBlock.logicalLeftOffsetForLine(lastVisibl
eLine->y(), false); | 930 LayoutUnit blockLeftEdge = destBlock.logicalLeftOffsetForLine(lastVisibl
eLine->y(), false); |
| 931 lastVisibleLine->placeEllipsis(anchorBox ? ellipsisAndSpaceStr : ellipsi
sStr, leftToRight, blockLeftEdge.toFloat(), blockRightEdge.toFloat(), totalWidth
, anchorBox); | 931 lastVisibleLine->placeEllipsis(anchorBox ? ellipsisAndSpaceStr : ellipsi
sStr, leftToRight, blockLeftEdge.toFloat(), blockRightEdge.toFloat(), totalWidth
, anchorBox); |
| 932 destBlock.setHasMarkupTruncation(true); | 932 destBlock.setHasMarkupTruncation(true); |
| 933 } | 933 } |
| 934 } | 934 } |
| 935 | 935 |
| 936 void RenderDeprecatedFlexibleBox::clearLineClamp() | 936 void RenderDeprecatedFlexibleBox::clearLineClamp() |
| 937 { | 937 { |
| 938 FlexBoxIterator iterator(this); | 938 FlexBoxIterator iterator(this); |
| 939 for (RenderBox* child = iterator.first(); child; child = iterator.next()) { | 939 for (LayoutBox* child = iterator.first(); child; child = iterator.next()) { |
| 940 if (childDoesNotAffectWidthOrFlexing(child)) | 940 if (childDoesNotAffectWidthOrFlexing(child)) |
| 941 continue; | 941 continue; |
| 942 | 942 |
| 943 child->clearOverrideSize(); | 943 child->clearOverrideSize(); |
| 944 if ((child->isReplaced() && (child->style()->width().isPercent() || chil
d->style()->height().isPercent())) | 944 if ((child->isReplaced() && (child->style()->width().isPercent() || chil
d->style()->height().isPercent())) |
| 945 || (child->style()->height().isAuto() && child->isRenderBlock())) { | 945 || (child->style()->height().isAuto() && child->isRenderBlock())) { |
| 946 child->setChildNeedsLayout(); | 946 child->setChildNeedsLayout(); |
| 947 | 947 |
| 948 if (child->isRenderBlock()) { | 948 if (child->isRenderBlock()) { |
| 949 toRenderBlock(child)->markPositionedObjectsForLayout(); | 949 toRenderBlock(child)->markPositionedObjectsForLayout(); |
| 950 toRenderBlock(child)->clearTruncation(); | 950 toRenderBlock(child)->clearTruncation(); |
| 951 } | 951 } |
| 952 } | 952 } |
| 953 } | 953 } |
| 954 } | 954 } |
| 955 | 955 |
| 956 void RenderDeprecatedFlexibleBox::placeChild(RenderBox* child, const LayoutPoint
& location) | 956 void RenderDeprecatedFlexibleBox::placeChild(LayoutBox* child, const LayoutPoint
& location) |
| 957 { | 957 { |
| 958 // FIXME Investigate if this can be removed based on other flags. crbug.com/
370010 | 958 // FIXME Investigate if this can be removed based on other flags. crbug.com/
370010 |
| 959 child->setMayNeedPaintInvalidation(); | 959 child->setMayNeedPaintInvalidation(); |
| 960 | 960 |
| 961 // Place the child. | 961 // Place the child. |
| 962 child->setLocation(location); | 962 child->setLocation(location); |
| 963 } | 963 } |
| 964 | 964 |
| 965 LayoutUnit RenderDeprecatedFlexibleBox::allowedChildFlex(RenderBox* child, bool
expanding, unsigned int group) | 965 LayoutUnit RenderDeprecatedFlexibleBox::allowedChildFlex(LayoutBox* child, bool
expanding, unsigned group) |
| 966 { | 966 { |
| 967 if (childDoesNotAffectWidthOrFlexing(child) || child->style()->boxFlex() ==
0.0f || child->style()->boxFlexGroup() != group) | 967 if (childDoesNotAffectWidthOrFlexing(child) || child->style()->boxFlex() ==
0.0f || child->style()->boxFlexGroup() != group) |
| 968 return 0; | 968 return 0; |
| 969 | 969 |
| 970 if (expanding) { | 970 if (expanding) { |
| 971 if (isHorizontal()) { | 971 if (isHorizontal()) { |
| 972 // FIXME: For now just handle fixed values. | 972 // FIXME: For now just handle fixed values. |
| 973 LayoutUnit maxWidth = LayoutUnit::max(); | 973 LayoutUnit maxWidth = LayoutUnit::max(); |
| 974 LayoutUnit width = contentWidthForChild(child); | 974 LayoutUnit width = contentWidthForChild(child); |
| 975 if (child->style()->maxWidth().isFixed()) | 975 if (child->style()->maxWidth().isFixed()) |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1028 if (isOutOfFlowPositioned()) | 1028 if (isOutOfFlowPositioned()) |
| 1029 return "RenderDeprecatedFlexibleBox (positioned)"; | 1029 return "RenderDeprecatedFlexibleBox (positioned)"; |
| 1030 if (isAnonymous()) | 1030 if (isAnonymous()) |
| 1031 return "RenderDeprecatedFlexibleBox (generated)"; | 1031 return "RenderDeprecatedFlexibleBox (generated)"; |
| 1032 if (isRelPositioned()) | 1032 if (isRelPositioned()) |
| 1033 return "RenderDeprecatedFlexibleBox (relative positioned)"; | 1033 return "RenderDeprecatedFlexibleBox (relative positioned)"; |
| 1034 return "RenderDeprecatedFlexibleBox"; | 1034 return "RenderDeprecatedFlexibleBox"; |
| 1035 } | 1035 } |
| 1036 | 1036 |
| 1037 } // namespace blink | 1037 } // namespace blink |
| OLD | NEW |