| 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 19 matching lines...) Expand all Loading... |
| 30 | 30 |
| 31 #include "config.h" | 31 #include "config.h" |
| 32 #include "core/rendering/RenderBlockFlow.h" | 32 #include "core/rendering/RenderBlockFlow.h" |
| 33 | 33 |
| 34 #include "core/accessibility/AXObjectCache.h" | 34 #include "core/accessibility/AXObjectCache.h" |
| 35 #include "core/frame/FrameView.h" | 35 #include "core/frame/FrameView.h" |
| 36 #include "core/rendering/FastTextAutosizer.h" | 36 #include "core/rendering/FastTextAutosizer.h" |
| 37 #include "core/rendering/HitTestLocation.h" | 37 #include "core/rendering/HitTestLocation.h" |
| 38 #include "core/rendering/LayoutRectRecorder.h" | 38 #include "core/rendering/LayoutRectRecorder.h" |
| 39 #include "core/rendering/LayoutRepainter.h" | 39 #include "core/rendering/LayoutRepainter.h" |
| 40 #include "core/rendering/RenderFlowThread.h" |
| 40 #include "core/rendering/RenderLayer.h" | 41 #include "core/rendering/RenderLayer.h" |
| 41 #include "core/rendering/RenderMultiColumnBlock.h" | 42 #include "core/rendering/RenderMultiColumnBlock.h" |
| 42 #include "core/rendering/RenderNamedFlowFragment.h" | |
| 43 #include "core/rendering/RenderNamedFlowThread.h" | |
| 44 #include "core/rendering/RenderText.h" | 43 #include "core/rendering/RenderText.h" |
| 45 #include "core/rendering/RenderView.h" | 44 #include "core/rendering/RenderView.h" |
| 46 #include "core/rendering/line/LineWidth.h" | 45 #include "core/rendering/line/LineWidth.h" |
| 47 #include "core/rendering/svg/SVGTextRunRenderingContext.h" | 46 #include "core/rendering/svg/SVGTextRunRenderingContext.h" |
| 48 #include "platform/text/BidiTextRun.h" | 47 #include "platform/text/BidiTextRun.h" |
| 49 | 48 |
| 50 using namespace std; | 49 using namespace std; |
| 51 | 50 |
| 52 namespace WebCore { | 51 namespace WebCore { |
| 53 | 52 |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 RenderBlockFlow* RenderBlockFlow::createAnonymousBlockFlow() const | 174 RenderBlockFlow* RenderBlockFlow::createAnonymousBlockFlow() const |
| 176 { | 175 { |
| 177 return toRenderBlockFlow(createAnonymousWithParentRendererAndDisplay(this, B
LOCK)); | 176 return toRenderBlockFlow(createAnonymousWithParentRendererAndDisplay(this, B
LOCK)); |
| 178 } | 177 } |
| 179 | 178 |
| 180 void RenderBlockFlow::willBeDestroyed() | 179 void RenderBlockFlow::willBeDestroyed() |
| 181 { | 180 { |
| 182 if (lineGridBox()) | 181 if (lineGridBox()) |
| 183 lineGridBox()->destroy(); | 182 lineGridBox()->destroy(); |
| 184 | 183 |
| 185 if (renderNamedFlowFragment()) | |
| 186 setRenderNamedFlowFragment(0); | |
| 187 | |
| 188 RenderBlock::willBeDestroyed(); | 184 RenderBlock::willBeDestroyed(); |
| 189 } | 185 } |
| 190 | 186 |
| 191 void RenderBlockFlow::checkForPaginationLogicalHeightChange(LayoutUnit& pageLogi
calHeight, bool& pageLogicalHeightChanged, bool& hasSpecifiedPageLogicalHeight) | 187 void RenderBlockFlow::checkForPaginationLogicalHeightChange(LayoutUnit& pageLogi
calHeight, bool& pageLogicalHeightChanged, bool& hasSpecifiedPageLogicalHeight) |
| 192 { | 188 { |
| 193 ColumnInfo* colInfo = columnInfo(); | 189 ColumnInfo* colInfo = columnInfo(); |
| 194 if (hasColumns()) { | 190 if (hasColumns()) { |
| 195 if (!pageLogicalHeight) { | 191 if (!pageLogicalHeight) { |
| 196 LayoutUnit oldLogicalHeight = logicalHeight(); | 192 LayoutUnit oldLogicalHeight = logicalHeight(); |
| 197 setLogicalHeight(0); | 193 setLogicalHeight(0); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 | 297 |
| 302 bool pageLogicalHeightChanged = false; | 298 bool pageLogicalHeightChanged = false; |
| 303 bool hasSpecifiedPageLogicalHeight = false; | 299 bool hasSpecifiedPageLogicalHeight = false; |
| 304 checkForPaginationLogicalHeightChange(pageLogicalHeight, pageLogicalHeightCh
anged, hasSpecifiedPageLogicalHeight); | 300 checkForPaginationLogicalHeightChange(pageLogicalHeight, pageLogicalHeightCh
anged, hasSpecifiedPageLogicalHeight); |
| 305 | 301 |
| 306 RenderView* renderView = view(); | 302 RenderView* renderView = view(); |
| 307 LayoutStateMaintainer statePusher(renderView, this, locationOffset(), hasCol
umns() || hasTransform() || hasReflection() || style()->isFlippedBlocksWritingMo
de(), pageLogicalHeight, pageLogicalHeightChanged, columnInfo()); | 303 LayoutStateMaintainer statePusher(renderView, this, locationOffset(), hasCol
umns() || hasTransform() || hasReflection() || style()->isFlippedBlocksWritingMo
de(), pageLogicalHeight, pageLogicalHeightChanged, columnInfo()); |
| 308 | 304 |
| 309 // Regions changing widths can force us to relayout our children. | 305 // Regions changing widths can force us to relayout our children. |
| 310 RenderFlowThread* flowThread = flowThreadContainingBlock(); | 306 RenderFlowThread* flowThread = flowThreadContainingBlock(); |
| 311 if (logicalWidthChangedInRegions(flowThread)) | |
| 312 relayoutChildren = true; | |
| 313 if (updateRegionsAndShapesLogicalSize(flowThread)) | 307 if (updateRegionsAndShapesLogicalSize(flowThread)) |
| 314 relayoutChildren = true; | 308 relayoutChildren = true; |
| 315 if (!relayoutChildren && isRenderNamedFlowFragmentContainer()) | |
| 316 relayoutChildren = true; | |
| 317 | 309 |
| 318 // We use four values, maxTopPos, maxTopNeg, maxBottomPos, and maxBottomNeg,
to track | 310 // We use four values, maxTopPos, maxTopNeg, maxBottomPos, and maxBottomNeg,
to track |
| 319 // our current maximal positive and negative margins. These values are used
when we | 311 // our current maximal positive and negative margins. These values are used
when we |
| 320 // are collapsed with adjacent blocks, so for example, if you have block A a
nd B | 312 // are collapsed with adjacent blocks, so for example, if you have block A a
nd B |
| 321 // collapsing together, then you'd take the maximal positive margin from bot
h A and B | 313 // collapsing together, then you'd take the maximal positive margin from bot
h A and B |
| 322 // and subtract it from the maximal negative margin from both A and B to get
the | 314 // and subtract it from the maximal negative margin from both A and B to get
the |
| 323 // true collapsed margin. This algorithm is recursive, so when we finish lay
out() | 315 // true collapsed margin. This algorithm is recursive, so when we finish lay
out() |
| 324 // our block knows its current maximal positive/negative values. | 316 // our block knows its current maximal positive/negative values. |
| 325 // | 317 // |
| 326 // Start out by setting our margin values to our current margins. Table cell
s have | 318 // Start out by setting our margin values to our current margins. Table cell
s have |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 386 if (shouldBreakAtLineToAvoidWidow()) { | 378 if (shouldBreakAtLineToAvoidWidow()) { |
| 387 statePusher.pop(); | 379 statePusher.pop(); |
| 388 setEverHadLayout(true); | 380 setEverHadLayout(true); |
| 389 return false; | 381 return false; |
| 390 } | 382 } |
| 391 | 383 |
| 392 // Calculate our new height. | 384 // Calculate our new height. |
| 393 LayoutUnit oldHeight = logicalHeight(); | 385 LayoutUnit oldHeight = logicalHeight(); |
| 394 LayoutUnit oldClientAfterEdge = clientLogicalBottom(); | 386 LayoutUnit oldClientAfterEdge = clientLogicalBottom(); |
| 395 | 387 |
| 396 // Before updating the final size of the flow thread make sure a forced brea
k is applied after the content. | |
| 397 // This ensures the size information is correctly computed for the last auto
-height region receiving content. | |
| 398 if (isRenderFlowThread()) | 388 if (isRenderFlowThread()) |
| 399 toRenderFlowThread(this)->applyBreakAfterContent(oldClientAfterEdge); | 389 toRenderFlowThread(this)->applyBreakAfterContent(oldClientAfterEdge); |
| 400 | 390 |
| 401 updateLogicalHeight(); | 391 updateLogicalHeight(); |
| 402 LayoutUnit newHeight = logicalHeight(); | 392 LayoutUnit newHeight = logicalHeight(); |
| 403 if (oldHeight != newHeight) { | 393 if (oldHeight != newHeight) { |
| 404 if (oldHeight > newHeight && maxFloatLogicalBottom > newHeight && !child
renInline()) { | 394 if (oldHeight > newHeight && maxFloatLogicalBottom > newHeight && !child
renInline()) { |
| 405 // One of our children's floats may have become an overhanging float
for us. We need to look for it. | 395 // One of our children's floats may have become an overhanging float
for us. We need to look for it. |
| 406 for (RenderObject* child = firstChild(); child; child = child->nextS
ibling()) { | 396 for (RenderObject* child = firstChild(); child; child = child->nextS
ibling()) { |
| 407 if (child->isRenderBlockFlow() && !child->isFloatingOrOutOfFlowP
ositioned()) { | 397 if (child->isRenderBlockFlow() && !child->isFloatingOrOutOfFlowP
ositioned()) { |
| (...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1123 marginInfo.clearMargin(); | 1113 marginInfo.clearMargin(); |
| 1124 } | 1114 } |
| 1125 | 1115 |
| 1126 if (marginInfo.margin()) | 1116 if (marginInfo.margin()) |
| 1127 marginInfo.setHasMarginAfterQuirk(hasMarginAfterQuirk(child)); | 1117 marginInfo.setHasMarginAfterQuirk(hasMarginAfterQuirk(child)); |
| 1128 } | 1118 } |
| 1129 | 1119 |
| 1130 // If margins would pull us past the top of the next page, then we need to p
ull back and pretend like the margins | 1120 // If margins would pull us past the top of the next page, then we need to p
ull back and pretend like the margins |
| 1131 // collapsed into the page edge. | 1121 // collapsed into the page edge. |
| 1132 LayoutState* layoutState = view()->layoutState(); | 1122 LayoutState* layoutState = view()->layoutState(); |
| 1133 if (layoutState->isPaginated() && layoutState->pageLogicalHeight() && logica
lTop > beforeCollapseLogicalTop | 1123 if (layoutState->isPaginated() && layoutState->pageLogicalHeight() && logica
lTop > beforeCollapseLogicalTop) { |
| 1134 && hasNextPage(beforeCollapseLogicalTop)) { | |
| 1135 LayoutUnit oldLogicalTop = logicalTop; | 1124 LayoutUnit oldLogicalTop = logicalTop; |
| 1136 logicalTop = min(logicalTop, nextPageLogicalTop(beforeCollapseLogicalTop
)); | 1125 logicalTop = min(logicalTop, nextPageLogicalTop(beforeCollapseLogicalTop
)); |
| 1137 setLogicalHeight(logicalHeight() + (logicalTop - oldLogicalTop)); | 1126 setLogicalHeight(logicalHeight() + (logicalTop - oldLogicalTop)); |
| 1138 } | 1127 } |
| 1139 | 1128 |
| 1140 if (previousBlockFlow) { | 1129 if (previousBlockFlow) { |
| 1141 // If |child| is a self-collapsing block it may have collapsed into a pr
evious sibling and although it hasn't reduced the height of the parent yet | 1130 // If |child| is a self-collapsing block it may have collapsed into a pr
evious sibling and although it hasn't reduced the height of the parent yet |
| 1142 // any floats from the parent will now overhang. | 1131 // any floats from the parent will now overhang. |
| 1143 LayoutUnit oldLogicalHeight = logicalHeight(); | 1132 LayoutUnit oldLogicalHeight = logicalHeight(); |
| 1144 setLogicalHeight(logicalTop); | 1133 setLogicalHeight(logicalTop); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1174 } | 1163 } |
| 1175 | 1164 |
| 1176 RenderLayer* childLayer = child->layer(); | 1165 RenderLayer* childLayer = child->layer(); |
| 1177 if (childLayer->staticBlockPosition() != logicalTop) { | 1166 if (childLayer->staticBlockPosition() != logicalTop) { |
| 1178 childLayer->setStaticBlockPosition(logicalTop); | 1167 childLayer->setStaticBlockPosition(logicalTop); |
| 1179 if (hasStaticBlockPosition) | 1168 if (hasStaticBlockPosition) |
| 1180 child->setChildNeedsLayout(MarkOnlyThis); | 1169 child->setChildNeedsLayout(MarkOnlyThis); |
| 1181 } | 1170 } |
| 1182 } | 1171 } |
| 1183 | 1172 |
| 1184 LayoutUnit RenderBlockFlow::computeStartPositionDeltaForChildAvoidingFloats(cons
t RenderBox* child, LayoutUnit childMarginStart, RenderRegion* region) | 1173 LayoutUnit RenderBlockFlow::computeStartPositionDeltaForChildAvoidingFloats(cons
t RenderBox* child, LayoutUnit childMarginStart) |
| 1185 { | 1174 { |
| 1186 LayoutUnit startPosition = startOffsetForContent(region); | 1175 LayoutUnit startPosition = startOffsetForContent(); |
| 1187 | 1176 |
| 1188 // Add in our start margin. | 1177 // Add in our start margin. |
| 1189 LayoutUnit oldPosition = startPosition + childMarginStart; | 1178 LayoutUnit oldPosition = startPosition + childMarginStart; |
| 1190 LayoutUnit newPosition = oldPosition; | 1179 LayoutUnit newPosition = oldPosition; |
| 1191 | 1180 |
| 1192 LayoutUnit blockOffset = logicalTopForChild(child); | 1181 LayoutUnit blockOffset = logicalTopForChild(child); |
| 1193 if (region) | 1182 LayoutUnit startOff = startOffsetForLine(blockOffset, false, logicalHeightFo
rChild(child)); |
| 1194 blockOffset = max(blockOffset, blockOffset + (region->logicalTopForFlowT
hreadContent() - offsetFromLogicalTopOfFirstPage())); | |
| 1195 | |
| 1196 LayoutUnit startOff = startOffsetForLineInRegion(blockOffset, false, region,
logicalHeightForChild(child)); | |
| 1197 | 1183 |
| 1198 if (style()->textAlign() != WEBKIT_CENTER && !child->style()->marginStartUsi
ng(style()).isAuto()) { | 1184 if (style()->textAlign() != WEBKIT_CENTER && !child->style()->marginStartUsi
ng(style()).isAuto()) { |
| 1199 if (childMarginStart < 0) | 1185 if (childMarginStart < 0) |
| 1200 startOff += childMarginStart; | 1186 startOff += childMarginStart; |
| 1201 newPosition = max(newPosition, startOff); // Let the float sit in the ch
ild's margin if it can fit. | 1187 newPosition = max(newPosition, startOff); // Let the float sit in the ch
ild's margin if it can fit. |
| 1202 } else if (startOff != startPosition) { | 1188 } else if (startOff != startPosition) { |
| 1203 newPosition = startOff + childMarginStart; | 1189 newPosition = startOff + childMarginStart; |
| 1204 } | 1190 } |
| 1205 | 1191 |
| 1206 return newPosition - oldPosition; | 1192 return newPosition - oldPosition; |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1368 } | 1354 } |
| 1369 | 1355 |
| 1370 // Collapse the result with our current margins. | 1356 // Collapse the result with our current margins. |
| 1371 if (!discardMarginBefore) | 1357 if (!discardMarginBefore) |
| 1372 logicalTopEstimate += max(marginInfo.positiveMargin(), positiveMargi
nBefore) - max(marginInfo.negativeMargin(), negativeMarginBefore); | 1358 logicalTopEstimate += max(marginInfo.positiveMargin(), positiveMargi
nBefore) - max(marginInfo.negativeMargin(), negativeMarginBefore); |
| 1373 } | 1359 } |
| 1374 | 1360 |
| 1375 // Adjust logicalTopEstimate down to the next page if the margins are so lar
ge that we don't fit on the current | 1361 // Adjust logicalTopEstimate down to the next page if the margins are so lar
ge that we don't fit on the current |
| 1376 // page. | 1362 // page. |
| 1377 LayoutState* layoutState = view()->layoutState(); | 1363 LayoutState* layoutState = view()->layoutState(); |
| 1378 if (layoutState->isPaginated() && layoutState->pageLogicalHeight() && logica
lTopEstimate > logicalHeight() | 1364 if (layoutState->isPaginated() && layoutState->pageLogicalHeight() && logica
lTopEstimate > logicalHeight()) |
| 1379 && hasNextPage(logicalHeight())) | |
| 1380 logicalTopEstimate = min(logicalTopEstimate, nextPageLogicalTop(logicalH
eight())); | 1365 logicalTopEstimate = min(logicalTopEstimate, nextPageLogicalTop(logicalH
eight())); |
| 1381 | 1366 |
| 1382 logicalTopEstimate += getClearDelta(child, logicalTopEstimate); | 1367 logicalTopEstimate += getClearDelta(child, logicalTopEstimate); |
| 1383 | 1368 |
| 1384 estimateWithoutPagination = logicalTopEstimate; | 1369 estimateWithoutPagination = logicalTopEstimate; |
| 1385 | 1370 |
| 1386 if (layoutState->isPaginated()) { | 1371 if (layoutState->isPaginated()) { |
| 1387 // If the object has a page or column break value of "before", then we s
hould shift to the top of the next page. | 1372 // If the object has a page or column break value of "before", then we s
hould shift to the top of the next page. |
| 1388 logicalTopEstimate = applyBeforeBreak(child, logicalTopEstimate); | 1373 logicalTopEstimate = applyBeforeBreak(child, logicalTopEstimate); |
| 1389 | 1374 |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1568 return childStyle->marginBeforeCollapse() == MSEPARATE; | 1553 return childStyle->marginBeforeCollapse() == MSEPARATE; |
| 1569 | 1554 |
| 1570 // FIXME: See |mustDiscardMarginBeforeForChild| above. | 1555 // FIXME: See |mustDiscardMarginBeforeForChild| above. |
| 1571 return false; | 1556 return false; |
| 1572 } | 1557 } |
| 1573 | 1558 |
| 1574 LayoutUnit RenderBlockFlow::applyBeforeBreak(RenderBox* child, LayoutUnit logica
lOffset) | 1559 LayoutUnit RenderBlockFlow::applyBeforeBreak(RenderBox* child, LayoutUnit logica
lOffset) |
| 1575 { | 1560 { |
| 1576 // FIXME: Add page break checking here when we support printing. | 1561 // FIXME: Add page break checking here when we support printing. |
| 1577 RenderFlowThread* flowThread = flowThreadContainingBlock(); | 1562 RenderFlowThread* flowThread = flowThreadContainingBlock(); |
| 1578 bool isInsideMulticolFlowThread = flowThread && !flowThread->isRenderNamedFl
owThread(); | 1563 bool isInsideMulticolFlowThread = flowThread; |
| 1579 bool checkColumnBreaks = isInsideMulticolFlowThread || view()->layoutState()
->isPaginatingColumns(); | 1564 bool checkColumnBreaks = isInsideMulticolFlowThread || view()->layoutState()
->isPaginatingColumns(); |
| 1580 bool checkPageBreaks = !checkColumnBreaks && view()->layoutState()->m_pageLo
gicalHeight; // FIXME: Once columns can print we have to check this. | 1565 bool checkPageBreaks = !checkColumnBreaks && view()->layoutState()->m_pageLo
gicalHeight; // FIXME: Once columns can print we have to check this. |
| 1581 bool checkRegionBreaks = flowThread && flowThread->isRenderNamedFlowThread()
; | |
| 1582 bool checkBeforeAlways = (checkColumnBreaks && child->style()->columnBreakBe
fore() == PBALWAYS) | 1566 bool checkBeforeAlways = (checkColumnBreaks && child->style()->columnBreakBe
fore() == PBALWAYS) |
| 1583 || (checkPageBreaks && child->style()->pageBreakBefore() == PBALWAYS) | 1567 || (checkPageBreaks && child->style()->pageBreakBefore() == PBALWAYS); |
| 1584 || (checkRegionBreaks && child->style()->regionBreakBefore() == PBALWAYS
); | 1568 if (checkBeforeAlways && inNormalFlow(child)) { |
| 1585 if (checkBeforeAlways && inNormalFlow(child) && hasNextPage(logicalOffset, I
ncludePageBoundary)) { | |
| 1586 if (checkColumnBreaks) { | 1569 if (checkColumnBreaks) { |
| 1587 if (isInsideMulticolFlowThread) | 1570 if (isInsideMulticolFlowThread) { |
| 1588 checkRegionBreaks = true; | 1571 LayoutUnit offsetBreakAdjustment = 0; |
| 1589 else | 1572 if (flowThread->addForcedRegionBreak(offsetFromLogicalTopOfFirst
Page() + logicalOffset, child, true, &offsetBreakAdjustment)) |
| 1573 return logicalOffset + offsetBreakAdjustment; |
| 1574 } else { |
| 1590 view()->layoutState()->addForcedColumnBreak(child, logicalOffset
); | 1575 view()->layoutState()->addForcedColumnBreak(child, logicalOffset
); |
| 1591 } | 1576 } |
| 1592 if (checkRegionBreaks) { | |
| 1593 LayoutUnit offsetBreakAdjustment = 0; | |
| 1594 if (flowThread->addForcedRegionBreak(offsetFromLogicalTopOfFirstPage
() + logicalOffset, child, true, &offsetBreakAdjustment)) | |
| 1595 return logicalOffset + offsetBreakAdjustment; | |
| 1596 } | 1577 } |
| 1597 return nextPageLogicalTop(logicalOffset, IncludePageBoundary); | 1578 return nextPageLogicalTop(logicalOffset, IncludePageBoundary); |
| 1598 } | 1579 } |
| 1599 return logicalOffset; | 1580 return logicalOffset; |
| 1600 } | 1581 } |
| 1601 | 1582 |
| 1602 LayoutUnit RenderBlockFlow::applyAfterBreak(RenderBox* child, LayoutUnit logical
Offset, MarginInfo& marginInfo) | 1583 LayoutUnit RenderBlockFlow::applyAfterBreak(RenderBox* child, LayoutUnit logical
Offset, MarginInfo& marginInfo) |
| 1603 { | 1584 { |
| 1604 // FIXME: Add page break checking here when we support printing. | 1585 // FIXME: Add page break checking here when we support printing. |
| 1605 RenderFlowThread* flowThread = flowThreadContainingBlock(); | 1586 RenderFlowThread* flowThread = flowThreadContainingBlock(); |
| 1606 bool isInsideMulticolFlowThread = flowThread && !flowThread->isRenderNamedFl
owThread(); | 1587 bool isInsideMulticolFlowThread = flowThread; |
| 1607 bool checkColumnBreaks = isInsideMulticolFlowThread || view()->layoutState()
->isPaginatingColumns(); | 1588 bool checkColumnBreaks = isInsideMulticolFlowThread || view()->layoutState()
->isPaginatingColumns(); |
| 1608 bool checkPageBreaks = !checkColumnBreaks && view()->layoutState()->m_pageLo
gicalHeight; // FIXME: Once columns can print we have to check this. | 1589 bool checkPageBreaks = !checkColumnBreaks && view()->layoutState()->m_pageLo
gicalHeight; // FIXME: Once columns can print we have to check this. |
| 1609 bool checkRegionBreaks = flowThread && flowThread->isRenderNamedFlowThread()
; | |
| 1610 bool checkAfterAlways = (checkColumnBreaks && child->style()->columnBreakAft
er() == PBALWAYS) | 1590 bool checkAfterAlways = (checkColumnBreaks && child->style()->columnBreakAft
er() == PBALWAYS) |
| 1611 || (checkPageBreaks && child->style()->pageBreakAfter() == PBALWAYS) | 1591 || (checkPageBreaks && child->style()->pageBreakAfter() == PBALWAYS); |
| 1612 || (checkRegionBreaks && child->style()->regionBreakAfter() == PBALWAYS)
; | 1592 if (checkAfterAlways && inNormalFlow(child)) { |
| 1613 if (checkAfterAlways && inNormalFlow(child) && hasNextPage(logicalOffset, In
cludePageBoundary)) { | |
| 1614 LayoutUnit marginOffset = marginInfo.canCollapseWithMarginBefore() ? Lay
outUnit() : marginInfo.margin(); | 1593 LayoutUnit marginOffset = marginInfo.canCollapseWithMarginBefore() ? Lay
outUnit() : marginInfo.margin(); |
| 1615 | 1594 |
| 1616 // So our margin doesn't participate in the next collapsing steps. | 1595 // So our margin doesn't participate in the next collapsing steps. |
| 1617 marginInfo.clearMargin(); | 1596 marginInfo.clearMargin(); |
| 1618 | 1597 |
| 1619 if (checkColumnBreaks) { | 1598 if (checkColumnBreaks) { |
| 1620 if (isInsideMulticolFlowThread) | 1599 if (isInsideMulticolFlowThread) { |
| 1621 checkRegionBreaks = true; | 1600 LayoutUnit offsetBreakAdjustment = 0; |
| 1622 else | 1601 if (flowThread->addForcedRegionBreak(offsetFromLogicalTopOfFirst
Page() + logicalOffset + marginOffset, child, false, &offsetBreakAdjustment)) |
| 1602 return logicalOffset + marginOffset + offsetBreakAdjustment; |
| 1603 } else { |
| 1623 view()->layoutState()->addForcedColumnBreak(child, logicalOffset
); | 1604 view()->layoutState()->addForcedColumnBreak(child, logicalOffset
); |
| 1624 } | 1605 } |
| 1625 if (checkRegionBreaks) { | |
| 1626 LayoutUnit offsetBreakAdjustment = 0; | |
| 1627 if (flowThread->addForcedRegionBreak(offsetFromLogicalTopOfFirstPage
() + logicalOffset + marginOffset, child, false, &offsetBreakAdjustment)) | |
| 1628 return logicalOffset + marginOffset + offsetBreakAdjustment; | |
| 1629 } | 1606 } |
| 1630 return nextPageLogicalTop(logicalOffset, IncludePageBoundary); | 1607 return nextPageLogicalTop(logicalOffset, IncludePageBoundary); |
| 1631 } | 1608 } |
| 1632 return logicalOffset; | 1609 return logicalOffset; |
| 1633 } | 1610 } |
| 1634 | 1611 |
| 1635 void RenderBlockFlow::addOverflowFromFloats() | 1612 void RenderBlockFlow::addOverflowFromFloats() |
| 1636 { | 1613 { |
| 1637 if (!m_floatingObjects) | 1614 if (!m_floatingObjects) |
| 1638 return; | 1615 return; |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1747 logicalBottom = lowestFloatLogicalBottom(); | 1724 logicalBottom = lowestFloatLogicalBottom(); |
| 1748 break; | 1725 break; |
| 1749 } | 1726 } |
| 1750 | 1727 |
| 1751 // 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). | 1728 // 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). |
| 1752 LayoutUnit result = clearSet ? max<LayoutUnit>(0, logicalBottom - logicalTop
) : LayoutUnit(); | 1729 LayoutUnit result = clearSet ? max<LayoutUnit>(0, logicalBottom - logicalTop
) : LayoutUnit(); |
| 1753 if (!result && child->avoidsFloats()) { | 1730 if (!result && child->avoidsFloats()) { |
| 1754 LayoutUnit newLogicalTop = logicalTop; | 1731 LayoutUnit newLogicalTop = logicalTop; |
| 1755 while (true) { | 1732 while (true) { |
| 1756 LayoutUnit availableLogicalWidthAtNewLogicalTopOffset = availableLog
icalWidthForLine(newLogicalTop, false, logicalHeightForChild(child)); | 1733 LayoutUnit availableLogicalWidthAtNewLogicalTopOffset = availableLog
icalWidthForLine(newLogicalTop, false, logicalHeightForChild(child)); |
| 1757 if (availableLogicalWidthAtNewLogicalTopOffset == availableLogicalWi
dthForContent(newLogicalTop)) | 1734 if (availableLogicalWidthAtNewLogicalTopOffset == availableLogicalWi
dthForContent()) |
| 1758 return newLogicalTop - logicalTop; | 1735 return newLogicalTop - logicalTop; |
| 1759 | 1736 |
| 1760 RenderRegion* region = regionAtBlockOffset(logicalTopForChild(child)
); | 1737 LayoutRect borderBox = child->borderBoxRect(); |
| 1761 LayoutRect borderBox = child->borderBoxRectInRegion(region, DoNotCac
heRenderBoxRegionInfo); | |
| 1762 LayoutUnit childLogicalWidthAtOldLogicalTopOffset = isHorizontalWrit
ingMode() ? borderBox.width() : borderBox.height(); | 1738 LayoutUnit childLogicalWidthAtOldLogicalTopOffset = isHorizontalWrit
ingMode() ? borderBox.width() : borderBox.height(); |
| 1763 | 1739 |
| 1764 // FIXME: None of this is right for perpendicular writing-mode child
ren. | 1740 // FIXME: None of this is right for perpendicular writing-mode child
ren. |
| 1765 LayoutUnit childOldLogicalWidth = child->logicalWidth(); | 1741 LayoutUnit childOldLogicalWidth = child->logicalWidth(); |
| 1766 LayoutUnit childOldMarginLeft = child->marginLeft(); | 1742 LayoutUnit childOldMarginLeft = child->marginLeft(); |
| 1767 LayoutUnit childOldMarginRight = child->marginRight(); | 1743 LayoutUnit childOldMarginRight = child->marginRight(); |
| 1768 LayoutUnit childOldLogicalTop = child->logicalTop(); | 1744 LayoutUnit childOldLogicalTop = child->logicalTop(); |
| 1769 | 1745 |
| 1770 child->setLogicalTop(newLogicalTop); | 1746 child->setLogicalTop(newLogicalTop); |
| 1771 child->updateLogicalWidth(); | 1747 child->updateLogicalWidth(); |
| 1772 region = regionAtBlockOffset(logicalTopForChild(child)); | 1748 borderBox = child->borderBoxRect(); |
| 1773 borderBox = child->borderBoxRectInRegion(region, DoNotCacheRenderBox
RegionInfo); | |
| 1774 LayoutUnit childLogicalWidthAtNewLogicalTopOffset = isHorizontalWrit
ingMode() ? borderBox.width() : borderBox.height(); | 1749 LayoutUnit childLogicalWidthAtNewLogicalTopOffset = isHorizontalWrit
ingMode() ? borderBox.width() : borderBox.height(); |
| 1775 | 1750 |
| 1776 child->setLogicalTop(childOldLogicalTop); | 1751 child->setLogicalTop(childOldLogicalTop); |
| 1777 child->setLogicalWidth(childOldLogicalWidth); | 1752 child->setLogicalWidth(childOldLogicalWidth); |
| 1778 child->setMarginLeft(childOldMarginLeft); | 1753 child->setMarginLeft(childOldMarginLeft); |
| 1779 child->setMarginRight(childOldMarginRight); | 1754 child->setMarginRight(childOldMarginRight); |
| 1780 | 1755 |
| 1781 if (childLogicalWidthAtNewLogicalTopOffset <= availableLogicalWidthA
tNewLogicalTopOffset) { | 1756 if (childLogicalWidthAtNewLogicalTopOffset <= availableLogicalWidthA
tNewLogicalTopOffset) { |
| 1782 // Even though we may not be moving, if the logical width did sh
rink because of the presence of new floats, then | 1757 // Even though we may not be moving, if the logical width did sh
rink because of the presence of new floats, then |
| 1783 // we need to force a relayout as though we shifted. This happen
s because of the dynamic addition of overhanging floats | 1758 // we need to force a relayout as though we shifted. This happen
s because of the dynamic addition of overhanging floats |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1839 break; | 1814 break; |
| 1840 } | 1815 } |
| 1841 } | 1816 } |
| 1842 } | 1817 } |
| 1843 } | 1818 } |
| 1844 } | 1819 } |
| 1845 | 1820 |
| 1846 parentBlockFlow->markAllDescendantsWithFloatsForLayout(); | 1821 parentBlockFlow->markAllDescendantsWithFloatsForLayout(); |
| 1847 parentBlockFlow->markSiblingsWithFloatsForLayout(); | 1822 parentBlockFlow->markSiblingsWithFloatsForLayout(); |
| 1848 } | 1823 } |
| 1849 | |
| 1850 if (renderNamedFlowFragment()) | |
| 1851 renderNamedFlowFragment()->setStyleForNamedFlowFragment(style()); | |
| 1852 } | 1824 } |
| 1853 | 1825 |
| 1854 void RenderBlockFlow::updateStaticInlinePositionForChild(RenderBox* child, Layou
tUnit logicalTop) | 1826 void RenderBlockFlow::updateStaticInlinePositionForChild(RenderBox* child, Layou
tUnit logicalTop) |
| 1855 { | 1827 { |
| 1856 if (child->style()->isOriginalDisplayInlineType()) | 1828 if (child->style()->isOriginalDisplayInlineType()) |
| 1857 setStaticInlinePositionForChild(child, logicalTop, startAlignedOffsetFor
Line(logicalTop, false)); | 1829 setStaticInlinePositionForChild(child, logicalTop, startAlignedOffsetFor
Line(logicalTop, false)); |
| 1858 else | 1830 else |
| 1859 setStaticInlinePositionForChild(child, logicalTop, startOffsetForContent
(logicalTop)); | 1831 setStaticInlinePositionForChild(child, logicalTop, startOffsetForContent
()); |
| 1860 } | 1832 } |
| 1861 | 1833 |
| 1862 void RenderBlockFlow::setStaticInlinePositionForChild(RenderBox* child, LayoutUn
it blockOffset, LayoutUnit inlinePosition) | 1834 void RenderBlockFlow::setStaticInlinePositionForChild(RenderBox* child, LayoutUn
it blockOffset, LayoutUnit inlinePosition) |
| 1863 { | 1835 { |
| 1864 if (flowThreadContainingBlock()) { | |
| 1865 // Shift the inline position to exclude the region offset. | |
| 1866 inlinePosition += startOffsetForContent() - startOffsetForContent(blockO
ffset); | |
| 1867 } | |
| 1868 child->layer()->setStaticInlinePosition(inlinePosition); | 1836 child->layer()->setStaticInlinePosition(inlinePosition); |
| 1869 } | 1837 } |
| 1870 | 1838 |
| 1871 void RenderBlockFlow::moveAllChildrenIncludingFloatsTo(RenderBlock* toBlock, boo
l fullRemoveInsert) | 1839 void RenderBlockFlow::moveAllChildrenIncludingFloatsTo(RenderBlock* toBlock, boo
l fullRemoveInsert) |
| 1872 { | 1840 { |
| 1873 RenderBlockFlow* toBlockFlow = toRenderBlockFlow(toBlock); | 1841 RenderBlockFlow* toBlockFlow = toRenderBlockFlow(toBlock); |
| 1874 moveAllChildrenTo(toBlockFlow, fullRemoveInsert); | 1842 moveAllChildrenTo(toBlockFlow, fullRemoveInsert); |
| 1875 | 1843 |
| 1876 // When a portion of the render tree is being detached, anonymous blocks | 1844 // When a portion of the render tree is being detached, anonymous blocks |
| 1877 // will be combined as their children are deleted. In this process, the | 1845 // will be combined as their children are deleted. In this process, the |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2169 // FIXME: Dynamic changes to the font or to the inline position need to resu
lt in a deep relayout. | 2137 // FIXME: Dynamic changes to the font or to the inline position need to resu
lt in a deep relayout. |
| 2170 // (https://bugs.webkit.org/show_bug.cgi?id=79944) | 2138 // (https://bugs.webkit.org/show_bug.cgi?id=79944) |
| 2171 float remainder = fmodf(fmodf(right + layoutOffset - lineGridOffset, maxChar
Width), maxCharWidth); | 2139 float remainder = fmodf(fmodf(right + layoutOffset - lineGridOffset, maxChar
Width), maxCharWidth); |
| 2172 right -= LayoutUnit::fromFloatCeil(remainder); | 2140 right -= LayoutUnit::fromFloatCeil(remainder); |
| 2173 return right; | 2141 return right; |
| 2174 } | 2142 } |
| 2175 | 2143 |
| 2176 LayoutPoint RenderBlockFlow::computeLogicalLocationForFloat(const FloatingObject
* floatingObject, LayoutUnit logicalTopOffset) const | 2144 LayoutPoint RenderBlockFlow::computeLogicalLocationForFloat(const FloatingObject
* floatingObject, LayoutUnit logicalTopOffset) const |
| 2177 { | 2145 { |
| 2178 RenderBox* childBox = floatingObject->renderer(); | 2146 RenderBox* childBox = floatingObject->renderer(); |
| 2179 LayoutUnit logicalLeftOffset = logicalLeftOffsetForContent(logicalTopOffset)
; // Constant part of left offset. | 2147 LayoutUnit logicalLeftOffset = logicalLeftOffsetForContent(); // Constant pa
rt of left offset. |
| 2180 LayoutUnit logicalRightOffset; // Constant part of right offset. | 2148 LayoutUnit logicalRightOffset; // Constant part of right offset. |
| 2181 // FIXME Bug 102948: This only works for shape outside directly set on this
block. | 2149 // FIXME Bug 102948: This only works for shape outside directly set on this
block. |
| 2182 ShapeInsideInfo* shapeInsideInfo = this->layoutShapeInsideInfo(); | 2150 ShapeInsideInfo* shapeInsideInfo = this->layoutShapeInsideInfo(); |
| 2183 // FIXME: Implement behavior for right floats. | 2151 // FIXME: Implement behavior for right floats. |
| 2184 if (shapeInsideInfo) { | 2152 if (shapeInsideInfo) { |
| 2185 LayoutSize floatLogicalSize = logicalSizeForFloat(floatingObject); | 2153 LayoutSize floatLogicalSize = logicalSizeForFloat(floatingObject); |
| 2186 // floatingObject's logicalSize doesn't contain the actual height at thi
s point, so we need to calculate it | 2154 // floatingObject's logicalSize doesn't contain the actual height at thi
s point, so we need to calculate it |
| 2187 floatLogicalSize.setHeight(logicalHeightForChild(childBox) + marginBefor
eForChild(childBox) + marginAfterForChild(childBox)); | 2155 floatLogicalSize.setHeight(logicalHeightForChild(childBox) + marginBefor
eForChild(childBox) + marginAfterForChild(childBox)); |
| 2188 | 2156 |
| 2189 // FIXME: If the float doesn't fit in the shape we should push it under
the content box | 2157 // FIXME: If the float doesn't fit in the shape we should push it under
the content box |
| 2190 logicalTopOffset = shapeInsideInfo->computeFirstFitPositionForFloat(floa
tLogicalSize); | 2158 logicalTopOffset = shapeInsideInfo->computeFirstFitPositionForFloat(floa
tLogicalSize); |
| 2191 if (logicalHeight() > logicalTopOffset) | 2159 if (logicalHeight() > logicalTopOffset) |
| 2192 logicalTopOffset = logicalHeight(); | 2160 logicalTopOffset = logicalHeight(); |
| 2193 | 2161 |
| 2194 SegmentList segments = shapeInsideInfo->computeSegmentsForLine(logicalTo
pOffset, floatLogicalSize.height()); | 2162 SegmentList segments = shapeInsideInfo->computeSegmentsForLine(logicalTo
pOffset, floatLogicalSize.height()); |
| 2195 // FIXME: Add support for shapes with multiple segments. | 2163 // FIXME: Add support for shapes with multiple segments. |
| 2196 if (segments.size() == 1) { | 2164 if (segments.size() == 1) { |
| 2197 // The segment offsets are relative to the content box. | 2165 // The segment offsets are relative to the content box. |
| 2198 logicalRightOffset = logicalLeftOffset + segments[0].logicalRight; | 2166 logicalRightOffset = logicalLeftOffset + segments[0].logicalRight; |
| 2199 logicalLeftOffset += segments[0].logicalLeft; | 2167 logicalLeftOffset += segments[0].logicalLeft; |
| 2200 } | 2168 } |
| 2201 } else { | 2169 } else { |
| 2202 logicalRightOffset = logicalRightOffsetForContent(logicalTopOffset); | 2170 logicalRightOffset = logicalRightOffsetForContent(); |
| 2203 } | 2171 } |
| 2204 | 2172 |
| 2205 LayoutUnit floatLogicalWidth = min(logicalWidthForFloat(floatingObject), log
icalRightOffset - logicalLeftOffset); // The width we look for. | 2173 LayoutUnit floatLogicalWidth = min(logicalWidthForFloat(floatingObject), log
icalRightOffset - logicalLeftOffset); // The width we look for. |
| 2206 | 2174 |
| 2207 LayoutUnit floatLogicalLeft; | 2175 LayoutUnit floatLogicalLeft; |
| 2208 | 2176 |
| 2209 bool insideFlowThread = flowThreadContainingBlock(); | 2177 bool insideFlowThread = flowThreadContainingBlock(); |
| 2210 | 2178 |
| 2211 if (childBox->style()->floating() == LeftFloat) { | 2179 if (childBox->style()->floating() == LeftFloat) { |
| 2212 LayoutUnit heightRemainingLeft = 1; | 2180 LayoutUnit heightRemainingLeft = 1; |
| 2213 LayoutUnit heightRemainingRight = 1; | 2181 LayoutUnit heightRemainingRight = 1; |
| 2214 floatLogicalLeft = logicalLeftOffsetForPositioningFloat(logicalTopOffset
, logicalLeftOffset, false, &heightRemainingLeft); | 2182 floatLogicalLeft = logicalLeftOffsetForPositioningFloat(logicalTopOffset
, logicalLeftOffset, false, &heightRemainingLeft); |
| 2215 while (logicalRightOffsetForPositioningFloat(logicalTopOffset, logicalRi
ghtOffset, false, &heightRemainingRight) - floatLogicalLeft < floatLogicalWidth)
{ | 2183 while (logicalRightOffsetForPositioningFloat(logicalTopOffset, logicalRi
ghtOffset, false, &heightRemainingRight) - floatLogicalLeft < floatLogicalWidth)
{ |
| 2216 logicalTopOffset += min(heightRemainingLeft, heightRemainingRight); | 2184 logicalTopOffset += min(heightRemainingLeft, heightRemainingRight); |
| 2217 floatLogicalLeft = logicalLeftOffsetForPositioningFloat(logicalTopOf
fset, logicalLeftOffset, false, &heightRemainingLeft); | 2185 floatLogicalLeft = logicalLeftOffsetForPositioningFloat(logicalTopOf
fset, logicalLeftOffset, false, &heightRemainingLeft); |
| 2218 if (insideFlowThread) { | 2186 if (insideFlowThread) { |
| 2219 // Have to re-evaluate all of our offsets, since they may have c
hanged. | 2187 // Have to re-evaluate all of our offsets, since they may have c
hanged. |
| 2220 logicalRightOffset = logicalRightOffsetForContent(logicalTopOffs
et); // Constant part of right offset. | 2188 logicalRightOffset = logicalRightOffsetForContent(); // Constant
part of right offset. |
| 2221 logicalLeftOffset = logicalLeftOffsetForContent(logicalTopOffset
); // Constant part of left offset. | 2189 logicalLeftOffset = logicalLeftOffsetForContent(); // Constant p
art of left offset. |
| 2222 floatLogicalWidth = min(logicalWidthForFloat(floatingObject), lo
gicalRightOffset - logicalLeftOffset); | 2190 floatLogicalWidth = min(logicalWidthForFloat(floatingObject), lo
gicalRightOffset - logicalLeftOffset); |
| 2223 } | 2191 } |
| 2224 } | 2192 } |
| 2225 floatLogicalLeft = max(logicalLeftOffset - borderAndPaddingLogicalLeft()
, floatLogicalLeft); | 2193 floatLogicalLeft = max(logicalLeftOffset - borderAndPaddingLogicalLeft()
, floatLogicalLeft); |
| 2226 } else { | 2194 } else { |
| 2227 LayoutUnit heightRemainingLeft = 1; | 2195 LayoutUnit heightRemainingLeft = 1; |
| 2228 LayoutUnit heightRemainingRight = 1; | 2196 LayoutUnit heightRemainingRight = 1; |
| 2229 floatLogicalLeft = logicalRightOffsetForPositioningFloat(logicalTopOffse
t, logicalRightOffset, false, &heightRemainingRight); | 2197 floatLogicalLeft = logicalRightOffsetForPositioningFloat(logicalTopOffse
t, logicalRightOffset, false, &heightRemainingRight); |
| 2230 while (floatLogicalLeft - logicalLeftOffsetForPositioningFloat(logicalTo
pOffset, logicalLeftOffset, false, &heightRemainingLeft) < floatLogicalWidth) { | 2198 while (floatLogicalLeft - logicalLeftOffsetForPositioningFloat(logicalTo
pOffset, logicalLeftOffset, false, &heightRemainingLeft) < floatLogicalWidth) { |
| 2231 logicalTopOffset += min(heightRemainingLeft, heightRemainingRight); | 2199 logicalTopOffset += min(heightRemainingLeft, heightRemainingRight); |
| 2232 floatLogicalLeft = logicalRightOffsetForPositioningFloat(logicalTopO
ffset, logicalRightOffset, false, &heightRemainingRight); | 2200 floatLogicalLeft = logicalRightOffsetForPositioningFloat(logicalTopO
ffset, logicalRightOffset, false, &heightRemainingRight); |
| 2233 if (insideFlowThread) { | 2201 if (insideFlowThread) { |
| 2234 // Have to re-evaluate all of our offsets, since they may have c
hanged. | 2202 // Have to re-evaluate all of our offsets, since they may have c
hanged. |
| 2235 logicalRightOffset = logicalRightOffsetForContent(logicalTopOffs
et); // Constant part of right offset. | 2203 logicalRightOffset = logicalRightOffsetForContent(); // Constant
part of right offset. |
| 2236 logicalLeftOffset = logicalLeftOffsetForContent(logicalTopOffset
); // Constant part of left offset. | 2204 logicalLeftOffset = logicalLeftOffsetForContent(); // Constant p
art of left offset. |
| 2237 floatLogicalWidth = min(logicalWidthForFloat(floatingObject), lo
gicalRightOffset - logicalLeftOffset); | 2205 floatLogicalWidth = min(logicalWidthForFloat(floatingObject), lo
gicalRightOffset - logicalLeftOffset); |
| 2238 } | 2206 } |
| 2239 } | 2207 } |
| 2240 // Use the original width of the float here, since the local variable | 2208 // Use the original width of the float here, since the local variable |
| 2241 // |floatLogicalWidth| was capped to the available line width. See | 2209 // |floatLogicalWidth| was capped to the available line width. See |
| 2242 // fast/block/float/clamped-right-float.html. | 2210 // fast/block/float/clamped-right-float.html. |
| 2243 floatLogicalLeft -= logicalWidthForFloat(floatingObject); | 2211 floatLogicalLeft -= logicalWidthForFloat(floatingObject); |
| 2244 } | 2212 } |
| 2245 | 2213 |
| 2246 return LayoutPoint(floatLogicalLeft, logicalTopOffset); | 2214 return LayoutPoint(floatLogicalLeft, logicalTopOffset); |
| (...skipping 575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2822 return constructTextRun(context, font, string, style, | 2790 return constructTextRun(context, font, string, style, |
| 2823 determineDirectionality(string, hasStrongDirectionality), | 2791 determineDirectionality(string, hasStrongDirectionality), |
| 2824 expansion, flags); | 2792 expansion, flags); |
| 2825 } | 2793 } |
| 2826 | 2794 |
| 2827 RootInlineBox* RenderBlockFlow::createRootInlineBox() | 2795 RootInlineBox* RenderBlockFlow::createRootInlineBox() |
| 2828 { | 2796 { |
| 2829 return new RootInlineBox(this); | 2797 return new RootInlineBox(this); |
| 2830 } | 2798 } |
| 2831 | 2799 |
| 2832 void RenderBlockFlow::createRenderNamedFlowFragmentIfNeeded() | |
| 2833 { | |
| 2834 if (!RuntimeEnabledFeatures::cssRegionsEnabled() | |
| 2835 || renderNamedFlowFragment() | |
| 2836 || isRenderNamedFlowFragment()) | |
| 2837 return; | |
| 2838 | |
| 2839 RenderStyle* styleToUse = style(); | |
| 2840 if (styleToUse->isDisplayRegionType() && styleToUse->hasFlowFrom() && docume
nt().renderView()) { | |
| 2841 RenderNamedFlowFragment* flowFragment = RenderNamedFlowFragment::createA
nonymous(&document()); | |
| 2842 flowFragment->setStyleForNamedFlowFragment(styleToUse); | |
| 2843 setRenderNamedFlowFragment(flowFragment); | |
| 2844 addChild(flowFragment); | |
| 2845 } | |
| 2846 } | |
| 2847 | |
| 2848 void RenderBlockFlow::insertedIntoTree() | |
| 2849 { | |
| 2850 RenderBlock::insertedIntoTree(); | |
| 2851 | |
| 2852 createRenderNamedFlowFragmentIfNeeded(); | |
| 2853 } | |
| 2854 | |
| 2855 bool RenderBlockFlow::canHaveChildren() const | |
| 2856 { | |
| 2857 return !renderNamedFlowFragment() ? RenderBlock::canHaveChildren() : renderN
amedFlowFragment()->canHaveChildren(); | |
| 2858 } | |
| 2859 | |
| 2860 bool RenderBlockFlow::canHaveGeneratedChildren() const | |
| 2861 { | |
| 2862 return !renderNamedFlowFragment() ? RenderBlock::canHaveGeneratedChildren()
: renderNamedFlowFragment()->canHaveGeneratedChildren(); | |
| 2863 } | |
| 2864 | |
| 2865 void RenderBlockFlow::updateLogicalHeight() | |
| 2866 { | |
| 2867 RenderBlock::updateLogicalHeight(); | |
| 2868 | |
| 2869 if (renderNamedFlowFragment()) | |
| 2870 renderNamedFlowFragment()->setLogicalHeight(max<LayoutUnit>(0, logicalHe
ight() - borderAndPaddingLogicalHeight())); | |
| 2871 } | |
| 2872 | |
| 2873 void RenderBlockFlow::setRenderNamedFlowFragment(RenderNamedFlowFragment* flowFr
agment) | |
| 2874 { | |
| 2875 RenderBlockFlow::RenderBlockFlowRareData& rareData = ensureRareData(); | |
| 2876 if (rareData.m_renderNamedFlowFragment) | |
| 2877 rareData.m_renderNamedFlowFragment->destroy(); | |
| 2878 rareData.m_renderNamedFlowFragment = flowFragment; | |
| 2879 } | |
| 2880 | |
| 2881 RenderBlockFlow::RenderBlockFlowRareData& RenderBlockFlow::ensureRareData() | 2800 RenderBlockFlow::RenderBlockFlowRareData& RenderBlockFlow::ensureRareData() |
| 2882 { | 2801 { |
| 2883 if (m_rareData) | 2802 if (m_rareData) |
| 2884 return *m_rareData; | 2803 return *m_rareData; |
| 2885 | 2804 |
| 2886 m_rareData = adoptPtr(new RenderBlockFlowRareData(this)); | 2805 m_rareData = adoptPtr(new RenderBlockFlowRareData(this)); |
| 2887 return *m_rareData; | 2806 return *m_rareData; |
| 2888 } | 2807 } |
| 2889 | 2808 |
| 2890 } // namespace WebCore | 2809 } // namespace WebCore |
| OLD | NEW |