| 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 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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/RenderInline.h" | 52 #include "core/rendering/RenderInline.h" |
| 53 #include "core/rendering/RenderLayer.h" | 53 #include "core/rendering/RenderLayer.h" |
| 54 #include "core/rendering/RenderMarquee.h" | 54 #include "core/rendering/RenderMarquee.h" |
| 55 #include "core/rendering/RenderNamedFlowThread.h" | |
| 56 #include "core/rendering/RenderRegion.h" | |
| 57 #include "core/rendering/RenderTableCell.h" | 55 #include "core/rendering/RenderTableCell.h" |
| 58 #include "core/rendering/RenderTextControl.h" | 56 #include "core/rendering/RenderTextControl.h" |
| 59 #include "core/rendering/RenderTextFragment.h" | 57 #include "core/rendering/RenderTextFragment.h" |
| 60 #include "core/rendering/RenderTheme.h" | 58 #include "core/rendering/RenderTheme.h" |
| 61 #include "core/rendering/RenderView.h" | 59 #include "core/rendering/RenderView.h" |
| 62 #include "core/rendering/shapes/ShapeOutsideInfo.h" | 60 #include "core/rendering/shapes/ShapeOutsideInfo.h" |
| 63 #include "core/rendering/style/ContentData.h" | 61 #include "core/rendering/style/ContentData.h" |
| 64 #include "core/rendering/style/RenderStyle.h" | 62 #include "core/rendering/style/RenderStyle.h" |
| 65 #include "platform/geometry/FloatQuad.h" | 63 #include "platform/geometry/FloatQuad.h" |
| 66 #include "platform/geometry/TransformState.h" | 64 #include "platform/geometry/TransformState.h" |
| (...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 499 else { | 497 else { |
| 500 RenderObject* cloneRenderer = toElement(node())->createRenderer(style())
; | 498 RenderObject* cloneRenderer = toElement(node())->createRenderer(style())
; |
| 501 cloneBlock = toRenderBlock(cloneRenderer); | 499 cloneBlock = toRenderBlock(cloneRenderer); |
| 502 cloneBlock->setStyle(style()); | 500 cloneBlock->setStyle(style()); |
| 503 | 501 |
| 504 // This takes care of setting the right value of childrenInline in case | 502 // This takes care of setting the right value of childrenInline in case |
| 505 // generated content is added to cloneBlock and 'this' does not have | 503 // generated content is added to cloneBlock and 'this' does not have |
| 506 // generated content added yet. | 504 // generated content added yet. |
| 507 cloneBlock->setChildrenInline(cloneBlock->firstChild() ? cloneBlock->fir
stChild()->isInline() : childrenInline()); | 505 cloneBlock->setChildrenInline(cloneBlock->firstChild() ? cloneBlock->fir
stChild()->isInline() : childrenInline()); |
| 508 } | 506 } |
| 509 cloneBlock->setFlowThreadState(flowThreadState()); | |
| 510 return cloneBlock; | 507 return cloneBlock; |
| 511 } | 508 } |
| 512 | 509 |
| 513 void RenderBlock::splitBlocks(RenderBlock* fromBlock, RenderBlock* toBlock, | 510 void RenderBlock::splitBlocks(RenderBlock* fromBlock, RenderBlock* toBlock, |
| 514 RenderBlock* middleBlock, | 511 RenderBlock* middleBlock, |
| 515 RenderObject* beforeChild, RenderBoxModelObject* o
ldCont) | 512 RenderObject* beforeChild, RenderBoxModelObject* o
ldCont) |
| 516 { | 513 { |
| 517 // Create a clone of this inline. | 514 // Create a clone of this inline. |
| 518 RenderBlock* cloneBlock = clone(); | 515 RenderBlock* cloneBlock = clone(); |
| 519 if (!isAnonymousBlock()) | 516 if (!isAnonymousBlock()) |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 759 } | 756 } |
| 760 | 757 |
| 761 // Check for a spanning element in columns. | 758 // Check for a spanning element in columns. |
| 762 if (gColumnFlowSplitEnabled) { | 759 if (gColumnFlowSplitEnabled) { |
| 763 RenderBlockFlow* columnsBlockAncestor = columnsBlockForSpanningElement(n
ewChild); | 760 RenderBlockFlow* columnsBlockAncestor = columnsBlockForSpanningElement(n
ewChild); |
| 764 if (columnsBlockAncestor) { | 761 if (columnsBlockAncestor) { |
| 765 TemporaryChange<bool> columnFlowSplitEnabled(gColumnFlowSplitEnabled
, false); | 762 TemporaryChange<bool> columnFlowSplitEnabled(gColumnFlowSplitEnabled
, false); |
| 766 // We are placing a column-span element inside a block. | 763 // We are placing a column-span element inside a block. |
| 767 RenderBlockFlow* newBox = createAnonymousColumnSpanBlock(); | 764 RenderBlockFlow* newBox = createAnonymousColumnSpanBlock(); |
| 768 | 765 |
| 769 if (columnsBlockAncestor != this && !isRenderFlowThread()) { | 766 if (columnsBlockAncestor != this) { |
| 770 // We are nested inside a multi-column element and are being spl
it by the span. We have to break up | 767 // We are nested inside a multi-column element and are being spl
it by the span. We have to break up |
| 771 // our block into continuations. | 768 // our block into continuations. |
| 772 RenderBoxModelObject* oldContinuation = continuation(); | 769 RenderBoxModelObject* oldContinuation = continuation(); |
| 773 | 770 |
| 774 // When we split an anonymous block, there's no need to do any c
ontinuation hookup, | 771 // When we split an anonymous block, there's no need to do any c
ontinuation hookup, |
| 775 // since we haven't actually split a real element. | 772 // since we haven't actually split a real element. |
| 776 if (!isAnonymousBlock()) | 773 if (!isAnonymousBlock()) |
| 777 setContinuation(newBox); | 774 setContinuation(newBox); |
| 778 | 775 |
| 779 splitFlow(beforeChild, newBox, newChild, oldContinuation); | 776 splitFlow(beforeChild, newBox, newChild, oldContinuation); |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 971 | 968 |
| 972 if (child->previousSibling()) | 969 if (child->previousSibling()) |
| 973 child->previousSibling()->setNextSibling(child->nextSibling()); | 970 child->previousSibling()->setNextSibling(child->nextSibling()); |
| 974 if (child->nextSibling()) | 971 if (child->nextSibling()) |
| 975 child->nextSibling()->setPreviousSibling(child->previousSibling()); | 972 child->nextSibling()->setPreviousSibling(child->previousSibling()); |
| 976 } | 973 } |
| 977 | 974 |
| 978 child->children()->setFirstChild(0); | 975 child->children()->setFirstChild(0); |
| 979 child->m_next = 0; | 976 child->m_next = 0; |
| 980 | 977 |
| 981 // Remove all the information in the flow thread associated with the leftove
r anonymous block. | |
| 982 child->removeFromRenderFlowThread(); | |
| 983 | |
| 984 child->setParent(0); | 978 child->setParent(0); |
| 985 child->setPreviousSibling(0); | 979 child->setPreviousSibling(0); |
| 986 child->setNextSibling(0); | 980 child->setNextSibling(0); |
| 987 | 981 |
| 988 child->destroy(); | 982 child->destroy(); |
| 989 } | 983 } |
| 990 | 984 |
| 991 static bool canMergeContiguousAnonymousBlocks(RenderObject* oldChild, RenderObje
ct* prev, RenderObject* next) | 985 static bool canMergeContiguousAnonymousBlocks(RenderObject* oldChild, RenderObje
ct* prev, RenderObject* next) |
| 992 { | 986 { |
| 993 if (oldChild->documentBeingDestroyed() || oldChild->isInline() || oldChild->
virtualContinuation()) | 987 if (oldChild->documentBeingDestroyed() || oldChild->isInline() || oldChild->
virtualContinuation()) |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1013 { | 1007 { |
| 1014 // It's possible that this block's destruction may have been triggered by th
e | 1008 // It's possible that this block's destruction may have been triggered by th
e |
| 1015 // child's removal. Just bail if the anonymous child block is already being | 1009 // child's removal. Just bail if the anonymous child block is already being |
| 1016 // destroyed. See crbug.com/282088 | 1010 // destroyed. See crbug.com/282088 |
| 1017 if (child->beingDestroyed()) | 1011 if (child->beingDestroyed()) |
| 1018 return; | 1012 return; |
| 1019 parent->setNeedsLayoutAndPrefWidthsRecalc(); | 1013 parent->setNeedsLayoutAndPrefWidthsRecalc(); |
| 1020 parent->setChildrenInline(child->childrenInline()); | 1014 parent->setChildrenInline(child->childrenInline()); |
| 1021 RenderObject* nextSibling = child->nextSibling(); | 1015 RenderObject* nextSibling = child->nextSibling(); |
| 1022 | 1016 |
| 1023 RenderFlowThread* childFlowThread = child->flowThreadContainingBlock(); | |
| 1024 CurrentRenderFlowThreadMaintainer flowThreadMaintainer(childFlowThread); | |
| 1025 | |
| 1026 parent->children()->removeChildNode(parent, child, child->hasLayer()); | 1017 parent->children()->removeChildNode(parent, child, child->hasLayer()); |
| 1027 child->moveAllChildrenTo(parent, nextSibling, child->hasLayer()); | 1018 child->moveAllChildrenTo(parent, nextSibling, child->hasLayer()); |
| 1028 // Explicitly delete the child's line box tree, or the special anonymous | 1019 // Explicitly delete the child's line box tree, or the special anonymous |
| 1029 // block handling in willBeDestroyed will cause problems. | 1020 // block handling in willBeDestroyed will cause problems. |
| 1030 child->deleteLineBoxTree(); | 1021 child->deleteLineBoxTree(); |
| 1031 if (childFlowThread && childFlowThread->isRenderNamedFlowThread()) | |
| 1032 toRenderNamedFlowThread(childFlowThread)->removeFlowChildInfo(child); | |
| 1033 child->destroy(); | 1022 child->destroy(); |
| 1034 } | 1023 } |
| 1035 | 1024 |
| 1036 void RenderBlock::removeChild(RenderObject* oldChild) | 1025 void RenderBlock::removeChild(RenderObject* oldChild) |
| 1037 { | 1026 { |
| 1038 // No need to waste time in merging or removing empty anonymous blocks. | 1027 // No need to waste time in merging or removing empty anonymous blocks. |
| 1039 // We can just bail out if our document is getting destroyed. | 1028 // We can just bail out if our document is getting destroyed. |
| 1040 if (documentBeingDestroyed()) { | 1029 if (documentBeingDestroyed()) { |
| 1041 RenderBox::removeChild(oldChild); | 1030 RenderBox::removeChild(oldChild); |
| 1042 return; | 1031 return; |
| (...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1330 // of a layout pass | 1319 // of a layout pass |
| 1331 child->setNormalChildNeedsLayout(true); | 1320 child->setNormalChildNeedsLayout(true); |
| 1332 child->markShapeInsideDescendantsForLayout(); | 1321 child->markShapeInsideDescendantsForLayout(); |
| 1333 child->layoutIfNeeded(); | 1322 child->layoutIfNeeded(); |
| 1334 } | 1323 } |
| 1335 | 1324 |
| 1336 ShapeInsideInfo* RenderBlock::layoutShapeInsideInfo() const | 1325 ShapeInsideInfo* RenderBlock::layoutShapeInsideInfo() const |
| 1337 { | 1326 { |
| 1338 if (ShapeInsideInfo* shapeInsideInfo = view()->layoutState()->shapeInsideInf
o()) | 1327 if (ShapeInsideInfo* shapeInsideInfo = view()->layoutState()->shapeInsideInf
o()) |
| 1339 return shapeInsideInfo; | 1328 return shapeInsideInfo; |
| 1340 | |
| 1341 RenderFlowThread* flowThread = flowThreadContainingBlock(); | |
| 1342 if (allowsShapeInsideInfoSharing(flowThread)) { | |
| 1343 LayoutUnit lineHeight = this->lineHeight(false, isHorizontalWritingMode(
) ? HorizontalLine : VerticalLine, PositionOfInteriorLineBoxes); | |
| 1344 // regionAtBlockOffset returns regions like an array first={0,N-1}, seco
nd={N,M-1}, ... | |
| 1345 LayoutUnit offset = logicalHeight() + lineHeight - LayoutUnit(1); | |
| 1346 RenderRegion* region = regionAtBlockOffset(offset); | |
| 1347 if (region && region->logicalHeight()) | |
| 1348 return region->shapeInsideInfo(); | |
| 1349 } | |
| 1350 | |
| 1351 return 0; | 1329 return 0; |
| 1352 } | 1330 } |
| 1353 | 1331 |
| 1354 LayoutSize RenderBlock::logicalOffsetFromShapeAncestorContainer(const RenderBloc
k* container) const | 1332 LayoutSize RenderBlock::logicalOffsetFromShapeAncestorContainer(const RenderBloc
k* container) const |
| 1355 { | 1333 { |
| 1356 const RenderBlock* currentBlock = this; | 1334 const RenderBlock* currentBlock = this; |
| 1357 LayoutRect blockRect(currentBlock->borderBoxRect()); | 1335 LayoutRect blockRect(currentBlock->borderBoxRect()); |
| 1358 while (currentBlock && !currentBlock->isRenderFlowThread() && currentBlock !
= container) { | 1336 while (currentBlock && currentBlock != container) { |
| 1359 RenderBlock* containerBlock = currentBlock->containingBlock(); | 1337 RenderBlock* containerBlock = currentBlock->containingBlock(); |
| 1360 ASSERT(containerBlock); | 1338 ASSERT(containerBlock); |
| 1361 if (!containerBlock) | 1339 if (!containerBlock) |
| 1362 return LayoutSize(); | 1340 return LayoutSize(); |
| 1363 | 1341 |
| 1364 if (containerBlock->style()->writingMode() != currentBlock->style()->wri
tingMode()) { | 1342 if (containerBlock->style()->writingMode() != currentBlock->style()->wri
tingMode()) { |
| 1365 // We have to put the block rect in container coordinates | 1343 // We have to put the block rect in container coordinates |
| 1366 // and we have to take into account both the container and current b
lock flipping modes | 1344 // and we have to take into account both the container and current b
lock flipping modes |
| 1367 // Bug: Flipping inline and block directions at the same time will n
ot work, | 1345 // Bug: Flipping inline and block directions at the same time will n
ot work, |
| 1368 // as one of the flipped dimensions will not yet have been set to it
s final size | 1346 // as one of the flipped dimensions will not yet have been set to it
s final size |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1410 | 1388 |
| 1411 if (shapeInside) { | 1389 if (shapeInside) { |
| 1412 ShapeInsideInfo* shapeInsideInfo = ensureShapeInsideInfo(); | 1390 ShapeInsideInfo* shapeInsideInfo = ensureShapeInsideInfo(); |
| 1413 shapeInsideInfo->dirtyShapeSize(); | 1391 shapeInsideInfo->dirtyShapeSize(); |
| 1414 } else { | 1392 } else { |
| 1415 setShapeInsideInfo(nullptr); | 1393 setShapeInsideInfo(nullptr); |
| 1416 markShapeInsideDescendantsForLayout(); | 1394 markShapeInsideDescendantsForLayout(); |
| 1417 } | 1395 } |
| 1418 } | 1396 } |
| 1419 | 1397 |
| 1420 static inline bool shapeInfoRequiresRelayout(const RenderBlock* block) | |
| 1421 { | |
| 1422 ShapeInsideInfo* info = block->shapeInsideInfo(); | |
| 1423 if (info) | |
| 1424 info->setNeedsLayout(info->shapeSizeDirty()); | |
| 1425 else | |
| 1426 info = block->layoutShapeInsideInfo(); | |
| 1427 return info && info->needsLayout(); | |
| 1428 } | |
| 1429 | |
| 1430 bool RenderBlock::updateRegionsAndShapesLogicalSize(RenderFlowThread* flowThread
) | |
| 1431 { | |
| 1432 if (!flowThread && !shapeInsideInfo()) | |
| 1433 return shapeInfoRequiresRelayout(this); | |
| 1434 | |
| 1435 LayoutUnit oldHeight = logicalHeight(); | |
| 1436 LayoutUnit oldTop = logicalTop(); | |
| 1437 | |
| 1438 // Compute the maximum logical height content may cause this block to expand
to | |
| 1439 // FIXME: These should eventually use the const computeLogicalHeight rather
than updateLogicalHeight | |
| 1440 setLogicalHeight(RenderFlowThread::maxLogicalHeight()); | |
| 1441 updateLogicalHeight(); | |
| 1442 | |
| 1443 computeShapeSize(); | |
| 1444 | |
| 1445 // Set our start and end regions. No regions above or below us will be consi
dered by our children. They are | |
| 1446 // effectively clamped to our region range. | |
| 1447 computeRegionRangeForBlock(flowThread); | |
| 1448 | |
| 1449 setLogicalHeight(oldHeight); | |
| 1450 setLogicalTop(oldTop); | |
| 1451 | |
| 1452 return shapeInfoRequiresRelayout(this); | |
| 1453 } | |
| 1454 | |
| 1455 void RenderBlock::computeShapeSize() | 1398 void RenderBlock::computeShapeSize() |
| 1456 { | 1399 { |
| 1457 ShapeInsideInfo* shapeInsideInfo = this->shapeInsideInfo(); | 1400 ShapeInsideInfo* shapeInsideInfo = this->shapeInsideInfo(); |
| 1458 if (!shapeInsideInfo) | 1401 if (!shapeInsideInfo) |
| 1459 return; | 1402 return; |
| 1460 | 1403 |
| 1461 if (isRenderNamedFlowFragment()) { | 1404 bool percentageLogicalHeightResolvable = percentageLogicalHeightIsResolvable
FromBlock(this, false); |
| 1462 ShapeInsideInfo* parentShapeInsideInfo = toRenderBlock(parent())->shapeI
nsideInfo(); | 1405 shapeInsideInfo->setShapeSize(logicalWidth(), percentageLogicalHeightResolva
ble ? logicalHeight() : LayoutUnit()); |
| 1463 ASSERT(parentShapeInsideInfo); | |
| 1464 shapeInsideInfo->setShapeSize(parentShapeInsideInfo->shapeSize().width()
, parentShapeInsideInfo->shapeSize().height()); | |
| 1465 } else { | |
| 1466 bool percentageLogicalHeightResolvable = percentageLogicalHeightIsResolv
ableFromBlock(this, false); | |
| 1467 shapeInsideInfo->setShapeSize(logicalWidth(), percentageLogicalHeightRes
olvable ? logicalHeight() : LayoutUnit()); | |
| 1468 } | |
| 1469 } | |
| 1470 | |
| 1471 void RenderBlock::updateRegionsAndShapesAfterChildLayout(RenderFlowThread* flowT
hread, bool heightChanged) | |
| 1472 { | |
| 1473 // A previous sibling has changed dimension, so we need to relayout the shap
e with the content | |
| 1474 ShapeInsideInfo* shapeInsideInfo = layoutShapeInsideInfo(); | |
| 1475 if (heightChanged && shapeInsideInfo) | |
| 1476 shapeInsideInfo->dirtyShapeSize(); | |
| 1477 | |
| 1478 computeRegionRangeForBlock(flowThread); | |
| 1479 } | |
| 1480 | |
| 1481 void RenderBlock::computeRegionRangeForBlock(RenderFlowThread* flowThread) | |
| 1482 { | |
| 1483 if (flowThread) | |
| 1484 flowThread->setRegionRangeForBox(this, offsetFromLogicalTopOfFirstPage()
); | |
| 1485 } | 1406 } |
| 1486 | 1407 |
| 1487 bool RenderBlock::updateLogicalWidthAndColumnWidth() | 1408 bool RenderBlock::updateLogicalWidthAndColumnWidth() |
| 1488 { | 1409 { |
| 1489 LayoutUnit oldWidth = logicalWidth(); | 1410 LayoutUnit oldWidth = logicalWidth(); |
| 1490 LayoutUnit oldColumnWidth = desiredColumnWidth(); | 1411 LayoutUnit oldColumnWidth = desiredColumnWidth(); |
| 1491 | 1412 |
| 1492 updateLogicalWidth(); | 1413 updateLogicalWidth(); |
| 1493 calcColumnWidth(); | 1414 calcColumnWidth(); |
| 1494 | 1415 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1517 } | 1438 } |
| 1518 if (colInfo->columnHeight() != pageLogicalHeight && everHadLayout()) { | 1439 if (colInfo->columnHeight() != pageLogicalHeight && everHadLayout()) { |
| 1519 colInfo->setColumnHeight(pageLogicalHeight); | 1440 colInfo->setColumnHeight(pageLogicalHeight); |
| 1520 pageLogicalHeightChanged = true; | 1441 pageLogicalHeightChanged = true; |
| 1521 } | 1442 } |
| 1522 | 1443 |
| 1523 if (!hasSpecifiedPageLogicalHeight && !pageLogicalHeight) | 1444 if (!hasSpecifiedPageLogicalHeight && !pageLogicalHeight) |
| 1524 colInfo->clearForcedBreaks(); | 1445 colInfo->clearForcedBreaks(); |
| 1525 | 1446 |
| 1526 colInfo->setPaginationUnit(paginationUnit()); | 1447 colInfo->setPaginationUnit(paginationUnit()); |
| 1527 } else if (isRenderFlowThread()) { | |
| 1528 pageLogicalHeight = 1; // This is just a hack to always make sure we hav
e a page logical height. | |
| 1529 pageLogicalHeightChanged = toRenderFlowThread(this)->pageLogicalSizeChan
ged(); | |
| 1530 } | 1448 } |
| 1531 } | 1449 } |
| 1532 | 1450 |
| 1533 void RenderBlock::layoutBlock(bool) | 1451 void RenderBlock::layoutBlock(bool) |
| 1534 { | 1452 { |
| 1535 ASSERT_NOT_REACHED(); | 1453 ASSERT_NOT_REACHED(); |
| 1536 clearNeedsLayout(); | 1454 clearNeedsLayout(); |
| 1537 } | 1455 } |
| 1538 | 1456 |
| 1539 void RenderBlock::addOverflowFromChildren() | 1457 void RenderBlock::addOverflowFromChildren() |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1576 addLayoutOverflow(rectToApply); | 1494 addLayoutOverflow(rectToApply); |
| 1577 if (hasRenderOverflow()) | 1495 if (hasRenderOverflow()) |
| 1578 m_overflow->setLayoutClientAfterEdge(oldClientAfterEdge); | 1496 m_overflow->setLayoutClientAfterEdge(oldClientAfterEdge); |
| 1579 } | 1497 } |
| 1580 | 1498 |
| 1581 // Add visual overflow from box-shadow and border-image-outset. | 1499 // Add visual overflow from box-shadow and border-image-outset. |
| 1582 addVisualEffectOverflow(); | 1500 addVisualEffectOverflow(); |
| 1583 | 1501 |
| 1584 // Add visual overflow from theme. | 1502 // Add visual overflow from theme. |
| 1585 addVisualOverflowFromTheme(); | 1503 addVisualOverflowFromTheme(); |
| 1586 | |
| 1587 if (isRenderNamedFlowThread()) | |
| 1588 toRenderNamedFlowThread(this)->computeOversetStateForRegions(oldClientAf
terEdge); | |
| 1589 } | 1504 } |
| 1590 | 1505 |
| 1591 void RenderBlock::addOverflowFromBlockChildren() | 1506 void RenderBlock::addOverflowFromBlockChildren() |
| 1592 { | 1507 { |
| 1593 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBo
x()) { | 1508 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBo
x()) { |
| 1594 if (!child->isFloatingOrOutOfFlowPositioned()) | 1509 if (!child->isFloatingOrOutOfFlowPositioned()) |
| 1595 addOverflowFromChild(child); | 1510 addOverflowFromChild(child); |
| 1596 } | 1511 } |
| 1597 } | 1512 } |
| 1598 | 1513 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1635 if (style()->shouldPlaceBlockDirectionScrollbarOnLogicalLeft()) | 1550 if (style()->shouldPlaceBlockDirectionScrollbarOnLogicalLeft()) |
| 1636 startPosition -= verticalScrollbarWidth(); | 1551 startPosition -= verticalScrollbarWidth(); |
| 1637 LayoutUnit totalAvailableLogicalWidth = borderAndPaddingLogicalWidth() + ava
ilableLogicalWidth(); | 1552 LayoutUnit totalAvailableLogicalWidth = borderAndPaddingLogicalWidth() + ava
ilableLogicalWidth(); |
| 1638 | 1553 |
| 1639 // Add in our start margin. | 1554 // Add in our start margin. |
| 1640 LayoutUnit childMarginStart = marginStartForChild(child); | 1555 LayoutUnit childMarginStart = marginStartForChild(child); |
| 1641 LayoutUnit newPosition = startPosition + childMarginStart; | 1556 LayoutUnit newPosition = startPosition + childMarginStart; |
| 1642 | 1557 |
| 1643 // Some objects (e.g., tables, horizontal rules, overflow:auto blocks) avoid
floats. They need | 1558 // Some objects (e.g., tables, horizontal rules, overflow:auto blocks) avoid
floats. They need |
| 1644 // to shift over as necessary to dodge any floats that might get in the way. | 1559 // to shift over as necessary to dodge any floats that might get in the way. |
| 1645 if (child->avoidsFloats() && containsFloats() && !flowThreadContainingBlock(
)) | 1560 if (child->avoidsFloats() && containsFloats()) |
| 1646 newPosition += toRenderBlockFlow(this)->computeStartPositionDeltaForChil
dAvoidingFloats(child, marginStartForChild(child)); | 1561 newPosition += toRenderBlockFlow(this)->computeStartPositionDeltaForChil
dAvoidingFloats(child, marginStartForChild(child)); |
| 1647 | 1562 |
| 1648 setLogicalLeftForChild(child, style()->isLeftToRightDirection() ? newPositio
n : totalAvailableLogicalWidth - newPosition - logicalWidthForChild(child), appl
yDelta); | 1563 setLogicalLeftForChild(child, style()->isLeftToRightDirection() ? newPositio
n : totalAvailableLogicalWidth - newPosition - logicalWidthForChild(child), appl
yDelta); |
| 1649 } | 1564 } |
| 1650 | 1565 |
| 1651 void RenderBlock::setLogicalLeftForChild(RenderBox* child, LayoutUnit logicalLef
t, ApplyLayoutDeltaMode applyDelta) | 1566 void RenderBlock::setLogicalLeftForChild(RenderBox* child, LayoutUnit logicalLef
t, ApplyLayoutDeltaMode applyDelta) |
| 1652 { | 1567 { |
| 1653 if (isHorizontalWritingMode()) { | 1568 if (isHorizontalWritingMode()) { |
| 1654 if (applyDelta == ApplyLayoutDelta) | 1569 if (applyDelta == ApplyLayoutDelta) |
| 1655 view()->addLayoutDelta(LayoutSize(child->x() - logicalLeft, 0)); | 1570 view()->addLayoutDelta(LayoutSize(child->x() - logicalLeft, 0)); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1724 | 1639 |
| 1725 LayoutStateMaintainer statePusher(view(), this, locationOffset(), hasColumns
() || hasTransform() || hasReflection() || style()->isFlippedBlocksWritingMode()
); | 1640 LayoutStateMaintainer statePusher(view(), this, locationOffset(), hasColumns
() || hasTransform() || hasReflection() || style()->isFlippedBlocksWritingMode()
); |
| 1726 | 1641 |
| 1727 if (needsPositionedMovementLayout() && !tryLayoutDoingPositionedMovementOnly
()) | 1642 if (needsPositionedMovementLayout() && !tryLayoutDoingPositionedMovementOnly
()) |
| 1728 return false; | 1643 return false; |
| 1729 | 1644 |
| 1730 // Lay out positioned descendants or objects that just need to recompute ove
rflow. | 1645 // Lay out positioned descendants or objects that just need to recompute ove
rflow. |
| 1731 if (needsSimplifiedNormalFlowLayout()) | 1646 if (needsSimplifiedNormalFlowLayout()) |
| 1732 simplifiedNormalFlowLayout(); | 1647 simplifiedNormalFlowLayout(); |
| 1733 | 1648 |
| 1734 // Make sure a forced break is applied after the content if we are a flow th
read in a simplified layout. | |
| 1735 // This ensures the size information is correctly computed for the last auto
-height region receiving content. | |
| 1736 if (isRenderFlowThread()) | |
| 1737 toRenderFlowThread(this)->applyBreakAfterContent(clientLogicalBottom()); | |
| 1738 | |
| 1739 // Lay out our positioned objects if our positioned child bit is set. | 1649 // Lay out our positioned objects if our positioned child bit is set. |
| 1740 // Also, if an absolute position element inside a relative positioned contai
ner moves, and the absolute element has a fixed position | 1650 // Also, if an absolute position element inside a relative positioned contai
ner moves, and the absolute element has a fixed position |
| 1741 // child, neither the fixed element nor its container learn of the movement
since posChildNeedsLayout() is only marked as far as the | 1651 // child, neither the fixed element nor its container learn of the movement
since posChildNeedsLayout() is only marked as far as the |
| 1742 // relative positioned container. So if we can have fixed pos objects in our
positioned objects list check if any of them | 1652 // relative positioned container. So if we can have fixed pos objects in our
positioned objects list check if any of them |
| 1743 // are statically positioned and thus need to move with their absolute ances
tors. | 1653 // are statically positioned and thus need to move with their absolute ances
tors. |
| 1744 bool canContainFixedPosObjects = canContainFixedPositionObjects(); | 1654 bool canContainFixedPosObjects = canContainFixedPositionObjects(); |
| 1745 if (posChildNeedsLayout() || canContainFixedPosObjects) | 1655 if (posChildNeedsLayout() || canContainFixedPosObjects) |
| 1746 layoutPositionedObjects(false, !posChildNeedsLayout() && canContainFixed
PosObjects); | 1656 layoutPositionedObjects(false, !posChildNeedsLayout() && canContainFixed
PosObjects); |
| 1747 | 1657 |
| 1748 // Recompute our overflow information. | 1658 // Recompute our overflow information. |
| (...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2356 return false; | 2266 return false; |
| 2357 ASSERT(node() || isAnonymous()); | 2267 ASSERT(node() || isAnonymous()); |
| 2358 | 2268 |
| 2359 // FIXME: Eventually tables should have to learn how to fill gaps between ce
lls, at least in simple non-spanning cases. | 2269 // FIXME: Eventually tables should have to learn how to fill gaps between ce
lls, at least in simple non-spanning cases. |
| 2360 if (isTable()) | 2270 if (isTable()) |
| 2361 return false; | 2271 return false; |
| 2362 | 2272 |
| 2363 if (isBody() || isRoot() || hasOverflowClip() | 2273 if (isBody() || isRoot() || hasOverflowClip() |
| 2364 || isPositioned() || isFloating() | 2274 || isPositioned() || isFloating() |
| 2365 || isTableCell() || isInlineBlockOrInlineTable() | 2275 || isTableCell() || isInlineBlockOrInlineTable() |
| 2366 || hasTransform() || hasReflection() || hasMask() || isWritingModeRoot() | 2276 || hasTransform() || hasReflection() || hasMask() || isWritingModeRoot()
) |
| 2367 || isRenderFlowThread()) | |
| 2368 return true; | 2277 return true; |
| 2369 | 2278 |
| 2370 if (view() && view()->selectionStart()) { | 2279 if (view() && view()->selectionStart()) { |
| 2371 Node* startElement = view()->selectionStart()->node(); | 2280 Node* startElement = view()->selectionStart()->node(); |
| 2372 if (startElement && startElement->rootEditableElement() == node()) | 2281 if (startElement && startElement->rootEditableElement() == node()) |
| 2373 return true; | 2282 return true; |
| 2374 } | 2283 } |
| 2375 | 2284 |
| 2376 return false; | 2285 return false; |
| 2377 } | 2286 } |
| (...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2735 { | 2644 { |
| 2736 if (gPositionedDescendantsMap) | 2645 if (gPositionedDescendantsMap) |
| 2737 return gPositionedDescendantsMap->get(this); | 2646 return gPositionedDescendantsMap->get(this); |
| 2738 return 0; | 2647 return 0; |
| 2739 } | 2648 } |
| 2740 | 2649 |
| 2741 void RenderBlock::insertPositionedObject(RenderBox* o) | 2650 void RenderBlock::insertPositionedObject(RenderBox* o) |
| 2742 { | 2651 { |
| 2743 ASSERT(!isAnonymousBlock()); | 2652 ASSERT(!isAnonymousBlock()); |
| 2744 | 2653 |
| 2745 if (o->isRenderFlowThread()) | |
| 2746 return; | |
| 2747 | |
| 2748 insertIntoTrackedRendererMaps(o, gPositionedDescendantsMap, gPositionedConta
inerMap); | 2654 insertIntoTrackedRendererMaps(o, gPositionedDescendantsMap, gPositionedConta
inerMap); |
| 2749 } | 2655 } |
| 2750 | 2656 |
| 2751 void RenderBlock::removePositionedObject(RenderBox* o) | 2657 void RenderBlock::removePositionedObject(RenderBox* o) |
| 2752 { | 2658 { |
| 2753 removeFromTrackedRendererMaps(o, gPositionedDescendantsMap, gPositionedConta
inerMap); | 2659 removeFromTrackedRendererMaps(o, gPositionedDescendantsMap, gPositionedConta
inerMap); |
| 2754 } | 2660 } |
| 2755 | 2661 |
| 2756 void RenderBlock::removePositionedObjects(RenderBlock* o, ContainingBlockState c
ontainingBlockState) | 2662 void RenderBlock::removePositionedObjects(RenderBlock* o, ContainingBlockState c
ontainingBlockState) |
| 2757 { | 2663 { |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2870 } | 2776 } |
| 2871 | 2777 |
| 2872 LayoutUnit RenderBlock::textIndentOffset() const | 2778 LayoutUnit RenderBlock::textIndentOffset() const |
| 2873 { | 2779 { |
| 2874 LayoutUnit cw = 0; | 2780 LayoutUnit cw = 0; |
| 2875 if (style()->textIndent().isPercent()) | 2781 if (style()->textIndent().isPercent()) |
| 2876 cw = containingBlock()->availableLogicalWidth(); | 2782 cw = containingBlock()->availableLogicalWidth(); |
| 2877 return minimumValueForLength(style()->textIndent(), cw); | 2783 return minimumValueForLength(style()->textIndent(), cw); |
| 2878 } | 2784 } |
| 2879 | 2785 |
| 2880 LayoutUnit RenderBlock::logicalLeftOffsetForContent(RenderRegion* region) const | |
| 2881 { | |
| 2882 LayoutUnit logicalLeftOffset = style()->isHorizontalWritingMode() ? borderLe
ft() + paddingLeft() : borderTop() + paddingTop(); | |
| 2883 if (!region) | |
| 2884 return logicalLeftOffset; | |
| 2885 LayoutRect boxRect = borderBoxRectInRegion(region); | |
| 2886 return logicalLeftOffset + (isHorizontalWritingMode() ? boxRect.x() : boxRec
t.y()); | |
| 2887 } | |
| 2888 | |
| 2889 LayoutUnit RenderBlock::logicalRightOffsetForContent(RenderRegion* region) const | |
| 2890 { | |
| 2891 LayoutUnit logicalRightOffset = style()->isHorizontalWritingMode() ? borderL
eft() + paddingLeft() : borderTop() + paddingTop(); | |
| 2892 logicalRightOffset += availableLogicalWidth(); | |
| 2893 if (!region) | |
| 2894 return logicalRightOffset; | |
| 2895 LayoutRect boxRect = borderBoxRectInRegion(region); | |
| 2896 return logicalRightOffset - (logicalWidth() - (isHorizontalWritingMode() ? b
oxRect.maxX() : boxRect.maxY())); | |
| 2897 } | |
| 2898 | |
| 2899 void RenderBlock::markLinesDirtyInBlockRange(LayoutUnit logicalTop, LayoutUnit l
ogicalBottom, RootInlineBox* highest) | 2786 void RenderBlock::markLinesDirtyInBlockRange(LayoutUnit logicalTop, LayoutUnit l
ogicalBottom, RootInlineBox* highest) |
| 2900 { | 2787 { |
| 2901 if (logicalTop >= logicalBottom) | 2788 if (logicalTop >= logicalBottom) |
| 2902 return; | 2789 return; |
| 2903 | 2790 |
| 2904 RootInlineBox* lowestDirtyLine = lastRootBox(); | 2791 RootInlineBox* lowestDirtyLine = lastRootBox(); |
| 2905 RootInlineBox* afterLowest = lowestDirtyLine; | 2792 RootInlineBox* afterLowest = lowestDirtyLine; |
| 2906 while (lowestDirtyLine && lowestDirtyLine->lineBottomWithLeading() >= logica
lBottom && logicalBottom < LayoutUnit::max()) { | 2793 while (lowestDirtyLine && lowestDirtyLine->lineBottomWithLeading() >= logica
lBottom && logicalBottom < LayoutUnit::max()) { |
| 2907 afterLowest = lowestDirtyLine; | 2794 afterLowest = lowestDirtyLine; |
| 2908 lowestDirtyLine = lowestDirtyLine->prevRootBox(); | 2795 lowestDirtyLine = lowestDirtyLine->prevRootBox(); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2971 && isPointInOverflowControl(result, locationInContainer.point(), adjuste
dLocation)) { | 2858 && isPointInOverflowControl(result, locationInContainer.point(), adjuste
dLocation)) { |
| 2972 updateHitTestResult(result, locationInContainer.point() - localOffset); | 2859 updateHitTestResult(result, locationInContainer.point() - localOffset); |
| 2973 // FIXME: isPointInOverflowControl() doesn't handle rect-based tests yet
. | 2860 // FIXME: isPointInOverflowControl() doesn't handle rect-based tests yet
. |
| 2974 if (!result.addNodeToRectBasedTestResult(nodeForHitTest(), request, loca
tionInContainer)) | 2861 if (!result.addNodeToRectBasedTestResult(nodeForHitTest(), request, loca
tionInContainer)) |
| 2975 return true; | 2862 return true; |
| 2976 } | 2863 } |
| 2977 | 2864 |
| 2978 // If we have clipping, then we can't have any spillout. | 2865 // If we have clipping, then we can't have any spillout. |
| 2979 bool useOverflowClip = hasOverflowClip() && !hasSelfPaintingLayer(); | 2866 bool useOverflowClip = hasOverflowClip() && !hasSelfPaintingLayer(); |
| 2980 bool useClip = (hasControlClip() || useOverflowClip); | 2867 bool useClip = (hasControlClip() || useOverflowClip); |
| 2981 bool checkChildren = !useClip || (hasControlClip() ? locationInContainer.int
ersects(controlClipRect(adjustedLocation)) : locationInContainer.intersects(over
flowClipRect(adjustedLocation, locationInContainer.region(), IncludeOverlayScrol
lbarSize))); | 2868 bool checkChildren = !useClip || (hasControlClip() ? locationInContainer.int
ersects(controlClipRect(adjustedLocation)) : locationInContainer.intersects(over
flowClipRect(adjustedLocation, IncludeOverlayScrollbarSize))); |
| 2982 if (checkChildren) { | 2869 if (checkChildren) { |
| 2983 // Hit test descendants first. | 2870 // Hit test descendants first. |
| 2984 LayoutSize scrolledOffset(localOffset); | 2871 LayoutSize scrolledOffset(localOffset); |
| 2985 if (hasOverflowClip()) | 2872 if (hasOverflowClip()) |
| 2986 scrolledOffset -= scrolledContentOffset(); | 2873 scrolledOffset -= scrolledContentOffset(); |
| 2987 | 2874 |
| 2988 // Hit test contents if we don't have columns. | 2875 // Hit test contents if we don't have columns. |
| 2989 if (!hasColumns()) { | 2876 if (!hasColumns()) { |
| 2990 if (hitTestContents(request, result, locationInContainer, toLayoutPo
int(scrolledOffset), hitTestAction)) { | 2877 if (hitTestContents(request, result, locationInContainer, toLayoutPo
int(scrolledOffset), hitTestAction)) { |
| 2991 updateHitTestResult(result, flipForWritingMode(locationInContain
er.point() - localOffset)); | 2878 updateHitTestResult(result, flipForWritingMode(locationInContain
er.point() - localOffset)); |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3112 LayoutRect colRect = it.columnRect(); | 2999 LayoutRect colRect = it.columnRect(); |
| 3113 if (colRect.contains(locationInContainer)) { | 3000 if (colRect.contains(locationInContainer)) { |
| 3114 it.adjust(offset); | 3001 it.adjust(offset); |
| 3115 return; | 3002 return; |
| 3116 } | 3003 } |
| 3117 } | 3004 } |
| 3118 } | 3005 } |
| 3119 | 3006 |
| 3120 bool RenderBlock::hitTestContents(const HitTestRequest& request, HitTestResult&
result, const HitTestLocation& locationInContainer, const LayoutPoint& accumulat
edOffset, HitTestAction hitTestAction) | 3007 bool RenderBlock::hitTestContents(const HitTestRequest& request, HitTestResult&
result, const HitTestLocation& locationInContainer, const LayoutPoint& accumulat
edOffset, HitTestAction hitTestAction) |
| 3121 { | 3008 { |
| 3122 if (isRenderRegion()) | |
| 3123 return toRenderRegion(this)->hitTestFlowThreadContents(request, result,
locationInContainer, accumulatedOffset, hitTestAction); | |
| 3124 | |
| 3125 if (childrenInline() && !isTable()) { | 3009 if (childrenInline() && !isTable()) { |
| 3126 // We have to hit-test our line boxes. | 3010 // We have to hit-test our line boxes. |
| 3127 if (m_lineBoxes.hitTest(this, request, result, locationInContainer, accu
mulatedOffset, hitTestAction)) | 3011 if (m_lineBoxes.hitTest(this, request, result, locationInContainer, accu
mulatedOffset, hitTestAction)) |
| 3128 return true; | 3012 return true; |
| 3129 } else { | 3013 } else { |
| 3130 // Hit test our children. | 3014 // Hit test our children. |
| 3131 HitTestAction childHitTest = hitTestAction; | 3015 HitTestAction childHitTest = hitTestAction; |
| 3132 if (hitTestAction == HitTestChildBlockBackgrounds) | 3016 if (hitTestAction == HitTestChildBlockBackgrounds) |
| 3133 childHitTest = HitTestChildBlockBackground; | 3017 childHitTest = HitTestChildBlockBackground; |
| 3134 for (RenderBox* child = lastChildBox(); child; child = child->previousSi
blingBox()) { | 3018 for (RenderBox* child = lastChildBox(); child; child = child->previousSi
blingBox()) { |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3369 | 3253 |
| 3370 int RenderBlock::columnGap() const | 3254 int RenderBlock::columnGap() const |
| 3371 { | 3255 { |
| 3372 if (style()->hasNormalColumnGap()) | 3256 if (style()->hasNormalColumnGap()) |
| 3373 return style()->fontDescription().computedPixelSize(); // "1em" is recom
mended as the normal gap setting. Matches <p> margins. | 3257 return style()->fontDescription().computedPixelSize(); // "1em" is recom
mended as the normal gap setting. Matches <p> margins. |
| 3374 return static_cast<int>(style()->columnGap()); | 3258 return static_cast<int>(style()->columnGap()); |
| 3375 } | 3259 } |
| 3376 | 3260 |
| 3377 void RenderBlock::calcColumnWidth() | 3261 void RenderBlock::calcColumnWidth() |
| 3378 { | 3262 { |
| 3379 if (document().regionBasedColumnsEnabled()) | |
| 3380 return; | |
| 3381 | |
| 3382 // Calculate our column width and column count. | 3263 // Calculate our column width and column count. |
| 3383 // FIXME: Can overflow on fast/block/float/float-not-removed-from-next-sibli
ng4.html, see https://bugs.webkit.org/show_bug.cgi?id=68744 | 3264 // FIXME: Can overflow on fast/block/float/float-not-removed-from-next-sibli
ng4.html, see https://bugs.webkit.org/show_bug.cgi?id=68744 |
| 3384 unsigned desiredColumnCount = 1; | 3265 unsigned desiredColumnCount = 1; |
| 3385 LayoutUnit desiredColumnWidth = contentLogicalWidth(); | 3266 LayoutUnit desiredColumnWidth = contentLogicalWidth(); |
| 3386 | 3267 |
| 3387 // For now, we don't support multi-column layouts when printing, since we ha
ve to do a lot of work for proper pagination. | 3268 // For now, we don't support multi-column layouts when printing, since we ha
ve to do a lot of work for proper pagination. |
| 3388 if (document().paginated() || (style()->hasAutoColumnCount() && style()->has
AutoColumnWidth()) || !style()->hasInlineColumnAxis()) { | 3269 if (document().paginated() || (style()->hasAutoColumnCount() && style()->has
AutoColumnWidth()) || !style()->hasInlineColumnAxis()) { |
| 3389 setDesiredColumnCountAndWidth(desiredColumnCount, desiredColumnWidth); | 3270 setDesiredColumnCountAndWidth(desiredColumnCount, desiredColumnWidth); |
| 3390 return; | 3271 return; |
| 3391 } | 3272 } |
| (...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3810 | 3691 |
| 3811 LayoutUnit borderAndPadding = borderAndPaddingLogicalWidth(); | 3692 LayoutUnit borderAndPadding = borderAndPaddingLogicalWidth(); |
| 3812 m_minPreferredLogicalWidth += borderAndPadding; | 3693 m_minPreferredLogicalWidth += borderAndPadding; |
| 3813 m_maxPreferredLogicalWidth += borderAndPadding; | 3694 m_maxPreferredLogicalWidth += borderAndPadding; |
| 3814 | 3695 |
| 3815 clearPreferredLogicalWidthsDirty(); | 3696 clearPreferredLogicalWidthsDirty(); |
| 3816 } | 3697 } |
| 3817 | 3698 |
| 3818 void RenderBlock::adjustIntrinsicLogicalWidthsForColumns(LayoutUnit& minLogicalW
idth, LayoutUnit& maxLogicalWidth) const | 3699 void RenderBlock::adjustIntrinsicLogicalWidthsForColumns(LayoutUnit& minLogicalW
idth, LayoutUnit& maxLogicalWidth) const |
| 3819 { | 3700 { |
| 3820 // FIXME: make this method virtual and move the code to RenderMultiColumnBlo
ck once the old | |
| 3821 // multicol code is gone. | |
| 3822 | |
| 3823 if (!style()->hasAutoColumnCount() || !style()->hasAutoColumnWidth()) { | 3701 if (!style()->hasAutoColumnCount() || !style()->hasAutoColumnWidth()) { |
| 3824 // The min/max intrinsic widths calculated really tell how much space el
ements need when | 3702 // The min/max intrinsic widths calculated really tell how much space el
ements need when |
| 3825 // laid out inside the columns. In order to eventually end up with the d
esired column width, | 3703 // laid out inside the columns. In order to eventually end up with the d
esired column width, |
| 3826 // we need to convert them to values pertaining to the multicol containe
r. | 3704 // we need to convert them to values pertaining to the multicol containe
r. |
| 3827 int columnCount = style()->hasAutoColumnCount() ? 1 : style()->columnCou
nt(); | 3705 int columnCount = style()->hasAutoColumnCount() ? 1 : style()->columnCou
nt(); |
| 3828 LayoutUnit columnWidth; | 3706 LayoutUnit columnWidth; |
| 3829 LayoutUnit gapExtra = (columnCount - 1) * columnGap(); | 3707 LayoutUnit gapExtra = (columnCount - 1) * columnGap(); |
| 3830 if (style()->hasAutoColumnWidth()) { | 3708 if (style()->hasAutoColumnWidth()) { |
| 3831 minLogicalWidth = minLogicalWidth * columnCount + gapExtra; | 3709 minLogicalWidth = minLogicalWidth * columnCount + gapExtra; |
| 3832 } else { | 3710 } else { |
| (...skipping 1359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5192 if (isAnonymousColumnsBlock()) | 5070 if (isAnonymousColumnsBlock()) |
| 5193 return createAnonymousColumnsWithParentRenderer(parent); | 5071 return createAnonymousColumnsWithParentRenderer(parent); |
| 5194 if (isAnonymousColumnSpanBlock()) | 5072 if (isAnonymousColumnSpanBlock()) |
| 5195 return createAnonymousColumnSpanWithParentRenderer(parent); | 5073 return createAnonymousColumnSpanWithParentRenderer(parent); |
| 5196 return createAnonymousWithParentRendererAndDisplay(parent, style()->display(
)); | 5074 return createAnonymousWithParentRendererAndDisplay(parent, style()->display(
)); |
| 5197 } | 5075 } |
| 5198 | 5076 |
| 5199 bool RenderBlock::hasNextPage(LayoutUnit logicalOffset, PageBoundaryRule pageBou
ndaryRule) const | 5077 bool RenderBlock::hasNextPage(LayoutUnit logicalOffset, PageBoundaryRule pageBou
ndaryRule) const |
| 5200 { | 5078 { |
| 5201 ASSERT(view()->layoutState() && view()->layoutState()->isPaginated()); | 5079 ASSERT(view()->layoutState() && view()->layoutState()->isPaginated()); |
| 5202 | 5080 return true; // Printing and multi-column both make new pages to accommodate
content. |
| 5203 RenderFlowThread* flowThread = flowThreadContainingBlock(); | |
| 5204 if (!flowThread) | |
| 5205 return true; // Printing and multi-column both make new pages to accommo
date content. | |
| 5206 | |
| 5207 // See if we're in the last region. | |
| 5208 LayoutUnit pageOffset = offsetFromLogicalTopOfFirstPage() + logicalOffset; | |
| 5209 RenderRegion* region = flowThread->regionAtBlockOffset(pageOffset, this); | |
| 5210 if (!region) | |
| 5211 return false; | |
| 5212 if (region->isLastRegion()) | |
| 5213 return region->isRenderRegionSet() || region->style()->regionFragment()
== BreakRegionFragment | |
| 5214 || (pageBoundaryRule == IncludePageBoundary && pageOffset == region-
>logicalTopForFlowThreadContent()); | |
| 5215 return true; | |
| 5216 } | 5081 } |
| 5217 | 5082 |
| 5218 LayoutUnit RenderBlock::nextPageLogicalTop(LayoutUnit logicalOffset, PageBoundar
yRule pageBoundaryRule) const | 5083 LayoutUnit RenderBlock::nextPageLogicalTop(LayoutUnit logicalOffset, PageBoundar
yRule pageBoundaryRule) const |
| 5219 { | 5084 { |
| 5220 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); | 5085 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); |
| 5221 if (!pageLogicalHeight) | 5086 if (!pageLogicalHeight) |
| 5222 return logicalOffset; | 5087 return logicalOffset; |
| 5223 | 5088 |
| 5224 // The logicalOffset is in our coordinate space. We can add in our pushed o
ffset. | 5089 // The logicalOffset is in our coordinate space. We can add in our pushed o
ffset. |
| 5225 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi
calOffset); | 5090 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi
calOffset); |
| 5226 if (pageBoundaryRule == ExcludePageBoundary) | 5091 if (pageBoundaryRule == ExcludePageBoundary) |
| 5227 return logicalOffset + (remainingLogicalHeight ? remainingLogicalHeight
: pageLogicalHeight); | 5092 return logicalOffset + (remainingLogicalHeight ? remainingLogicalHeight
: pageLogicalHeight); |
| 5228 return logicalOffset + remainingLogicalHeight; | 5093 return logicalOffset + remainingLogicalHeight; |
| 5229 } | 5094 } |
| 5230 | 5095 |
| 5231 ColumnInfo::PaginationUnit RenderBlock::paginationUnit() const | 5096 ColumnInfo::PaginationUnit RenderBlock::paginationUnit() const |
| 5232 { | 5097 { |
| 5233 return ColumnInfo::Column; | 5098 return ColumnInfo::Column; |
| 5234 } | 5099 } |
| 5235 | 5100 |
| 5236 LayoutUnit RenderBlock::pageLogicalTopForOffset(LayoutUnit offset) const | 5101 LayoutUnit RenderBlock::pageLogicalTopForOffset(LayoutUnit offset) const |
| 5237 { | 5102 { |
| 5238 RenderView* renderView = view(); | 5103 RenderView* renderView = view(); |
| 5239 LayoutUnit firstPageLogicalTop = isHorizontalWritingMode() ? renderView->lay
outState()->m_pageOffset.height() : renderView->layoutState()->m_pageOffset.widt
h(); | 5104 LayoutUnit firstPageLogicalTop = isHorizontalWritingMode() ? renderView->lay
outState()->m_pageOffset.height() : renderView->layoutState()->m_pageOffset.widt
h(); |
| 5240 LayoutUnit blockLogicalTop = isHorizontalWritingMode() ? renderView->layoutS
tate()->m_layoutOffset.height() : renderView->layoutState()->m_layoutOffset.widt
h(); | 5105 LayoutUnit blockLogicalTop = isHorizontalWritingMode() ? renderView->layoutS
tate()->m_layoutOffset.height() : renderView->layoutState()->m_layoutOffset.widt
h(); |
| 5241 | 5106 |
| 5242 LayoutUnit cumulativeOffset = offset + blockLogicalTop; | 5107 LayoutUnit cumulativeOffset = offset + blockLogicalTop; |
| 5243 RenderFlowThread* flowThread = flowThreadContainingBlock(); | 5108 LayoutUnit pageLogicalHeight = renderView->layoutState()->pageLogicalHeight(
); |
| 5244 if (!flowThread) { | 5109 if (!pageLogicalHeight) |
| 5245 LayoutUnit pageLogicalHeight = renderView->layoutState()->pageLogicalHei
ght(); | 5110 return 0; |
| 5246 if (!pageLogicalHeight) | 5111 return cumulativeOffset - roundToInt(cumulativeOffset - firstPageLogicalTop)
% roundToInt(pageLogicalHeight); |
| 5247 return 0; | |
| 5248 return cumulativeOffset - roundToInt(cumulativeOffset - firstPageLogical
Top) % roundToInt(pageLogicalHeight); | |
| 5249 } | |
| 5250 return flowThread->pageLogicalTopForOffset(cumulativeOffset); | |
| 5251 } | 5112 } |
| 5252 | 5113 |
| 5253 LayoutUnit RenderBlock::pageLogicalHeightForOffset(LayoutUnit offset) const | 5114 LayoutUnit RenderBlock::pageLogicalHeightForOffset(LayoutUnit offset) const |
| 5254 { | 5115 { |
| 5255 RenderView* renderView = view(); | 5116 RenderView* renderView = view(); |
| 5256 RenderFlowThread* flowThread = flowThreadContainingBlock(); | 5117 return renderView->layoutState()->m_pageLogicalHeight; |
| 5257 if (!flowThread) | |
| 5258 return renderView->layoutState()->m_pageLogicalHeight; | |
| 5259 return flowThread->pageLogicalHeightForOffset(offset + offsetFromLogicalTopO
fFirstPage()); | |
| 5260 } | 5118 } |
| 5261 | 5119 |
| 5262 LayoutUnit RenderBlock::pageRemainingLogicalHeightForOffset(LayoutUnit offset, P
ageBoundaryRule pageBoundaryRule) const | 5120 LayoutUnit RenderBlock::pageRemainingLogicalHeightForOffset(LayoutUnit offset, P
ageBoundaryRule pageBoundaryRule) const |
| 5263 { | 5121 { |
| 5264 RenderView* renderView = view(); | 5122 RenderView* renderView = view(); |
| 5265 offset += offsetFromLogicalTopOfFirstPage(); | 5123 offset += offsetFromLogicalTopOfFirstPage(); |
| 5266 | 5124 |
| 5267 RenderFlowThread* flowThread = flowThreadContainingBlock(); | 5125 LayoutUnit pageLogicalHeight = renderView->layoutState()->m_pageLogicalHeigh
t; |
| 5268 if (!flowThread) { | 5126 LayoutUnit remainingHeight = pageLogicalHeight - intMod(offset, pageLogicalH
eight); |
| 5269 LayoutUnit pageLogicalHeight = renderView->layoutState()->m_pageLogicalH
eight; | 5127 if (pageBoundaryRule == IncludePageBoundary) { |
| 5270 LayoutUnit remainingHeight = pageLogicalHeight - intMod(offset, pageLogi
calHeight); | 5128 // If includeBoundaryPoint is true the line exactly on the top edge of a |
| 5271 if (pageBoundaryRule == IncludePageBoundary) { | 5129 // column will act as being part of the previous column. |
| 5272 // If includeBoundaryPoint is true the line exactly on the top edge
of a | 5130 remainingHeight = intMod(remainingHeight, pageLogicalHeight); |
| 5273 // column will act as being part of the previous column. | |
| 5274 remainingHeight = intMod(remainingHeight, pageLogicalHeight); | |
| 5275 } | |
| 5276 return remainingHeight; | |
| 5277 } | 5131 } |
| 5278 | 5132 return remainingHeight; |
| 5279 return flowThread->pageRemainingLogicalHeightForOffset(offset, pageBoundaryR
ule); | |
| 5280 } | 5133 } |
| 5281 | 5134 |
| 5282 LayoutUnit RenderBlock::adjustForUnsplittableChild(RenderBox* child, LayoutUnit
logicalOffset, bool includeMargins) | 5135 LayoutUnit RenderBlock::adjustForUnsplittableChild(RenderBox* child, LayoutUnit
logicalOffset, bool includeMargins) |
| 5283 { | 5136 { |
| 5284 bool checkColumnBreaks = view()->layoutState()->isPaginatingColumns(); | 5137 bool checkColumnBreaks = view()->layoutState()->isPaginatingColumns(); |
| 5285 bool checkPageBreaks = !checkColumnBreaks && view()->layoutState()->m_pageLo
gicalHeight; | 5138 bool checkPageBreaks = !checkColumnBreaks && view()->layoutState()->m_pageLo
gicalHeight; |
| 5286 RenderFlowThread* flowThread = flowThreadContainingBlock(); | |
| 5287 bool checkRegionBreaks = flowThread && flowThread->isRenderNamedFlowThread()
; | |
| 5288 bool isUnsplittable = child->isUnsplittableForPagination() || (checkColumnBr
eaks && child->style()->columnBreakInside() == PBAVOID) | 5139 bool isUnsplittable = child->isUnsplittableForPagination() || (checkColumnBr
eaks && child->style()->columnBreakInside() == PBAVOID) |
| 5289 || (checkPageBreaks && child->style()->pageBreakInside() == PBAVOID) | 5140 || (checkPageBreaks && child->style()->pageBreakInside() == PBAVOID); |
| 5290 || (checkRegionBreaks && child->style()->regionBreakInside() == PBAVOID)
; | |
| 5291 if (!isUnsplittable) | 5141 if (!isUnsplittable) |
| 5292 return logicalOffset; | 5142 return logicalOffset; |
| 5293 LayoutUnit childLogicalHeight = logicalHeightForChild(child) + (includeMargi
ns ? marginBeforeForChild(child) + marginAfterForChild(child) : LayoutUnit()); | 5143 LayoutUnit childLogicalHeight = logicalHeightForChild(child) + (includeMargi
ns ? marginBeforeForChild(child) + marginAfterForChild(child) : LayoutUnit()); |
| 5294 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); | 5144 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); |
| 5295 bool hasUniformPageLogicalHeight = !flowThread || flowThread->regionsHaveUni
formLogicalHeight(); | 5145 bool hasUniformPageLogicalHeight = true; |
| 5296 updateMinimumPageHeight(logicalOffset, childLogicalHeight); | 5146 updateMinimumPageHeight(logicalOffset, childLogicalHeight); |
| 5297 if (!pageLogicalHeight || (hasUniformPageLogicalHeight && childLogicalHeight
> pageLogicalHeight) | 5147 if (!pageLogicalHeight || (hasUniformPageLogicalHeight && childLogicalHeight
> pageLogicalHeight) |
| 5298 || !hasNextPage(logicalOffset)) | 5148 || !hasNextPage(logicalOffset)) |
| 5299 return logicalOffset; | 5149 return logicalOffset; |
| 5300 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi
calOffset, ExcludePageBoundary); | 5150 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi
calOffset, ExcludePageBoundary); |
| 5301 if (remainingLogicalHeight < childLogicalHeight) { | 5151 if (remainingLogicalHeight < childLogicalHeight) { |
| 5302 if (!hasUniformPageLogicalHeight && !pushToNextPageWithMinimumLogicalHei
ght(remainingLogicalHeight, logicalOffset, childLogicalHeight)) | 5152 if (!hasUniformPageLogicalHeight && !pushToNextPageWithMinimumLogicalHei
ght(remainingLogicalHeight, logicalOffset, childLogicalHeight)) |
| 5303 return logicalOffset; | 5153 return logicalOffset; |
| 5304 return logicalOffset + remainingLogicalHeight; | 5154 return logicalOffset + remainingLogicalHeight; |
| 5305 } | 5155 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 5316 if (!hasNextPage(logicalOffset + adjustment)) | 5166 if (!hasNextPage(logicalOffset + adjustment)) |
| 5317 return false; | 5167 return false; |
| 5318 adjustment += pageLogicalHeight; | 5168 adjustment += pageLogicalHeight; |
| 5319 checkRegion = true; | 5169 checkRegion = true; |
| 5320 } | 5170 } |
| 5321 return !checkRegion; | 5171 return !checkRegion; |
| 5322 } | 5172 } |
| 5323 | 5173 |
| 5324 void RenderBlock::setPageBreak(LayoutUnit offset, LayoutUnit spaceShortage) | 5174 void RenderBlock::setPageBreak(LayoutUnit offset, LayoutUnit spaceShortage) |
| 5325 { | 5175 { |
| 5326 if (RenderFlowThread* flowThread = flowThreadContainingBlock()) | |
| 5327 flowThread->setPageBreak(offsetFromLogicalTopOfFirstPage() + offset, spa
ceShortage); | |
| 5328 } | 5176 } |
| 5329 | 5177 |
| 5330 void RenderBlock::updateMinimumPageHeight(LayoutUnit offset, LayoutUnit minHeigh
t) | 5178 void RenderBlock::updateMinimumPageHeight(LayoutUnit offset, LayoutUnit minHeigh
t) |
| 5331 { | 5179 { |
| 5332 if (RenderFlowThread* flowThread = flowThreadContainingBlock()) | 5180 if (ColumnInfo* colInfo = view()->layoutState()->m_columnInfo) |
| 5333 flowThread->updateMinimumPageHeight(offsetFromLogicalTopOfFirstPage() +
offset, minHeight); | |
| 5334 else if (ColumnInfo* colInfo = view()->layoutState()->m_columnInfo) | |
| 5335 colInfo->updateMinimumColumnHeight(minHeight); | 5181 colInfo->updateMinimumColumnHeight(minHeight); |
| 5336 } | 5182 } |
| 5337 | 5183 |
| 5338 static inline LayoutUnit calculateMinimumPageHeight(RenderStyle* renderStyle, Ro
otInlineBox* lastLine, LayoutUnit lineTop, LayoutUnit lineBottom) | 5184 static inline LayoutUnit calculateMinimumPageHeight(RenderStyle* renderStyle, Ro
otInlineBox* lastLine, LayoutUnit lineTop, LayoutUnit lineBottom) |
| 5339 { | 5185 { |
| 5340 // We may require a certain minimum number of lines per page in order to sat
isfy | 5186 // We may require a certain minimum number of lines per page in order to sat
isfy |
| 5341 // orphans and widows, and that may affect the minimum page height. | 5187 // orphans and widows, and that may affect the minimum page height. |
| 5342 unsigned lineCount = max<unsigned>(renderStyle->hasAutoOrphans() ? 1 : rende
rStyle->orphans(), renderStyle->hasAutoWidows() ? 1 : renderStyle->widows()); | 5188 unsigned lineCount = max<unsigned>(renderStyle->hasAutoOrphans() ? 1 : rende
rStyle->orphans(), renderStyle->hasAutoWidows() ? 1 : renderStyle->widows()); |
| 5343 if (lineCount > 1) { | 5189 if (lineCount > 1) { |
| 5344 RootInlineBox* line = lastLine; | 5190 RootInlineBox* line = lastLine; |
| 5345 for (unsigned i = 1; i < lineCount && line->prevRootBox(); i++) | 5191 for (unsigned i = 1; i < lineCount && line->prevRootBox(); i++) |
| 5346 line = line->prevRootBox(); | 5192 line = line->prevRootBox(); |
| 5347 | 5193 |
| 5348 // FIXME: Paginating using line overflow isn't all fine. See FIXME in | 5194 // FIXME: Paginating using line overflow isn't all fine. See FIXME in |
| 5349 // adjustLinePositionForPagination() for more details. | 5195 // adjustLinePositionForPagination() for more details. |
| 5350 LayoutRect overflow = line->logicalVisualOverflowRect(line->lineTop(), l
ine->lineBottom()); | 5196 LayoutRect overflow = line->logicalVisualOverflowRect(line->lineTop(), l
ine->lineBottom()); |
| 5351 lineTop = min(line->lineTopWithLeading(), overflow.y()); | 5197 lineTop = min(line->lineTopWithLeading(), overflow.y()); |
| 5352 } | 5198 } |
| 5353 return lineBottom - lineTop; | 5199 return lineBottom - lineTop; |
| 5354 } | 5200 } |
| 5355 | 5201 |
| 5356 void RenderBlock::adjustLinePositionForPagination(RootInlineBox* lineBox, Layout
Unit& delta, RenderFlowThread* flowThread) | 5202 void RenderBlock::adjustLinePositionForPagination(RootInlineBox* lineBox, Layout
Unit& delta) |
| 5357 { | 5203 { |
| 5358 // FIXME: For now we paginate using line overflow. This ensures that lines
don't overlap at all when we | 5204 // FIXME: For now we paginate using line overflow. This ensures that lines
don't overlap at all when we |
| 5359 // put a strut between them for pagination purposes. However, this really i
sn't the desired rendering, since | 5205 // put a strut between them for pagination purposes. However, this really i
sn't the desired rendering, since |
| 5360 // the line on the top of the next page will appear too far down relative to
the same kind of line at the top | 5206 // the line on the top of the next page will appear too far down relative to
the same kind of line at the top |
| 5361 // of the first column. | 5207 // of the first column. |
| 5362 // | 5208 // |
| 5363 // The rendering we would like to see is one where the lineTopWithLeading is
at the top of the column, and any line overflow | 5209 // The rendering we would like to see is one where the lineTopWithLeading is
at the top of the column, and any line overflow |
| 5364 // simply spills out above the top of the column. This effect would match w
hat happens at the top of the first column. | 5210 // simply spills out above the top of the column. This effect would match w
hat happens at the top of the first column. |
| 5365 // We can't achieve this rendering, however, until we stop columns from clip
ping to the column bounds (thus allowing | 5211 // We can't achieve this rendering, however, until we stop columns from clip
ping to the column bounds (thus allowing |
| 5366 // for overflow to occur), and then cache visible overflow for each column r
ect. | 5212 // for overflow to occur), and then cache visible overflow for each column r
ect. |
| 5367 // | 5213 // |
| 5368 // Furthermore, the paint we have to do when a column has overflow has to be
special. We need to exclude | 5214 // Furthermore, the paint we have to do when a column has overflow has to be
special. We need to exclude |
| 5369 // content that paints in a previous column (and content that paints in the
following column). | 5215 // content that paints in a previous column (and content that paints in the
following column). |
| 5370 // | 5216 // |
| 5371 // For now we'll at least honor the lineTopWithLeading when paginating if it
is above the logical top overflow. This will | 5217 // For now we'll at least honor the lineTopWithLeading when paginating if it
is above the logical top overflow. This will |
| 5372 // at least make positive leading work in typical cases. | 5218 // at least make positive leading work in typical cases. |
| 5373 // | 5219 // |
| 5374 // FIXME: Another problem with simply moving lines is that the available lin
e width may change (because of floats). | 5220 // FIXME: Another problem with simply moving lines is that the available lin
e width may change (because of floats). |
| 5375 // Technically if the location we move the line to has a different line widt
h than our old position, then we need to dirty the | 5221 // Technically if the location we move the line to has a different line widt
h than our old position, then we need to dirty the |
| 5376 // line and all following lines. | 5222 // line and all following lines. |
| 5377 LayoutRect logicalVisualOverflow = lineBox->logicalVisualOverflowRect(lineBo
x->lineTop(), lineBox->lineBottom()); | 5223 LayoutRect logicalVisualOverflow = lineBox->logicalVisualOverflowRect(lineBo
x->lineTop(), lineBox->lineBottom()); |
| 5378 LayoutUnit logicalOffset = min(lineBox->lineTopWithLeading(), logicalVisualO
verflow.y()); | 5224 LayoutUnit logicalOffset = min(lineBox->lineTopWithLeading(), logicalVisualO
verflow.y()); |
| 5379 LayoutUnit logicalBottom = max(lineBox->lineBottomWithLeading(), logicalVisu
alOverflow.maxY()); | 5225 LayoutUnit logicalBottom = max(lineBox->lineBottomWithLeading(), logicalVisu
alOverflow.maxY()); |
| 5380 LayoutUnit lineHeight = logicalBottom - logicalOffset; | 5226 LayoutUnit lineHeight = logicalBottom - logicalOffset; |
| 5381 updateMinimumPageHeight(logicalOffset, calculateMinimumPageHeight(style(), l
ineBox, logicalOffset, logicalBottom)); | 5227 updateMinimumPageHeight(logicalOffset, calculateMinimumPageHeight(style(), l
ineBox, logicalOffset, logicalBottom)); |
| 5382 logicalOffset += delta; | 5228 logicalOffset += delta; |
| 5383 lineBox->setPaginationStrut(0); | 5229 lineBox->setPaginationStrut(0); |
| 5384 lineBox->setIsFirstAfterPageBreak(false); | 5230 lineBox->setIsFirstAfterPageBreak(false); |
| 5385 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); | 5231 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); |
| 5386 bool hasUniformPageLogicalHeight = !flowThread || flowThread->regionsHaveUni
formLogicalHeight(); | 5232 bool hasUniformPageLogicalHeight = true; |
| 5387 // If lineHeight is greater than pageLogicalHeight, but logicalVisualOverflo
w.height() still fits, we are | 5233 // If lineHeight is greater than pageLogicalHeight, but logicalVisualOverflo
w.height() still fits, we are |
| 5388 // still going to add a strut, so that the visible overflow fits on a single
page. | 5234 // still going to add a strut, so that the visible overflow fits on a single
page. |
| 5389 if (!pageLogicalHeight || (hasUniformPageLogicalHeight && logicalVisualOverf
low.height() > pageLogicalHeight) | 5235 if (!pageLogicalHeight || (hasUniformPageLogicalHeight && logicalVisualOverf
low.height() > pageLogicalHeight) |
| 5390 || !hasNextPage(logicalOffset)) | 5236 || !hasNextPage(logicalOffset)) |
| 5391 // 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. | 5237 // 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. |
| 5392 // 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. | 5238 // 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. |
| 5393 return; | 5239 return; |
| 5394 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi
calOffset, ExcludePageBoundary); | 5240 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi
calOffset, ExcludePageBoundary); |
| 5395 | 5241 |
| 5396 int lineIndex = lineCount(lineBox); | 5242 int lineIndex = lineCount(lineBox); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 5419 } | 5265 } |
| 5420 } else if (remainingLogicalHeight == pageLogicalHeight) { | 5266 } else if (remainingLogicalHeight == pageLogicalHeight) { |
| 5421 // We're at the very top of a page or column. | 5267 // We're at the very top of a page or column. |
| 5422 if (lineBox != firstRootBox()) | 5268 if (lineBox != firstRootBox()) |
| 5423 lineBox->setIsFirstAfterPageBreak(true); | 5269 lineBox->setIsFirstAfterPageBreak(true); |
| 5424 if (lineBox != firstRootBox() || offsetFromLogicalTopOfFirstPage()) | 5270 if (lineBox != firstRootBox() || offsetFromLogicalTopOfFirstPage()) |
| 5425 setPageBreak(logicalOffset, lineHeight); | 5271 setPageBreak(logicalOffset, lineHeight); |
| 5426 } | 5272 } |
| 5427 } | 5273 } |
| 5428 | 5274 |
| 5429 void RenderBlock::updateRegionForLine(RootInlineBox* lineBox) const | 5275 bool RenderBlock::lineWidthForPaginatedLineChanged(RootInlineBox* rootBox, Layou
tUnit lineDelta) const |
| 5430 { | 5276 { |
| 5431 ASSERT(lineBox); | 5277 return false; |
| 5432 lineBox->setContainingRegion(regionAtBlockOffset(lineBox->lineTopWithLeading
())); | |
| 5433 | |
| 5434 RootInlineBox* prevLineBox = lineBox->prevRootBox(); | |
| 5435 if (!prevLineBox) | |
| 5436 return; | |
| 5437 | |
| 5438 // This check is more accurate than the one in |adjustLinePositionForPaginat
ion| because it takes into | |
| 5439 // account just the container changes between lines. The before mentioned fu
nction doesn't set the flag | |
| 5440 // correctly if the line is positioned at the top of the last fragment conta
iner. | |
| 5441 if (lineBox->containingRegion() != prevLineBox->containingRegion()) | |
| 5442 lineBox->setIsFirstAfterPageBreak(true); | |
| 5443 } | |
| 5444 | |
| 5445 bool RenderBlock::lineWidthForPaginatedLineChanged(RootInlineBox* rootBox, Layou
tUnit lineDelta, RenderFlowThread* flowThread) const | |
| 5446 { | |
| 5447 if (!flowThread) | |
| 5448 return false; | |
| 5449 | |
| 5450 RenderRegion* currentRegion = regionAtBlockOffset(rootBox->lineTopWithLeadin
g() + lineDelta); | |
| 5451 // Just bail if the region didn't change. | |
| 5452 if (rootBox->containingRegion() == currentRegion) | |
| 5453 return false; | |
| 5454 return rootBox->paginatedLineWidth() != availableLogicalWidthForContent(curr
entRegion); | |
| 5455 } | 5278 } |
| 5456 | 5279 |
| 5457 LayoutUnit RenderBlock::offsetFromLogicalTopOfFirstPage() const | 5280 LayoutUnit RenderBlock::offsetFromLogicalTopOfFirstPage() const |
| 5458 { | 5281 { |
| 5459 LayoutState* layoutState = view()->layoutState(); | 5282 LayoutState* layoutState = view()->layoutState(); |
| 5460 if (layoutState && !layoutState->isPaginated()) | 5283 if (layoutState && !layoutState->isPaginated()) |
| 5461 return 0; | 5284 return 0; |
| 5462 | 5285 |
| 5463 RenderFlowThread* flowThread = flowThreadContainingBlock(); | |
| 5464 if (flowThread) | |
| 5465 return flowThread->offsetFromLogicalTopOfFirstRegion(this); | |
| 5466 | |
| 5467 if (layoutState) { | 5286 if (layoutState) { |
| 5468 ASSERT(layoutState->renderer() == this); | 5287 ASSERT(layoutState->renderer() == this); |
| 5469 | 5288 |
| 5470 LayoutSize offsetDelta = layoutState->m_layoutOffset - layoutState->m_pa
geOffset; | 5289 LayoutSize offsetDelta = layoutState->m_layoutOffset - layoutState->m_pa
geOffset; |
| 5471 return isHorizontalWritingMode() ? offsetDelta.height() : offsetDelta.wi
dth(); | 5290 return isHorizontalWritingMode() ? offsetDelta.height() : offsetDelta.wi
dth(); |
| 5472 } | 5291 } |
| 5473 | 5292 |
| 5474 ASSERT_NOT_REACHED(); | 5293 ASSERT_NOT_REACHED(); |
| 5475 return 0; | 5294 return 0; |
| 5476 } | 5295 } |
| 5477 | 5296 |
| 5478 RenderRegion* RenderBlock::regionAtBlockOffset(LayoutUnit blockOffset) const | |
| 5479 { | |
| 5480 RenderFlowThread* flowThread = flowThreadContainingBlock(); | |
| 5481 if (!flowThread || !flowThread->hasValidRegionInfo()) | |
| 5482 return 0; | |
| 5483 | |
| 5484 return flowThread->regionAtBlockOffset(offsetFromLogicalTopOfFirstPage() + b
lockOffset, true); | |
| 5485 } | |
| 5486 | |
| 5487 bool RenderBlock::logicalWidthChangedInRegions(RenderFlowThread* flowThread) con
st | |
| 5488 { | |
| 5489 if (!flowThread || !flowThread->hasValidRegionInfo()) | |
| 5490 return false; | |
| 5491 | |
| 5492 return flowThread->logicalWidthChangedInRegionsForBlock(this); | |
| 5493 } | |
| 5494 | |
| 5495 RenderRegion* RenderBlock::clampToStartAndEndRegions(RenderRegion* region) const | |
| 5496 { | |
| 5497 RenderFlowThread* flowThread = flowThreadContainingBlock(); | |
| 5498 | |
| 5499 ASSERT(isRenderView() || (region && flowThread)); | |
| 5500 if (isRenderView()) | |
| 5501 return region; | |
| 5502 | |
| 5503 // We need to clamp to the block, since we want any lines or blocks that ove
rflow out of the | |
| 5504 // logical top or logical bottom of the block to size as though the border b
ox in the first and | |
| 5505 // last regions extended infinitely. Otherwise the lines are going to size a
ccording to the regions | |
| 5506 // they overflow into, which makes no sense when this block doesn't exist in
|region| at all. | |
| 5507 RenderRegion* startRegion; | |
| 5508 RenderRegion* endRegion; | |
| 5509 flowThread->getRegionRangeForBox(this, startRegion, endRegion); | |
| 5510 | |
| 5511 if (startRegion && region->logicalTopForFlowThreadContent() < startRegion->l
ogicalTopForFlowThreadContent()) | |
| 5512 return startRegion; | |
| 5513 if (endRegion && region->logicalTopForFlowThreadContent() > endRegion->logic
alTopForFlowThreadContent()) | |
| 5514 return endRegion; | |
| 5515 | |
| 5516 return region; | |
| 5517 } | |
| 5518 | |
| 5519 LayoutUnit RenderBlock::collapsedMarginBeforeForChild(const RenderBox* child) co
nst | 5297 LayoutUnit RenderBlock::collapsedMarginBeforeForChild(const RenderBox* child) co
nst |
| 5520 { | 5298 { |
| 5521 // If the child has the same directionality as we do, then we can just retur
n its | 5299 // If the child has the same directionality as we do, then we can just retur
n its |
| 5522 // collapsed margin. | 5300 // collapsed margin. |
| 5523 if (!child->isWritingModeRoot()) | 5301 if (!child->isWritingModeRoot()) |
| 5524 return child->collapsedMarginBefore(); | 5302 return child->collapsedMarginBefore(); |
| 5525 | 5303 |
| 5526 // The child has a different directionality. If the child is parallel, then
it's just | 5304 // The child has a different directionality. If the child is parallel, then
it's just |
| 5527 // flipped relative to us. We can use the collapsed margin for the opposite
edge. | 5305 // flipped relative to us. We can use the collapsed margin for the opposite
edge. |
| 5528 if (child->isHorizontalWritingMode() == isHorizontalWritingMode()) | 5306 if (child->isHorizontalWritingMode() == isHorizontalWritingMode()) |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5671 void RenderBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m
arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Render
Object* obj) const | 5449 void RenderBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m
arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Render
Object* obj) const |
| 5672 { | 5450 { |
| 5673 showRenderObject(); | 5451 showRenderObject(); |
| 5674 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) | 5452 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) |
| 5675 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); | 5453 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); |
| 5676 } | 5454 } |
| 5677 | 5455 |
| 5678 #endif | 5456 #endif |
| 5679 | 5457 |
| 5680 } // namespace WebCore | 5458 } // namespace WebCore |
| OLD | NEW |