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 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
363 } | 363 } |
364 | 364 |
365 void LayoutBlock::invalidatePaintOfSubtreesIfNeeded(PaintInvalidationState& chil
dPaintInvalidationState) | 365 void LayoutBlock::invalidatePaintOfSubtreesIfNeeded(PaintInvalidationState& chil
dPaintInvalidationState) |
366 { | 366 { |
367 LayoutBox::invalidatePaintOfSubtreesIfNeeded(childPaintInvalidationState); | 367 LayoutBox::invalidatePaintOfSubtreesIfNeeded(childPaintInvalidationState); |
368 | 368 |
369 // Take care of positioned objects. This is required as PaintInvalidationSta
te keeps a single clip rect. | 369 // Take care of positioned objects. This is required as PaintInvalidationSta
te keeps a single clip rect. |
370 if (TrackedLayoutBoxListHashSet* positionedObjects = this->positionedObjects
()) { | 370 if (TrackedLayoutBoxListHashSet* positionedObjects = this->positionedObjects
()) { |
371 for (auto* box : *positionedObjects) { | 371 for (auto* box : *positionedObjects) { |
372 | 372 |
373 // One of the renderers we're skipping over here may be the child's
paint invalidation container, | 373 // One of the layoutObjects we're skipping over here may be the chil
d's paint invalidation container, |
374 // so we can't pass our own paint invalidation container along. | 374 // so we can't pass our own paint invalidation container along. |
375 const LayoutBoxModelObject& paintInvalidationContainerForChild = *bo
x->containerForPaintInvalidation(); | 375 const LayoutBoxModelObject& paintInvalidationContainerForChild = *bo
x->containerForPaintInvalidation(); |
376 | 376 |
377 // If it's a new paint invalidation container, we won't have properl
y accumulated the offset into the | 377 // If it's a new paint invalidation container, we won't have properl
y accumulated the offset into the |
378 // PaintInvalidationState. | 378 // PaintInvalidationState. |
379 // FIXME: Teach PaintInvalidationState to handle this case. crbug.co
m/371485 | 379 // FIXME: Teach PaintInvalidationState to handle this case. crbug.co
m/371485 |
380 if (paintInvalidationContainerForChild != childPaintInvalidationStat
e.paintInvalidationContainer()) { | 380 if (paintInvalidationContainerForChild != childPaintInvalidationStat
e.paintInvalidationContainer()) { |
381 ForceHorriblySlowRectMapping slowRectMapping(&childPaintInvalida
tionState); | 381 ForceHorriblySlowRectMapping slowRectMapping(&childPaintInvalida
tionState); |
382 PaintInvalidationState disabledPaintInvalidationState(childPaint
InvalidationState, *this, paintInvalidationContainerForChild); | 382 PaintInvalidationState disabledPaintInvalidationState(childPaint
InvalidationState, *this, paintInvalidationContainerForChild); |
383 box->invalidateTreeIfNeeded(disabledPaintInvalidationState); | 383 box->invalidateTreeIfNeeded(disabledPaintInvalidationState); |
384 continue; | 384 continue; |
385 } | 385 } |
386 | 386 |
387 // If the positioned renderer is absolutely positioned and it is ins
ide | 387 // If the positioned layoutObject is absolutely positioned and it is
inside |
388 // a relatively positioned inline element, we need to account for | 388 // a relatively positioned inline element, we need to account for |
389 // the inline elements position in PaintInvalidationState. | 389 // the inline elements position in PaintInvalidationState. |
390 if (box->style()->position() == AbsolutePosition) { | 390 if (box->style()->position() == AbsolutePosition) { |
391 LayoutObject* container = box->container(&paintInvalidationConta
inerForChild, 0); | 391 LayoutObject* container = box->container(&paintInvalidationConta
inerForChild, 0); |
392 if (container->isRelPositioned() && container->isLayoutInline())
{ | 392 if (container->isRelPositioned() && container->isLayoutInline())
{ |
393 // FIXME: We should be able to use PaintInvalidationState fo
r this. | 393 // FIXME: We should be able to use PaintInvalidationState fo
r this. |
394 // Currently, we will place absolutely positioned elements i
nside | 394 // Currently, we will place absolutely positioned elements i
nside |
395 // relatively positioned inline blocks in the wrong location
. crbug.com/371485 | 395 // relatively positioned inline blocks in the wrong location
. crbug.com/371485 |
396 ForceHorriblySlowRectMapping slowRectMapping(&childPaintInva
lidationState); | 396 ForceHorriblySlowRectMapping slowRectMapping(&childPaintInva
lidationState); |
397 PaintInvalidationState disabledPaintInvalidationState(childP
aintInvalidationState, *this, paintInvalidationContainerForChild); | 397 PaintInvalidationState disabledPaintInvalidationState(childP
aintInvalidationState, *this, paintInvalidationContainerForChild); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
432 | 432 |
433 void LayoutBlock::addChildToContinuation(LayoutObject* newChild, LayoutObject* b
eforeChild) | 433 void LayoutBlock::addChildToContinuation(LayoutObject* newChild, LayoutObject* b
eforeChild) |
434 { | 434 { |
435 LayoutBlock* flow = continuationBefore(beforeChild); | 435 LayoutBlock* flow = continuationBefore(beforeChild); |
436 LayoutBoxModelObject* beforeChildParent = 0; | 436 LayoutBoxModelObject* beforeChildParent = 0; |
437 if (beforeChild) { | 437 if (beforeChild) { |
438 beforeChildParent = toLayoutBoxModelObject(beforeChild->parent()); | 438 beforeChildParent = toLayoutBoxModelObject(beforeChild->parent()); |
439 // Don't attempt to insert into something that isn't a LayoutBlockFlow (
block | 439 // Don't attempt to insert into something that isn't a LayoutBlockFlow (
block |
440 // container). While the DOM nodes of |beforeChild| and |newChild| are s
iblings, there may | 440 // container). While the DOM nodes of |beforeChild| and |newChild| are s
iblings, there may |
441 // be anonymous table wrapper objects around |beforeChild| on the layout
side. Therefore, | 441 // be anonymous table wrapper objects around |beforeChild| on the layout
side. Therefore, |
442 // find the nearest LayoutBlockFlow. If it turns out that the new render
er doesn't belong | 442 // find the nearest LayoutBlockFlow. If it turns out that the new layout
Object doesn't belong |
443 // inside the anonymous table, this will make sure that it's really put
on the outside. If | 443 // inside the anonymous table, this will make sure that it's really put
on the outside. If |
444 // it turns out that it does belong inside it, the normal child insertio
n machinery will | 444 // it turns out that it does belong inside it, the normal child insertio
n machinery will |
445 // make sure it ends up there, and at the right place too. We cannot jus
t guess that it's | 445 // make sure it ends up there, and at the right place too. We cannot jus
t guess that it's |
446 // going to be right under the parent of |beforeChild|. | 446 // going to be right under the parent of |beforeChild|. |
447 while (beforeChildParent && !beforeChildParent->isLayoutBlockFlow()) { | 447 while (beforeChildParent && !beforeChildParent->isLayoutBlockFlow()) { |
448 ASSERT(!beforeChildParent->virtualContinuation()); | 448 ASSERT(!beforeChildParent->virtualContinuation()); |
449 ASSERT(beforeChildParent->isAnonymous()); | 449 ASSERT(beforeChildParent->isAnonymous()); |
450 RELEASE_ASSERT(beforeChildParent != this); | 450 RELEASE_ASSERT(beforeChildParent != this); |
451 beforeChildParent = toLayoutBoxModelObject(beforeChildParent->parent
()); | 451 beforeChildParent = toLayoutBoxModelObject(beforeChildParent->parent
()); |
452 } | 452 } |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
553 } | 553 } |
554 | 554 |
555 LayoutBlockFlow* LayoutBlock::containingColumnsBlock(bool allowAnonymousColumnBl
ock) | 555 LayoutBlockFlow* LayoutBlock::containingColumnsBlock(bool allowAnonymousColumnBl
ock) |
556 { | 556 { |
557 LayoutBlock* firstChildIgnoringAnonymousWrappers = 0; | 557 LayoutBlock* firstChildIgnoringAnonymousWrappers = 0; |
558 for (LayoutObject* curr = this; curr; curr = curr->parent()) { | 558 for (LayoutObject* curr = this; curr; curr = curr->parent()) { |
559 if (!curr->isLayoutBlock() || curr->isFloatingOrOutOfFlowPositioned() ||
curr->isTableCell() || curr->isDocumentElement() || curr->isLayoutView() || cur
r->hasOverflowClip() | 559 if (!curr->isLayoutBlock() || curr->isFloatingOrOutOfFlowPositioned() ||
curr->isTableCell() || curr->isDocumentElement() || curr->isLayoutView() || cur
r->hasOverflowClip() |
560 || curr->isInlineBlockOrInlineTable()) | 560 || curr->isInlineBlockOrInlineTable()) |
561 return 0; | 561 return 0; |
562 | 562 |
563 // FIXME: Renderers that do special management of their children (tables
, buttons, | 563 // FIXME: LayoutObjects that do special management of their children (ta
bles, buttons, |
564 // lists, flexboxes, etc.) breaks when the flow is split through them. D
isabling | 564 // lists, flexboxes, etc.) breaks when the flow is split through them. D
isabling |
565 // multi-column for them to avoid this problem.) | 565 // multi-column for them to avoid this problem.) |
566 if (!curr->isLayoutBlockFlow() || curr->isListItem()) | 566 if (!curr->isLayoutBlockFlow() || curr->isListItem()) |
567 return 0; | 567 return 0; |
568 | 568 |
569 LayoutBlockFlow* currBlock = toLayoutBlockFlow(curr); | 569 LayoutBlockFlow* currBlock = toLayoutBlockFlow(curr); |
570 if (!currBlock->createsAnonymousWrapper()) | 570 if (!currBlock->createsAnonymousWrapper()) |
571 firstChildIgnoringAnonymousWrappers = currBlock; | 571 firstChildIgnoringAnonymousWrappers = currBlock; |
572 | 572 |
573 if (currBlock->style()->specifiesColumns() && (allowAnonymousColumnBlock
|| !currBlock->isAnonymousColumnsBlock())) | 573 if (currBlock->style()->specifiesColumns() && (allowAnonymousColumnBlock
|| !currBlock->isAnonymousColumnsBlock())) |
574 return toLayoutBlockFlow(firstChildIgnoringAnonymousWrappers); | 574 return toLayoutBlockFlow(firstChildIgnoringAnonymousWrappers); |
575 | 575 |
576 if (currBlock->isAnonymousColumnSpanBlock()) | 576 if (currBlock->isAnonymousColumnSpanBlock()) |
577 return 0; | 577 return 0; |
578 } | 578 } |
579 return 0; | 579 return 0; |
580 } | 580 } |
581 | 581 |
582 LayoutBlock* LayoutBlock::clone() const | 582 LayoutBlock* LayoutBlock::clone() const |
583 { | 583 { |
584 LayoutBlock* cloneBlock; | 584 LayoutBlock* cloneBlock; |
585 if (isAnonymousBlock()) { | 585 if (isAnonymousBlock()) { |
586 cloneBlock = createAnonymousBlock(); | 586 cloneBlock = createAnonymousBlock(); |
587 cloneBlock->setChildrenInline(childrenInline()); | 587 cloneBlock->setChildrenInline(childrenInline()); |
588 } else { | 588 } else { |
589 LayoutObject* cloneRenderer = toElement(node())->createLayoutObject(styl
eRef()); | 589 LayoutObject* cloneLayoutObject = toElement(node())->createLayoutObject(
styleRef()); |
590 cloneBlock = toLayoutBlock(cloneRenderer); | 590 cloneBlock = toLayoutBlock(cloneLayoutObject); |
591 cloneBlock->setStyle(mutableStyle()); | 591 cloneBlock->setStyle(mutableStyle()); |
592 | 592 |
593 // This takes care of setting the right value of childrenInline in case | 593 // This takes care of setting the right value of childrenInline in case |
594 // generated content is added to cloneBlock and 'this' does not have | 594 // generated content is added to cloneBlock and 'this' does not have |
595 // generated content added yet. | 595 // generated content added yet. |
596 cloneBlock->setChildrenInline(cloneBlock->firstChild() ? cloneBlock->fir
stChild()->isInline() : childrenInline()); | 596 cloneBlock->setChildrenInline(cloneBlock->firstChild() ? cloneBlock->fir
stChild()->isInline() : childrenInline()); |
597 } | 597 } |
598 cloneBlock->setFlowThreadState(flowThreadState()); | 598 cloneBlock->setFlowThreadState(flowThreadState()); |
599 return cloneBlock; | 599 return cloneBlock; |
600 } | 600 } |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
808 LayoutObject* beforeChildContainer = beforeChild->parent(); | 808 LayoutObject* beforeChildContainer = beforeChild->parent(); |
809 while (beforeChildContainer->parent() != this) | 809 while (beforeChildContainer->parent() != this) |
810 beforeChildContainer = beforeChildContainer->parent(); | 810 beforeChildContainer = beforeChildContainer->parent(); |
811 ASSERT(beforeChildContainer); | 811 ASSERT(beforeChildContainer); |
812 | 812 |
813 if (beforeChildContainer->isAnonymous()) { | 813 if (beforeChildContainer->isAnonymous()) { |
814 // If the requested beforeChild is not one of our children, then thi
s is because | 814 // If the requested beforeChild is not one of our children, then thi
s is because |
815 // there is an anonymous container within this object that contains
the beforeChild. | 815 // there is an anonymous container within this object that contains
the beforeChild. |
816 LayoutObject* beforeChildAnonymousContainer = beforeChildContainer; | 816 LayoutObject* beforeChildAnonymousContainer = beforeChildContainer; |
817 if (beforeChildAnonymousContainer->isAnonymousBlock() | 817 if (beforeChildAnonymousContainer->isAnonymousBlock() |
818 // Full screen renderers and full screen placeholders act as ano
nymous blocks, not tables: | 818 // Full screen layoutObjects and full screen placeholders act as
anonymous blocks, not tables: |
819 || beforeChildAnonymousContainer->isLayoutFullScreen() | 819 || beforeChildAnonymousContainer->isLayoutFullScreen() |
820 || beforeChildAnonymousContainer->isLayoutFullScreenPlaceholder(
) | 820 || beforeChildAnonymousContainer->isLayoutFullScreenPlaceholder(
) |
821 ) { | 821 ) { |
822 // Insert the child into the anonymous block box instead of here
. | 822 // Insert the child into the anonymous block box instead of here
. |
823 if (newChild->isInline() || newChild->isFloatingOrOutOfFlowPosit
ioned() || beforeChild->parent()->slowFirstChild() != beforeChild) | 823 if (newChild->isInline() || newChild->isFloatingOrOutOfFlowPosit
ioned() || beforeChild->parent()->slowFirstChild() != beforeChild) |
824 beforeChild->parent()->addChild(newChild, beforeChild); | 824 beforeChild->parent()->addChild(newChild, beforeChild); |
825 else | 825 else |
826 addChild(newChild, beforeChild->parent()); | 826 addChild(newChild, beforeChild->parent()); |
827 return; | 827 return; |
828 } | 828 } |
(...skipping 1554 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2383 // prevent crossing editable boundaries. This would require many tests. | 2383 // prevent crossing editable boundaries. This would require many tests. |
2384 static PositionWithAffinity positionForPointRespectingEditingBoundaries(LayoutBl
ock* parent, LayoutBox* child, const LayoutPoint& pointInParentCoordinates) | 2384 static PositionWithAffinity positionForPointRespectingEditingBoundaries(LayoutBl
ock* parent, LayoutBox* child, const LayoutPoint& pointInParentCoordinates) |
2385 { | 2385 { |
2386 LayoutPoint childLocation = child->location(); | 2386 LayoutPoint childLocation = child->location(); |
2387 if (child->isRelPositioned()) | 2387 if (child->isRelPositioned()) |
2388 childLocation += child->offsetForInFlowPosition(); | 2388 childLocation += child->offsetForInFlowPosition(); |
2389 | 2389 |
2390 // FIXME: This is wrong if the child's writing-mode is different from the pa
rent's. | 2390 // FIXME: This is wrong if the child's writing-mode is different from the pa
rent's. |
2391 LayoutPoint pointInChildCoordinates(toLayoutPoint(pointInParentCoordinates -
childLocation)); | 2391 LayoutPoint pointInChildCoordinates(toLayoutPoint(pointInParentCoordinates -
childLocation)); |
2392 | 2392 |
2393 // If this is an anonymous renderer, we just recur normally | 2393 // If this is an anonymous layoutObject, we just recur normally |
2394 Node* childNode = child->nonPseudoNode(); | 2394 Node* childNode = child->nonPseudoNode(); |
2395 if (!childNode) | 2395 if (!childNode) |
2396 return child->positionForPoint(pointInChildCoordinates); | 2396 return child->positionForPoint(pointInChildCoordinates); |
2397 | 2397 |
2398 // Otherwise, first make sure that the editability of the parent and child a
gree. | 2398 // Otherwise, first make sure that the editability of the parent and child a
gree. |
2399 // If they don't agree, then we return a visible position just before or aft
er the child | 2399 // If they don't agree, then we return a visible position just before or aft
er the child |
2400 LayoutObject* ancestor = parent; | 2400 LayoutObject* ancestor = parent; |
2401 while (ancestor && !ancestor->nonPseudoNode()) | 2401 while (ancestor && !ancestor->nonPseudoNode()) |
2402 ancestor = ancestor->parent(); | 2402 ancestor = ancestor->parent(); |
2403 | 2403 |
(...skipping 783 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3187 } | 3187 } |
3188 | 3188 |
3189 // If we're not replaced, we'll only get called with PositionOfInteriorLineB
oxes. | 3189 // If we're not replaced, we'll only get called with PositionOfInteriorLineB
oxes. |
3190 // Note that inline-block counts as replaced here. | 3190 // Note that inline-block counts as replaced here. |
3191 ASSERT(linePositionMode == PositionOfInteriorLineBoxes); | 3191 ASSERT(linePositionMode == PositionOfInteriorLineBoxes); |
3192 | 3192 |
3193 const FontMetrics& fontMetrics = style(firstLine)->fontMetrics(); | 3193 const FontMetrics& fontMetrics = style(firstLine)->fontMetrics(); |
3194 return fontMetrics.ascent(baselineType) + (lineHeight(firstLine, direction,
linePositionMode) - fontMetrics.height()) / 2; | 3194 return fontMetrics.ascent(baselineType) + (lineHeight(firstLine, direction,
linePositionMode) - fontMetrics.height()) / 2; |
3195 } | 3195 } |
3196 | 3196 |
3197 LayoutUnit LayoutBlock::minLineHeightForReplacedRenderer(bool isFirstLine, Layou
tUnit replacedHeight) const | 3197 LayoutUnit LayoutBlock::minLineHeightForReplacedObject(bool isFirstLine, LayoutU
nit replacedHeight) const |
3198 { | 3198 { |
3199 if (!document().inNoQuirksMode() && replacedHeight) | 3199 if (!document().inNoQuirksMode() && replacedHeight) |
3200 return replacedHeight; | 3200 return replacedHeight; |
3201 | 3201 |
3202 if (!(style(isFirstLine)->lineBoxContain() & LineBoxContainBlock)) | 3202 if (!(style(isFirstLine)->lineBoxContain() & LineBoxContainBlock)) |
3203 return LayoutUnit(); | 3203 return LayoutUnit(); |
3204 | 3204 |
3205 return std::max<LayoutUnit>(replacedHeight, lineHeight(isFirstLine, isHorizo
ntalWritingMode() ? HorizontalLine : VerticalLine, PositionOfInteriorLineBoxes))
; | 3205 return std::max<LayoutUnit>(replacedHeight, lineHeight(isFirstLine, isHorizo
ntalWritingMode() ? HorizontalLine : VerticalLine, PositionOfInteriorLineBoxes))
; |
3206 } | 3206 } |
3207 | 3207 |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3515 } | 3515 } |
3516 | 3516 |
3517 void LayoutBlock::addFocusRingRects(Vector<LayoutRect>& rects, const LayoutPoint
& additionalOffset) const | 3517 void LayoutBlock::addFocusRingRects(Vector<LayoutRect>& rects, const LayoutPoint
& additionalOffset) const |
3518 { | 3518 { |
3519 // For blocks inside inlines, we go ahead and include margins so that we run
right up to the | 3519 // For blocks inside inlines, we go ahead and include margins so that we run
right up to the |
3520 // inline boxes above and below us (thus getting merged with them to form a
single irregular | 3520 // inline boxes above and below us (thus getting merged with them to form a
single irregular |
3521 // shape). | 3521 // shape). |
3522 if (inlineElementContinuation()) { | 3522 if (inlineElementContinuation()) { |
3523 // FIXME: This check really isn't accurate. | 3523 // FIXME: This check really isn't accurate. |
3524 bool nextInlineHasLineBox = inlineElementContinuation()->firstLineBox(); | 3524 bool nextInlineHasLineBox = inlineElementContinuation()->firstLineBox(); |
3525 // FIXME: This is wrong. The principal renderer may not be the continuat
ion preceding this block. | 3525 // FIXME: This is wrong. The principal layoutObject may not be the conti
nuation preceding this block. |
3526 // FIXME: This is wrong for vertical writing-modes. | 3526 // FIXME: This is wrong for vertical writing-modes. |
3527 // https://bugs.webkit.org/show_bug.cgi?id=46781 | 3527 // https://bugs.webkit.org/show_bug.cgi?id=46781 |
3528 bool prevInlineHasLineBox = toLayoutInline(inlineElementContinuation()->
node()->layoutObject())->firstLineBox(); | 3528 bool prevInlineHasLineBox = toLayoutInline(inlineElementContinuation()->
node()->layoutObject())->firstLineBox(); |
3529 LayoutUnit topMargin = prevInlineHasLineBox ? collapsedMarginBefore() :
LayoutUnit(); | 3529 LayoutUnit topMargin = prevInlineHasLineBox ? collapsedMarginBefore() :
LayoutUnit(); |
3530 LayoutUnit bottomMargin = nextInlineHasLineBox ? collapsedMarginAfter()
: LayoutUnit(); | 3530 LayoutUnit bottomMargin = nextInlineHasLineBox ? collapsedMarginAfter()
: LayoutUnit(); |
3531 LayoutRect rect(additionalOffset, size()); | 3531 LayoutRect rect(additionalOffset, size()); |
3532 rect.expandEdges(topMargin, 0, bottomMargin, 0); | 3532 rect.expandEdges(topMargin, 0, bottomMargin, 0); |
3533 | 3533 |
3534 if (!rect.isEmpty()) | 3534 if (!rect.isEmpty()) |
3535 rects.append(rect); | 3535 rects.append(rect); |
(...skipping 29 matching lines...) Expand all Loading... |
3565 // It's common for this rect to be entirely contained in our box, so
exclude that simple case. | 3565 // It's common for this rect to be entirely contained in our box, so
exclude that simple case. |
3566 if (!rect.isEmpty() && (rects.isEmpty() || !rects[0].contains(rect))
) | 3566 if (!rect.isEmpty() && (rects.isEmpty() || !rects[0].contains(rect))
) |
3567 rects.append(rect); | 3567 rects.append(rect); |
3568 } | 3568 } |
3569 } | 3569 } |
3570 } | 3570 } |
3571 | 3571 |
3572 LayoutBox* LayoutBlock::createAnonymousBoxWithSameTypeAs(const LayoutObject* par
ent) const | 3572 LayoutBox* LayoutBlock::createAnonymousBoxWithSameTypeAs(const LayoutObject* par
ent) const |
3573 { | 3573 { |
3574 if (isAnonymousColumnsBlock()) | 3574 if (isAnonymousColumnsBlock()) |
3575 return createAnonymousColumnsWithParentRenderer(parent); | 3575 return createAnonymousColumnsWithParent(parent); |
3576 if (isAnonymousColumnSpanBlock()) | 3576 if (isAnonymousColumnSpanBlock()) |
3577 return createAnonymousColumnSpanWithParentRenderer(parent); | 3577 return createAnonymousColumnSpanWithParent(parent); |
3578 return createAnonymousWithParentRendererAndDisplay(parent, style()->display(
)); | 3578 return createAnonymousWithParentAndDisplay(parent, style()->display()); |
3579 } | 3579 } |
3580 | 3580 |
3581 LayoutUnit LayoutBlock::nextPageLogicalTop(LayoutUnit logicalOffset, PageBoundar
yRule pageBoundaryRule) const | 3581 LayoutUnit LayoutBlock::nextPageLogicalTop(LayoutUnit logicalOffset, PageBoundar
yRule pageBoundaryRule) const |
3582 { | 3582 { |
3583 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); | 3583 LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset); |
3584 if (!pageLogicalHeight) | 3584 if (!pageLogicalHeight) |
3585 return logicalOffset; | 3585 return logicalOffset; |
3586 | 3586 |
3587 // The logicalOffset is in our coordinate space. We can add in our pushed o
ffset. | 3587 // The logicalOffset is in our coordinate space. We can add in our pushed o
ffset. |
3588 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi
calOffset); | 3588 LayoutUnit remainingLogicalHeight = pageRemainingLogicalHeightForOffset(logi
calOffset); |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3714 // whether or not authors specified quirky ems, since they're an implementat
ion detail. | 3714 // whether or not authors specified quirky ems, since they're an implementat
ion detail. |
3715 return false; | 3715 return false; |
3716 } | 3716 } |
3717 | 3717 |
3718 const char* LayoutBlock::name() const | 3718 const char* LayoutBlock::name() const |
3719 { | 3719 { |
3720 ASSERT_NOT_REACHED(); | 3720 ASSERT_NOT_REACHED(); |
3721 return "LayoutBlock"; | 3721 return "LayoutBlock"; |
3722 } | 3722 } |
3723 | 3723 |
3724 LayoutBlock* LayoutBlock::createAnonymousWithParentRendererAndDisplay(const Layo
utObject* parent, EDisplay display) | 3724 LayoutBlock* LayoutBlock::createAnonymousWithParentAndDisplay(const LayoutObject
* parent, EDisplay display) |
3725 { | 3725 { |
3726 // FIXME: Do we need to convert all our inline displays to block-type in the
anonymous logic ? | 3726 // FIXME: Do we need to convert all our inline displays to block-type in the
anonymous logic ? |
3727 EDisplay newDisplay; | 3727 EDisplay newDisplay; |
3728 LayoutBlock* newBox = 0; | 3728 LayoutBlock* newBox = 0; |
3729 if (display == FLEX || display == INLINE_FLEX) { | 3729 if (display == FLEX || display == INLINE_FLEX) { |
3730 newBox = LayoutFlexibleBox::createAnonymous(&parent->document()); | 3730 newBox = LayoutFlexibleBox::createAnonymous(&parent->document()); |
3731 newDisplay = FLEX; | 3731 newDisplay = FLEX; |
3732 } else { | 3732 } else { |
3733 newBox = LayoutBlockFlow::createAnonymous(&parent->document()); | 3733 newBox = LayoutBlockFlow::createAnonymous(&parent->document()); |
3734 newDisplay = BLOCK; | 3734 newDisplay = BLOCK; |
3735 } | 3735 } |
3736 | 3736 |
3737 RefPtr<ComputedStyle> newStyle = ComputedStyle::createAnonymousStyleWithDisp
lay(parent->styleRef(), newDisplay); | 3737 RefPtr<ComputedStyle> newStyle = ComputedStyle::createAnonymousStyleWithDisp
lay(parent->styleRef(), newDisplay); |
3738 parent->updateAnonymousChildStyle(*newBox, *newStyle); | 3738 parent->updateAnonymousChildStyle(*newBox, *newStyle); |
3739 newBox->setStyle(newStyle.release()); | 3739 newBox->setStyle(newStyle.release()); |
3740 return newBox; | 3740 return newBox; |
3741 } | 3741 } |
3742 | 3742 |
3743 LayoutBlockFlow* LayoutBlock::createAnonymousColumnsWithParentRenderer(const Lay
outObject* parent) | 3743 LayoutBlockFlow* LayoutBlock::createAnonymousColumnsWithParent(const LayoutObjec
t* parent) |
3744 { | 3744 { |
3745 RefPtr<ComputedStyle> newStyle = ComputedStyle::createAnonymousStyleWithDisp
lay(parent->styleRef(), BLOCK); | 3745 RefPtr<ComputedStyle> newStyle = ComputedStyle::createAnonymousStyleWithDisp
lay(parent->styleRef(), BLOCK); |
3746 newStyle->inheritColumnPropertiesFrom(parent->styleRef()); | 3746 newStyle->inheritColumnPropertiesFrom(parent->styleRef()); |
3747 | 3747 |
3748 LayoutBlockFlow* newBox = LayoutBlockFlow::createAnonymous(&parent->document
()); | 3748 LayoutBlockFlow* newBox = LayoutBlockFlow::createAnonymous(&parent->document
()); |
3749 parent->updateAnonymousChildStyle(*newBox, *newStyle); | 3749 parent->updateAnonymousChildStyle(*newBox, *newStyle); |
3750 newBox->setStyle(newStyle.release()); | 3750 newBox->setStyle(newStyle.release()); |
3751 return newBox; | 3751 return newBox; |
3752 } | 3752 } |
3753 | 3753 |
3754 LayoutBlockFlow* LayoutBlock::createAnonymousColumnSpanWithParentRenderer(const
LayoutObject* parent) | 3754 LayoutBlockFlow* LayoutBlock::createAnonymousColumnSpanWithParent(const LayoutOb
ject* parent) |
3755 { | 3755 { |
3756 RefPtr<ComputedStyle> newStyle = ComputedStyle::createAnonymousStyleWithDisp
lay(parent->styleRef(), BLOCK); | 3756 RefPtr<ComputedStyle> newStyle = ComputedStyle::createAnonymousStyleWithDisp
lay(parent->styleRef(), BLOCK); |
3757 newStyle->setColumnSpan(ColumnSpanAll); | 3757 newStyle->setColumnSpan(ColumnSpanAll); |
3758 | 3758 |
3759 LayoutBlockFlow* newBox = LayoutBlockFlow::createAnonymous(&parent->document
()); | 3759 LayoutBlockFlow* newBox = LayoutBlockFlow::createAnonymous(&parent->document
()); |
3760 parent->updateAnonymousChildStyle(*newBox, *newStyle); | 3760 parent->updateAnonymousChildStyle(*newBox, *newStyle); |
3761 newBox->setStyle(newStyle.release()); | 3761 newBox->setStyle(newStyle.release()); |
3762 return newBox; | 3762 return newBox; |
3763 } | 3763 } |
3764 | 3764 |
3765 static bool recalcNormalFlowChildOverflowIfNeeded(LayoutObject* renderer) | 3765 static bool recalcNormalFlowChildOverflowIfNeeded(LayoutObject* layoutObject) |
3766 { | 3766 { |
3767 if (renderer->isOutOfFlowPositioned() || !renderer->needsOverflowRecalcAfter
StyleChange()) | 3767 if (layoutObject->isOutOfFlowPositioned() || !layoutObject->needsOverflowRec
alcAfterStyleChange()) |
3768 return false; | 3768 return false; |
3769 | 3769 |
3770 ASSERT(renderer->isLayoutBlock()); | 3770 ASSERT(layoutObject->isLayoutBlock()); |
3771 return toLayoutBlock(renderer)->recalcOverflowAfterStyleChange(); | 3771 return toLayoutBlock(layoutObject)->recalcOverflowAfterStyleChange(); |
3772 } | 3772 } |
3773 | 3773 |
3774 bool LayoutBlock::recalcChildOverflowAfterStyleChange() | 3774 bool LayoutBlock::recalcChildOverflowAfterStyleChange() |
3775 { | 3775 { |
3776 ASSERT(childNeedsOverflowRecalcAfterStyleChange()); | 3776 ASSERT(childNeedsOverflowRecalcAfterStyleChange()); |
3777 setChildNeedsOverflowRecalcAfterStyleChange(false); | 3777 setChildNeedsOverflowRecalcAfterStyleChange(false); |
3778 | 3778 |
3779 bool childrenOverflowChanged = false; | 3779 bool childrenOverflowChanged = false; |
3780 | 3780 |
3781 if (childrenInline()) { | 3781 if (childrenInline()) { |
3782 ListHashSet<RootInlineBox*> lineBoxes; | 3782 ListHashSet<RootInlineBox*> lineBoxes; |
3783 for (InlineWalker walker(this); !walker.atEnd(); walker.advance()) { | 3783 for (InlineWalker walker(this); !walker.atEnd(); walker.advance()) { |
3784 LayoutObject* renderer = walker.current(); | 3784 LayoutObject* layoutObject = walker.current(); |
3785 if (recalcNormalFlowChildOverflowIfNeeded(renderer)) { | 3785 if (recalcNormalFlowChildOverflowIfNeeded(layoutObject)) { |
3786 childrenOverflowChanged = true; | 3786 childrenOverflowChanged = true; |
3787 if (InlineBox* inlineBoxWrapper = toLayoutBlock(renderer)->inlin
eBoxWrapper()) | 3787 if (InlineBox* inlineBoxWrapper = toLayoutBlock(layoutObject)->i
nlineBoxWrapper()) |
3788 lineBoxes.add(&inlineBoxWrapper->root()); | 3788 lineBoxes.add(&inlineBoxWrapper->root()); |
3789 } | 3789 } |
3790 } | 3790 } |
3791 | 3791 |
3792 // FIXME: Glyph overflow will get lost in this case, but not really a bi
g deal. | 3792 // FIXME: Glyph overflow will get lost in this case, but not really a bi
g deal. |
3793 GlyphOverflowAndFallbackFontsMap textBoxDataMap; | 3793 GlyphOverflowAndFallbackFontsMap textBoxDataMap; |
3794 for (ListHashSet<RootInlineBox*>::const_iterator it = lineBoxes.begin();
it != lineBoxes.end(); ++it) { | 3794 for (ListHashSet<RootInlineBox*>::const_iterator it = lineBoxes.begin();
it != lineBoxes.end(); ++it) { |
3795 RootInlineBox* box = *it; | 3795 RootInlineBox* box = *it; |
3796 box->computeOverflow(box->lineTop(), box->lineBottom(), textBoxDataM
ap); | 3796 box->computeOverflow(box->lineTop(), box->lineBottom(), textBoxDataM
ap); |
3797 } | 3797 } |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3913 void LayoutBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m
arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Layout
Object* obj) const | 3913 void LayoutBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m
arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Layout
Object* obj) const |
3914 { | 3914 { |
3915 showLayoutObject(); | 3915 showLayoutObject(); |
3916 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) | 3916 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) |
3917 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); | 3917 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); |
3918 } | 3918 } |
3919 | 3919 |
3920 #endif | 3920 #endif |
3921 | 3921 |
3922 } // namespace blink | 3922 } // namespace blink |
OLD | NEW |