| 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 * Copyright (C) 2003, 2006, 2007 Apple Inc. All rights reserved. | 4 * Copyright (C) 2003, 2006, 2007 Apple Inc. All rights reserved. |
| 5 * | 5 * |
| 6 * This library is free software; you can redistribute it and/or | 6 * This library is free software; you can redistribute it and/or |
| 7 * modify it under the terms of the GNU Library General Public | 7 * modify it under the terms of the GNU Library General Public |
| 8 * License as published by the Free Software Foundation; either | 8 * License as published by the Free Software Foundation; either |
| 9 * version 2 of the License, or (at your option) any later version. | 9 * version 2 of the License, or (at your option) any later version. |
| 10 * | 10 * |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 LayoutBoxRareData() | 68 LayoutBoxRareData() |
| 69 : m_spannerPlaceholder(nullptr), | 69 : m_spannerPlaceholder(nullptr), |
| 70 m_overrideLogicalContentWidth(-1), | 70 m_overrideLogicalContentWidth(-1), |
| 71 m_overrideLogicalContentHeight(-1), | 71 m_overrideLogicalContentHeight(-1), |
| 72 m_hasOverrideContainingBlockContentLogicalWidth(false), | 72 m_hasOverrideContainingBlockContentLogicalWidth(false), |
| 73 m_hasOverrideContainingBlockContentLogicalHeight(false), | 73 m_hasOverrideContainingBlockContentLogicalHeight(false), |
| 74 m_percentHeightContainer(nullptr), | 74 m_percentHeightContainer(nullptr), |
| 75 m_snapContainer(nullptr), | 75 m_snapContainer(nullptr), |
| 76 m_snapAreas(nullptr) {} | 76 m_snapAreas(nullptr) {} |
| 77 | 77 |
| 78 // For spanners, the spanner placeholder that lays us out within the multicol
container. | 78 // For spanners, the spanner placeholder that lays us out within the multicol |
| 79 // container. |
| 79 LayoutMultiColumnSpannerPlaceholder* m_spannerPlaceholder; | 80 LayoutMultiColumnSpannerPlaceholder* m_spannerPlaceholder; |
| 80 | 81 |
| 81 LayoutUnit m_overrideLogicalContentWidth; | 82 LayoutUnit m_overrideLogicalContentWidth; |
| 82 LayoutUnit m_overrideLogicalContentHeight; | 83 LayoutUnit m_overrideLogicalContentHeight; |
| 83 | 84 |
| 84 bool m_hasOverrideContainingBlockContentLogicalWidth; | 85 bool m_hasOverrideContainingBlockContentLogicalWidth; |
| 85 bool m_hasOverrideContainingBlockContentLogicalHeight; | 86 bool m_hasOverrideContainingBlockContentLogicalHeight; |
| 86 LayoutUnit m_overrideContainingBlockContentLogicalWidth; | 87 LayoutUnit m_overrideContainingBlockContentLogicalWidth; |
| 87 LayoutUnit m_overrideContainingBlockContentLogicalHeight; | 88 LayoutUnit m_overrideContainingBlockContentLogicalHeight; |
| 88 | 89 |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 320 IntSize pixelSnappedSize() const { return m_frameRect.pixelSnappedSize(); } | 321 IntSize pixelSnappedSize() const { return m_frameRect.pixelSnappedSize(); } |
| 321 | 322 |
| 322 void setLocation(const LayoutPoint& location) { | 323 void setLocation(const LayoutPoint& location) { |
| 323 if (location == m_frameRect.location()) | 324 if (location == m_frameRect.location()) |
| 324 return; | 325 return; |
| 325 m_frameRect.setLocation(location); | 326 m_frameRect.setLocation(location); |
| 326 frameRectChanged(); | 327 frameRectChanged(); |
| 327 } | 328 } |
| 328 | 329 |
| 329 // FIXME: Currently scrollbars are using int geometry and positioned based on | 330 // FIXME: Currently scrollbars are using int geometry and positioned based on |
| 330 // pixelSnappedBorderBoxRect whose size may change when location changes becau
se of | 331 // pixelSnappedBorderBoxRect whose size may change when location changes |
| 331 // pixel snapping. This function is used to change location of the LayoutBox o
utside | 332 // because of pixel snapping. This function is used to change location of the |
| 332 // of LayoutBox::layout(). Will remove when we use LayoutUnits for scrollbars. | 333 // LayoutBox outside of LayoutBox::layout(). Will remove when we use |
| 334 // LayoutUnits for scrollbars. |
| 333 void setLocationAndUpdateOverflowControlsIfNeeded(const LayoutPoint&); | 335 void setLocationAndUpdateOverflowControlsIfNeeded(const LayoutPoint&); |
| 334 | 336 |
| 335 void setSize(const LayoutSize& size) { | 337 void setSize(const LayoutSize& size) { |
| 336 if (size == m_frameRect.size()) | 338 if (size == m_frameRect.size()) |
| 337 return; | 339 return; |
| 338 m_frameRect.setSize(size); | 340 m_frameRect.setSize(size); |
| 339 frameRectChanged(); | 341 frameRectChanged(); |
| 340 } | 342 } |
| 341 void move(LayoutUnit dx, LayoutUnit dy) { | 343 void move(LayoutUnit dx, LayoutUnit dy) { |
| 342 if (!dx && !dy) | 344 if (!dx && !dy) |
| (...skipping 20 matching lines...) Expand all Loading... |
| 363 return LayoutRect(LayoutUnit(borderLeft()), LayoutUnit(borderTop()), | 365 return LayoutRect(LayoutUnit(borderLeft()), LayoutUnit(borderTop()), |
| 364 clientWidth(), clientHeight()); | 366 clientWidth(), clientHeight()); |
| 365 } | 367 } |
| 366 IntRect pixelSnappedBorderBoxRect() const { | 368 IntRect pixelSnappedBorderBoxRect() const { |
| 367 return IntRect(IntPoint(), m_frameRect.pixelSnappedSize()); | 369 return IntRect(IntPoint(), m_frameRect.pixelSnappedSize()); |
| 368 } | 370 } |
| 369 IntRect borderBoundingBox() const final { | 371 IntRect borderBoundingBox() const final { |
| 370 return pixelSnappedBorderBoxRect(); | 372 return pixelSnappedBorderBoxRect(); |
| 371 } | 373 } |
| 372 | 374 |
| 373 // The content area of the box (excludes padding - and intrinsic padding for t
able cells, etc... - and border). | 375 // The content area of the box (excludes padding - and intrinsic padding for |
| 376 // table cells, etc... - and border). |
| 374 DISABLE_CFI_PERF LayoutRect contentBoxRect() const { | 377 DISABLE_CFI_PERF LayoutRect contentBoxRect() const { |
| 375 return LayoutRect(borderLeft() + paddingLeft(), borderTop() + paddingTop(), | 378 return LayoutRect(borderLeft() + paddingLeft(), borderTop() + paddingTop(), |
| 376 contentWidth(), contentHeight()); | 379 contentWidth(), contentHeight()); |
| 377 } | 380 } |
| 378 LayoutSize contentBoxOffset() const { | 381 LayoutSize contentBoxOffset() const { |
| 379 return LayoutSize(borderLeft() + paddingLeft(), borderTop() + paddingTop()); | 382 return LayoutSize(borderLeft() + paddingLeft(), borderTop() + paddingTop()); |
| 380 } | 383 } |
| 381 // The content box in absolute coords. Ignores transforms. | 384 // The content box in absolute coords. Ignores transforms. |
| 382 IntRect absoluteContentBox() const; | 385 IntRect absoluteContentBox() const; |
| 383 // The offset of the content box in absolute coords, ignoring transforms. | 386 // The offset of the content box in absolute coords, ignoring transforms. |
| 384 IntSize absoluteContentBoxOffset() const; | 387 IntSize absoluteContentBoxOffset() const; |
| 385 // The content box converted to absolute coords (taking transforms into accoun
t). | 388 // The content box converted to absolute coords (taking transforms into |
| 389 // account). |
| 386 FloatQuad absoluteContentQuad() const; | 390 FloatQuad absoluteContentQuad() const; |
| 387 // The enclosing rectangle of the background with given opacity requirement. | 391 // The enclosing rectangle of the background with given opacity requirement. |
| 388 LayoutRect backgroundRect(BackgroundRectType) const; | 392 LayoutRect backgroundRect(BackgroundRectType) const; |
| 389 | 393 |
| 390 // This returns the content area of the box (excluding padding and border). Th
e only difference with contentBoxRect is that computedCSSContentBoxRect | 394 // This returns the content area of the box (excluding padding and border). |
| 391 // does include the intrinsic padding in the content box as this is what some
callers expect (like getComputedStyle). | 395 // The only difference with contentBoxRect is that computedCSSContentBoxRect |
| 396 // does include the intrinsic padding in the content box as this is what some |
| 397 // callers expect (like getComputedStyle). |
| 392 LayoutRect computedCSSContentBoxRect() const { | 398 LayoutRect computedCSSContentBoxRect() const { |
| 393 return LayoutRect( | 399 return LayoutRect( |
| 394 borderLeft() + computedCSSPaddingLeft(), | 400 borderLeft() + computedCSSPaddingLeft(), |
| 395 borderTop() + computedCSSPaddingTop(), | 401 borderTop() + computedCSSPaddingTop(), |
| 396 clientWidth() - computedCSSPaddingLeft() - computedCSSPaddingRight(), | 402 clientWidth() - computedCSSPaddingLeft() - computedCSSPaddingRight(), |
| 397 clientHeight() - computedCSSPaddingTop() - computedCSSPaddingBottom()); | 403 clientHeight() - computedCSSPaddingTop() - computedCSSPaddingBottom()); |
| 398 } | 404 } |
| 399 | 405 |
| 400 void addOutlineRects(Vector<LayoutRect>&, | 406 void addOutlineRects(Vector<LayoutRect>&, |
| 401 const LayoutPoint& additionalOffset, | 407 const LayoutPoint& additionalOffset, |
| 402 IncludeBlockVisualOverflowOrNot) const override; | 408 IncludeBlockVisualOverflowOrNot) const override; |
| 403 | 409 |
| 404 // Use this with caution! No type checking is done! | 410 // Use this with caution! No type checking is done! |
| 405 LayoutBox* previousSiblingBox() const; | 411 LayoutBox* previousSiblingBox() const; |
| 406 LayoutBox* previousInFlowSiblingBox() const; | 412 LayoutBox* previousInFlowSiblingBox() const; |
| 407 LayoutBox* nextSiblingBox() const; | 413 LayoutBox* nextSiblingBox() const; |
| 408 LayoutBox* nextInFlowSiblingBox() const; | 414 LayoutBox* nextInFlowSiblingBox() const; |
| 409 LayoutBox* parentBox() const; | 415 LayoutBox* parentBox() const; |
| 410 | 416 |
| 411 // Return the previous sibling column set or spanner placeholder. Only to be u
sed on multicol container children. | 417 // Return the previous sibling column set or spanner placeholder. Only to be |
| 418 // used on multicol container children. |
| 412 LayoutBox* previousSiblingMultiColumnBox() const; | 419 LayoutBox* previousSiblingMultiColumnBox() const; |
| 413 // Return the next sibling column set or spanner placeholder. Only to be used
on multicol container children. | 420 // Return the next sibling column set or spanner placeholder. Only to be used |
| 421 // on multicol container children. |
| 414 LayoutBox* nextSiblingMultiColumnBox() const; | 422 LayoutBox* nextSiblingMultiColumnBox() const; |
| 415 | 423 |
| 416 bool canResize() const; | 424 bool canResize() const; |
| 417 | 425 |
| 418 // Visual and layout overflow are in the coordinate space of the box. This me
ans that they | 426 // Visual and layout overflow are in the coordinate space of the box. This |
| 419 // aren't purely physical directions. For horizontal-tb and vertical-lr they w
ill match physical | 427 // means that they aren't purely physical directions. For horizontal-tb and |
| 420 // directions, but for vertical-rl, the left/right are flipped when compared t
o their physical | 428 // vertical-lr they will match physical directions, but for vertical-rl, the |
| 421 // counterparts. For example minX is on the left in vertical-lr, but it is on
the right in | 429 // left/right are flipped when compared to their physical counterparts. |
| 430 // For example minX is on the left in vertical-lr, but it is on the right in |
| 422 // vertical-rl. | 431 // vertical-rl. |
| 423 LayoutRect noOverflowRect() const; | 432 LayoutRect noOverflowRect() const; |
| 424 LayoutRect layoutOverflowRect() const { | 433 LayoutRect layoutOverflowRect() const { |
| 425 return m_overflow ? m_overflow->layoutOverflowRect() : noOverflowRect(); | 434 return m_overflow ? m_overflow->layoutOverflowRect() : noOverflowRect(); |
| 426 } | 435 } |
| 427 IntRect pixelSnappedLayoutOverflowRect() const { | 436 IntRect pixelSnappedLayoutOverflowRect() const { |
| 428 return pixelSnappedIntRect(layoutOverflowRect()); | 437 return pixelSnappedIntRect(layoutOverflowRect()); |
| 429 } | 438 } |
| 430 LayoutSize maxLayoutOverflow() const { | 439 LayoutSize maxLayoutOverflow() const { |
| 431 return LayoutSize(layoutOverflowRect().maxX(), layoutOverflowRect().maxY()); | 440 return LayoutSize(layoutOverflowRect().maxX(), layoutOverflowRect().maxY()); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 449 : visualOverflowRect().maxY(); | 458 : visualOverflowRect().maxY(); |
| 450 } | 459 } |
| 451 | 460 |
| 452 LayoutRect selfVisualOverflowRect() const { | 461 LayoutRect selfVisualOverflowRect() const { |
| 453 return m_overflow ? m_overflow->selfVisualOverflowRect() : borderBoxRect(); | 462 return m_overflow ? m_overflow->selfVisualOverflowRect() : borderBoxRect(); |
| 454 } | 463 } |
| 455 LayoutRect contentsVisualOverflowRect() const { | 464 LayoutRect contentsVisualOverflowRect() const { |
| 456 return m_overflow ? m_overflow->contentsVisualOverflowRect() : LayoutRect(); | 465 return m_overflow ? m_overflow->contentsVisualOverflowRect() : LayoutRect(); |
| 457 } | 466 } |
| 458 | 467 |
| 459 // These methods don't mean the box *actually* has top/left overflow. They me
an that | 468 // These methods don't mean the box *actually* has top/left overflow. They |
| 460 // *if* the box overflows, it will overflow to the top/left rather than the bo
ttom/right. | 469 // mean that *if* the box overflows, it will overflow to the top/left rather |
| 461 // This happens when child content is laid out right-to-left (e.g. direction:r
tl) or | 470 // than the bottom/right. This happens when child content is laid out |
| 462 // or bottom-to-top (e.g. direction:rtl writing-mode:vertical-rl). | 471 // right-to-left (e.g. direction:rtl) or or bottom-to-top (e.g. direction:rtl |
| 472 // writing-mode:vertical-rl). |
| 463 virtual bool hasTopOverflow() const; | 473 virtual bool hasTopOverflow() const; |
| 464 virtual bool hasLeftOverflow() const; | 474 virtual bool hasLeftOverflow() const; |
| 465 | 475 |
| 466 void addLayoutOverflow(const LayoutRect&); | 476 void addLayoutOverflow(const LayoutRect&); |
| 467 void addSelfVisualOverflow(const LayoutRect&); | 477 void addSelfVisualOverflow(const LayoutRect&); |
| 468 void addContentsVisualOverflow(const LayoutRect&); | 478 void addContentsVisualOverflow(const LayoutRect&); |
| 469 | 479 |
| 470 void addVisualEffectOverflow(); | 480 void addVisualEffectOverflow(); |
| 471 LayoutRectOutsets computeVisualEffectOverflowOutsets() const; | 481 LayoutRectOutsets computeVisualEffectOverflowOutsets() const; |
| 472 void addOverflowFromChild(LayoutBox* child) { | 482 void addOverflowFromChild(LayoutBox* child) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 489 } | 499 } |
| 490 LayoutUnit contentLogicalWidth() const { | 500 LayoutUnit contentLogicalWidth() const { |
| 491 return style()->isHorizontalWritingMode() ? contentWidth() | 501 return style()->isHorizontalWritingMode() ? contentWidth() |
| 492 : contentHeight(); | 502 : contentHeight(); |
| 493 } | 503 } |
| 494 LayoutUnit contentLogicalHeight() const { | 504 LayoutUnit contentLogicalHeight() const { |
| 495 return style()->isHorizontalWritingMode() ? contentHeight() | 505 return style()->isHorizontalWritingMode() ? contentHeight() |
| 496 : contentWidth(); | 506 : contentWidth(); |
| 497 } | 507 } |
| 498 | 508 |
| 499 // IE extensions. Used to calculate offsetWidth/Height. Overridden by inlines
(LayoutFlow) | 509 // IE extensions. Used to calculate offsetWidth/Height. Overridden by inlines |
| 500 // to return the remaining width on a given line (and the height of a single l
ine). | 510 // (LayoutFlow) to return the remaining width on a given line (and the height |
| 511 // of a single line). |
| 501 LayoutUnit offsetWidth() const override { return m_frameRect.width(); } | 512 LayoutUnit offsetWidth() const override { return m_frameRect.width(); } |
| 502 LayoutUnit offsetHeight() const override { return m_frameRect.height(); } | 513 LayoutUnit offsetHeight() const override { return m_frameRect.height(); } |
| 503 | 514 |
| 504 int pixelSnappedOffsetWidth(const Element*) const final; | 515 int pixelSnappedOffsetWidth(const Element*) const final; |
| 505 int pixelSnappedOffsetHeight(const Element*) const final; | 516 int pixelSnappedOffsetHeight(const Element*) const final; |
| 506 | 517 |
| 507 // More IE extensions. clientWidth and clientHeight represent the interior of
an object | 518 // More IE extensions. clientWidth and clientHeight represent the interior of |
| 508 // excluding border and scrollbar. clientLeft/Top are just the borderLeftWidt
h and borderTopWidth. | 519 // an object excluding border and scrollbar. clientLeft/Top are just the |
| 520 // borderLeftWidth and borderTopWidth. |
| 509 DISABLE_CFI_PERF LayoutUnit clientLeft() const { | 521 DISABLE_CFI_PERF LayoutUnit clientLeft() const { |
| 510 return LayoutUnit(borderLeft() + | 522 return LayoutUnit(borderLeft() + |
| 511 (shouldPlaceBlockDirectionScrollbarOnLogicalLeft() | 523 (shouldPlaceBlockDirectionScrollbarOnLogicalLeft() |
| 512 ? verticalScrollbarWidth() | 524 ? verticalScrollbarWidth() |
| 513 : 0)); | 525 : 0)); |
| 514 } | 526 } |
| 515 DISABLE_CFI_PERF LayoutUnit clientTop() const { | 527 DISABLE_CFI_PERF LayoutUnit clientTop() const { |
| 516 return LayoutUnit(borderTop()); | 528 return LayoutUnit(borderTop()); |
| 517 } | 529 } |
| 518 LayoutUnit clientWidth() const; | 530 LayoutUnit clientWidth() const; |
| 519 LayoutUnit clientHeight() const; | 531 LayoutUnit clientHeight() const; |
| 520 DISABLE_CFI_PERF LayoutUnit clientLogicalWidth() const { | 532 DISABLE_CFI_PERF LayoutUnit clientLogicalWidth() const { |
| 521 return style()->isHorizontalWritingMode() ? clientWidth() : clientHeight(); | 533 return style()->isHorizontalWritingMode() ? clientWidth() : clientHeight(); |
| 522 } | 534 } |
| 523 DISABLE_CFI_PERF LayoutUnit clientLogicalHeight() const { | 535 DISABLE_CFI_PERF LayoutUnit clientLogicalHeight() const { |
| 524 return style()->isHorizontalWritingMode() ? clientHeight() : clientWidth(); | 536 return style()->isHorizontalWritingMode() ? clientHeight() : clientWidth(); |
| 525 } | 537 } |
| 526 DISABLE_CFI_PERF LayoutUnit clientLogicalBottom() const { | 538 DISABLE_CFI_PERF LayoutUnit clientLogicalBottom() const { |
| 527 return borderBefore() + clientLogicalHeight(); | 539 return borderBefore() + clientLogicalHeight(); |
| 528 } | 540 } |
| 529 DISABLE_CFI_PERF LayoutRect clientBoxRect() const { | 541 DISABLE_CFI_PERF LayoutRect clientBoxRect() const { |
| 530 return LayoutRect(clientLeft(), clientTop(), clientWidth(), clientHeight()); | 542 return LayoutRect(clientLeft(), clientTop(), clientWidth(), clientHeight()); |
| 531 } | 543 } |
| 532 | 544 |
| 533 int pixelSnappedClientWidth() const; | 545 int pixelSnappedClientWidth() const; |
| 534 int pixelSnappedClientHeight() const; | 546 int pixelSnappedClientHeight() const; |
| 535 | 547 |
| 536 // scrollWidth/scrollHeight will be the same as clientWidth/clientHeight unles
s the | 548 // scrollWidth/scrollHeight will be the same as clientWidth/clientHeight |
| 537 // object has overflow:hidden/scroll/auto specified and also has overflow. | 549 // unless the object has overflow:hidden/scroll/auto specified and also has |
| 538 // scrollLeft/Top return the current scroll position. These methods are virtu
al so that objects like | 550 // overflow. scrollLeft/Top return the current scroll position. These methods |
| 539 // textareas can scroll shadow content (but pretend that they are the objects
that are | 551 // are virtual so that objects like textareas can scroll shadow content (but |
| 540 // scrolling). | 552 // pretend that they are the objects that are scrolling). |
| 541 virtual LayoutUnit scrollLeft() const; | 553 virtual LayoutUnit scrollLeft() const; |
| 542 virtual LayoutUnit scrollTop() const; | 554 virtual LayoutUnit scrollTop() const; |
| 543 virtual LayoutUnit scrollWidth() const; | 555 virtual LayoutUnit scrollWidth() const; |
| 544 virtual LayoutUnit scrollHeight() const; | 556 virtual LayoutUnit scrollHeight() const; |
| 545 int pixelSnappedScrollWidth() const; | 557 int pixelSnappedScrollWidth() const; |
| 546 int pixelSnappedScrollHeight() const; | 558 int pixelSnappedScrollHeight() const; |
| 547 virtual void setScrollLeft(LayoutUnit); | 559 virtual void setScrollLeft(LayoutUnit); |
| 548 virtual void setScrollTop(LayoutUnit); | 560 virtual void setScrollTop(LayoutUnit); |
| 549 | 561 |
| 550 void scrollToOffset(const DoubleSize&, | 562 void scrollToOffset(const DoubleSize&, |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 629 styleToUse->direction(), value); | 641 styleToUse->direction(), value); |
| 630 } | 642 } |
| 631 void setMarginEnd(LayoutUnit value, | 643 void setMarginEnd(LayoutUnit value, |
| 632 const ComputedStyle* overrideStyle = nullptr) { | 644 const ComputedStyle* overrideStyle = nullptr) { |
| 633 const ComputedStyle* styleToUse = overrideStyle ? overrideStyle : style(); | 645 const ComputedStyle* styleToUse = overrideStyle ? overrideStyle : style(); |
| 634 m_marginBoxOutsets.setEnd(styleToUse->getWritingMode(), | 646 m_marginBoxOutsets.setEnd(styleToUse->getWritingMode(), |
| 635 styleToUse->direction(), value); | 647 styleToUse->direction(), value); |
| 636 } | 648 } |
| 637 | 649 |
| 638 // The following functions are used to implement collapsing margins. | 650 // The following functions are used to implement collapsing margins. |
| 639 // All objects know their maximal positive and negative margins. The | 651 // All objects know their maximal positive and negative margins. The formula |
| 640 // formula for computing a collapsed margin is |maxPosMargin| - |maxNegmargin|
. | 652 // for computing a collapsed margin is |maxPosMargin| - |maxNegmargin|. |
| 641 // For a non-collapsing box, such as a leaf element, this formula will simply
return | 653 // For a non-collapsing box, such as a leaf element, this formula will simply |
| 642 // the margin of the element. Blocks override the maxMarginBefore and maxMarg
inAfter | 654 // return the margin of the element. Blocks override the maxMarginBefore and |
| 643 // methods. | 655 // maxMarginAfter methods. |
| 644 virtual bool isSelfCollapsingBlock() const { return false; } | 656 virtual bool isSelfCollapsingBlock() const { return false; } |
| 645 virtual LayoutUnit collapsedMarginBefore() const { return marginBefore(); } | 657 virtual LayoutUnit collapsedMarginBefore() const { return marginBefore(); } |
| 646 virtual LayoutUnit collapsedMarginAfter() const { return marginAfter(); } | 658 virtual LayoutUnit collapsedMarginAfter() const { return marginAfter(); } |
| 647 LayoutRectOutsets collapsedMarginBoxLogicalOutsets() const { | 659 LayoutRectOutsets collapsedMarginBoxLogicalOutsets() const { |
| 648 return LayoutRectOutsets(collapsedMarginBefore(), LayoutUnit(), | 660 return LayoutRectOutsets(collapsedMarginBefore(), LayoutUnit(), |
| 649 collapsedMarginAfter(), LayoutUnit()); | 661 collapsedMarginAfter(), LayoutUnit()); |
| 650 } | 662 } |
| 651 | 663 |
| 652 void absoluteRects(Vector<IntRect>&, | 664 void absoluteRects(Vector<IntRect>&, |
| 653 const LayoutPoint& accumulatedOffset) const override; | 665 const LayoutPoint& accumulatedOffset) const override; |
| 654 void absoluteQuads(Vector<FloatQuad>&) const override; | 666 void absoluteQuads(Vector<FloatQuad>&) const override; |
| 655 FloatRect localBoundingBoxRectForAccessibility() const final; | 667 FloatRect localBoundingBoxRectForAccessibility() const final; |
| 656 | 668 |
| 657 int reflectionOffset() const; | 669 int reflectionOffset() const; |
| 658 // Given a rect in the object's coordinate space, returns the corresponding re
ct in the reflection. | 670 // Given a rect in the object's coordinate space, returns the corresponding |
| 671 // rect in the reflection. |
| 659 LayoutRect reflectedRect(const LayoutRect&) const; | 672 LayoutRect reflectedRect(const LayoutRect&) const; |
| 660 | 673 |
| 661 void layout() override; | 674 void layout() override; |
| 662 void paint(const PaintInfo&, const LayoutPoint&) const override; | 675 void paint(const PaintInfo&, const LayoutPoint&) const override; |
| 663 bool nodeAtPoint(HitTestResult&, | 676 bool nodeAtPoint(HitTestResult&, |
| 664 const HitTestLocation& locationInContainer, | 677 const HitTestLocation& locationInContainer, |
| 665 const LayoutPoint& accumulatedOffset, | 678 const LayoutPoint& accumulatedOffset, |
| 666 HitTestAction) override; | 679 HitTestAction) override; |
| 667 | 680 |
| 668 LayoutUnit minPreferredLogicalWidth() const override; | 681 LayoutUnit minPreferredLogicalWidth() const override; |
| 669 LayoutUnit maxPreferredLogicalWidth() const override; | 682 LayoutUnit maxPreferredLogicalWidth() const override; |
| 670 | 683 |
| 671 // FIXME: We should rename these back to overrideLogicalHeight/Width and have
them store | 684 // FIXME: We should rename these back to overrideLogicalHeight/Width and have |
| 672 // the border-box height/width like the regular height/width accessors on Layo
utBox. | 685 // them store the border-box height/width like the regular height/width |
| 673 // Right now, these are different than contentHeight/contentWidth because they
still | 686 // accessors on LayoutBox. Right now, these are different than contentHeight/ |
| 674 // include the scrollbar height/width. | 687 // contentWidth because they still include the scrollbar height/width. |
| 675 LayoutUnit overrideLogicalContentWidth() const; | 688 LayoutUnit overrideLogicalContentWidth() const; |
| 676 LayoutUnit overrideLogicalContentHeight() const; | 689 LayoutUnit overrideLogicalContentHeight() const; |
| 677 bool hasOverrideLogicalContentHeight() const; | 690 bool hasOverrideLogicalContentHeight() const; |
| 678 bool hasOverrideLogicalContentWidth() const; | 691 bool hasOverrideLogicalContentWidth() const; |
| 679 void setOverrideLogicalContentHeight(LayoutUnit); | 692 void setOverrideLogicalContentHeight(LayoutUnit); |
| 680 void setOverrideLogicalContentWidth(LayoutUnit); | 693 void setOverrideLogicalContentWidth(LayoutUnit); |
| 681 void clearOverrideSize(); | 694 void clearOverrideSize(); |
| 682 void clearOverrideLogicalContentHeight(); | 695 void clearOverrideLogicalContentHeight(); |
| 683 void clearOverrideLogicalContentWidth(); | 696 void clearOverrideLogicalContentWidth(); |
| 684 | 697 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 732 // (logical top or logical left). | 745 // (logical top or logical left). |
| 733 LayoutUnit m_position; | 746 LayoutUnit m_position; |
| 734 | 747 |
| 735 // |m_margins| represents the margins in the measured direction. | 748 // |m_margins| represents the margins in the measured direction. |
| 736 // Note that ComputedMarginValues has also the margins in | 749 // Note that ComputedMarginValues has also the margins in |
| 737 // the orthogonal direction to have clearer names but they are | 750 // the orthogonal direction to have clearer names but they are |
| 738 // ignored in the code. | 751 // ignored in the code. |
| 739 ComputedMarginValues m_margins; | 752 ComputedMarginValues m_margins; |
| 740 }; | 753 }; |
| 741 | 754 |
| 742 // Resolve auto margins in the chosen direction of the containing block so tha
t objects can be pushed to the start, middle or end | 755 // Resolve auto margins in the chosen direction of the containing block so |
| 743 // of the containing block. | 756 // that objects can be pushed to the start, middle or end of the containing |
| 757 // block. |
| 744 void computeMarginsForDirection(MarginDirection forDirection, | 758 void computeMarginsForDirection(MarginDirection forDirection, |
| 745 const LayoutBlock* containingBlock, | 759 const LayoutBlock* containingBlock, |
| 746 LayoutUnit containerWidth, | 760 LayoutUnit containerWidth, |
| 747 LayoutUnit childWidth, | 761 LayoutUnit childWidth, |
| 748 LayoutUnit& marginStart, | 762 LayoutUnit& marginStart, |
| 749 LayoutUnit& marginEnd, | 763 LayoutUnit& marginEnd, |
| 750 Length marginStartLength, | 764 Length marginStartLength, |
| 751 Length marginStartEnd) const; | 765 Length marginStartEnd) const; |
| 752 | 766 |
| 753 // Used to resolve margins in the containing block's block-flow direction. | 767 // Used to resolve margins in the containing block's block-flow direction. |
| 754 void computeAndSetBlockDirectionMargins(const LayoutBlock* containingBlock); | 768 void computeAndSetBlockDirectionMargins(const LayoutBlock* containingBlock); |
| 755 | 769 |
| 756 LayoutUnit offsetFromLogicalTopOfFirstPage() const; | 770 LayoutUnit offsetFromLogicalTopOfFirstPage() const; |
| 757 | 771 |
| 758 // The page logical offset is the object's offset from the top of the page in
the page progression | 772 // The page logical offset is the object's offset from the top of the page in |
| 759 // direction (so an x-offset in vertical text and a y-offset for horizontal te
xt). | 773 // the page progression direction (so an x-offset in vertical text and a |
| 774 // y-offset for horizontal text). |
| 760 LayoutUnit pageLogicalOffset() const { | 775 LayoutUnit pageLogicalOffset() const { |
| 761 return m_rareData ? m_rareData->m_pageLogicalOffset : LayoutUnit(); | 776 return m_rareData ? m_rareData->m_pageLogicalOffset : LayoutUnit(); |
| 762 } | 777 } |
| 763 void setPageLogicalOffset(LayoutUnit); | 778 void setPageLogicalOffset(LayoutUnit); |
| 764 | 779 |
| 765 // Specify which page or column to associate with an offset, if said offset is
exactly at a page | 780 // Specify which page or column to associate with an offset, if said offset is |
| 766 // or column boundary. | 781 // exactly at a page or column boundary. |
| 767 enum PageBoundaryRule { AssociateWithFormerPage, AssociateWithLatterPage }; | 782 enum PageBoundaryRule { AssociateWithFormerPage, AssociateWithLatterPage }; |
| 768 LayoutUnit pageLogicalHeightForOffset(LayoutUnit) const; | 783 LayoutUnit pageLogicalHeightForOffset(LayoutUnit) const; |
| 769 LayoutUnit pageRemainingLogicalHeightForOffset(LayoutUnit, | 784 LayoutUnit pageRemainingLogicalHeightForOffset(LayoutUnit, |
| 770 PageBoundaryRule) const; | 785 PageBoundaryRule) const; |
| 771 | 786 |
| 772 // Calculate the strut to insert in order fit content of size |contentLogicalH
eight|. | 787 // Calculate the strut to insert in order fit content of size |
| 773 // |strutToNextPage| is the strut to add to |offset| to merely get to the top
of the next page | 788 // |contentLogicalHeight|. |strutToNextPage| is the strut to add to |offset| |
| 774 // or column. This is what will be returned if the content can actually fit th
ere. Otherwise, | 789 // to merely get to the top of the next page or column. This is what will be |
| 775 // return the distance to the next fragmentainer that can fit this piece of co
ntent. | 790 // returned if the content can actually fit there. Otherwise, return the |
| 791 // distance to the next fragmentainer that can fit this piece of content. |
| 776 virtual LayoutUnit calculatePaginationStrutToFitContent( | 792 virtual LayoutUnit calculatePaginationStrutToFitContent( |
| 777 LayoutUnit offset, | 793 LayoutUnit offset, |
| 778 LayoutUnit strutToNextPage, | 794 LayoutUnit strutToNextPage, |
| 779 LayoutUnit contentLogicalHeight) const; | 795 LayoutUnit contentLogicalHeight) const; |
| 780 | 796 |
| 781 void positionLineBox(InlineBox*); | 797 void positionLineBox(InlineBox*); |
| 782 void moveWithEdgeOfInlineContainerIfNecessary(bool isHorizontal); | 798 void moveWithEdgeOfInlineContainerIfNecessary(bool isHorizontal); |
| 783 | 799 |
| 784 virtual InlineBox* createInlineBox(); | 800 virtual InlineBox* createInlineBox(); |
| 785 void dirtyLineBoxes(bool fullLayout); | 801 void dirtyLineBoxes(bool fullLayout); |
| 786 | 802 |
| 787 // For atomic inline elements, this function returns the inline box that conta
ins us. Enables | 803 // For atomic inline elements, this function returns the inline box that |
| 788 // the atomic inline LayoutObject to quickly determine what line it is contain
ed on and to easily | 804 // contains us. Enables the atomic inline LayoutObject to quickly determine |
| 789 // iterate over structures on the line. | 805 // what line it is contained on and to easily iterate over structures on the |
| 806 // line. |
| 790 InlineBox* inlineBoxWrapper() const { return m_inlineBoxWrapper; } | 807 InlineBox* inlineBoxWrapper() const { return m_inlineBoxWrapper; } |
| 791 void setInlineBoxWrapper(InlineBox*); | 808 void setInlineBoxWrapper(InlineBox*); |
| 792 void deleteLineBoxWrapper(); | 809 void deleteLineBoxWrapper(); |
| 793 | 810 |
| 794 void setSpannerPlaceholder(LayoutMultiColumnSpannerPlaceholder&); | 811 void setSpannerPlaceholder(LayoutMultiColumnSpannerPlaceholder&); |
| 795 void clearSpannerPlaceholder(); | 812 void clearSpannerPlaceholder(); |
| 796 LayoutMultiColumnSpannerPlaceholder* spannerPlaceholder() const final { | 813 LayoutMultiColumnSpannerPlaceholder* spannerPlaceholder() const final { |
| 797 return m_rareData ? m_rareData->m_spannerPlaceholder : 0; | 814 return m_rareData ? m_rareData->m_spannerPlaceholder : 0; |
| 798 } | 815 } |
| 799 | 816 |
| 800 // A pagination strut is the amount of space needed to push an in-flow block-l
evel object (or | 817 // A pagination strut is the amount of space needed to push an in-flow block- |
| 801 // float) to the logical top of the next page or column. It will be set both f
or forced breaks | 818 // level object (or float) to the logical top of the next page or column. It |
| 802 // (e.g. page-break-before:always) and soft breaks (when there's not enough sp
ace in the current | 819 // will be set both for forced breaks (e.g. page-break-before:always) and soft |
| 803 // page / column for the object). The strut is baked into the logicalTop() of
the object, so | 820 // breaks (when there's not enough space in the current page / column for the |
| 804 // that logicalTop() - paginationStrut() == the original position in the previ
ous column before | 821 // object). The strut is baked into the logicalTop() of the object, so that |
| 805 // deciding to break. | 822 // logicalTop() - paginationStrut() == the original position in the previous |
| 823 // column before deciding to break. |
| 806 // | 824 // |
| 807 // Pagination struts are either set in front of a block-level box (here) or be
fore a line | 825 // Pagination struts are either set in front of a block-level box (here) or |
| 808 // (RootInlineBox::paginationStrut()). | 826 // before a line (RootInlineBox::paginationStrut()). |
| 809 LayoutUnit paginationStrut() const { | 827 LayoutUnit paginationStrut() const { |
| 810 return m_rareData ? m_rareData->m_paginationStrut : LayoutUnit(); | 828 return m_rareData ? m_rareData->m_paginationStrut : LayoutUnit(); |
| 811 } | 829 } |
| 812 void setPaginationStrut(LayoutUnit); | 830 void setPaginationStrut(LayoutUnit); |
| 813 void resetPaginationStrut() { | 831 void resetPaginationStrut() { |
| 814 if (m_rareData) | 832 if (m_rareData) |
| 815 m_rareData->m_paginationStrut = LayoutUnit(); | 833 m_rareData->m_paginationStrut = LayoutUnit(); |
| 816 } | 834 } |
| 817 | 835 |
| 818 // Is the specified break-before or break-after value supported on this object
? It needs to be | 836 // Is the specified break-before or break-after value supported on this |
| 819 // in-flow all the way up to a fragmentation context that supports the specifi
ed value. | 837 // object? It needs to be in-flow all the way up to a fragmentation context |
| 838 // that supports the specified value. |
| 820 bool isBreakBetweenControllable(EBreak) const; | 839 bool isBreakBetweenControllable(EBreak) const; |
| 821 | 840 |
| 822 // Is the specified break-inside value supported on this object? It needs to b
e contained by a | 841 // Is the specified break-inside value supported on this object? It needs to |
| 823 // fragmentation context that supports the specified value. | 842 // be contained by a fragmentation context that supports the specified value. |
| 824 bool isBreakInsideControllable(EBreak) const; | 843 bool isBreakInsideControllable(EBreak) const; |
| 825 | 844 |
| 826 virtual EBreak breakAfter() const; | 845 virtual EBreak breakAfter() const; |
| 827 virtual EBreak breakBefore() const; | 846 virtual EBreak breakBefore() const; |
| 828 EBreak breakInside() const; | 847 EBreak breakInside() const; |
| 829 | 848 |
| 830 // Join two adjacent break values specified on break-before and/or break-after
. avoid* values | 849 // Join two adjacent break values specified on break-before and/or break- |
| 831 // win over auto values, and forced break values win over avoid* values. |firs
tValue| is | 850 // after. avoid* values win over auto values, and forced break values win over |
| 832 // specified on an element earlier in the flow than |secondValue|. This method
is used at class | 851 // avoid* values. |firstValue| is specified on an element earlier in the flow |
| 833 // A break points [1], to join the values of the previous break-after and the
next | 852 // than |secondValue|. This method is used at class A break points [1], to |
| 834 // break-before, to figure out whether we may, must, or should not, break at t
hat point. It is | 853 // join the values of the previous break-after and the next break-before, to |
| 835 // also used when propagating break-before values from first children and brea
k-after values on | 854 // figure out whether we may, must, or should not, break at that point. It is |
| 836 // last children to their container. | 855 // also used when propagating break-before values from first children and |
| 856 // break-after values on last children to their container. |
| 837 // | 857 // |
| 838 // [1] https://drafts.csswg.org/css-break/#possible-breaks | 858 // [1] https://drafts.csswg.org/css-break/#possible-breaks |
| 839 static EBreak joinFragmentainerBreakValues(EBreak firstValue, | 859 static EBreak joinFragmentainerBreakValues(EBreak firstValue, |
| 840 EBreak secondValue); | 860 EBreak secondValue); |
| 841 | 861 |
| 842 static bool isForcedFragmentainerBreakValue(EBreak); | 862 static bool isForcedFragmentainerBreakValue(EBreak); |
| 843 | 863 |
| 844 EBreak classABreakPointValue(EBreak previousBreakAfterValue) const; | 864 EBreak classABreakPointValue(EBreak previousBreakAfterValue) const; |
| 845 | 865 |
| 846 // Return true if we should insert a break in front of this box. The box needs
to start at a | 866 // Return true if we should insert a break in front of this box. The box needs |
| 847 // valid class A break point in order to allow a forced break. To determine wh
ether or not to | 867 // to start at a valid class A break point in order to allow a forced break. |
| 848 // break, we also need to know the break-after value of the previous in-flow s
ibling. | 868 // To determine whether or not to break, we also need to know the break-after |
| 869 // value of the previous in-flow sibling. |
| 849 bool needsForcedBreakBefore(EBreak previousBreakAfterValue) const; | 870 bool needsForcedBreakBefore(EBreak previousBreakAfterValue) const; |
| 850 | 871 |
| 851 bool paintedOutputOfObjectHasNoEffectRegardlessOfSize() const override; | 872 bool paintedOutputOfObjectHasNoEffectRegardlessOfSize() const override; |
| 852 LayoutRect localOverflowRectForPaintInvalidation() const override; | 873 LayoutRect localOverflowRectForPaintInvalidation() const override; |
| 853 bool mapToVisualRectInAncestorSpace( | 874 bool mapToVisualRectInAncestorSpace( |
| 854 const LayoutBoxModelObject* ancestor, | 875 const LayoutBoxModelObject* ancestor, |
| 855 LayoutRect&, | 876 LayoutRect&, |
| 856 VisualRectFlags = DefaultVisualRectFlags) const override; | 877 VisualRectFlags = DefaultVisualRectFlags) const override; |
| 857 | 878 |
| 858 LayoutUnit containingBlockLogicalHeightForGetComputedStyle() const; | 879 LayoutUnit containingBlockLogicalHeightForGetComputedStyle() const; |
| 859 | 880 |
| 860 LayoutUnit containingBlockLogicalWidthForContent() const override; | 881 LayoutUnit containingBlockLogicalWidthForContent() const override; |
| 861 LayoutUnit containingBlockLogicalHeightForContent( | 882 LayoutUnit containingBlockLogicalHeightForContent( |
| 862 AvailableLogicalHeightType) const; | 883 AvailableLogicalHeightType) const; |
| 863 | 884 |
| 864 LayoutUnit containingBlockAvailableLineWidth() const; | 885 LayoutUnit containingBlockAvailableLineWidth() const; |
| 865 LayoutUnit perpendicularContainingBlockLogicalHeight() const; | 886 LayoutUnit perpendicularContainingBlockLogicalHeight() const; |
| 866 | 887 |
| 867 virtual void updateLogicalWidth(); | 888 virtual void updateLogicalWidth(); |
| 868 void updateLogicalHeight(); | 889 void updateLogicalHeight(); |
| 869 virtual void computeLogicalHeight(LayoutUnit logicalHeight, | 890 virtual void computeLogicalHeight(LayoutUnit logicalHeight, |
| 870 LayoutUnit logicalTop, | 891 LayoutUnit logicalTop, |
| 871 LogicalExtentComputedValues&) const; | 892 LogicalExtentComputedValues&) const; |
| 872 // This function will compute the logical border-box height, without laying ou
t the box. This means that the result | 893 // This function will compute the logical border-box height, without laying |
| 873 // is only "correct" when the height is explicitly specified. This function ex
ists so that intrinsic width calculations | 894 // out the box. This means that the result is only "correct" when the height |
| 874 // have a way to deal with children that have orthogonal flows. | 895 // is explicitly specified. This function exists so that intrinsic width |
| 875 // When there is no explicit height, this function assumes a content height of
zero (and returns just border+padding) | 896 // calculations have a way to deal with children that have orthogonal flows. |
| 897 // When there is no explicit height, this function assumes a content height of |
| 898 // zero (and returns just border+padding). |
| 876 LayoutUnit computeLogicalHeightWithoutLayout() const; | 899 LayoutUnit computeLogicalHeightWithoutLayout() const; |
| 877 | 900 |
| 878 void computeLogicalWidth(LogicalExtentComputedValues&) const; | 901 void computeLogicalWidth(LogicalExtentComputedValues&) const; |
| 879 | 902 |
| 880 bool stretchesToViewport() const { | 903 bool stretchesToViewport() const { |
| 881 return document().inQuirksMode() && stretchesToViewportInQuirksMode(); | 904 return document().inQuirksMode() && stretchesToViewportInQuirksMode(); |
| 882 } | 905 } |
| 883 | 906 |
| 884 virtual LayoutSize intrinsicSize() const { return LayoutSize(); } | 907 virtual LayoutSize intrinsicSize() const { return LayoutSize(); } |
| 885 LayoutUnit intrinsicLogicalWidth() const { | 908 LayoutUnit intrinsicLogicalWidth() const { |
| 886 return style()->isHorizontalWritingMode() ? intrinsicSize().width() | 909 return style()->isHorizontalWritingMode() ? intrinsicSize().width() |
| 887 : intrinsicSize().height(); | 910 : intrinsicSize().height(); |
| 888 } | 911 } |
| 889 LayoutUnit intrinsicLogicalHeight() const { | 912 LayoutUnit intrinsicLogicalHeight() const { |
| 890 return style()->isHorizontalWritingMode() ? intrinsicSize().height() | 913 return style()->isHorizontalWritingMode() ? intrinsicSize().height() |
| 891 : intrinsicSize().width(); | 914 : intrinsicSize().width(); |
| 892 } | 915 } |
| 893 virtual LayoutUnit intrinsicContentLogicalHeight() const { | 916 virtual LayoutUnit intrinsicContentLogicalHeight() const { |
| 894 return m_intrinsicContentLogicalHeight; | 917 return m_intrinsicContentLogicalHeight; |
| 895 } | 918 } |
| 896 | 919 |
| 897 // Whether or not the element shrinks to its intrinsic width (rather than fill
ing the width | 920 // Whether or not the element shrinks to its intrinsic width (rather than |
| 898 // of a containing block). HTML4 buttons, <select>s, <input>s, legends, and f
loating/compact elements do this. | 921 // filling the width of a containing block). HTML4 buttons, <select>s, |
| 922 // <input>s, legends, and floating/compact elements do this. |
| 899 bool sizesLogicalWidthToFitContent(const Length& logicalWidth) const; | 923 bool sizesLogicalWidthToFitContent(const Length& logicalWidth) const; |
| 900 | 924 |
| 901 LayoutUnit shrinkLogicalWidthToAvoidFloats(LayoutUnit childMarginStart, | 925 LayoutUnit shrinkLogicalWidthToAvoidFloats(LayoutUnit childMarginStart, |
| 902 LayoutUnit childMarginEnd, | 926 LayoutUnit childMarginEnd, |
| 903 const LayoutBlockFlow* cb) const; | 927 const LayoutBlockFlow* cb) const; |
| 904 | 928 |
| 905 LayoutUnit computeLogicalWidthUsing(SizeType, | 929 LayoutUnit computeLogicalWidthUsing(SizeType, |
| 906 const Length& logicalWidth, | 930 const Length& logicalWidth, |
| 907 LayoutUnit availableLogicalWidth, | 931 LayoutUnit availableLogicalWidth, |
| 908 const LayoutBlock* containingBlock) const; | 932 const LayoutBlock* containingBlock) const; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 928 LayoutUnit logicalHeight) const; | 952 LayoutUnit logicalHeight) const; |
| 929 | 953 |
| 930 virtual LayoutUnit computeReplacedLogicalWidth( | 954 virtual LayoutUnit computeReplacedLogicalWidth( |
| 931 ShouldComputePreferred = ComputeActual) const; | 955 ShouldComputePreferred = ComputeActual) const; |
| 932 virtual LayoutUnit computeReplacedLogicalHeight( | 956 virtual LayoutUnit computeReplacedLogicalHeight( |
| 933 LayoutUnit estimatedUsedWidth = LayoutUnit()) const; | 957 LayoutUnit estimatedUsedWidth = LayoutUnit()) const; |
| 934 | 958 |
| 935 bool percentageLogicalHeightIsResolvable() const; | 959 bool percentageLogicalHeightIsResolvable() const; |
| 936 LayoutUnit computePercentageLogicalHeight(const Length& height) const; | 960 LayoutUnit computePercentageLogicalHeight(const Length& height) const; |
| 937 | 961 |
| 938 // Block flows subclass availableWidth/Height to handle multi column layout (s
hrinking the width/height available to children when laying out.) | 962 // Block flows subclass availableWidth/Height to handle multi column layout |
| 963 // (shrinking the width/height available to children when laying out.) |
| 939 LayoutUnit availableLogicalWidth() const { return contentLogicalWidth(); } | 964 LayoutUnit availableLogicalWidth() const { return contentLogicalWidth(); } |
| 940 LayoutUnit availableLogicalHeight(AvailableLogicalHeightType) const; | 965 LayoutUnit availableLogicalHeight(AvailableLogicalHeightType) const; |
| 941 LayoutUnit availableLogicalHeightUsing(const Length&, | 966 LayoutUnit availableLogicalHeightUsing(const Length&, |
| 942 AvailableLogicalHeightType) const; | 967 AvailableLogicalHeightType) const; |
| 943 | 968 |
| 944 // There are a few cases where we need to refer specifically to the available
physical width and available physical height. | 969 // There are a few cases where we need to refer specifically to the available |
| 945 // Relative positioning is one of those cases, since left/top offsets are phys
ical. | 970 // physical width and available physical height. Relative positioning is one |
| 971 // of those cases, since left/top offsets are physical. |
| 946 LayoutUnit availableWidth() const { | 972 LayoutUnit availableWidth() const { |
| 947 return style()->isHorizontalWritingMode() | 973 return style()->isHorizontalWritingMode() |
| 948 ? availableLogicalWidth() | 974 ? availableLogicalWidth() |
| 949 : availableLogicalHeight(IncludeMarginBorderPadding); | 975 : availableLogicalHeight(IncludeMarginBorderPadding); |
| 950 } | 976 } |
| 951 LayoutUnit availableHeight() const { | 977 LayoutUnit availableHeight() const { |
| 952 return style()->isHorizontalWritingMode() | 978 return style()->isHorizontalWritingMode() |
| 953 ? availableLogicalHeight(IncludeMarginBorderPadding) | 979 ? availableLogicalHeight(IncludeMarginBorderPadding) |
| 954 : availableLogicalWidth(); | 980 : availableLogicalWidth(); |
| 955 } | 981 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1000 } | 1026 } |
| 1001 virtual bool scrollsOverflowX() const { | 1027 virtual bool scrollsOverflowX() const { |
| 1002 return hasOverflowClip() && (style()->overflowX() == OverflowScroll || | 1028 return hasOverflowClip() && (style()->overflowX() == OverflowScroll || |
| 1003 hasAutoHorizontalScrollbar()); | 1029 hasAutoHorizontalScrollbar()); |
| 1004 } | 1030 } |
| 1005 virtual bool scrollsOverflowY() const { | 1031 virtual bool scrollsOverflowY() const { |
| 1006 return hasOverflowClip() && (style()->overflowY() == OverflowScroll || | 1032 return hasOverflowClip() && (style()->overflowY() == OverflowScroll || |
| 1007 hasAutoVerticalScrollbar()); | 1033 hasAutoVerticalScrollbar()); |
| 1008 } | 1034 } |
| 1009 | 1035 |
| 1010 // Elements such as the <input> field override this to specify that they are s
crollable | 1036 // Elements such as the <input> field override this to specify that they are |
| 1011 // outside the context of the CSS overflow style | 1037 // scrollable outside the context of the CSS overflow style |
| 1012 virtual bool isIntrinsicallyScrollable( | 1038 virtual bool isIntrinsicallyScrollable( |
| 1013 ScrollbarOrientation orientation) const { | 1039 ScrollbarOrientation orientation) const { |
| 1014 return false; | 1040 return false; |
| 1015 } | 1041 } |
| 1016 | 1042 |
| 1017 bool hasUnsplittableScrollingOverflow() const; | 1043 bool hasUnsplittableScrollingOverflow() const; |
| 1018 | 1044 |
| 1019 // Page / column breakability inside block-level objects. | 1045 // Page / column breakability inside block-level objects. |
| 1020 enum PaginationBreakability { | 1046 enum PaginationBreakability { |
| 1021 AllowAnyBreaks, // No restrictions on breaking. May examine children to fin
d possible break points. | 1047 AllowAnyBreaks, // No restrictions on breaking. May examine children to |
| 1022 ForbidBreaks, // Forbid breaks inside this object. Content cannot be spli
t nicely into smaller pieces. | 1048 // find possible break points. |
| 1023 AvoidBreaks // Preferably avoid breaks. If not possible, examine childr
en to find possible break points. | 1049 ForbidBreaks, // Forbid breaks inside this object. Content cannot be split |
| 1050 // nicely into smaller pieces. |
| 1051 AvoidBreaks // Preferably avoid breaks. If not possible, examine children |
| 1052 // to find possible break points. |
| 1024 }; | 1053 }; |
| 1025 PaginationBreakability getPaginationBreakability() const; | 1054 PaginationBreakability getPaginationBreakability() const; |
| 1026 | 1055 |
| 1027 LayoutRect localCaretRect( | 1056 LayoutRect localCaretRect( |
| 1028 InlineBox*, | 1057 InlineBox*, |
| 1029 int caretOffset, | 1058 int caretOffset, |
| 1030 LayoutUnit* extraWidthToEndOfLine = nullptr) override; | 1059 LayoutUnit* extraWidthToEndOfLine = nullptr) override; |
| 1031 | 1060 |
| 1032 virtual LayoutRect overflowClipRect( | 1061 virtual LayoutRect overflowClipRect( |
| 1033 const LayoutPoint& location, | 1062 const LayoutPoint& location, |
| 1034 OverlayScrollbarClipBehavior = IgnoreOverlayScrollbarSize) const; | 1063 OverlayScrollbarClipBehavior = IgnoreOverlayScrollbarSize) const; |
| 1035 LayoutRect clipRect(const LayoutPoint& location) const; | 1064 LayoutRect clipRect(const LayoutPoint& location) const; |
| 1036 virtual bool hasControlClip() const { return false; } | 1065 virtual bool hasControlClip() const { return false; } |
| 1037 virtual LayoutRect controlClipRect(const LayoutPoint&) const { | 1066 virtual LayoutRect controlClipRect(const LayoutPoint&) const { |
| 1038 return LayoutRect(); | 1067 return LayoutRect(); |
| 1039 } | 1068 } |
| 1040 | 1069 |
| 1041 // Returns the combination of overflow clip, contain: paint clip and CSS clip
for this object, in local space. | 1070 // Returns the combination of overflow clip, contain: paint clip and CSS clip |
| 1071 // for this object, in local space. |
| 1042 LayoutRect clippingRect() const; | 1072 LayoutRect clippingRect() const; |
| 1043 | 1073 |
| 1044 virtual void paintBoxDecorationBackground(const PaintInfo&, | 1074 virtual void paintBoxDecorationBackground(const PaintInfo&, |
| 1045 const LayoutPoint&) const; | 1075 const LayoutPoint&) const; |
| 1046 virtual void paintMask(const PaintInfo&, const LayoutPoint&) const; | 1076 virtual void paintMask(const PaintInfo&, const LayoutPoint&) const; |
| 1047 void imageChanged(WrappedImagePtr, const IntRect* = nullptr) override; | 1077 void imageChanged(WrappedImagePtr, const IntRect* = nullptr) override; |
| 1048 ResourcePriority computeResourcePriority() const final; | 1078 ResourcePriority computeResourcePriority() const final; |
| 1049 | 1079 |
| 1050 void logicalExtentAfterUpdatingLogicalWidth(const LayoutUnit& logicalTop, | 1080 void logicalExtentAfterUpdatingLogicalWidth(const LayoutUnit& logicalTop, |
| 1051 LogicalExtentComputedValues&); | 1081 LogicalExtentComputedValues&); |
| 1052 | 1082 |
| 1053 PositionWithAffinity positionForPoint(const LayoutPoint&) override; | 1083 PositionWithAffinity positionForPoint(const LayoutPoint&) override; |
| 1054 | 1084 |
| 1055 void removeFloatingOrPositionedChildFromBlockLists(); | 1085 void removeFloatingOrPositionedChildFromBlockLists(); |
| 1056 | 1086 |
| 1057 PaintLayer* enclosingFloatPaintingLayer() const; | 1087 PaintLayer* enclosingFloatPaintingLayer() const; |
| 1058 | 1088 |
| 1059 virtual int firstLineBoxBaseline() const { return -1; } | 1089 virtual int firstLineBoxBaseline() const { return -1; } |
| 1060 virtual int inlineBlockBaseline(LineDirectionMode) const { | 1090 virtual int inlineBlockBaseline(LineDirectionMode) const { |
| 1061 return -1; | 1091 return -1; |
| 1062 } // Returns -1 if we should skip this box when computing the baseline of an
inline-block. | 1092 } // Returns -1 if we should skip this box when computing the baseline of an |
| 1093 // inline-block. |
| 1063 | 1094 |
| 1064 virtual Node* nodeForHitTest() const { return node(); } | 1095 virtual Node* nodeForHitTest() const { return node(); } |
| 1065 | 1096 |
| 1066 bool shrinkToAvoidFloats() const; | 1097 bool shrinkToAvoidFloats() const; |
| 1067 virtual bool avoidsFloats() const; | 1098 virtual bool avoidsFloats() const; |
| 1068 | 1099 |
| 1069 void markChildForPaginationRelayoutIfNeeded(LayoutBox& child, | 1100 void markChildForPaginationRelayoutIfNeeded(LayoutBox& child, |
| 1070 SubtreeLayoutScope&); | 1101 SubtreeLayoutScope&); |
| 1071 | 1102 |
| 1072 bool isWritingModeRoot() const { | 1103 bool isWritingModeRoot() const { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1104 bool firstLine, | 1135 bool firstLine, |
| 1105 LineDirectionMode, | 1136 LineDirectionMode, |
| 1106 LinePositionMode = PositionOnContainingLine) const override; | 1137 LinePositionMode = PositionOnContainingLine) const override; |
| 1107 | 1138 |
| 1108 LayoutUnit offsetLeft(const Element*) const override; | 1139 LayoutUnit offsetLeft(const Element*) const override; |
| 1109 LayoutUnit offsetTop(const Element*) const override; | 1140 LayoutUnit offsetTop(const Element*) const override; |
| 1110 | 1141 |
| 1111 LayoutPoint flipForWritingModeForChild(const LayoutBox* child, | 1142 LayoutPoint flipForWritingModeForChild(const LayoutBox* child, |
| 1112 const LayoutPoint&) const; | 1143 const LayoutPoint&) const; |
| 1113 LayoutUnit flipForWritingMode(LayoutUnit position) const WARN_UNUSED_RETURN { | 1144 LayoutUnit flipForWritingMode(LayoutUnit position) const WARN_UNUSED_RETURN { |
| 1114 // The offset is in the block direction (y for horizontal writing modes, x f
or vertical writing modes). | 1145 // The offset is in the block direction (y for horizontal writing modes, x |
| 1146 // for vertical writing modes). |
| 1115 if (!UNLIKELY(hasFlippedBlocksWritingMode())) | 1147 if (!UNLIKELY(hasFlippedBlocksWritingMode())) |
| 1116 return position; | 1148 return position; |
| 1117 return logicalHeight() - position; | 1149 return logicalHeight() - position; |
| 1118 } | 1150 } |
| 1119 LayoutPoint flipForWritingMode(const LayoutPoint& position) const | 1151 LayoutPoint flipForWritingMode(const LayoutPoint& position) const |
| 1120 WARN_UNUSED_RETURN { | 1152 WARN_UNUSED_RETURN { |
| 1121 if (!UNLIKELY(hasFlippedBlocksWritingMode())) | 1153 if (!UNLIKELY(hasFlippedBlocksWritingMode())) |
| 1122 return position; | 1154 return position; |
| 1123 return isHorizontalWritingMode() | 1155 return isHorizontalWritingMode() |
| 1124 ? LayoutPoint(position.x(), m_frameRect.height() - position.y()) | 1156 ? LayoutPoint(position.x(), m_frameRect.height() - position.y()) |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1171 bool hasVisualOverflow() const { | 1203 bool hasVisualOverflow() const { |
| 1172 return m_overflow && !borderBoxRect().contains(visualOverflowRect()); | 1204 return m_overflow && !borderBoxRect().contains(visualOverflowRect()); |
| 1173 } | 1205 } |
| 1174 | 1206 |
| 1175 virtual bool needsPreferredWidthsRecalculation() const; | 1207 virtual bool needsPreferredWidthsRecalculation() const; |
| 1176 | 1208 |
| 1177 // See README.md for an explanation of scroll origin. | 1209 // See README.md for an explanation of scroll origin. |
| 1178 virtual IntSize originAdjustmentForScrollbars() const; | 1210 virtual IntSize originAdjustmentForScrollbars() const; |
| 1179 IntSize scrolledContentOffset() const; | 1211 IntSize scrolledContentOffset() const; |
| 1180 | 1212 |
| 1181 // Maps a rect in scrolling contents space to box space and apply overflow cli
p if needed. | 1213 // Maps a rect in scrolling contents space to box space and apply overflow |
| 1182 // Returns true if no clipping applied or the rect actually intersects the cli
pping region. | 1214 // clip if needed. Returns true if no clipping applied or the rect actually |
| 1183 // If edgeInclusive is true, then this method may return true even | 1215 // intersects the clipping region. If edgeInclusive is true, then this method |
| 1184 // if the resulting rect has zero area. | 1216 // may return true even if the resulting rect has zero area. |
| 1185 bool mapScrollingContentsRectToBoxSpace( | 1217 bool mapScrollingContentsRectToBoxSpace( |
| 1186 LayoutRect&, | 1218 LayoutRect&, |
| 1187 ApplyOverflowClipFlag, | 1219 ApplyOverflowClipFlag, |
| 1188 VisualRectFlags = DefaultVisualRectFlags) const; | 1220 VisualRectFlags = DefaultVisualRectFlags) const; |
| 1189 | 1221 |
| 1190 virtual bool hasRelativeLogicalWidth() const; | 1222 virtual bool hasRelativeLogicalWidth() const; |
| 1191 virtual bool hasRelativeLogicalHeight() const; | 1223 virtual bool hasRelativeLogicalHeight() const; |
| 1192 | 1224 |
| 1193 bool hasHorizontalLayoutOverflow() const { | 1225 bool hasHorizontalLayoutOverflow() const { |
| 1194 if (!m_overflow) | 1226 if (!m_overflow) |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1279 void willBeRemovedFromTree() override; | 1311 void willBeRemovedFromTree() override; |
| 1280 | 1312 |
| 1281 void styleWillChange(StyleDifference, const ComputedStyle& newStyle) override; | 1313 void styleWillChange(StyleDifference, const ComputedStyle& newStyle) override; |
| 1282 void styleDidChange(StyleDifference, const ComputedStyle* oldStyle) override; | 1314 void styleDidChange(StyleDifference, const ComputedStyle* oldStyle) override; |
| 1283 void updateFromStyle() override; | 1315 void updateFromStyle() override; |
| 1284 | 1316 |
| 1285 virtual ItemPosition selfAlignmentNormalBehavior() const { | 1317 virtual ItemPosition selfAlignmentNormalBehavior() const { |
| 1286 return ItemPositionStretch; | 1318 return ItemPositionStretch; |
| 1287 } | 1319 } |
| 1288 | 1320 |
| 1289 // Returns false if it could not cheaply compute the extent (e.g. fixed backgr
ound), in which case the returned rect may be incorrect. | 1321 // Returns false if it could not cheaply compute the extent (e.g. fixed |
| 1290 // FIXME: make this a const method once the LayoutBox reference in BoxPainter
is const. | 1322 // background), in which case the returned rect may be incorrect. |
| 1323 // FIXME: make this a const method once the LayoutBox reference in BoxPainter |
| 1324 // is const. |
| 1291 bool getBackgroundPaintedExtent(LayoutRect&) const; | 1325 bool getBackgroundPaintedExtent(LayoutRect&) const; |
| 1292 virtual bool foregroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect, | 1326 virtual bool foregroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect, |
| 1293 unsigned maxDepthToTest) const; | 1327 unsigned maxDepthToTest) const; |
| 1294 bool computeBackgroundIsKnownToBeObscured() const override; | 1328 bool computeBackgroundIsKnownToBeObscured() const override; |
| 1295 | 1329 |
| 1296 virtual void computePositionedLogicalWidth( | 1330 virtual void computePositionedLogicalWidth( |
| 1297 LogicalExtentComputedValues&) const; | 1331 LogicalExtentComputedValues&) const; |
| 1298 | 1332 |
| 1299 LayoutUnit computeIntrinsicLogicalWidthUsing( | 1333 LayoutUnit computeIntrinsicLogicalWidthUsing( |
| 1300 const Length& logicalWidthLength, | 1334 const Length& logicalWidthLength, |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1413 const Length& logicalBottom, | 1447 const Length& logicalBottom, |
| 1414 const Length& marginLogicalTop, | 1448 const Length& marginLogicalTop, |
| 1415 const Length& marginLogicalBottom, | 1449 const Length& marginLogicalBottom, |
| 1416 LogicalExtentComputedValues&) const; | 1450 LogicalExtentComputedValues&) const; |
| 1417 | 1451 |
| 1418 LayoutUnit fillAvailableMeasure(LayoutUnit availableLogicalWidth) const; | 1452 LayoutUnit fillAvailableMeasure(LayoutUnit availableLogicalWidth) const; |
| 1419 LayoutUnit fillAvailableMeasure(LayoutUnit availableLogicalWidth, | 1453 LayoutUnit fillAvailableMeasure(LayoutUnit availableLogicalWidth, |
| 1420 LayoutUnit& marginStart, | 1454 LayoutUnit& marginStart, |
| 1421 LayoutUnit& marginEnd) const; | 1455 LayoutUnit& marginEnd) const; |
| 1422 | 1456 |
| 1423 // Calculates the intrinsic(https://drafts.csswg.org/css-sizing-3/#intrinsic)
logical widths for this layout box. | 1457 // Calculates the intrinsic(https://drafts.csswg.org/css-sizing-3/#intrinsic) |
| 1458 // logical widths for this layout box. |
| 1424 // | 1459 // |
| 1425 // intrinsicWidth is defined as: | 1460 // intrinsicWidth is defined as: |
| 1426 // intrinsic size of content (without our border and padding) + scrollbarW
idth. | 1461 // intrinsic size of content (without our border and padding) + |
| 1462 // scrollbarWidth. |
| 1427 // | 1463 // |
| 1428 // preferredWidth is defined as: | 1464 // preferredWidth is defined as: |
| 1429 // fixedWidth OR (intrinsicWidth plus border and padding). | 1465 // fixedWidth OR (intrinsicWidth plus border and padding). |
| 1430 // Note: fixedWidth includes border and padding and scrollbarWidth. | 1466 // Note: fixedWidth includes border and padding and scrollbarWidth. |
| 1431 virtual void computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, | 1467 virtual void computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, |
| 1432 LayoutUnit& maxLogicalWidth) const; | 1468 LayoutUnit& maxLogicalWidth) const; |
| 1433 | 1469 |
| 1434 // This function calculates the preferred widths for an object. | 1470 // This function calculates the preferred widths for an object. |
| 1435 // | 1471 // |
| 1436 // This function is only expected to be called if | 1472 // This function is only expected to be called if |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1557 } | 1593 } |
| 1558 | 1594 |
| 1559 inline LayoutBox* LayoutBox::nextSiblingMultiColumnBox() const { | 1595 inline LayoutBox* LayoutBox::nextSiblingMultiColumnBox() const { |
| 1560 ASSERT(isLayoutMultiColumnSpannerPlaceholder() || isLayoutMultiColumnSet()); | 1596 ASSERT(isLayoutMultiColumnSpannerPlaceholder() || isLayoutMultiColumnSet()); |
| 1561 return nextSiblingBox(); | 1597 return nextSiblingBox(); |
| 1562 } | 1598 } |
| 1563 | 1599 |
| 1564 inline void LayoutBox::setInlineBoxWrapper(InlineBox* boxWrapper) { | 1600 inline void LayoutBox::setInlineBoxWrapper(InlineBox* boxWrapper) { |
| 1565 if (boxWrapper) { | 1601 if (boxWrapper) { |
| 1566 ASSERT(!m_inlineBoxWrapper); | 1602 ASSERT(!m_inlineBoxWrapper); |
| 1567 // m_inlineBoxWrapper should already be nullptr. Deleting it is a safeguard
against security issues. | 1603 // m_inlineBoxWrapper should already be nullptr. Deleting it is a safeguard |
| 1568 // Otherwise, there will two line box wrappers keeping the reference to this
layoutObject, and | 1604 // against security issues. Otherwise, there will two line box wrappers |
| 1569 // only one will be notified when the layoutObject is getting destroyed. The
second line box wrapper | 1605 // keeping the reference to this layoutObject, and only one will be notified |
| 1606 // when the layoutObject is getting destroyed. The second line box wrapper |
| 1570 // will keep a stale reference. | 1607 // will keep a stale reference. |
| 1571 if (UNLIKELY(m_inlineBoxWrapper != nullptr)) | 1608 if (UNLIKELY(m_inlineBoxWrapper != nullptr)) |
| 1572 deleteLineBoxWrapper(); | 1609 deleteLineBoxWrapper(); |
| 1573 } | 1610 } |
| 1574 | 1611 |
| 1575 m_inlineBoxWrapper = boxWrapper; | 1612 m_inlineBoxWrapper = boxWrapper; |
| 1576 } | 1613 } |
| 1577 | 1614 |
| 1578 inline bool LayoutBox::isForcedFragmentainerBreakValue(EBreak breakValue) { | 1615 inline bool LayoutBox::isForcedFragmentainerBreakValue(EBreak breakValue) { |
| 1579 return breakValue == BreakColumn || breakValue == BreakLeft || | 1616 return breakValue == BreakColumn || breakValue == BreakLeft || |
| 1580 breakValue == BreakPage || breakValue == BreakRecto || | 1617 breakValue == BreakPage || breakValue == BreakRecto || |
| 1581 breakValue == BreakRight || breakValue == BreakVerso; | 1618 breakValue == BreakRight || breakValue == BreakVerso; |
| 1582 } | 1619 } |
| 1583 | 1620 |
| 1584 } // namespace blink | 1621 } // namespace blink |
| 1585 | 1622 |
| 1586 #endif // LayoutBox_h | 1623 #endif // LayoutBox_h |
| OLD | NEW |