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 1760 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1771 cache->recomputeIsIgnored(this); | 1771 cache->recomputeIsIgnored(this); |
1772 } | 1772 } |
1773 | 1773 |
1774 return rootBox; | 1774 return rootBox; |
1775 } | 1775 } |
1776 | 1776 |
1777 void RenderBlockFlow::deleteLineBoxTree() | 1777 void RenderBlockFlow::deleteLineBoxTree() |
1778 { | 1778 { |
1779 if (containsFloats()) | 1779 if (containsFloats()) |
1780 m_floatingObjects->clearLineBoxTreePointers(); | 1780 m_floatingObjects->clearLineBoxTreePointers(); |
1781 RenderBlock::deleteLineBoxTree(); | 1781 |
| 1782 m_lineBoxes.deleteLineBoxTree(); |
| 1783 |
| 1784 if (AXObjectCache* cache = document().existingAXObjectCache()) |
| 1785 cache->recomputeIsIgnored(this); |
1782 } | 1786 } |
1783 | 1787 |
1784 void RenderBlockFlow::markAllDescendantsWithFloatsForLayout(RenderBox* floatToRe
move, bool inLayout) | 1788 void RenderBlockFlow::markAllDescendantsWithFloatsForLayout(RenderBox* floatToRe
move, bool inLayout) |
1785 { | 1789 { |
1786 if (!everHadLayout() && !containsFloats()) | 1790 if (!everHadLayout() && !containsFloats()) |
1787 return; | 1791 return; |
1788 | 1792 |
1789 if (m_descendantsWithFloatsMarkedForLayout && !floatToRemove) | 1793 if (m_descendantsWithFloatsMarkedForLayout && !floatToRemove) |
1790 return; | 1794 return; |
1791 m_descendantsWithFloatsMarkedForLayout |= !floatToRemove; | 1795 m_descendantsWithFloatsMarkedForLayout |= !floatToRemove; |
(...skipping 851 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2643 return true; | 2647 return true; |
2644 } | 2648 } |
2645 } | 2649 } |
2646 } | 2650 } |
2647 | 2651 |
2648 return false; | 2652 return false; |
2649 } | 2653 } |
2650 | 2654 |
2651 void RenderBlockFlow::adjustForBorderFit(LayoutUnit x, LayoutUnit& left, LayoutU
nit& right) const | 2655 void RenderBlockFlow::adjustForBorderFit(LayoutUnit x, LayoutUnit& left, LayoutU
nit& right) const |
2652 { | 2656 { |
2653 RenderBlock::adjustForBorderFit(x, left, right); | 2657 if (style()->visibility() != VISIBLE) |
2654 if (m_floatingObjects && style()->visibility() == VISIBLE) { | 2658 return; |
| 2659 |
| 2660 // We don't deal with relative positioning. Our assumption is that you shrin
k to fit the lines without accounting |
| 2661 // for either overflow or translations via relative positioning. |
| 2662 if (childrenInline()) { |
| 2663 for (RootInlineBox* box = firstRootBox(); box; box = box->nextRootBox())
{ |
| 2664 if (box->firstChild()) |
| 2665 left = std::min(left, x + static_cast<LayoutUnit>(box->firstChil
d()->x())); |
| 2666 if (box->lastChild()) |
| 2667 right = std::max(right, x + static_cast<LayoutUnit>(ceilf(box->l
astChild()->logicalRight()))); |
| 2668 } |
| 2669 } else { |
| 2670 for (RenderBox* obj = firstChildBox(); obj; obj = obj->nextSiblingBox())
{ |
| 2671 if (!obj->isFloatingOrOutOfFlowPositioned()) { |
| 2672 if (obj->isRenderBlockFlow() && !obj->hasOverflowClip()) { |
| 2673 toRenderBlockFlow(obj)->adjustForBorderFit(x + obj->x(), lef
t, right); |
| 2674 } else if (obj->style()->visibility() == VISIBLE) { |
| 2675 // We are a replaced element or some kind of non-block-flow
object. |
| 2676 left = std::min(left, x + obj->x()); |
| 2677 right = std::max(right, x + obj->x() + obj->width()); |
| 2678 } |
| 2679 } |
| 2680 } |
| 2681 } |
| 2682 |
| 2683 if (m_floatingObjects) { |
2655 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); | 2684 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); |
2656 FloatingObjectSetIterator end = floatingObjectSet.end(); | 2685 FloatingObjectSetIterator end = floatingObjectSet.end(); |
2657 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end
; ++it) { | 2686 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end
; ++it) { |
2658 FloatingObject* floatingObject = it->get(); | 2687 FloatingObject* floatingObject = it->get(); |
2659 // Only examine the object if our m_shouldPaint flag is set. | 2688 // Only examine the object if our m_shouldPaint flag is set. |
2660 if (floatingObject->shouldPaint()) { | 2689 if (floatingObject->shouldPaint()) { |
2661 LayoutUnit floatLeft = xPositionForFloatIncludingMargin(floating
Object) - floatingObject->renderer()->x(); | 2690 LayoutUnit floatLeft = xPositionForFloatIncludingMargin(floating
Object) - floatingObject->renderer()->x(); |
2662 LayoutUnit floatRight = floatLeft + floatingObject->renderer()->
width(); | 2691 LayoutUnit floatRight = floatLeft + floatingObject->renderer()->
width(); |
2663 left = std::min(left, floatLeft); | 2692 left = std::min(left, floatLeft); |
2664 right = std::max(right, floatRight); | 2693 right = std::max(right, floatRight); |
2665 } | 2694 } |
2666 } | 2695 } |
2667 } | 2696 } |
2668 } | 2697 } |
2669 | 2698 |
| 2699 void RenderBlockFlow::fitBorderToLinesIfNeeded() |
| 2700 { |
| 2701 if (style()->borderFit() == BorderFitBorder || hasOverrideWidth()) |
| 2702 return; |
| 2703 |
| 2704 // Walk any normal flow lines to snugly fit. |
| 2705 LayoutUnit left = LayoutUnit::max(); |
| 2706 LayoutUnit right = LayoutUnit::min(); |
| 2707 LayoutUnit oldWidth = contentWidth(); |
| 2708 adjustForBorderFit(0, left, right); |
| 2709 |
| 2710 // Clamp to our existing edges. We can never grow. We only shrink. |
| 2711 LayoutUnit leftEdge = borderLeft() + paddingLeft(); |
| 2712 LayoutUnit rightEdge = leftEdge + oldWidth; |
| 2713 left = std::min(rightEdge, std::max(leftEdge, left)); |
| 2714 right = std::max(left, std::min(rightEdge, right)); |
| 2715 |
| 2716 LayoutUnit newContentWidth = right - left; |
| 2717 if (newContentWidth == oldWidth) |
| 2718 return; |
| 2719 |
| 2720 setOverrideLogicalContentWidth(newContentWidth); |
| 2721 layoutBlock(false); |
| 2722 clearOverrideLogicalContentWidth(); |
| 2723 } |
| 2724 |
2670 LayoutUnit RenderBlockFlow::logicalLeftFloatOffsetForLine(LayoutUnit logicalTop,
LayoutUnit fixedOffset, LayoutUnit logicalHeight) const | 2725 LayoutUnit RenderBlockFlow::logicalLeftFloatOffsetForLine(LayoutUnit logicalTop,
LayoutUnit fixedOffset, LayoutUnit logicalHeight) const |
2671 { | 2726 { |
2672 if (m_floatingObjects && m_floatingObjects->hasLeftObjects()) | 2727 if (m_floatingObjects && m_floatingObjects->hasLeftObjects()) |
2673 return m_floatingObjects->logicalLeftOffset(fixedOffset, logicalTop, log
icalHeight); | 2728 return m_floatingObjects->logicalLeftOffset(fixedOffset, logicalTop, log
icalHeight); |
2674 | 2729 |
2675 return fixedOffset; | 2730 return fixedOffset; |
2676 } | 2731 } |
2677 | 2732 |
2678 LayoutUnit RenderBlockFlow::logicalRightFloatOffsetForLine(LayoutUnit logicalTop
, LayoutUnit fixedOffset, LayoutUnit logicalHeight) const | 2733 LayoutUnit RenderBlockFlow::logicalRightFloatOffsetForLine(LayoutUnit logicalTop
, LayoutUnit fixedOffset, LayoutUnit logicalHeight) const |
2679 { | 2734 { |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2846 RenderBlockFlow::RenderBlockFlowRareData& RenderBlockFlow::ensureRareData() | 2901 RenderBlockFlow::RenderBlockFlowRareData& RenderBlockFlow::ensureRareData() |
2847 { | 2902 { |
2848 if (m_rareData) | 2903 if (m_rareData) |
2849 return *m_rareData; | 2904 return *m_rareData; |
2850 | 2905 |
2851 m_rareData = adoptPtr(new RenderBlockFlowRareData(this)); | 2906 m_rareData = adoptPtr(new RenderBlockFlowRareData(this)); |
2852 return *m_rareData; | 2907 return *m_rareData; |
2853 } | 2908 } |
2854 | 2909 |
2855 } // namespace blink | 2910 } // namespace blink |
OLD | NEW |