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 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
363 for (LayoutBlock* cb = containingBlock(); !cb->isLayoutView(); | 363 for (LayoutBlock* cb = containingBlock(); !cb->isLayoutView(); |
364 cb = cb->containingBlock()) { | 364 cb = cb->containingBlock()) { |
365 if (cb->style()->logicalHeight().isFixed() || cb->isTableCell()) | 365 if (cb->style()->logicalHeight().isFixed() || cb->isTableCell()) |
366 hasAutoHeight = false; | 366 hasAutoHeight = false; |
367 } | 367 } |
368 } | 368 } |
369 | 369 |
370 // If the height is 0 or auto, then whether or not we are a self-collapsing | 370 // If the height is 0 or auto, then whether or not we are a self-collapsing |
371 // block depends on whether we have content that is all self-collapsing. | 371 // block depends on whether we have content that is all self-collapsing. |
372 // TODO(alancutter): Make this work correctly for calc lengths. | 372 // TODO(alancutter): Make this work correctly for calc lengths. |
373 if (hasAutoHeight || ((logicalHeightLength.isFixed() || | 373 if (hasAutoHeight || |
374 logicalHeightLength.isPercentOrCalc()) && | 374 ((logicalHeightLength.isFixed() || |
375 logicalHeightLength.isZero())) { | 375 logicalHeightLength.isPercentOrCalc()) && |
| 376 logicalHeightLength.isZero())) { |
376 // If the block has inline children, see if we generated any line boxes. | 377 // If the block has inline children, see if we generated any line boxes. |
377 // If we have any line boxes, then we can't be self-collapsing, since we | 378 // If we have any line boxes, then we can't be self-collapsing, since we |
378 // have content. | 379 // have content. |
379 if (childrenInline()) | 380 if (childrenInline()) |
380 return !firstLineBox(); | 381 return !firstLineBox(); |
381 | 382 |
382 // Whether or not we collapse is dependent on whether all our normal flow | 383 // Whether or not we collapse is dependent on whether all our normal flow |
383 // children are also self-collapsing. | 384 // children are also self-collapsing. |
384 for (LayoutBox* child = firstChildBox(); child; | 385 for (LayoutBox* child = firstChildBox(); child; |
385 child = child->nextSiblingBox()) { | 386 child = child->nextSiblingBox()) { |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
634 // If the child is being centred then the margin calculated to do that has | 635 // If the child is being centred then the margin calculated to do that has |
635 // factored in any offset required to avoid floats, so use it if necessary. | 636 // factored in any offset required to avoid floats, so use it if necessary. |
636 if (style()->textAlign() == ETextAlign::kWebkitCenter || | 637 if (style()->textAlign() == ETextAlign::kWebkitCenter || |
637 child.style()->marginStartUsing(style()).isAuto()) | 638 child.style()->marginStartUsing(style()).isAuto()) |
638 newPosition = | 639 newPosition = |
639 std::max(newPosition, positionToAvoidFloats + childMarginStart); | 640 std::max(newPosition, positionToAvoidFloats + childMarginStart); |
640 else if (positionToAvoidFloats > initialStartPosition) | 641 else if (positionToAvoidFloats > initialStartPosition) |
641 newPosition = std::max(newPosition, positionToAvoidFloats); | 642 newPosition = std::max(newPosition, positionToAvoidFloats); |
642 } | 643 } |
643 | 644 |
644 setLogicalLeftForChild(child, style()->isLeftToRightDirection() | 645 setLogicalLeftForChild(child, |
645 ? newPosition | 646 style()->isLeftToRightDirection() |
646 : totalAvailableLogicalWidth - newPosition - | 647 ? newPosition |
647 logicalWidthForChild(child)); | 648 : totalAvailableLogicalWidth - newPosition - |
| 649 logicalWidthForChild(child)); |
648 } | 650 } |
649 | 651 |
650 void LayoutBlockFlow::setLogicalLeftForChild(LayoutBox& child, | 652 void LayoutBlockFlow::setLogicalLeftForChild(LayoutBox& child, |
651 LayoutUnit logicalLeft) { | 653 LayoutUnit logicalLeft) { |
652 if (isHorizontalWritingMode()) { | 654 if (isHorizontalWritingMode()) { |
653 child.setX(logicalLeft); | 655 child.setX(logicalLeft); |
654 } else { | 656 } else { |
655 child.setY(logicalLeft); | 657 child.setY(logicalLeft); |
656 } | 658 } |
657 } | 659 } |
(...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1296 if (!parent() || !parent()->isLayoutBlockFlow()) | 1298 if (!parent() || !parent()->isLayoutBlockFlow()) |
1297 return; | 1299 return; |
1298 | 1300 |
1299 // Attempt to locate a previous sibling with overhanging floats. We skip any | 1301 // Attempt to locate a previous sibling with overhanging floats. We skip any |
1300 // elements that may have shifted to avoid floats, and any objects whose | 1302 // elements that may have shifted to avoid floats, and any objects whose |
1301 // floats cannot interact with objects outside it (i.e. objects that create a | 1303 // floats cannot interact with objects outside it (i.e. objects that create a |
1302 // new block formatting context). | 1304 // new block formatting context). |
1303 LayoutBlockFlow* parentBlockFlow = toLayoutBlockFlow(parent()); | 1305 LayoutBlockFlow* parentBlockFlow = toLayoutBlockFlow(parent()); |
1304 bool siblingFloatMayIntrude = false; | 1306 bool siblingFloatMayIntrude = false; |
1305 LayoutObject* prev = previousSibling(); | 1307 LayoutObject* prev = previousSibling(); |
1306 while (prev && (!prev->isBox() || !prev->isLayoutBlock() || | 1308 while (prev && |
1307 toLayoutBlock(prev)->avoidsFloats() || | 1309 (!prev->isBox() || !prev->isLayoutBlock() || |
1308 toLayoutBlock(prev)->createsNewFormattingContext())) { | 1310 toLayoutBlock(prev)->avoidsFloats() || |
| 1311 toLayoutBlock(prev)->createsNewFormattingContext())) { |
1309 if (prev->isFloating()) | 1312 if (prev->isFloating()) |
1310 siblingFloatMayIntrude = true; | 1313 siblingFloatMayIntrude = true; |
1311 prev = prev->previousSibling(); | 1314 prev = prev->previousSibling(); |
1312 } | 1315 } |
1313 | 1316 |
1314 // First add in floats from the parent. Self-collapsing blocks let their | 1317 // First add in floats from the parent. Self-collapsing blocks let their |
1315 // parent track any floats that intrude into them (as opposed to floats they | 1318 // parent track any floats that intrude into them (as opposed to floats they |
1316 // contain themselves) so check for those here too. If margin collapsing has | 1319 // contain themselves) so check for those here too. If margin collapsing has |
1317 // moved us up past the top a previous sibling then we need to check for | 1320 // moved us up past the top a previous sibling then we need to check for |
1318 // floats from the parent too. | 1321 // floats from the parent too. |
(...skipping 1350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2669 void LayoutBlockFlow::markSiblingsWithFloatsForLayout( | 2672 void LayoutBlockFlow::markSiblingsWithFloatsForLayout( |
2670 LayoutBox* floatToRemove) { | 2673 LayoutBox* floatToRemove) { |
2671 if (!m_floatingObjects) | 2674 if (!m_floatingObjects) |
2672 return; | 2675 return; |
2673 | 2676 |
2674 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); | 2677 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); |
2675 FloatingObjectSetIterator end = floatingObjectSet.end(); | 2678 FloatingObjectSetIterator end = floatingObjectSet.end(); |
2676 | 2679 |
2677 for (LayoutObject* next = nextSibling(); next; next = next->nextSibling()) { | 2680 for (LayoutObject* next = nextSibling(); next; next = next->nextSibling()) { |
2678 if (!next->isLayoutBlockFlow() || | 2681 if (!next->isLayoutBlockFlow() || |
2679 (!floatToRemove && (next->isFloatingOrOutOfFlowPositioned() || | 2682 (!floatToRemove && |
2680 toLayoutBlockFlow(next)->avoidsFloats()))) | 2683 (next->isFloatingOrOutOfFlowPositioned() || |
| 2684 toLayoutBlockFlow(next)->avoidsFloats()))) |
2681 continue; | 2685 continue; |
2682 | 2686 |
2683 LayoutBlockFlow* nextBlock = toLayoutBlockFlow(next); | 2687 LayoutBlockFlow* nextBlock = toLayoutBlockFlow(next); |
2684 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; | 2688 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; |
2685 ++it) { | 2689 ++it) { |
2686 LayoutBox* floatingBox = (*it)->layoutObject(); | 2690 LayoutBox* floatingBox = (*it)->layoutObject(); |
2687 if (floatToRemove && floatingBox != floatToRemove) | 2691 if (floatToRemove && floatingBox != floatToRemove) |
2688 continue; | 2692 continue; |
2689 if (nextBlock->containsFloat(floatingBox)) | 2693 if (nextBlock->containsFloat(floatingBox)) |
2690 nextBlock->markAllDescendantsWithFloatsForLayout(floatingBox); | 2694 nextBlock->markAllDescendantsWithFloatsForLayout(floatingBox); |
(...skipping 1068 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3759 child.layoutIfNeeded(); | 3763 child.layoutIfNeeded(); |
3760 } | 3764 } |
3761 } | 3765 } |
3762 | 3766 |
3763 LayoutUnit childLogicalLeftMargin = | 3767 LayoutUnit childLogicalLeftMargin = |
3764 style()->isLeftToRightDirection() ? marginStart : marginEnd; | 3768 style()->isLeftToRightDirection() ? marginStart : marginEnd; |
3765 setLogicalLeftForChild(child, | 3769 setLogicalLeftForChild(child, |
3766 floatLogicalLocation.x() + childLogicalLeftMargin); | 3770 floatLogicalLocation.x() + childLogicalLeftMargin); |
3767 setLogicalLeftForFloat(floatingObject, floatLogicalLocation.x()); | 3771 setLogicalLeftForFloat(floatingObject, floatLogicalLocation.x()); |
3768 setLogicalTopForFloat(floatingObject, logicalTopMarginEdge); | 3772 setLogicalTopForFloat(floatingObject, logicalTopMarginEdge); |
3769 setLogicalHeightForFloat(floatingObject, logicalHeightForChild(child) + | 3773 setLogicalHeightForFloat( |
3770 marginBefore + marginAfter); | 3774 floatingObject, |
| 3775 logicalHeightForChild(child) + marginBefore + marginAfter); |
3771 | 3776 |
3772 if (ShapeOutsideInfo* shapeOutside = child.shapeOutsideInfo()) | 3777 if (ShapeOutsideInfo* shapeOutside = child.shapeOutsideInfo()) |
3773 shapeOutside->setReferenceBoxLogicalSize(logicalSizeForChild(child)); | 3778 shapeOutside->setReferenceBoxLogicalSize(logicalSizeForChild(child)); |
3774 | 3779 |
3775 return logicalTopMarginEdge; | 3780 return logicalTopMarginEdge; |
3776 } | 3781 } |
3777 | 3782 |
3778 bool LayoutBlockFlow::hasOverhangingFloat(LayoutBox* layoutBox) { | 3783 bool LayoutBlockFlow::hasOverhangingFloat(LayoutBox* layoutBox) { |
3779 if (!m_floatingObjects || !parent()) | 3784 if (!m_floatingObjects || !parent()) |
3780 return false; | 3785 return false; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3818 createFloatingObjects(); | 3823 createFloatingObjects(); |
3819 | 3824 |
3820 // Applying the child's margin makes no sense in the case where the | 3825 // Applying the child's margin makes no sense in the case where the |
3821 // child was passed in since this margin was added already through the | 3826 // child was passed in since this margin was added already through the |
3822 // modification of the |logicalLeftOffset| variable above. | 3827 // modification of the |logicalLeftOffset| variable above. |
3823 // |logicalLeftOffset| will equal the margin in this case, so it's | 3828 // |logicalLeftOffset| will equal the margin in this case, so it's |
3824 // already been taken into account. Only apply this code if prev is the | 3829 // already been taken into account. Only apply this code if prev is the |
3825 // parent, since otherwise the left margin will get applied twice. | 3830 // parent, since otherwise the left margin will get applied twice. |
3826 LayoutSize offset = | 3831 LayoutSize offset = |
3827 isHorizontalWritingMode() | 3832 isHorizontalWritingMode() |
3828 ? LayoutSize( | 3833 ? LayoutSize(logicalLeftOffset - |
3829 logicalLeftOffset - (prev != parent() ? prev->marginLeft() | 3834 (prev != parent() ? prev->marginLeft() |
3830 : LayoutUnit()), | 3835 : LayoutUnit()), |
3831 logicalTopOffset) | 3836 logicalTopOffset) |
3832 : LayoutSize( | 3837 : LayoutSize(logicalTopOffset, |
3833 logicalTopOffset, | 3838 logicalLeftOffset - |
3834 logicalLeftOffset - (prev != parent() ? prev->marginTop() | 3839 (prev != parent() ? prev->marginTop() |
3835 : LayoutUnit())); | 3840 : LayoutUnit())); |
3836 | 3841 |
3837 m_floatingObjects->add(floatingObject.copyToNewContainer(offset)); | 3842 m_floatingObjects->add(floatingObject.copyToNewContainer(offset)); |
3838 } | 3843 } |
3839 } | 3844 } |
3840 } | 3845 } |
3841 } | 3846 } |
3842 | 3847 |
3843 void LayoutBlockFlow::addOverhangingFloats(LayoutBlockFlow* child, | 3848 void LayoutBlockFlow::addOverhangingFloats(LayoutBlockFlow* child, |
3844 bool makeChildPaintOtherFloats) { | 3849 bool makeChildPaintOtherFloats) { |
3845 // Prevent floats from being added to the canvas by the root element, e.g., | 3850 // Prevent floats from being added to the canvas by the root element, e.g., |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3967 | 3972 |
3968 if (hitTestAction == HitTestFloat && | 3973 if (hitTestAction == HitTestFloat && |
3969 hitTestFloats(result, locationInContainer, scrolledOffset)) | 3974 hitTestFloats(result, locationInContainer, scrolledOffset)) |
3970 return true; | 3975 return true; |
3971 | 3976 |
3972 if (childrenInline()) { | 3977 if (childrenInline()) { |
3973 if (m_lineBoxes.hitTest(LineLayoutBoxModel(this), result, | 3978 if (m_lineBoxes.hitTest(LineLayoutBoxModel(this), result, |
3974 locationInContainer, scrolledOffset, | 3979 locationInContainer, scrolledOffset, |
3975 hitTestAction)) { | 3980 hitTestAction)) { |
3976 updateHitTestResult( | 3981 updateHitTestResult( |
3977 result, flipForWritingMode(toLayoutPoint(locationInContainer.point() - | 3982 result, |
3978 accumulatedOffset))); | 3983 flipForWritingMode( |
| 3984 toLayoutPoint(locationInContainer.point() - accumulatedOffset))); |
3979 return true; | 3985 return true; |
3980 } | 3986 } |
3981 } else if (LayoutBlock::hitTestChildren(result, locationInContainer, | 3987 } else if (LayoutBlock::hitTestChildren(result, locationInContainer, |
3982 accumulatedOffset, hitTestAction)) { | 3988 accumulatedOffset, hitTestAction)) { |
3983 return true; | 3989 return true; |
3984 } | 3990 } |
3985 | 3991 |
3986 return false; | 3992 return false; |
3987 } | 3993 } |
3988 | 3994 |
(...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4584 std::min<LayoutUnit>(curr->lineBottom(), curr->y() + curr->height()); | 4590 std::min<LayoutUnit>(curr->lineBottom(), curr->y() + curr->height()); |
4585 LayoutRect rect(additionalOffset.x() + curr->x(), | 4591 LayoutRect rect(additionalOffset.x() + curr->x(), |
4586 additionalOffset.y() + top, curr->width(), bottom - top); | 4592 additionalOffset.y() + top, curr->width(), bottom - top); |
4587 if (!rect.isEmpty()) | 4593 if (!rect.isEmpty()) |
4588 rects.push_back(rect); | 4594 rects.push_back(rect); |
4589 } | 4595 } |
4590 } | 4596 } |
4591 | 4597 |
4592 if (inlineElementContinuation) | 4598 if (inlineElementContinuation) |
4593 inlineElementContinuation->addOutlineRects( | 4599 inlineElementContinuation->addOutlineRects( |
4594 rects, additionalOffset + | 4600 rects, |
4595 (inlineElementContinuation->containingBlock()->location() - | 4601 additionalOffset + |
4596 location()), | 4602 (inlineElementContinuation->containingBlock()->location() - |
| 4603 location()), |
4597 includeBlockOverflows); | 4604 includeBlockOverflows); |
4598 } | 4605 } |
4599 | 4606 |
4600 PaintInvalidationReason LayoutBlockFlow::invalidatePaintIfNeeded( | 4607 PaintInvalidationReason LayoutBlockFlow::invalidatePaintIfNeeded( |
4601 const PaintInvalidationState& paintInvalidationState) { | 4608 const PaintInvalidationState& paintInvalidationState) { |
4602 if (containsFloats()) | 4609 if (containsFloats()) |
4603 paintInvalidationState.paintingLayer().setNeedsPaintPhaseFloat(); | 4610 paintInvalidationState.paintingLayer().setNeedsPaintPhaseFloat(); |
4604 | 4611 |
4605 return LayoutBlock::invalidatePaintIfNeeded(paintInvalidationState); | 4612 return LayoutBlock::invalidatePaintIfNeeded(paintInvalidationState); |
4606 } | 4613 } |
4607 | 4614 |
4608 void LayoutBlockFlow::invalidateDisplayItemClients( | 4615 void LayoutBlockFlow::invalidateDisplayItemClients( |
4609 PaintInvalidationReason invalidationReason) const { | 4616 PaintInvalidationReason invalidationReason) const { |
4610 BlockFlowPaintInvalidator(*this).invalidateDisplayItemClients( | 4617 BlockFlowPaintInvalidator(*this).invalidateDisplayItemClients( |
4611 invalidationReason); | 4618 invalidationReason); |
4612 } | 4619 } |
4613 | 4620 |
4614 } // namespace blink | 4621 } // namespace blink |
OLD | NEW |