| 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 2631 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2642 } | 2642 } |
| 2643 | 2643 |
| 2644 LayoutUnit LayoutBlockFlow::getClearDelta(LayoutBox* child, | 2644 LayoutUnit LayoutBlockFlow::getClearDelta(LayoutBox* child, |
| 2645 LayoutUnit logicalTop) { | 2645 LayoutUnit logicalTop) { |
| 2646 // There is no need to compute clearance if we have no floats. | 2646 // There is no need to compute clearance if we have no floats. |
| 2647 if (!containsFloats()) | 2647 if (!containsFloats()) |
| 2648 return LayoutUnit(); | 2648 return LayoutUnit(); |
| 2649 | 2649 |
| 2650 // At least one float is present. We need to perform the clearance | 2650 // At least one float is present. We need to perform the clearance |
| 2651 // computation. | 2651 // computation. |
| 2652 bool clearSet = child->style()->clear() != ClearNone; | 2652 EClear clear = child->style()->clear(); |
| 2653 LayoutUnit logicalBottom; | 2653 LayoutUnit logicalBottom = lowestFloatLogicalBottom(clear); |
| 2654 switch (child->style()->clear()) { | |
| 2655 case ClearNone: | |
| 2656 break; | |
| 2657 case ClearLeft: | |
| 2658 logicalBottom = lowestFloatLogicalBottom(FloatingObject::FloatLeft); | |
| 2659 break; | |
| 2660 case ClearRight: | |
| 2661 logicalBottom = lowestFloatLogicalBottom(FloatingObject::FloatRight); | |
| 2662 break; | |
| 2663 case ClearBoth: | |
| 2664 logicalBottom = lowestFloatLogicalBottom(); | |
| 2665 break; | |
| 2666 } | |
| 2667 | 2654 |
| 2668 // We also clear floats if we are too big to sit on the same line as a float | 2655 // We also clear floats if we are too big to sit on the same line as a float |
| 2669 // (and wish to avoid floats by default). | 2656 // (and wish to avoid floats by default). |
| 2670 LayoutUnit result = clearSet | 2657 LayoutUnit result = clear != ClearNone |
| 2671 ? (logicalBottom - logicalTop).clampNegativeToZero() | 2658 ? (logicalBottom - logicalTop).clampNegativeToZero() |
| 2672 : LayoutUnit(); | 2659 : LayoutUnit(); |
| 2673 if (!result && child->avoidsFloats()) { | 2660 if (!result && child->avoidsFloats()) { |
| 2674 LayoutUnit newLogicalTop = logicalTop; | 2661 LayoutUnit newLogicalTop = logicalTop; |
| 2675 LayoutRect borderBox = child->borderBoxRect(); | 2662 LayoutRect borderBox = child->borderBoxRect(); |
| 2676 LayoutUnit childLogicalWidthAtOldLogicalTopOffset = | 2663 LayoutUnit childLogicalWidthAtOldLogicalTopOffset = |
| 2677 isHorizontalWritingMode() ? borderBox.width() : borderBox.height(); | 2664 isHorizontalWritingMode() ? borderBox.width() : borderBox.height(); |
| 2678 while (true) { | 2665 while (true) { |
| 2679 LayoutUnit availableLogicalWidthAtNewLogicalTopOffset = | 2666 LayoutUnit availableLogicalWidthAtNewLogicalTopOffset = |
| 2680 availableLogicalWidthForLine(newLogicalTop, DoNotIndentText, | 2667 availableLogicalWidthForLine(newLogicalTop, DoNotIndentText, |
| (...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3333 void LayoutBlockFlow::childBecameNonInline(LayoutObject*) { | 3320 void LayoutBlockFlow::childBecameNonInline(LayoutObject*) { |
| 3334 makeChildrenNonInline(); | 3321 makeChildrenNonInline(); |
| 3335 if (isAnonymousBlock() && parent() && parent()->isLayoutBlock()) | 3322 if (isAnonymousBlock() && parent() && parent()->isLayoutBlock()) |
| 3336 toLayoutBlock(parent())->removeLeftoverAnonymousBlock(this); | 3323 toLayoutBlock(parent())->removeLeftoverAnonymousBlock(this); |
| 3337 // |this| may be dead here | 3324 // |this| may be dead here |
| 3338 } | 3325 } |
| 3339 | 3326 |
| 3340 void LayoutBlockFlow::clearFloats(EClear clear) { | 3327 void LayoutBlockFlow::clearFloats(EClear clear) { |
| 3341 positionNewFloats(logicalHeight()); | 3328 positionNewFloats(logicalHeight()); |
| 3342 // set y position | 3329 // set y position |
| 3343 LayoutUnit newY; | 3330 LayoutUnit newY = lowestFloatLogicalBottom(clear); |
| 3344 switch (clear) { | |
| 3345 case ClearLeft: | |
| 3346 newY = lowestFloatLogicalBottom(FloatingObject::FloatLeft); | |
| 3347 break; | |
| 3348 case ClearRight: | |
| 3349 newY = lowestFloatLogicalBottom(FloatingObject::FloatRight); | |
| 3350 break; | |
| 3351 case ClearBoth: | |
| 3352 newY = lowestFloatLogicalBottom(); | |
| 3353 default: | |
| 3354 break; | |
| 3355 } | |
| 3356 if (size().height() < newY) | 3331 if (size().height() < newY) |
| 3357 setLogicalHeight(newY); | 3332 setLogicalHeight(newY); |
| 3358 } | 3333 } |
| 3359 | 3334 |
| 3360 bool LayoutBlockFlow::containsFloat(LayoutBox* layoutBox) const { | 3335 bool LayoutBlockFlow::containsFloat(LayoutBox* layoutBox) const { |
| 3361 return m_floatingObjects && | 3336 return m_floatingObjects && |
| 3362 m_floatingObjects->set().contains<FloatingObjectHashTranslator>( | 3337 m_floatingObjects->set().contains<FloatingObjectHashTranslator>( |
| 3363 layoutBox); | 3338 layoutBox); |
| 3364 } | 3339 } |
| 3365 | 3340 |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3646 FloatingObject& floatingObject, | 3621 FloatingObject& floatingObject, |
| 3647 LayoutUnit logicalTop) { | 3622 LayoutUnit logicalTop) { |
| 3648 LayoutBox& childBox = *floatingObject.layoutObject(); | 3623 LayoutBox& childBox = *floatingObject.layoutObject(); |
| 3649 | 3624 |
| 3650 // FIXME Investigate if this can be removed. crbug.com/370006 | 3625 // FIXME Investigate if this can be removed. crbug.com/370006 |
| 3651 childBox.setMayNeedPaintInvalidation(); | 3626 childBox.setMayNeedPaintInvalidation(); |
| 3652 | 3627 |
| 3653 LayoutUnit childLogicalLeftMargin = style()->isLeftToRightDirection() | 3628 LayoutUnit childLogicalLeftMargin = style()->isLeftToRightDirection() |
| 3654 ? marginStartForChild(childBox) | 3629 ? marginStartForChild(childBox) |
| 3655 : marginEndForChild(childBox); | 3630 : marginEndForChild(childBox); |
| 3656 if (childBox.style()->clear() & ClearLeft) { | 3631 logicalTop = |
| 3657 logicalTop = std::max(lowestFloatLogicalBottom(FloatingObject::FloatLeft), | 3632 std::max(logicalTop, lowestFloatLogicalBottom(childBox.style()->clear())); |
| 3658 logicalTop); | |
| 3659 } | |
| 3660 if (childBox.style()->clear() & ClearRight) { | |
| 3661 logicalTop = std::max(lowestFloatLogicalBottom(FloatingObject::FloatRight), | |
| 3662 logicalTop); | |
| 3663 } | |
| 3664 | 3633 |
| 3665 bool isPaginated = view()->layoutState()->isPaginated(); | 3634 bool isPaginated = view()->layoutState()->isPaginated(); |
| 3666 if (isPaginated && !childrenInline()) { | 3635 if (isPaginated && !childrenInline()) { |
| 3667 // Forced breaks are inserted at class A break points. Floats may be | 3636 // Forced breaks are inserted at class A break points. Floats may be |
| 3668 // affected by a break-after value on the previous in-flow sibling. | 3637 // affected by a break-after value on the previous in-flow sibling. |
| 3669 if (LayoutBox* previousInFlowBox = childBox.previousInFlowSiblingBox()) { | 3638 if (LayoutBox* previousInFlowBox = childBox.previousInFlowSiblingBox()) { |
| 3670 logicalTop = | 3639 logicalTop = |
| 3671 applyForcedBreak(logicalTop, previousInFlowBox->breakAfter()); | 3640 applyForcedBreak(logicalTop, previousInFlowBox->breakAfter()); |
| 3672 } | 3641 } |
| 3673 } | 3642 } |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3889 // need to go ahead and add its overflow in to the child now. | 3858 // need to go ahead and add its overflow in to the child now. |
| 3890 if (floatingObject.isDescendant()) | 3859 if (floatingObject.isDescendant()) |
| 3891 child->addOverflowFromChild( | 3860 child->addOverflowFromChild( |
| 3892 floatingObject.layoutObject(), | 3861 floatingObject.layoutObject(), |
| 3893 LayoutSize(xPositionForFloatIncludingMargin(floatingObject), | 3862 LayoutSize(xPositionForFloatIncludingMargin(floatingObject), |
| 3894 yPositionForFloatIncludingMargin(floatingObject))); | 3863 yPositionForFloatIncludingMargin(floatingObject))); |
| 3895 } | 3864 } |
| 3896 } | 3865 } |
| 3897 } | 3866 } |
| 3898 | 3867 |
| 3899 LayoutUnit LayoutBlockFlow::lowestFloatLogicalBottom( | 3868 LayoutUnit LayoutBlockFlow::lowestFloatLogicalBottom(EClear clear) const { |
| 3900 FloatingObject::Type floatType) const { | 3869 if (clear == ClearNone || !m_floatingObjects) |
| 3901 if (!m_floatingObjects) | |
| 3902 return LayoutUnit(); | 3870 return LayoutUnit(); |
| 3903 | 3871 |
| 3872 FloatingObject::Type floatType = |
| 3873 clear == ClearLeft ? FloatingObject::FloatLeft |
| 3874 : clear == ClearRight ? FloatingObject::FloatRight |
| 3875 : FloatingObject::FloatLeftRight; |
| 3904 return m_floatingObjects->lowestFloatLogicalBottom(floatType); | 3876 return m_floatingObjects->lowestFloatLogicalBottom(floatType); |
| 3905 } | 3877 } |
| 3906 | 3878 |
| 3907 LayoutUnit LayoutBlockFlow::nextFloatLogicalBottomBelow( | 3879 LayoutUnit LayoutBlockFlow::nextFloatLogicalBottomBelow( |
| 3908 LayoutUnit logicalHeight) const { | 3880 LayoutUnit logicalHeight) const { |
| 3909 if (!m_floatingObjects) | 3881 if (!m_floatingObjects) |
| 3910 return logicalHeight; | 3882 return logicalHeight; |
| 3911 return m_floatingObjects->findNextFloatLogicalBottomBelow(logicalHeight); | 3883 return m_floatingObjects->findNextFloatLogicalBottomBelow(logicalHeight); |
| 3912 } | 3884 } |
| 3913 | 3885 |
| (...skipping 656 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4570 return LayoutBlock::invalidatePaintIfNeeded(paintInvalidationState); | 4542 return LayoutBlock::invalidatePaintIfNeeded(paintInvalidationState); |
| 4571 } | 4543 } |
| 4572 | 4544 |
| 4573 void LayoutBlockFlow::invalidateDisplayItemClients( | 4545 void LayoutBlockFlow::invalidateDisplayItemClients( |
| 4574 PaintInvalidationReason invalidationReason) const { | 4546 PaintInvalidationReason invalidationReason) const { |
| 4575 BlockFlowPaintInvalidator(*this).invalidateDisplayItemClients( | 4547 BlockFlowPaintInvalidator(*this).invalidateDisplayItemClients( |
| 4576 invalidationReason); | 4548 invalidationReason); |
| 4577 } | 4549 } |
| 4578 | 4550 |
| 4579 } // namespace blink | 4551 } // namespace blink |
| OLD | NEW |