| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 4 * (C) 2007 David Smith (catfish.man@gmail.com) | 4 * (C) 2007 David Smith (catfish.man@gmail.com) |
| 5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc.
All rights reserved. | 5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc.
All rights reserved. |
| 6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
| 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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 #include "core/rendering/HitTestLocation.h" | 42 #include "core/rendering/HitTestLocation.h" |
| 43 #include "core/rendering/HitTestResult.h" | 43 #include "core/rendering/HitTestResult.h" |
| 44 #include "core/rendering/InlineIterator.h" | 44 #include "core/rendering/InlineIterator.h" |
| 45 #include "core/rendering/InlineTextBox.h" | 45 #include "core/rendering/InlineTextBox.h" |
| 46 #include "core/rendering/LayoutRectRecorder.h" | 46 #include "core/rendering/LayoutRectRecorder.h" |
| 47 #include "core/rendering/LayoutRepainter.h" | 47 #include "core/rendering/LayoutRepainter.h" |
| 48 #include "core/rendering/PaintInfo.h" | 48 #include "core/rendering/PaintInfo.h" |
| 49 #include "core/rendering/RenderCombineText.h" | 49 #include "core/rendering/RenderCombineText.h" |
| 50 #include "core/rendering/RenderDeprecatedFlexibleBox.h" | 50 #include "core/rendering/RenderDeprecatedFlexibleBox.h" |
| 51 #include "core/rendering/RenderFlexibleBox.h" | 51 #include "core/rendering/RenderFlexibleBox.h" |
| 52 #include "core/rendering/RenderFlowThread.h" |
| 52 #include "core/rendering/RenderInline.h" | 53 #include "core/rendering/RenderInline.h" |
| 53 #include "core/rendering/RenderLayer.h" | 54 #include "core/rendering/RenderLayer.h" |
| 54 #include "core/rendering/RenderMarquee.h" | 55 #include "core/rendering/RenderMarquee.h" |
| 55 #include "core/rendering/RenderNamedFlowThread.h" | |
| 56 #include "core/rendering/RenderRegion.h" | 56 #include "core/rendering/RenderRegion.h" |
| 57 #include "core/rendering/RenderTableCell.h" | 57 #include "core/rendering/RenderTableCell.h" |
| 58 #include "core/rendering/RenderTextControl.h" | 58 #include "core/rendering/RenderTextControl.h" |
| 59 #include "core/rendering/RenderTextFragment.h" | 59 #include "core/rendering/RenderTextFragment.h" |
| 60 #include "core/rendering/RenderTheme.h" | 60 #include "core/rendering/RenderTheme.h" |
| 61 #include "core/rendering/RenderView.h" | 61 #include "core/rendering/RenderView.h" |
| 62 #include "core/rendering/shapes/ShapeOutsideInfo.h" | 62 #include "core/rendering/shapes/ShapeOutsideInfo.h" |
| 63 #include "core/rendering/style/ContentData.h" | 63 #include "core/rendering/style/ContentData.h" |
| 64 #include "core/rendering/style/RenderStyle.h" | 64 #include "core/rendering/style/RenderStyle.h" |
| 65 #include "platform/geometry/FloatQuad.h" | 65 #include "platform/geometry/FloatQuad.h" |
| (...skipping 985 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1051 RenderObject* nextSibling = child->nextSibling(); | 1051 RenderObject* nextSibling = child->nextSibling(); |
| 1052 | 1052 |
| 1053 RenderFlowThread* childFlowThread = child->flowThreadContainingBlock(); | 1053 RenderFlowThread* childFlowThread = child->flowThreadContainingBlock(); |
| 1054 CurrentRenderFlowThreadMaintainer flowThreadMaintainer(childFlowThread); | 1054 CurrentRenderFlowThreadMaintainer flowThreadMaintainer(childFlowThread); |
| 1055 | 1055 |
| 1056 parent->children()->removeChildNode(parent, child, child->hasLayer()); | 1056 parent->children()->removeChildNode(parent, child, child->hasLayer()); |
| 1057 child->moveAllChildrenTo(parent, nextSibling, child->hasLayer()); | 1057 child->moveAllChildrenTo(parent, nextSibling, child->hasLayer()); |
| 1058 // Explicitly delete the child's line box tree, or the special anonymous | 1058 // Explicitly delete the child's line box tree, or the special anonymous |
| 1059 // block handling in willBeDestroyed will cause problems. | 1059 // block handling in willBeDestroyed will cause problems. |
| 1060 child->deleteLineBoxTree(); | 1060 child->deleteLineBoxTree(); |
| 1061 if (childFlowThread && childFlowThread->isRenderNamedFlowThread()) | |
| 1062 toRenderNamedFlowThread(childFlowThread)->removeFlowChildInfo(child); | |
| 1063 child->destroy(); | 1061 child->destroy(); |
| 1064 } | 1062 } |
| 1065 | 1063 |
| 1066 void RenderBlock::removeChild(RenderObject* oldChild) | 1064 void RenderBlock::removeChild(RenderObject* oldChild) |
| 1067 { | 1065 { |
| 1068 // No need to waste time in merging or removing empty anonymous blocks. | 1066 // No need to waste time in merging or removing empty anonymous blocks. |
| 1069 // We can just bail out if our document is getting destroyed. | 1067 // We can just bail out if our document is getting destroyed. |
| 1070 if (documentBeingDestroyed()) { | 1068 if (documentBeingDestroyed()) { |
| 1071 RenderBox::removeChild(oldChild); | 1069 RenderBox::removeChild(oldChild); |
| 1072 return; | 1070 return; |
| (...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1462 | 1460 |
| 1463 return shapeInfoRequiresRelayout(this); | 1461 return shapeInfoRequiresRelayout(this); |
| 1464 } | 1462 } |
| 1465 | 1463 |
| 1466 void RenderBlock::computeShapeSize() | 1464 void RenderBlock::computeShapeSize() |
| 1467 { | 1465 { |
| 1468 ShapeInsideInfo* shapeInsideInfo = this->shapeInsideInfo(); | 1466 ShapeInsideInfo* shapeInsideInfo = this->shapeInsideInfo(); |
| 1469 if (!shapeInsideInfo) | 1467 if (!shapeInsideInfo) |
| 1470 return; | 1468 return; |
| 1471 | 1469 |
| 1472 if (isRenderNamedFlowFragment()) { | 1470 bool percentageLogicalHeightResolvable = percentageLogicalHeightIsResolvable
FromBlock(this, false); |
| 1473 ShapeInsideInfo* parentShapeInsideInfo = toRenderBlock(parent())->shapeI
nsideInfo(); | 1471 shapeInsideInfo->setShapeSize(logicalWidth(), percentageLogicalHeightResolva
ble ? logicalHeight() : LayoutUnit()); |
| 1474 ASSERT(parentShapeInsideInfo); | |
| 1475 shapeInsideInfo->setShapeSize(parentShapeInsideInfo->shapeSize().width()
, parentShapeInsideInfo->shapeSize().height()); | |
| 1476 } else { | |
| 1477 bool percentageLogicalHeightResolvable = percentageLogicalHeightIsResolv
ableFromBlock(this, false); | |
| 1478 shapeInsideInfo->setShapeSize(logicalWidth(), percentageLogicalHeightRes
olvable ? logicalHeight() : LayoutUnit()); | |
| 1479 } | |
| 1480 } | 1472 } |
| 1481 | 1473 |
| 1482 void RenderBlock::updateRegionsAndShapesAfterChildLayout(RenderFlowThread* flowT
hread, bool heightChanged) | 1474 void RenderBlock::updateRegionsAndShapesAfterChildLayout(RenderFlowThread* flowT
hread, bool heightChanged) |
| 1483 { | 1475 { |
| 1484 // A previous sibling has changed dimension, so we need to relayout the shap
e with the content | 1476 // A previous sibling has changed dimension, so we need to relayout the shap
e with the content |
| 1485 ShapeInsideInfo* shapeInsideInfo = layoutShapeInsideInfo(); | 1477 ShapeInsideInfo* shapeInsideInfo = layoutShapeInsideInfo(); |
| 1486 if (heightChanged && shapeInsideInfo) | 1478 if (heightChanged && shapeInsideInfo) |
| 1487 shapeInsideInfo->dirtyShapeSize(); | 1479 shapeInsideInfo->dirtyShapeSize(); |
| 1488 | 1480 |
| 1489 computeRegionRangeForBlock(flowThread); | 1481 computeRegionRangeForBlock(flowThread); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1555 addLayoutOverflow(rectToApply); | 1547 addLayoutOverflow(rectToApply); |
| 1556 if (hasRenderOverflow()) | 1548 if (hasRenderOverflow()) |
| 1557 m_overflow->setLayoutClientAfterEdge(oldClientAfterEdge); | 1549 m_overflow->setLayoutClientAfterEdge(oldClientAfterEdge); |
| 1558 } | 1550 } |
| 1559 | 1551 |
| 1560 // Add visual overflow from box-shadow and border-image-outset. | 1552 // Add visual overflow from box-shadow and border-image-outset. |
| 1561 addVisualEffectOverflow(); | 1553 addVisualEffectOverflow(); |
| 1562 | 1554 |
| 1563 // Add visual overflow from theme. | 1555 // Add visual overflow from theme. |
| 1564 addVisualOverflowFromTheme(); | 1556 addVisualOverflowFromTheme(); |
| 1565 | |
| 1566 if (isRenderNamedFlowThread()) | |
| 1567 toRenderNamedFlowThread(this)->computeOversetStateForRegions(oldClientAf
terEdge); | |
| 1568 } | 1557 } |
| 1569 | 1558 |
| 1570 void RenderBlock::addOverflowFromBlockChildren() | 1559 void RenderBlock::addOverflowFromBlockChildren() |
| 1571 { | 1560 { |
| 1572 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBo
x()) { | 1561 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBo
x()) { |
| 1573 if (!child->isFloatingOrOutOfFlowPositioned()) | 1562 if (!child->isFloatingOrOutOfFlowPositioned()) |
| 1574 addOverflowFromChild(child); | 1563 addOverflowFromChild(child); |
| 1575 } | 1564 } |
| 1576 } | 1565 } |
| 1577 | 1566 |
| (...skipping 1273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2851 } | 2840 } |
| 2852 | 2841 |
| 2853 LayoutUnit RenderBlock::textIndentOffset() const | 2842 LayoutUnit RenderBlock::textIndentOffset() const |
| 2854 { | 2843 { |
| 2855 LayoutUnit cw = 0; | 2844 LayoutUnit cw = 0; |
| 2856 if (style()->textIndent().isPercent()) | 2845 if (style()->textIndent().isPercent()) |
| 2857 cw = containingBlock()->availableLogicalWidth(); | 2846 cw = containingBlock()->availableLogicalWidth(); |
| 2858 return minimumValueForLength(style()->textIndent(), cw); | 2847 return minimumValueForLength(style()->textIndent(), cw); |
| 2859 } | 2848 } |
| 2860 | 2849 |
| 2861 LayoutUnit RenderBlock::logicalLeftOffsetForContent(RenderRegion* region) const | |
| 2862 { | |
| 2863 LayoutUnit logicalLeftOffset = style()->isHorizontalWritingMode() ? borderLe
ft() + paddingLeft() : borderTop() + paddingTop(); | |
| 2864 if (!region) | |
| 2865 return logicalLeftOffset; | |
| 2866 LayoutRect boxRect = borderBoxRectInRegion(region); | |
| 2867 return logicalLeftOffset + (isHorizontalWritingMode() ? boxRect.x() : boxRec
t.y()); | |
| 2868 } | |
| 2869 | |
| 2870 LayoutUnit RenderBlock::logicalRightOffsetForContent(RenderRegion* region) const | |
| 2871 { | |
| 2872 LayoutUnit logicalRightOffset = style()->isHorizontalWritingMode() ? borderL
eft() + paddingLeft() : borderTop() + paddingTop(); | |
| 2873 logicalRightOffset += availableLogicalWidth(); | |
| 2874 if (!region) | |
| 2875 return logicalRightOffset; | |
| 2876 LayoutRect boxRect = borderBoxRectInRegion(region); | |
| 2877 return logicalRightOffset - (logicalWidth() - (isHorizontalWritingMode() ? b
oxRect.maxX() : boxRect.maxY())); | |
| 2878 } | |
| 2879 | |
| 2880 void RenderBlock::markLinesDirtyInBlockRange(LayoutUnit logicalTop, LayoutUnit l
ogicalBottom, RootInlineBox* highest) | 2850 void RenderBlock::markLinesDirtyInBlockRange(LayoutUnit logicalTop, LayoutUnit l
ogicalBottom, RootInlineBox* highest) |
| 2881 { | 2851 { |
| 2882 if (logicalTop >= logicalBottom) | 2852 if (logicalTop >= logicalBottom) |
| 2883 return; | 2853 return; |
| 2884 | 2854 |
| 2885 RootInlineBox* lowestDirtyLine = lastRootBox(); | 2855 RootInlineBox* lowestDirtyLine = lastRootBox(); |
| 2886 RootInlineBox* afterLowest = lowestDirtyLine; | 2856 RootInlineBox* afterLowest = lowestDirtyLine; |
| 2887 while (lowestDirtyLine && lowestDirtyLine->lineBottomWithLeading() >= logica
lBottom && logicalBottom < LayoutUnit::max()) { | 2857 while (lowestDirtyLine && lowestDirtyLine->lineBottomWithLeading() >= logica
lBottom && logicalBottom < LayoutUnit::max()) { |
| 2888 afterLowest = lowestDirtyLine; | 2858 afterLowest = lowestDirtyLine; |
| 2889 lowestDirtyLine = lowestDirtyLine->prevRootBox(); | 2859 lowestDirtyLine = lowestDirtyLine->prevRootBox(); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2952 && isPointInOverflowControl(result, locationInContainer.point(), adjuste
dLocation)) { | 2922 && isPointInOverflowControl(result, locationInContainer.point(), adjuste
dLocation)) { |
| 2953 updateHitTestResult(result, locationInContainer.point() - localOffset); | 2923 updateHitTestResult(result, locationInContainer.point() - localOffset); |
| 2954 // FIXME: isPointInOverflowControl() doesn't handle rect-based tests yet
. | 2924 // FIXME: isPointInOverflowControl() doesn't handle rect-based tests yet
. |
| 2955 if (!result.addNodeToRectBasedTestResult(nodeForHitTest(), request, loca
tionInContainer)) | 2925 if (!result.addNodeToRectBasedTestResult(nodeForHitTest(), request, loca
tionInContainer)) |
| 2956 return true; | 2926 return true; |
| 2957 } | 2927 } |
| 2958 | 2928 |
| 2959 // If we have clipping, then we can't have any spillout. | 2929 // If we have clipping, then we can't have any spillout. |
| 2960 bool useOverflowClip = hasOverflowClip() && !hasSelfPaintingLayer(); | 2930 bool useOverflowClip = hasOverflowClip() && !hasSelfPaintingLayer(); |
| 2961 bool useClip = (hasControlClip() || useOverflowClip); | 2931 bool useClip = (hasControlClip() || useOverflowClip); |
| 2962 bool checkChildren = !useClip || (hasControlClip() ? locationInContainer.int
ersects(controlClipRect(adjustedLocation)) : locationInContainer.intersects(over
flowClipRect(adjustedLocation, locationInContainer.region(), IncludeOverlayScrol
lbarSize))); | 2932 bool checkChildren = !useClip || (hasControlClip() ? locationInContainer.int
ersects(controlClipRect(adjustedLocation)) : locationInContainer.intersects(over
flowClipRect(adjustedLocation, IncludeOverlayScrollbarSize))); |
| 2963 if (checkChildren) { | 2933 if (checkChildren) { |
| 2964 // Hit test descendants first. | 2934 // Hit test descendants first. |
| 2965 LayoutSize scrolledOffset(localOffset); | 2935 LayoutSize scrolledOffset(localOffset); |
| 2966 if (hasOverflowClip()) | 2936 if (hasOverflowClip()) |
| 2967 scrolledOffset -= scrolledContentOffset(); | 2937 scrolledOffset -= scrolledContentOffset(); |
| 2968 | 2938 |
| 2969 // Hit test contents if we don't have columns. | 2939 // Hit test contents if we don't have columns. |
| 2970 if (!hasColumns()) { | 2940 if (!hasColumns()) { |
| 2971 if (hitTestContents(request, result, locationInContainer, toLayoutPo
int(scrolledOffset), hitTestAction)) { | 2941 if (hitTestContents(request, result, locationInContainer, toLayoutPo
int(scrolledOffset), hitTestAction)) { |
| 2972 updateHitTestResult(result, flipForWritingMode(locationInContain
er.point() - localOffset)); | 2942 updateHitTestResult(result, flipForWritingMode(locationInContain
er.point() - localOffset)); |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3093 LayoutRect colRect = it.columnRect(); | 3063 LayoutRect colRect = it.columnRect(); |
| 3094 if (colRect.contains(locationInContainer)) { | 3064 if (colRect.contains(locationInContainer)) { |
| 3095 it.adjust(offset); | 3065 it.adjust(offset); |
| 3096 return; | 3066 return; |
| 3097 } | 3067 } |
| 3098 } | 3068 } |
| 3099 } | 3069 } |
| 3100 | 3070 |
| 3101 bool RenderBlock::hitTestContents(const HitTestRequest& request, HitTestResult&
result, const HitTestLocation& locationInContainer, const LayoutPoint& accumulat
edOffset, HitTestAction hitTestAction) | 3071 bool RenderBlock::hitTestContents(const HitTestRequest& request, HitTestResult&
result, const HitTestLocation& locationInContainer, const LayoutPoint& accumulat
edOffset, HitTestAction hitTestAction) |
| 3102 { | 3072 { |
| 3103 if (isRenderRegion()) | |
| 3104 return toRenderRegion(this)->hitTestFlowThreadContents(request, result,
locationInContainer, accumulatedOffset, hitTestAction); | |
| 3105 | |
| 3106 if (childrenInline() && !isTable()) { | 3073 if (childrenInline() && !isTable()) { |
| 3107 // We have to hit-test our line boxes. | 3074 // We have to hit-test our line boxes. |
| 3108 if (m_lineBoxes.hitTest(this, request, result, locationInContainer, accu
mulatedOffset, hitTestAction)) | 3075 if (m_lineBoxes.hitTest(this, request, result, locationInContainer, accu
mulatedOffset, hitTestAction)) |
| 3109 return true; | 3076 return true; |
| 3110 } else { | 3077 } else { |
| 3111 // Hit test our children. | 3078 // Hit test our children. |
| 3112 HitTestAction childHitTest = hitTestAction; | 3079 HitTestAction childHitTest = hitTestAction; |
| 3113 if (hitTestAction == HitTestChildBlockBackgrounds) | 3080 if (hitTestAction == HitTestChildBlockBackgrounds) |
| 3114 childHitTest = HitTestChildBlockBackground; | 3081 childHitTest = HitTestChildBlockBackground; |
| 3115 for (RenderBox* child = lastChildBox(); child; child = child->previousSi
blingBox()) { | 3082 for (RenderBox* child = lastChildBox(); child; child = child->previousSi
blingBox()) { |
| (...skipping 2026 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5142 | 5109 |
| 5143 RenderBox* RenderBlock::createAnonymousBoxWithSameTypeAs(const RenderObject* par
ent) const | 5110 RenderBox* RenderBlock::createAnonymousBoxWithSameTypeAs(const RenderObject* par
ent) const |
| 5144 { | 5111 { |
| 5145 if (isAnonymousColumnsBlock()) | 5112 if (isAnonymousColumnsBlock()) |
| 5146 return createAnonymousColumnsWithParentRenderer(parent); | 5113 return createAnonymousColumnsWithParentRenderer(parent); |
| 5147 if (isAnonymousColumnSpanBlock()) | 5114 if (isAnonymousColumnSpanBlock()) |
| 5148 return createAnonymousColumnSpanWithParentRenderer(parent); | 5115 return createAnonymousColumnSpanWithParentRenderer(parent); |
| 5149 return createAnonymousWithParentRendererAndDisplay(parent, style()->display(
)); | 5116 return createAnonymousWithParentRendererAndDisplay(parent, style()->display(
)); |
| 5150 } | 5117 } |
| 5151 | 5118 |
| 5152 bool RenderBlock::hasNextPage(LayoutUnit logicalOffset, PageBoundaryRule pageBou
ndaryRule) const | |
| 5153 { | |
| 5154 ASSERT(view()->layoutState() && view()->layoutState()->isPaginated()); | |
| 5155 | |
| 5156 RenderFlowThread* flowThread = flowThreadContainingBlock(); | |
| 5157 if (!flowThread) | |
| 5158 return true; // Printing and multi-column both make new pages to accommo
date content. | |
| 5159 | |
| 5160 // See if we're in the last region. | |
| 5161 LayoutUnit pageOffset = offsetFromLogicalTopOfFirstPage() + logicalOffset; | |
| 5162 RenderRegion* region = flowThread->regionAtBlockOffset(pageOffset, this); | |
| 5163 if (!region) | |
| 5164 return false; | |
| 5165 if (region->isLastRegion()) | |
| 5166 return region->isRenderRegionSet() || region->style()->regionFragment()
== BreakRegionFragment | |
| 5167 || (pageBoundaryRule == IncludePageBoundary && pageOffset == region-
>logicalTopForFlowThreadContent()); | |
| 5168 return true; | |
| 5169 } | |
| 5170 | |
| 5171 LayoutUnit RenderBlock::nextPageLogicalTop(LayoutUnit logicalOffset, PageBoundar
yRule pageBoundaryRule) const | 5119 LayoutUnit RenderBlock::nextPageLogicalTop(LayoutUnit logicalOffset, PageBoundar
yRule pageBoundaryRule) const |
| 5172 { | 5120 { |
| 5173 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); | 5121 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); |
| 5174 if (!pageLogicalHeight) | 5122 if (!pageLogicalHeight) |
| 5175 return logicalOffset; | 5123 return logicalOffset; |
| 5176 | 5124 |
| 5177 // The logicalOffset is in our coordinate space. We can add in our pushed o
ffset. | 5125 // The logicalOffset is in our coordinate space. We can add in our pushed o
ffset. |
| 5178 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi
calOffset); | 5126 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi
calOffset); |
| 5179 if (pageBoundaryRule == ExcludePageBoundary) | 5127 if (pageBoundaryRule == ExcludePageBoundary) |
| 5180 return logicalOffset + (remainingLogicalHeight ? remainingLogicalHeight
: pageLogicalHeight); | 5128 return logicalOffset + (remainingLogicalHeight ? remainingLogicalHeight
: pageLogicalHeight); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5224 return remainingHeight; | 5172 return remainingHeight; |
| 5225 } | 5173 } |
| 5226 | 5174 |
| 5227 return flowThread->pageRemainingLogicalHeightForOffset(offset, pageBoundaryR
ule); | 5175 return flowThread->pageRemainingLogicalHeightForOffset(offset, pageBoundaryR
ule); |
| 5228 } | 5176 } |
| 5229 | 5177 |
| 5230 LayoutUnit RenderBlock::adjustForUnsplittableChild(RenderBox* child, LayoutUnit
logicalOffset, bool includeMargins) | 5178 LayoutUnit RenderBlock::adjustForUnsplittableChild(RenderBox* child, LayoutUnit
logicalOffset, bool includeMargins) |
| 5231 { | 5179 { |
| 5232 bool checkColumnBreaks = view()->layoutState()->isPaginatingColumns(); | 5180 bool checkColumnBreaks = view()->layoutState()->isPaginatingColumns(); |
| 5233 bool checkPageBreaks = !checkColumnBreaks && view()->layoutState()->m_pageLo
gicalHeight; | 5181 bool checkPageBreaks = !checkColumnBreaks && view()->layoutState()->m_pageLo
gicalHeight; |
| 5234 RenderFlowThread* flowThread = flowThreadContainingBlock(); | |
| 5235 bool checkRegionBreaks = flowThread && flowThread->isRenderNamedFlowThread()
; | |
| 5236 bool isUnsplittable = child->isUnsplittableForPagination() || (checkColumnBr
eaks && child->style()->columnBreakInside() == PBAVOID) | 5182 bool isUnsplittable = child->isUnsplittableForPagination() || (checkColumnBr
eaks && child->style()->columnBreakInside() == PBAVOID) |
| 5237 || (checkPageBreaks && child->style()->pageBreakInside() == PBAVOID) | 5183 || (checkPageBreaks && child->style()->pageBreakInside() == PBAVOID); |
| 5238 || (checkRegionBreaks && child->style()->regionBreakInside() == PBAVOID)
; | |
| 5239 if (!isUnsplittable) | 5184 if (!isUnsplittable) |
| 5240 return logicalOffset; | 5185 return logicalOffset; |
| 5241 LayoutUnit childLogicalHeight = logicalHeightForChild(child) + (includeMargi
ns ? marginBeforeForChild(child) + marginAfterForChild(child) : LayoutUnit()); | 5186 LayoutUnit childLogicalHeight = logicalHeightForChild(child) + (includeMargi
ns ? marginBeforeForChild(child) + marginAfterForChild(child) : LayoutUnit()); |
| 5242 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); | 5187 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); |
| 5243 bool hasUniformPageLogicalHeight = !flowThread || flowThread->regionsHaveUni
formLogicalHeight(); | |
| 5244 updateMinimumPageHeight(logicalOffset, childLogicalHeight); | 5188 updateMinimumPageHeight(logicalOffset, childLogicalHeight); |
| 5245 if (!pageLogicalHeight || (hasUniformPageLogicalHeight && childLogicalHeight
> pageLogicalHeight) | 5189 if (!pageLogicalHeight || childLogicalHeight > pageLogicalHeight) |
| 5246 || !hasNextPage(logicalOffset)) | |
| 5247 return logicalOffset; | 5190 return logicalOffset; |
| 5248 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi
calOffset, ExcludePageBoundary); | 5191 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi
calOffset, ExcludePageBoundary); |
| 5249 if (remainingLogicalHeight < childLogicalHeight) { | 5192 if (remainingLogicalHeight < childLogicalHeight) |
| 5250 if (!hasUniformPageLogicalHeight && !pushToNextPageWithMinimumLogicalHei
ght(remainingLogicalHeight, logicalOffset, childLogicalHeight)) | |
| 5251 return logicalOffset; | |
| 5252 return logicalOffset + remainingLogicalHeight; | 5193 return logicalOffset + remainingLogicalHeight; |
| 5253 } | |
| 5254 return logicalOffset; | 5194 return logicalOffset; |
| 5255 } | 5195 } |
| 5256 | 5196 |
| 5257 bool RenderBlock::pushToNextPageWithMinimumLogicalHeight(LayoutUnit& adjustment,
LayoutUnit logicalOffset, LayoutUnit minimumLogicalHeight) const | 5197 bool RenderBlock::pushToNextPageWithMinimumLogicalHeight(LayoutUnit& adjustment,
LayoutUnit logicalOffset, LayoutUnit minimumLogicalHeight) const |
| 5258 { | 5198 { |
| 5259 bool checkRegion = false; | 5199 // FIXME: multicol will need to do some work here, when we implement support
for multiple rows. |
| 5260 for (LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset
+ adjustment); pageLogicalHeight; | 5200 return false; |
| 5261 pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset + adjustmen
t)) { | |
| 5262 if (minimumLogicalHeight <= pageLogicalHeight) | |
| 5263 return true; | |
| 5264 if (!hasNextPage(logicalOffset + adjustment)) | |
| 5265 return false; | |
| 5266 adjustment += pageLogicalHeight; | |
| 5267 checkRegion = true; | |
| 5268 } | |
| 5269 return !checkRegion; | |
| 5270 } | 5201 } |
| 5271 | 5202 |
| 5272 void RenderBlock::setPageBreak(LayoutUnit offset, LayoutUnit spaceShortage) | 5203 void RenderBlock::setPageBreak(LayoutUnit offset, LayoutUnit spaceShortage) |
| 5273 { | 5204 { |
| 5274 if (RenderFlowThread* flowThread = flowThreadContainingBlock()) | 5205 if (RenderFlowThread* flowThread = flowThreadContainingBlock()) |
| 5275 flowThread->setPageBreak(offsetFromLogicalTopOfFirstPage() + offset, spa
ceShortage); | 5206 flowThread->setPageBreak(offsetFromLogicalTopOfFirstPage() + offset, spa
ceShortage); |
| 5276 } | 5207 } |
| 5277 | 5208 |
| 5278 void RenderBlock::updateMinimumPageHeight(LayoutUnit offset, LayoutUnit minHeigh
t) | 5209 void RenderBlock::updateMinimumPageHeight(LayoutUnit offset, LayoutUnit minHeigh
t) |
| 5279 { | 5210 { |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5327 LayoutUnit logicalBottom = max(lineBox->lineBottomWithLeading(), logicalVisu
alOverflow.maxY()); | 5258 LayoutUnit logicalBottom = max(lineBox->lineBottomWithLeading(), logicalVisu
alOverflow.maxY()); |
| 5328 LayoutUnit lineHeight = logicalBottom - logicalOffset; | 5259 LayoutUnit lineHeight = logicalBottom - logicalOffset; |
| 5329 updateMinimumPageHeight(logicalOffset, calculateMinimumPageHeight(style(), l
ineBox, logicalOffset, logicalBottom)); | 5260 updateMinimumPageHeight(logicalOffset, calculateMinimumPageHeight(style(), l
ineBox, logicalOffset, logicalBottom)); |
| 5330 logicalOffset += delta; | 5261 logicalOffset += delta; |
| 5331 lineBox->setPaginationStrut(0); | 5262 lineBox->setPaginationStrut(0); |
| 5332 lineBox->setIsFirstAfterPageBreak(false); | 5263 lineBox->setIsFirstAfterPageBreak(false); |
| 5333 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); | 5264 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); |
| 5334 bool hasUniformPageLogicalHeight = !flowThread || flowThread->regionsHaveUni
formLogicalHeight(); | 5265 bool hasUniformPageLogicalHeight = !flowThread || flowThread->regionsHaveUni
formLogicalHeight(); |
| 5335 // If lineHeight is greater than pageLogicalHeight, but logicalVisualOverflo
w.height() still fits, we are | 5266 // If lineHeight is greater than pageLogicalHeight, but logicalVisualOverflo
w.height() still fits, we are |
| 5336 // still going to add a strut, so that the visible overflow fits on a single
page. | 5267 // still going to add a strut, so that the visible overflow fits on a single
page. |
| 5337 if (!pageLogicalHeight || (hasUniformPageLogicalHeight && logicalVisualOverf
low.height() > pageLogicalHeight) | 5268 if (!pageLogicalHeight || (hasUniformPageLogicalHeight && logicalVisualOverf
low.height() > pageLogicalHeight)) |
| 5338 || !hasNextPage(logicalOffset)) | |
| 5339 // FIXME: In case the line aligns with the top of the page (or it's slig
htly shifted downwards) it will not be marked as the first line in the page. | 5269 // FIXME: In case the line aligns with the top of the page (or it's slig
htly shifted downwards) it will not be marked as the first line in the page. |
| 5340 // From here, the fix is not straightforward because it's not easy to al
ways determine when the current line is the first in the page. | 5270 // From here, the fix is not straightforward because it's not easy to al
ways determine when the current line is the first in the page. |
| 5341 return; | 5271 return; |
| 5342 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi
calOffset, ExcludePageBoundary); | 5272 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi
calOffset, ExcludePageBoundary); |
| 5343 | 5273 |
| 5344 int lineIndex = lineCount(lineBox); | 5274 int lineIndex = lineCount(lineBox); |
| 5345 if (remainingLogicalHeight < lineHeight || (shouldBreakAtLineToAvoidWidow()
&& lineBreakToAvoidWidow() == lineIndex)) { | 5275 if (remainingLogicalHeight < lineHeight || (shouldBreakAtLineToAvoidWidow()
&& lineBreakToAvoidWidow() == lineIndex)) { |
| 5346 if (shouldBreakAtLineToAvoidWidow() && lineBreakToAvoidWidow() == lineIn
dex) { | 5276 if (shouldBreakAtLineToAvoidWidow() && lineBreakToAvoidWidow() == lineIn
dex) { |
| 5347 clearShouldBreakAtLineToAvoidWidow(); | 5277 clearShouldBreakAtLineToAvoidWidow(); |
| 5348 setDidBreakAtLineToAvoidWidow(); | 5278 setDidBreakAtLineToAvoidWidow(); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 5367 } | 5297 } |
| 5368 } else if (remainingLogicalHeight == pageLogicalHeight) { | 5298 } else if (remainingLogicalHeight == pageLogicalHeight) { |
| 5369 // We're at the very top of a page or column. | 5299 // We're at the very top of a page or column. |
| 5370 if (lineBox != firstRootBox()) | 5300 if (lineBox != firstRootBox()) |
| 5371 lineBox->setIsFirstAfterPageBreak(true); | 5301 lineBox->setIsFirstAfterPageBreak(true); |
| 5372 if (lineBox != firstRootBox() || offsetFromLogicalTopOfFirstPage()) | 5302 if (lineBox != firstRootBox() || offsetFromLogicalTopOfFirstPage()) |
| 5373 setPageBreak(logicalOffset, lineHeight); | 5303 setPageBreak(logicalOffset, lineHeight); |
| 5374 } | 5304 } |
| 5375 } | 5305 } |
| 5376 | 5306 |
| 5377 void RenderBlock::updateRegionForLine(RootInlineBox* lineBox) const | |
| 5378 { | |
| 5379 ASSERT(lineBox); | |
| 5380 lineBox->setContainingRegion(regionAtBlockOffset(lineBox->lineTopWithLeading
())); | |
| 5381 | |
| 5382 RootInlineBox* prevLineBox = lineBox->prevRootBox(); | |
| 5383 if (!prevLineBox) | |
| 5384 return; | |
| 5385 | |
| 5386 // This check is more accurate than the one in |adjustLinePositionForPaginat
ion| because it takes into | |
| 5387 // account just the container changes between lines. The before mentioned fu
nction doesn't set the flag | |
| 5388 // correctly if the line is positioned at the top of the last fragment conta
iner. | |
| 5389 if (lineBox->containingRegion() != prevLineBox->containingRegion()) | |
| 5390 lineBox->setIsFirstAfterPageBreak(true); | |
| 5391 } | |
| 5392 | |
| 5393 bool RenderBlock::lineWidthForPaginatedLineChanged(RootInlineBox* rootBox, Layou
tUnit lineDelta, RenderFlowThread* flowThread) const | |
| 5394 { | |
| 5395 if (!flowThread) | |
| 5396 return false; | |
| 5397 | |
| 5398 RenderRegion* currentRegion = regionAtBlockOffset(rootBox->lineTopWithLeadin
g() + lineDelta); | |
| 5399 // Just bail if the region didn't change. | |
| 5400 if (rootBox->containingRegion() == currentRegion) | |
| 5401 return false; | |
| 5402 return rootBox->paginatedLineWidth() != availableLogicalWidthForContent(curr
entRegion); | |
| 5403 } | |
| 5404 | |
| 5405 LayoutUnit RenderBlock::offsetFromLogicalTopOfFirstPage() const | 5307 LayoutUnit RenderBlock::offsetFromLogicalTopOfFirstPage() const |
| 5406 { | 5308 { |
| 5407 LayoutState* layoutState = view()->layoutState(); | 5309 LayoutState* layoutState = view()->layoutState(); |
| 5408 if (layoutState && !layoutState->isPaginated()) | 5310 if (layoutState && !layoutState->isPaginated()) |
| 5409 return 0; | 5311 return 0; |
| 5410 | 5312 |
| 5411 RenderFlowThread* flowThread = flowThreadContainingBlock(); | 5313 RenderFlowThread* flowThread = flowThreadContainingBlock(); |
| 5412 if (flowThread) | 5314 if (flowThread) |
| 5413 return flowThread->offsetFromLogicalTopOfFirstRegion(this); | 5315 return flowThread->offsetFromLogicalTopOfFirstRegion(this); |
| 5414 | 5316 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 5425 | 5327 |
| 5426 RenderRegion* RenderBlock::regionAtBlockOffset(LayoutUnit blockOffset) const | 5328 RenderRegion* RenderBlock::regionAtBlockOffset(LayoutUnit blockOffset) const |
| 5427 { | 5329 { |
| 5428 RenderFlowThread* flowThread = flowThreadContainingBlock(); | 5330 RenderFlowThread* flowThread = flowThreadContainingBlock(); |
| 5429 if (!flowThread || !flowThread->hasValidRegionInfo()) | 5331 if (!flowThread || !flowThread->hasValidRegionInfo()) |
| 5430 return 0; | 5332 return 0; |
| 5431 | 5333 |
| 5432 return flowThread->regionAtBlockOffset(offsetFromLogicalTopOfFirstPage() + b
lockOffset, true); | 5334 return flowThread->regionAtBlockOffset(offsetFromLogicalTopOfFirstPage() + b
lockOffset, true); |
| 5433 } | 5335 } |
| 5434 | 5336 |
| 5435 bool RenderBlock::logicalWidthChangedInRegions(RenderFlowThread* flowThread) con
st | |
| 5436 { | |
| 5437 if (!flowThread || !flowThread->hasValidRegionInfo()) | |
| 5438 return false; | |
| 5439 | |
| 5440 return flowThread->logicalWidthChangedInRegionsForBlock(this); | |
| 5441 } | |
| 5442 | |
| 5443 RenderRegion* RenderBlock::clampToStartAndEndRegions(RenderRegion* region) const | |
| 5444 { | |
| 5445 RenderFlowThread* flowThread = flowThreadContainingBlock(); | |
| 5446 | |
| 5447 ASSERT(isRenderView() || (region && flowThread)); | |
| 5448 if (isRenderView()) | |
| 5449 return region; | |
| 5450 | |
| 5451 // We need to clamp to the block, since we want any lines or blocks that ove
rflow out of the | |
| 5452 // logical top or logical bottom of the block to size as though the border b
ox in the first and | |
| 5453 // last regions extended infinitely. Otherwise the lines are going to size a
ccording to the regions | |
| 5454 // they overflow into, which makes no sense when this block doesn't exist in
|region| at all. | |
| 5455 RenderRegion* startRegion; | |
| 5456 RenderRegion* endRegion; | |
| 5457 flowThread->getRegionRangeForBox(this, startRegion, endRegion); | |
| 5458 | |
| 5459 if (startRegion && region->logicalTopForFlowThreadContent() < startRegion->l
ogicalTopForFlowThreadContent()) | |
| 5460 return startRegion; | |
| 5461 if (endRegion && region->logicalTopForFlowThreadContent() > endRegion->logic
alTopForFlowThreadContent()) | |
| 5462 return endRegion; | |
| 5463 | |
| 5464 return region; | |
| 5465 } | |
| 5466 | |
| 5467 LayoutUnit RenderBlock::collapsedMarginBeforeForChild(const RenderBox* child) co
nst | 5337 LayoutUnit RenderBlock::collapsedMarginBeforeForChild(const RenderBox* child) co
nst |
| 5468 { | 5338 { |
| 5469 // If the child has the same directionality as we do, then we can just retur
n its | 5339 // If the child has the same directionality as we do, then we can just retur
n its |
| 5470 // collapsed margin. | 5340 // collapsed margin. |
| 5471 if (!child->isWritingModeRoot()) | 5341 if (!child->isWritingModeRoot()) |
| 5472 return child->collapsedMarginBefore(); | 5342 return child->collapsedMarginBefore(); |
| 5473 | 5343 |
| 5474 // The child has a different directionality. If the child is parallel, then
it's just | 5344 // The child has a different directionality. If the child is parallel, then
it's just |
| 5475 // flipped relative to us. We can use the collapsed margin for the opposite
edge. | 5345 // flipped relative to us. We can use the collapsed margin for the opposite
edge. |
| 5476 if (child->isHorizontalWritingMode() == isHorizontalWritingMode()) | 5346 if (child->isHorizontalWritingMode() == isHorizontalWritingMode()) |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5619 void RenderBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m
arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Render
Object* obj) const | 5489 void RenderBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m
arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Render
Object* obj) const |
| 5620 { | 5490 { |
| 5621 showRenderObject(); | 5491 showRenderObject(); |
| 5622 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) | 5492 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) |
| 5623 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); | 5493 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); |
| 5624 } | 5494 } |
| 5625 | 5495 |
| 5626 #endif | 5496 #endif |
| 5627 | 5497 |
| 5628 } // namespace WebCore | 5498 } // namespace WebCore |
| OLD | NEW |