Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 494 | 494 |
| 495 layoutPositionedObjects(relayoutChildren || isDocumentElement(), oldLeft != logicalLeft() ? ForcedLayoutAfterContainingBlockMoved : DefaultLayout); | 495 layoutPositionedObjects(relayoutChildren || isDocumentElement(), oldLeft != logicalLeft() ? ForcedLayoutAfterContainingBlockMoved : DefaultLayout); |
| 496 | 496 |
| 497 // Add overflow from children (unless we're multi-column, since in that case all our child overflow is clipped anyway). | 497 // Add overflow from children (unless we're multi-column, since in that case all our child overflow is clipped anyway). |
| 498 computeOverflow(oldClientAfterEdge); | 498 computeOverflow(oldClientAfterEdge); |
| 499 | 499 |
| 500 m_descendantsWithFloatsMarkedForLayout = false; | 500 m_descendantsWithFloatsMarkedForLayout = false; |
| 501 return true; | 501 return true; |
| 502 } | 502 } |
| 503 | 503 |
| 504 void RenderBlockFlow::determineLogicalLeftPositionForChild(RenderBox* child) | 504 void RenderBlockFlow::determineLogicalLeftPositionForChild(RenderBox* child) |
|
Julien - ping for review
2014/11/26 18:52:35
This function could also take a reference.
| |
| 505 { | 505 { |
| 506 LayoutUnit startPosition = borderStart() + paddingStart(); | 506 LayoutUnit startPosition = borderStart() + paddingStart(); |
| 507 LayoutUnit initialStartPosition = startPosition; | 507 LayoutUnit initialStartPosition = startPosition; |
| 508 if (style()->shouldPlaceBlockDirectionScrollbarOnLogicalLeft()) | 508 if (style()->shouldPlaceBlockDirectionScrollbarOnLogicalLeft()) |
| 509 startPosition -= verticalScrollbarWidth(); | 509 startPosition -= verticalScrollbarWidth(); |
| 510 LayoutUnit totalAvailableLogicalWidth = borderAndPaddingLogicalWidth() + ava ilableLogicalWidth(); | 510 LayoutUnit totalAvailableLogicalWidth = borderAndPaddingLogicalWidth() + ava ilableLogicalWidth(); |
| 511 | 511 |
| 512 LayoutUnit childMarginStart = marginStartForChild(child); | 512 LayoutUnit childMarginStart = marginStartForChild(*child); |
|
Julien - ping for review
2014/11/26 18:52:35
It seems like the function could also use a refere
| |
| 513 LayoutUnit newPosition = startPosition + childMarginStart; | 513 LayoutUnit newPosition = startPosition + childMarginStart; |
| 514 | 514 |
| 515 LayoutUnit positionToAvoidFloats; | 515 LayoutUnit positionToAvoidFloats; |
| 516 if (child->avoidsFloats() && containsFloats() && !flowThreadContainingBlock( )) | 516 if (child->avoidsFloats() && containsFloats() && !flowThreadContainingBlock( )) |
| 517 positionToAvoidFloats = startOffsetForLine(logicalTopForChild(child), fa lse, logicalHeightForChild(child)); | 517 positionToAvoidFloats = startOffsetForLine(logicalTopForChild(*child), f alse, logicalHeightForChild(*child)); |
| 518 | 518 |
| 519 // If the child has an offset from the content edge to avoid floats then use that, otherwise let any negative | 519 // If the child has an offset from the content edge to avoid floats then use that, otherwise let any negative |
| 520 // margin pull it back over the content edge or any positive margin push it out. | 520 // margin pull it back over the content edge or any positive margin push it out. |
| 521 // If the child is being centred then the margin calculated to do that has f actored in any offset required to | 521 // If the child is being centred then the margin calculated to do that has f actored in any offset required to |
| 522 // avoid floats, so use it if necessary. | 522 // avoid floats, so use it if necessary. |
| 523 if (style()->textAlign() == WEBKIT_CENTER || child->style()->marginStartUsin g(style()).isAuto()) | 523 if (style()->textAlign() == WEBKIT_CENTER || child->style()->marginStartUsin g(style()).isAuto()) |
| 524 newPosition = std::max(newPosition, positionToAvoidFloats + childMarginS tart); | 524 newPosition = std::max(newPosition, positionToAvoidFloats + childMarginS tart); |
| 525 else if (positionToAvoidFloats > initialStartPosition) | 525 else if (positionToAvoidFloats > initialStartPosition) |
| 526 newPosition = std::max(newPosition, positionToAvoidFloats); | 526 newPosition = std::max(newPosition, positionToAvoidFloats); |
| 527 | 527 |
| 528 setLogicalLeftForChild(child, style()->isLeftToRightDirection() ? newPositio n : totalAvailableLogicalWidth - newPosition - logicalWidthForChild(child)); | 528 setLogicalLeftForChild(child, style()->isLeftToRightDirection() ? newPositio n : totalAvailableLogicalWidth - newPosition - logicalWidthForChild(*child)); |
| 529 } | 529 } |
| 530 | 530 |
| 531 void RenderBlockFlow::setLogicalLeftForChild(RenderBox* child, LayoutUnit logica lLeft) | 531 void RenderBlockFlow::setLogicalLeftForChild(RenderBox* child, LayoutUnit logica lLeft) |
| 532 { | 532 { |
| 533 if (isHorizontalWritingMode()) { | 533 if (isHorizontalWritingMode()) { |
| 534 child->setX(logicalLeft); | 534 child->setX(logicalLeft); |
| 535 } else { | 535 } else { |
| 536 child->setY(logicalLeft); | 536 child->setY(logicalLeft); |
| 537 } | 537 } |
| 538 } | 538 } |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 555 child->computeAndSetBlockDirectionMargins(this); | 555 child->computeAndSetBlockDirectionMargins(this); |
| 556 | 556 |
| 557 // Try to guess our correct logical top position. In most cases this guess w ill | 557 // Try to guess our correct logical top position. In most cases this guess w ill |
| 558 // be correct. Only if we're wrong (when we compute the real logical top pos ition) | 558 // be correct. Only if we're wrong (when we compute the real logical top pos ition) |
| 559 // will we have to potentially relayout. | 559 // will we have to potentially relayout. |
| 560 LayoutUnit estimateWithoutPagination; | 560 LayoutUnit estimateWithoutPagination; |
| 561 LayoutUnit logicalTopEstimate = estimateLogicalTopPosition(child, marginInfo , estimateWithoutPagination); | 561 LayoutUnit logicalTopEstimate = estimateLogicalTopPosition(child, marginInfo , estimateWithoutPagination); |
| 562 | 562 |
| 563 // Cache our old rect so that we can dirty the proper paint invalidation rec ts if the child moves. | 563 // Cache our old rect so that we can dirty the proper paint invalidation rec ts if the child moves. |
| 564 LayoutRect oldRect = child->frameRect(); | 564 LayoutRect oldRect = child->frameRect(); |
| 565 LayoutUnit oldLogicalTop = logicalTopForChild(child); | 565 LayoutUnit oldLogicalTop = logicalTopForChild(*child); |
|
Julien - ping for review
2014/11/26 18:52:35
Same comment.
| |
| 566 | 566 |
| 567 // Go ahead and position the child as though it didn't collapse with the top . | 567 // Go ahead and position the child as though it didn't collapse with the top . |
| 568 setLogicalTopForChild(child, logicalTopEstimate); | 568 setLogicalTopForChild(child, logicalTopEstimate); |
| 569 | 569 |
| 570 RenderBlockFlow* childRenderBlockFlow = child->isRenderBlockFlow() ? toRende rBlockFlow(child) : 0; | 570 RenderBlockFlow* childRenderBlockFlow = child->isRenderBlockFlow() ? toRende rBlockFlow(child) : 0; |
| 571 bool markDescendantsWithFloats = false; | 571 bool markDescendantsWithFloats = false; |
| 572 if (logicalTopEstimate != oldLogicalTop && childRenderBlockFlow && !childRen derBlockFlow->avoidsFloats() && childRenderBlockFlow->containsFloats()) { | 572 if (logicalTopEstimate != oldLogicalTop && childRenderBlockFlow && !childRen derBlockFlow->avoidsFloats() && childRenderBlockFlow->containsFloats()) { |
| 573 markDescendantsWithFloats = true; | 573 markDescendantsWithFloats = true; |
| 574 } else if (UNLIKELY(logicalTopEstimate.mightBeSaturated())) { | 574 } else if (UNLIKELY(logicalTopEstimate.mightBeSaturated())) { |
| 575 // logicalTopEstimate, returned by estimateLogicalTopPosition, might be saturated for | 575 // logicalTopEstimate, returned by estimateLogicalTopPosition, might be saturated for |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 653 // This has to be done after checking for clear, so that margins can be rese t if a clear occurred. | 653 // This has to be done after checking for clear, so that margins can be rese t if a clear occurred. |
| 654 if (marginInfo.atBeforeSideOfBlock() && !childIsSelfCollapsing) | 654 if (marginInfo.atBeforeSideOfBlock() && !childIsSelfCollapsing) |
| 655 marginInfo.setAtBeforeSideOfBlock(false); | 655 marginInfo.setAtBeforeSideOfBlock(false); |
| 656 | 656 |
| 657 // Now place the child in the correct left position | 657 // Now place the child in the correct left position |
| 658 determineLogicalLeftPositionForChild(child); | 658 determineLogicalLeftPositionForChild(child); |
| 659 | 659 |
| 660 LayoutSize childOffset = child->location() - oldRect.location(); | 660 LayoutSize childOffset = child->location() - oldRect.location(); |
| 661 | 661 |
| 662 // Update our height now that the child has been placed in the correct posit ion. | 662 // Update our height now that the child has been placed in the correct posit ion. |
| 663 setLogicalHeight(logicalHeight() + logicalHeightForChild(child)); | 663 setLogicalHeight(logicalHeight() + logicalHeightForChild(*child)); |
| 664 if (mustSeparateMarginAfterForChild(child)) { | 664 if (mustSeparateMarginAfterForChild(child)) { |
| 665 setLogicalHeight(logicalHeight() + marginAfterForChild(child)); | 665 setLogicalHeight(logicalHeight() + marginAfterForChild(*child)); |
| 666 marginInfo.clearMargin(); | 666 marginInfo.clearMargin(); |
| 667 } | 667 } |
| 668 // If the child has overhanging floats that intrude into following siblings (or possibly out | 668 // If the child has overhanging floats that intrude into following siblings (or possibly out |
| 669 // of this block), then the parent gets notified of the floats now. | 669 // of this block), then the parent gets notified of the floats now. |
| 670 if (childRenderBlockFlow) | 670 if (childRenderBlockFlow) |
| 671 addOverhangingFloats(childRenderBlockFlow, !childNeededLayout); | 671 addOverhangingFloats(childRenderBlockFlow, !childNeededLayout); |
| 672 | 672 |
| 673 // If the child moved, we have to invalidate its paint as well as any floati ng/positioned | 673 // If the child moved, we have to invalidate its paint as well as any floati ng/positioned |
| 674 // descendants. An exception is if we need a layout. In this case, we know w e're going to | 674 // descendants. An exception is if we need a layout. In this case, we know w e're going to |
| 675 // invalidate our paint (and the child) anyway. | 675 // invalidate our paint (and the child) anyway. |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 866 } | 866 } |
| 867 | 867 |
| 868 LayoutUnit RenderBlockFlow::adjustForUnsplittableChild(RenderBox* child, LayoutU nit logicalOffset, bool includeMargins) | 868 LayoutUnit RenderBlockFlow::adjustForUnsplittableChild(RenderBox* child, LayoutU nit logicalOffset, bool includeMargins) |
| 869 { | 869 { |
| 870 bool checkColumnBreaks = view()->layoutState()->isPaginatingColumns() || flo wThreadContainingBlock(); | 870 bool checkColumnBreaks = view()->layoutState()->isPaginatingColumns() || flo wThreadContainingBlock(); |
| 871 bool checkPageBreaks = !checkColumnBreaks && view()->layoutState()->pageLogi calHeight(); | 871 bool checkPageBreaks = !checkColumnBreaks && view()->layoutState()->pageLogi calHeight(); |
| 872 bool isUnsplittable = child->isUnsplittableForPagination() || (checkColumnBr eaks && child->style()->columnBreakInside() == PBAVOID) | 872 bool isUnsplittable = child->isUnsplittableForPagination() || (checkColumnBr eaks && child->style()->columnBreakInside() == PBAVOID) |
| 873 || (checkPageBreaks && child->style()->pageBreakInside() == PBAVOID); | 873 || (checkPageBreaks && child->style()->pageBreakInside() == PBAVOID); |
| 874 if (!isUnsplittable) | 874 if (!isUnsplittable) |
| 875 return logicalOffset; | 875 return logicalOffset; |
| 876 LayoutUnit childLogicalHeight = logicalHeightForChild(child) + (includeMargi ns ? marginBeforeForChild(child) + marginAfterForChild(child) : LayoutUnit()); | 876 LayoutUnit childLogicalHeight = logicalHeightForChild(*child) + (includeMarg ins ? marginBeforeForChild(*child) + marginAfterForChild(*child) : LayoutUnit()) ; |
| 877 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); | 877 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); |
| 878 updateMinimumPageHeight(logicalOffset, childLogicalHeight); | 878 updateMinimumPageHeight(logicalOffset, childLogicalHeight); |
| 879 if (!pageLogicalHeight || childLogicalHeight > pageLogicalHeight) | 879 if (!pageLogicalHeight || childLogicalHeight > pageLogicalHeight) |
| 880 return logicalOffset; | 880 return logicalOffset; |
| 881 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi calOffset, ExcludePageBoundary); | 881 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi calOffset, ExcludePageBoundary); |
| 882 if (remainingLogicalHeight < childLogicalHeight) | 882 if (remainingLogicalHeight < childLogicalHeight) |
| 883 return logicalOffset + remainingLogicalHeight; | 883 return logicalOffset + remainingLogicalHeight; |
| 884 return logicalOffset; | 884 return logicalOffset; |
| 885 } | 885 } |
| 886 | 886 |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1038 | 1038 |
| 1039 while (next) { | 1039 while (next) { |
| 1040 RenderBox* child = next; | 1040 RenderBox* child = next; |
| 1041 next = child->nextSiblingBox(); | 1041 next = child->nextSiblingBox(); |
| 1042 | 1042 |
| 1043 child->setMayNeedPaintInvalidation(true); | 1043 child->setMayNeedPaintInvalidation(true); |
| 1044 | 1044 |
| 1045 if (childToExclude == child) | 1045 if (childToExclude == child) |
| 1046 continue; // Skip this child, since it will be positioned by the spe cialized subclass (fieldsets and ruby runs). | 1046 continue; // Skip this child, since it will be positioned by the spe cialized subclass (fieldsets and ruby runs). |
| 1047 | 1047 |
| 1048 updateBlockChildDirtyBitsBeforeLayout(relayoutChildren, child); | 1048 updateBlockChildDirtyBitsBeforeLayout(relayoutChildren, *child); |
| 1049 | 1049 |
| 1050 if (child->isOutOfFlowPositioned()) { | 1050 if (child->isOutOfFlowPositioned()) { |
| 1051 child->containingBlock()->insertPositionedObject(child); | 1051 child->containingBlock()->insertPositionedObject(child); |
| 1052 adjustPositionedBlock(child, marginInfo); | 1052 adjustPositionedBlock(child, marginInfo); |
| 1053 continue; | 1053 continue; |
| 1054 } | 1054 } |
| 1055 if (child->isFloating()) { | 1055 if (child->isFloating()) { |
| 1056 insertFloatingObject(child); | 1056 insertFloatingObject(child); |
| 1057 adjustFloatingBlock(marginInfo); | 1057 adjustFloatingBlock(marginInfo); |
| 1058 continue; | 1058 continue; |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1131 childBeforeNegative = childRenderBlockFlow->maxNegativeMarginAfter() ; | 1131 childBeforeNegative = childRenderBlockFlow->maxNegativeMarginAfter() ; |
| 1132 childAfterPositive = childRenderBlockFlow->maxPositiveMarginBefore() ; | 1132 childAfterPositive = childRenderBlockFlow->maxPositiveMarginBefore() ; |
| 1133 childAfterNegative = childRenderBlockFlow->maxNegativeMarginBefore() ; | 1133 childAfterNegative = childRenderBlockFlow->maxNegativeMarginBefore() ; |
| 1134 } else { | 1134 } else { |
| 1135 beforeMargin = child->marginAfter(); | 1135 beforeMargin = child->marginAfter(); |
| 1136 afterMargin = child->marginBefore(); | 1136 afterMargin = child->marginBefore(); |
| 1137 } | 1137 } |
| 1138 } else { | 1138 } else { |
| 1139 // The child is perpendicular to us, which means its margins don't colla pse but are on the | 1139 // The child is perpendicular to us, which means its margins don't colla pse but are on the |
| 1140 // "logical left/right" sides of the child box. We can just return the r aw margin in this case. | 1140 // "logical left/right" sides of the child box. We can just return the r aw margin in this case. |
| 1141 beforeMargin = marginBeforeForChild(child); | 1141 beforeMargin = marginBeforeForChild(*child); |
| 1142 afterMargin = marginAfterForChild(child); | 1142 afterMargin = marginAfterForChild(*child); |
|
Julien - ping for review
2014/11/26 18:52:35
Ditto.
| |
| 1143 } | 1143 } |
| 1144 | 1144 |
| 1145 // Resolve uncollapsing margins into their positive/negative buckets. | 1145 // Resolve uncollapsing margins into their positive/negative buckets. |
| 1146 if (beforeMargin) { | 1146 if (beforeMargin) { |
| 1147 if (beforeMargin > 0) | 1147 if (beforeMargin > 0) |
| 1148 childBeforePositive = beforeMargin; | 1148 childBeforePositive = beforeMargin; |
| 1149 else | 1149 else |
| 1150 childBeforeNegative = -beforeMargin; | 1150 childBeforeNegative = -beforeMargin; |
| 1151 } | 1151 } |
| 1152 if (afterMargin) { | 1152 if (afterMargin) { |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1263 logicalTop = logicalHeight() + collapsedBeforePos - collapsedBef oreNeg; | 1263 logicalTop = logicalHeight() + collapsedBeforePos - collapsedBef oreNeg; |
| 1264 } | 1264 } |
| 1265 } | 1265 } |
| 1266 } else { | 1266 } else { |
| 1267 if (mustSeparateMarginBeforeForChild(child)) { | 1267 if (mustSeparateMarginBeforeForChild(child)) { |
| 1268 ASSERT(!marginInfo.discardMargin() || (marginInfo.discardMargin() && !marginInfo.margin())); | 1268 ASSERT(!marginInfo.discardMargin() || (marginInfo.discardMargin() && !marginInfo.margin())); |
| 1269 // If we are at the before side of the block and we collapse, ignore the computed margin | 1269 // If we are at the before side of the block and we collapse, ignore the computed margin |
| 1270 // and just add the child margin to the container height. This will correctly position | 1270 // and just add the child margin to the container height. This will correctly position |
| 1271 // the child inside the container. | 1271 // the child inside the container. |
| 1272 LayoutUnit separateMargin = !marginInfo.canCollapseWithMarginBefore( ) ? marginInfo.margin() : LayoutUnit(0); | 1272 LayoutUnit separateMargin = !marginInfo.canCollapseWithMarginBefore( ) ? marginInfo.margin() : LayoutUnit(0); |
| 1273 setLogicalHeight(logicalHeight() + separateMargin + marginBeforeForC hild(child)); | 1273 setLogicalHeight(logicalHeight() + separateMargin + marginBeforeForC hild(*child)); |
|
Julien - ping for review
2014/11/26 18:52:35
Ditto.
| |
| 1274 logicalTop = logicalHeight(); | 1274 logicalTop = logicalHeight(); |
| 1275 } else if (!marginInfo.discardMargin() && (!marginInfo.atBeforeSideOfBlo ck() | 1275 } else if (!marginInfo.discardMargin() && (!marginInfo.atBeforeSideOfBlo ck() |
| 1276 || (!marginInfo.canCollapseMarginBeforeWithChildren() | 1276 || (!marginInfo.canCollapseMarginBeforeWithChildren() |
| 1277 && (!document().inQuirksMode() || !marginInfo.quirkContainer() || !m arginInfo.hasMarginBeforeQuirk())))) { | 1277 && (!document().inQuirksMode() || !marginInfo.quirkContainer() || !m arginInfo.hasMarginBeforeQuirk())))) { |
| 1278 // We're collapsing with a previous sibling's margins and not | 1278 // We're collapsing with a previous sibling's margins and not |
| 1279 // with the top of the block. | 1279 // with the top of the block. |
| 1280 setLogicalHeight(logicalHeight() + std::max(marginInfo.positiveMargi n(), posTop) - std::max(marginInfo.negativeMargin(), negTop)); | 1280 setLogicalHeight(logicalHeight() + std::max(marginInfo.positiveMargi n(), posTop) - std::max(marginInfo.negativeMargin(), negTop)); |
| 1281 logicalTop = logicalHeight(); | 1281 logicalTop = logicalHeight(); |
| 1282 } | 1282 } |
| 1283 | 1283 |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1438 | 1438 |
| 1439 // The margins are discarded by a child that specified -webkit-margin-collap se: discard. | 1439 // The margins are discarded by a child that specified -webkit-margin-collap se: discard. |
| 1440 // FIXME: Use writing mode independent accessor for marginBeforeCollapse. | 1440 // FIXME: Use writing mode independent accessor for marginBeforeCollapse. |
| 1441 if (child->style()->marginBeforeCollapse() == MDISCARD) { | 1441 if (child->style()->marginBeforeCollapse() == MDISCARD) { |
| 1442 positiveMarginBefore = 0; | 1442 positiveMarginBefore = 0; |
| 1443 negativeMarginBefore = 0; | 1443 negativeMarginBefore = 0; |
| 1444 discardMarginBefore = true; | 1444 discardMarginBefore = true; |
| 1445 return; | 1445 return; |
| 1446 } | 1446 } |
| 1447 | 1447 |
| 1448 LayoutUnit beforeChildMargin = marginBeforeForChild(child); | 1448 LayoutUnit beforeChildMargin = marginBeforeForChild(*child); |
| 1449 positiveMarginBefore = std::max(positiveMarginBefore, beforeChildMargin); | 1449 positiveMarginBefore = std::max(positiveMarginBefore, beforeChildMargin); |
| 1450 negativeMarginBefore = std::max(negativeMarginBefore, -beforeChildMargin); | 1450 negativeMarginBefore = std::max(negativeMarginBefore, -beforeChildMargin); |
| 1451 | 1451 |
| 1452 if (!child->isRenderBlockFlow()) | 1452 if (!child->isRenderBlockFlow()) |
| 1453 return; | 1453 return; |
| 1454 | 1454 |
| 1455 RenderBlockFlow* childBlockFlow = toRenderBlockFlow(child); | 1455 RenderBlockFlow* childBlockFlow = toRenderBlockFlow(child); |
| 1456 if (childBlockFlow->childrenInline() || childBlockFlow->isWritingModeRoot()) | 1456 if (childBlockFlow->childrenInline() || childBlockFlow->isWritingModeRoot()) |
| 1457 return; | 1457 return; |
| 1458 | 1458 |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 1475 if (grandchildBox->isRenderBlock()) { | 1475 if (grandchildBox->isRenderBlock()) { |
| 1476 RenderBlock* grandchildBlock = toRenderBlock(grandchildBox); | 1476 RenderBlock* grandchildBlock = toRenderBlock(grandchildBox); |
| 1477 grandchildBlock->setHasMarginBeforeQuirk(grandchildBox->style()->has MarginBeforeQuirk()); | 1477 grandchildBlock->setHasMarginBeforeQuirk(grandchildBox->style()->has MarginBeforeQuirk()); |
| 1478 grandchildBlock->setHasMarginAfterQuirk(grandchildBox->style()->hasM arginAfterQuirk()); | 1478 grandchildBlock->setHasMarginAfterQuirk(grandchildBox->style()->hasM arginAfterQuirk()); |
| 1479 } | 1479 } |
| 1480 } | 1480 } |
| 1481 | 1481 |
| 1482 // If we have a 'clear' value but also have a margin we may not actually req uire clearance to move past any floats. | 1482 // If we have a 'clear' value but also have a margin we may not actually req uire clearance to move past any floats. |
| 1483 // If that's the case we want to be sure we estimate the correct position in cluding margins after any floats rather | 1483 // If that's the case we want to be sure we estimate the correct position in cluding margins after any floats rather |
| 1484 // than use 'clearance' later which could give us the wrong position. | 1484 // than use 'clearance' later which could give us the wrong position. |
| 1485 if (grandchildBox->style()->clear() != CNONE && childBlockFlow->marginBefore ForChild(grandchildBox) == 0) | 1485 if (grandchildBox->style()->clear() != CNONE && childBlockFlow->marginBefore ForChild(*grandchildBox) == 0) |
| 1486 return; | 1486 return; |
| 1487 | 1487 |
| 1488 // Collapse the margin of the grandchild box with our own to produce an esti mate. | 1488 // Collapse the margin of the grandchild box with our own to produce an esti mate. |
| 1489 childBlockFlow->marginBeforeEstimateForChild(grandchildBox, positiveMarginBe fore, negativeMarginBefore, discardMarginBefore); | 1489 childBlockFlow->marginBeforeEstimateForChild(grandchildBox, positiveMarginBe fore, negativeMarginBefore, discardMarginBefore); |
| 1490 } | 1490 } |
| 1491 | 1491 |
| 1492 LayoutUnit RenderBlockFlow::estimateLogicalTopPosition(RenderBox* child, const M arginInfo& marginInfo, LayoutUnit& estimateWithoutPagination) | 1492 LayoutUnit RenderBlockFlow::estimateLogicalTopPosition(RenderBox* child, const M arginInfo& marginInfo, LayoutUnit& estimateWithoutPagination) |
| 1493 { | 1493 { |
| 1494 // FIXME: We need to eliminate the estimation of vertical position, because when it's wrong we sometimes trigger a pathological | 1494 // FIXME: We need to eliminate the estimation of vertical position, because when it's wrong we sometimes trigger a pathological |
| 1495 // relayout if there are intruding floats. | 1495 // relayout if there are intruding floats. |
| (...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1880 case CBOTH: | 1880 case CBOTH: |
| 1881 logicalBottom = lowestFloatLogicalBottom(); | 1881 logicalBottom = lowestFloatLogicalBottom(); |
| 1882 break; | 1882 break; |
| 1883 } | 1883 } |
| 1884 | 1884 |
| 1885 // We also clear floats if we are too big to sit on the same line as a float (and wish to avoid floats by default). | 1885 // We also clear floats if we are too big to sit on the same line as a float (and wish to avoid floats by default). |
| 1886 LayoutUnit result = clearSet ? std::max<LayoutUnit>(0, logicalBottom - logic alTop) : LayoutUnit(); | 1886 LayoutUnit result = clearSet ? std::max<LayoutUnit>(0, logicalBottom - logic alTop) : LayoutUnit(); |
| 1887 if (!result && child->avoidsFloats()) { | 1887 if (!result && child->avoidsFloats()) { |
| 1888 LayoutUnit newLogicalTop = logicalTop; | 1888 LayoutUnit newLogicalTop = logicalTop; |
| 1889 while (true) { | 1889 while (true) { |
| 1890 LayoutUnit availableLogicalWidthAtNewLogicalTopOffset = availableLog icalWidthForLine(newLogicalTop, false, logicalHeightForChild(child)); | 1890 LayoutUnit availableLogicalWidthAtNewLogicalTopOffset = availableLog icalWidthForLine(newLogicalTop, false, logicalHeightForChild(*child)); |
| 1891 if (availableLogicalWidthAtNewLogicalTopOffset == availableLogicalWi dthForContent()) | 1891 if (availableLogicalWidthAtNewLogicalTopOffset == availableLogicalWi dthForContent()) |
| 1892 return newLogicalTop - logicalTop; | 1892 return newLogicalTop - logicalTop; |
| 1893 | 1893 |
| 1894 LayoutRect borderBox = child->borderBoxRect(); | 1894 LayoutRect borderBox = child->borderBoxRect(); |
| 1895 LayoutUnit childLogicalWidthAtOldLogicalTopOffset = isHorizontalWrit ingMode() ? borderBox.width() : borderBox.height(); | 1895 LayoutUnit childLogicalWidthAtOldLogicalTopOffset = isHorizontalWrit ingMode() ? borderBox.width() : borderBox.height(); |
| 1896 | 1896 |
| 1897 borderBox = child->borderBoxAfterUpdatingLogicalWidth(newLogicalTop) ; | 1897 borderBox = child->borderBoxAfterUpdatingLogicalWidth(newLogicalTop) ; |
| 1898 LayoutUnit childLogicalWidthAtNewLogicalTopOffset = isHorizontalWrit ingMode() ? borderBox.width() : borderBox.height(); | 1898 LayoutUnit childLogicalWidthAtNewLogicalTopOffset = isHorizontalWrit ingMode() ? borderBox.width() : borderBox.height(); |
| 1899 | 1899 |
| 1900 if (childLogicalWidthAtNewLogicalTopOffset <= availableLogicalWidthA tNewLogicalTopOffset) { | 1900 if (childLogicalWidthAtNewLogicalTopOffset <= availableLogicalWidthA tNewLogicalTopOffset) { |
| (...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2296 floatBox->setChildNeedsLayout(MarkOnlyThis); | 2296 floatBox->setChildNeedsLayout(MarkOnlyThis); |
| 2297 | 2297 |
| 2298 bool needsBlockDirectionLocationSetBeforeLayout = isChildRenderBlock && view ()->layoutState()->needsBlockDirectionLocationSetBeforeLayout(); | 2298 bool needsBlockDirectionLocationSetBeforeLayout = isChildRenderBlock && view ()->layoutState()->needsBlockDirectionLocationSetBeforeLayout(); |
| 2299 if (!needsBlockDirectionLocationSetBeforeLayout || isWritingModeRoot()) { // We are unsplittable if we're a block flow root. | 2299 if (!needsBlockDirectionLocationSetBeforeLayout || isWritingModeRoot()) { // We are unsplittable if we're a block flow root. |
| 2300 floatBox->layoutIfNeeded(); | 2300 floatBox->layoutIfNeeded(); |
| 2301 } else { | 2301 } else { |
| 2302 floatBox->updateLogicalWidth(); | 2302 floatBox->updateLogicalWidth(); |
| 2303 floatBox->computeAndSetBlockDirectionMargins(this); | 2303 floatBox->computeAndSetBlockDirectionMargins(this); |
| 2304 } | 2304 } |
| 2305 | 2305 |
| 2306 setLogicalWidthForFloat(newObj.get(), logicalWidthForChild(floatBox) + margi nStartForChild(floatBox) + marginEndForChild(floatBox)); | 2306 setLogicalWidthForFloat(newObj.get(), logicalWidthForChild(*floatBox) + marg inStartForChild(*floatBox) + marginEndForChild(*floatBox)); |
| 2307 | 2307 |
| 2308 return m_floatingObjects->add(newObj.release()); | 2308 return m_floatingObjects->add(newObj.release()); |
| 2309 } | 2309 } |
| 2310 | 2310 |
| 2311 void RenderBlockFlow::removeFloatingObject(RenderBox* floatBox) | 2311 void RenderBlockFlow::removeFloatingObject(RenderBox* floatBox) |
| 2312 { | 2312 { |
| 2313 if (m_floatingObjects) { | 2313 if (m_floatingObjects) { |
| 2314 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); | 2314 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); |
| 2315 FloatingObjectSetIterator it = floatingObjectSet.find<FloatingObjectHash Translator>(floatBox); | 2315 FloatingObjectSetIterator it = floatingObjectSet.find<FloatingObjectHash Translator>(floatBox); |
| 2316 if (it != floatingObjectSet.end()) { | 2316 if (it != floatingObjectSet.end()) { |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2401 // The containing block is responsible for positioning floats, so if we have floats in our | 2401 // The containing block is responsible for positioning floats, so if we have floats in our |
| 2402 // list that come from somewhere else, do not attempt to position them. | 2402 // list that come from somewhere else, do not attempt to position them. |
| 2403 if (floatingObject->renderer()->containingBlock() != this) | 2403 if (floatingObject->renderer()->containingBlock() != this) |
| 2404 continue; | 2404 continue; |
| 2405 | 2405 |
| 2406 RenderBox* childBox = floatingObject->renderer(); | 2406 RenderBox* childBox = floatingObject->renderer(); |
| 2407 | 2407 |
| 2408 // FIXME Investigate if this can be removed. crbug.com/370006 | 2408 // FIXME Investigate if this can be removed. crbug.com/370006 |
| 2409 childBox->setMayNeedPaintInvalidation(true); | 2409 childBox->setMayNeedPaintInvalidation(true); |
| 2410 | 2410 |
| 2411 LayoutUnit childLogicalLeftMargin = style()->isLeftToRightDirection() ? marginStartForChild(childBox) : marginEndForChild(childBox); | 2411 LayoutUnit childLogicalLeftMargin = style()->isLeftToRightDirection() ? marginStartForChild(*childBox) : marginEndForChild(*childBox); |
| 2412 if (childBox->style()->clear() & CLEFT) | 2412 if (childBox->style()->clear() & CLEFT) |
| 2413 logicalTop = std::max(lowestFloatLogicalBottom(FloatingObject::Float Left), logicalTop); | 2413 logicalTop = std::max(lowestFloatLogicalBottom(FloatingObject::Float Left), logicalTop); |
| 2414 if (childBox->style()->clear() & CRIGHT) | 2414 if (childBox->style()->clear() & CRIGHT) |
| 2415 logicalTop = std::max(lowestFloatLogicalBottom(FloatingObject::Float Right), logicalTop); | 2415 logicalTop = std::max(lowestFloatLogicalBottom(FloatingObject::Float Right), logicalTop); |
| 2416 | 2416 |
| 2417 LayoutPoint floatLogicalLocation = computeLogicalLocationForFloat(floati ngObject, logicalTop); | 2417 LayoutPoint floatLogicalLocation = computeLogicalLocationForFloat(floati ngObject, logicalTop); |
| 2418 | 2418 |
| 2419 setLogicalLeftForFloat(floatingObject, floatLogicalLocation.x()); | 2419 setLogicalLeftForFloat(floatingObject, floatLogicalLocation.x()); |
| 2420 | 2420 |
| 2421 setLogicalLeftForChild(childBox, floatLogicalLocation.x() + childLogical LeftMargin); | 2421 setLogicalLeftForChild(childBox, floatLogicalLocation.x() + childLogical LeftMargin); |
| 2422 setLogicalTopForChild(childBox, floatLogicalLocation.y() + marginBeforeF orChild(childBox)); | 2422 setLogicalTopForChild(childBox, floatLogicalLocation.y() + marginBeforeF orChild(*childBox)); |
| 2423 | 2423 |
| 2424 SubtreeLayoutScope layoutScope(*childBox); | 2424 SubtreeLayoutScope layoutScope(*childBox); |
| 2425 LayoutState* layoutState = view()->layoutState(); | 2425 LayoutState* layoutState = view()->layoutState(); |
| 2426 bool isPaginated = layoutState->isPaginated(); | 2426 bool isPaginated = layoutState->isPaginated(); |
| 2427 if (isPaginated && !childBox->needsLayout()) | 2427 if (isPaginated && !childBox->needsLayout()) |
| 2428 childBox->markForPaginationRelayoutIfNeeded(layoutScope); | 2428 childBox->markForPaginationRelayoutIfNeeded(layoutScope); |
| 2429 | 2429 |
| 2430 childBox->layoutIfNeeded(); | 2430 childBox->layoutIfNeeded(); |
| 2431 | 2431 |
| 2432 if (isPaginated) { | 2432 if (isPaginated) { |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 2443 childBlockFlow->setPaginationStrut(0); | 2443 childBlockFlow->setPaginationStrut(0); |
| 2444 } | 2444 } |
| 2445 | 2445 |
| 2446 if (newLogicalTop != floatLogicalLocation.y()) { | 2446 if (newLogicalTop != floatLogicalLocation.y()) { |
| 2447 floatingObject->setPaginationStrut(newLogicalTop - floatLogicalL ocation.y()); | 2447 floatingObject->setPaginationStrut(newLogicalTop - floatLogicalL ocation.y()); |
| 2448 | 2448 |
| 2449 floatLogicalLocation = computeLogicalLocationForFloat(floatingOb ject, newLogicalTop); | 2449 floatLogicalLocation = computeLogicalLocationForFloat(floatingOb ject, newLogicalTop); |
| 2450 setLogicalLeftForFloat(floatingObject, floatLogicalLocation.x()) ; | 2450 setLogicalLeftForFloat(floatingObject, floatLogicalLocation.x()) ; |
| 2451 | 2451 |
| 2452 setLogicalLeftForChild(childBox, floatLogicalLocation.x() + chil dLogicalLeftMargin); | 2452 setLogicalLeftForChild(childBox, floatLogicalLocation.x() + chil dLogicalLeftMargin); |
| 2453 setLogicalTopForChild(childBox, floatLogicalLocation.y() + margi nBeforeForChild(childBox)); | 2453 setLogicalTopForChild(childBox, floatLogicalLocation.y() + margi nBeforeForChild(*childBox)); |
| 2454 | 2454 |
| 2455 if (childBox->isRenderBlock()) | 2455 if (childBox->isRenderBlock()) |
| 2456 childBox->setChildNeedsLayout(MarkOnlyThis); | 2456 childBox->setChildNeedsLayout(MarkOnlyThis); |
| 2457 childBox->layoutIfNeeded(); | 2457 childBox->layoutIfNeeded(); |
| 2458 } | 2458 } |
| 2459 } | 2459 } |
| 2460 | 2460 |
| 2461 setLogicalTopForFloat(floatingObject, floatLogicalLocation.y()); | 2461 setLogicalTopForFloat(floatingObject, floatLogicalLocation.y()); |
| 2462 | 2462 |
| 2463 setLogicalHeightForFloat(floatingObject, logicalHeightForChild(childBox) + marginBeforeForChild(childBox) + marginAfterForChild(childBox)); | 2463 setLogicalHeightForFloat(floatingObject, logicalHeightForChild(*childBox ) + marginBeforeForChild(*childBox) + marginAfterForChild(*childBox)); |
| 2464 | 2464 |
| 2465 m_floatingObjects->addPlacedObject(floatingObject); | 2465 m_floatingObjects->addPlacedObject(floatingObject); |
| 2466 | 2466 |
| 2467 if (ShapeOutsideInfo* shapeOutside = childBox->shapeOutsideInfo()) | 2467 if (ShapeOutsideInfo* shapeOutside = childBox->shapeOutsideInfo()) |
| 2468 shapeOutside->setReferenceBoxLogicalSize(logicalSizeForChild(childBo x)); | 2468 shapeOutside->setReferenceBoxLogicalSize(logicalSizeForChild(*childB ox)); |
| 2469 } | 2469 } |
| 2470 return true; | 2470 return true; |
| 2471 } | 2471 } |
| 2472 | 2472 |
| 2473 bool RenderBlockFlow::hasOverhangingFloat(RenderBox* renderer) | 2473 bool RenderBlockFlow::hasOverhangingFloat(RenderBox* renderer) |
| 2474 { | 2474 { |
| 2475 if (!m_floatingObjects || hasColumns() || !parent()) | 2475 if (!m_floatingObjects || hasColumns() || !parent()) |
| 2476 return false; | 2476 return false; |
| 2477 | 2477 |
| 2478 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); | 2478 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2592 return logicalHeight; | 2592 return logicalHeight; |
| 2593 | 2593 |
| 2594 LayoutUnit logicalBottom; | 2594 LayoutUnit logicalBottom; |
| 2595 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); | 2595 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); |
| 2596 FloatingObjectSetIterator end = floatingObjectSet.end(); | 2596 FloatingObjectSetIterator end = floatingObjectSet.end(); |
| 2597 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++ it) { | 2597 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++ it) { |
| 2598 FloatingObject* floatingObject = it->get(); | 2598 FloatingObject* floatingObject = it->get(); |
| 2599 LayoutUnit floatLogicalBottom = logicalBottomForFloat(floatingObject); | 2599 LayoutUnit floatLogicalBottom = logicalBottomForFloat(floatingObject); |
| 2600 ShapeOutsideInfo* shapeOutside = floatingObject->renderer()->shapeOutsid eInfo(); | 2600 ShapeOutsideInfo* shapeOutside = floatingObject->renderer()->shapeOutsid eInfo(); |
| 2601 if (shapeOutside && (offsetMode == ShapeOutsideFloatShapeOffset)) { | 2601 if (shapeOutside && (offsetMode == ShapeOutsideFloatShapeOffset)) { |
| 2602 LayoutUnit shapeLogicalBottom = logicalTopForFloat(floatingObject) + marginBeforeForChild(floatingObject->renderer()) + shapeOutside->shapeLogicalBo ttom(); | 2602 LayoutUnit shapeLogicalBottom = logicalTopForFloat(floatingObject) + marginBeforeForChild(*(floatingObject->renderer())) + shapeOutside->shapeLogica lBottom(); |
| 2603 // Use the shapeLogicalBottom unless it extends outside of the margi n box, in which case it is clipped. | 2603 // Use the shapeLogicalBottom unless it extends outside of the margi n box, in which case it is clipped. |
| 2604 if (shapeLogicalBottom < floatLogicalBottom) | 2604 if (shapeLogicalBottom < floatLogicalBottom) |
| 2605 floatLogicalBottom = shapeLogicalBottom; | 2605 floatLogicalBottom = shapeLogicalBottom; |
| 2606 } | 2606 } |
| 2607 if (floatLogicalBottom > logicalHeight) | 2607 if (floatLogicalBottom > logicalHeight) |
| 2608 logicalBottom = logicalBottom ? std::min(floatLogicalBottom, logical Bottom) : floatLogicalBottom; | 2608 logicalBottom = logicalBottom ? std::min(floatLogicalBottom, logical Bottom) : floatLogicalBottom; |
| 2609 } | 2609 } |
| 2610 | 2610 |
| 2611 return logicalBottom; | 2611 return logicalBottom; |
| 2612 } | 2612 } |
| (...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3091 FrameView* frameView = document().view(); | 3091 FrameView* frameView = document().view(); |
| 3092 LayoutUnit top = (style()->position() == FixedPosition) ? 0 : frameView->scr ollOffset().height(); | 3092 LayoutUnit top = (style()->position() == FixedPosition) ? 0 : frameView->scr ollOffset().height(); |
| 3093 int visibleHeight = frameView->visibleContentRect(IncludeScrollbars).height( ); | 3093 int visibleHeight = frameView->visibleContentRect(IncludeScrollbars).height( ); |
| 3094 if (height() < visibleHeight) | 3094 if (height() < visibleHeight) |
| 3095 top += (visibleHeight - height()) / 2; | 3095 top += (visibleHeight - height()) / 2; |
| 3096 setY(top); | 3096 setY(top); |
| 3097 dialog->setCentered(top); | 3097 dialog->setCentered(top); |
| 3098 } | 3098 } |
| 3099 | 3099 |
| 3100 } // namespace blink | 3100 } // namespace blink |
| OLD | NEW |