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