Changeset 256380 in webkit
- Timestamp:
- Feb 11, 2020 3:13:00 PM (4 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 18 edited
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r256377 r256380 1 2020-02-11 Zalan Bujtas <zalan@apple.com> 2 3 [LFC] Introduce Layout::ReplacedBox 4 https://bugs.webkit.org/show_bug.cgi?id=207561 5 <rdar://problem/59353151> 6 7 Reviewed by Antti Koivisto. 8 9 This is in preparation for making Layout::Box an "abstract" box (so that it stops being a leaf type of box). 10 11 * Sources.txt: 12 * WebCore.xcodeproj/project.pbxproj: 13 * layout/FormattingContext.cpp: 14 (WebCore::Layout::FormattingContext::validateGeometryConstraintsAfterLayout const): 15 * layout/FormattingContext.h: 16 * layout/FormattingContextGeometry.cpp: 17 (WebCore::Layout::FormattingContext::Geometry::outOfFlowNonReplacedVerticalGeometry const): 18 (WebCore::Layout::FormattingContext::Geometry::outOfFlowNonReplacedHorizontalGeometry): 19 (WebCore::Layout::FormattingContext::Geometry::outOfFlowReplacedVerticalGeometry const): 20 (WebCore::Layout::FormattingContext::Geometry::outOfFlowReplacedHorizontalGeometry const): 21 (WebCore::Layout::FormattingContext::Geometry::complicatedCases const): 22 (WebCore::Layout::FormattingContext::Geometry::floatingNonReplacedWidthAndMargin): 23 (WebCore::Layout::FormattingContext::Geometry::floatingReplacedHeightAndMargin const): 24 (WebCore::Layout::FormattingContext::Geometry::floatingReplacedWidthAndMargin const): 25 (WebCore::Layout::FormattingContext::Geometry::outOfFlowVerticalGeometry const): 26 (WebCore::Layout::FormattingContext::Geometry::outOfFlowHorizontalGeometry): 27 (WebCore::Layout::FormattingContext::Geometry::floatingHeightAndMargin const): 28 (WebCore::Layout::FormattingContext::Geometry::floatingWidthAndMargin): 29 (WebCore::Layout::FormattingContext::Geometry::inlineReplacedHeightAndMargin const): 30 (WebCore::Layout::FormattingContext::Geometry::inlineReplacedWidthAndMargin const): 31 * layout/blockformatting/BlockFormattingContext.h: 32 * layout/blockformatting/BlockFormattingContextGeometry.cpp: 33 (WebCore::Layout::BlockFormattingContext::Geometry::inFlowNonReplacedHeightAndMargin): 34 (WebCore::Layout::BlockFormattingContext::Geometry::inFlowReplacedWidthAndMargin const): 35 (WebCore::Layout::BlockFormattingContext::Geometry::inFlowHeightAndMargin): 36 (WebCore::Layout::BlockFormattingContext::Geometry::inFlowWidthAndMargin): 37 (WebCore::Layout::BlockFormattingContext::Geometry::intrinsicWidthConstraints): 38 * layout/blockformatting/BlockMarginCollapse.cpp: 39 (WebCore::Layout::BlockFormattingContext::MarginCollapse::marginsCollapseThrough const): 40 (WebCore::Layout::BlockFormattingContext::MarginCollapse::precomputedMarginBefore): 41 * layout/inlineformatting/InlineFormattingContext.cpp: 42 (WebCore::Layout::InlineFormattingContext::computedIntrinsicWidthConstraints): 43 (WebCore::Layout::InlineFormattingContext::computeWidthAndMargin): 44 (WebCore::Layout::InlineFormattingContext::computeHeightAndMargin): 45 * layout/inlineformatting/InlineFormattingContextGeometry.cpp: 46 (WebCore::Layout::InlineFormattingContext::Geometry::inlineBlockWidthAndMargin): 47 (WebCore::Layout::InlineFormattingContext::Geometry::inlineBlockHeightAndMargin const): 48 * layout/inlineformatting/InlineLineBuilder.cpp: 49 (WebCore::Layout::LineBuilder::append): 50 (WebCore::Layout::LineBuilder::appendReplacedInlineBox): 51 (WebCore::Layout::LineBuilder::runContentHeight const): 52 (WebCore::Layout::LineBuilder::isVisuallyNonEmpty const): 53 * layout/inlineformatting/LineLayoutContext.cpp: 54 (WebCore::Layout::LineLayoutContext::inlineItemWidth const): 55 * layout/layouttree/LayoutBox.cpp: 56 (WebCore::Layout::Box::Box): 57 (WebCore::Layout::Box::isInlineBox const): 58 (WebCore::Layout::Box::replaced const): Deleted. 59 (WebCore::Layout::Box::replaced): Deleted. 60 * layout/layouttree/LayoutBox.h: 61 (WebCore::Layout::Box::isTableCell const): 62 (WebCore::Layout::Box::isReplacedBox const): 63 (WebCore::Layout::Box::isReplaced const): Deleted. 64 * layout/layouttree/LayoutReplacedBox.cpp: Renamed from Source/WebCore/layout/layouttree/LayoutReplaced.cpp. 65 (WebCore::Layout::ReplacedBox::ReplacedBox): 66 (WebCore::Layout::ReplacedBox::hasIntrinsicWidth const): 67 (WebCore::Layout::ReplacedBox::hasIntrinsicHeight const): 68 (WebCore::Layout::ReplacedBox::hasIntrinsicRatio const): 69 (WebCore::Layout::ReplacedBox::intrinsicWidth const): 70 (WebCore::Layout::ReplacedBox::intrinsicHeight const): 71 (WebCore::Layout::ReplacedBox::intrinsicRatio const): 72 (WebCore::Layout::ReplacedBox::hasAspectRatio const): 73 * layout/layouttree/LayoutReplacedBox.h: Renamed from Source/WebCore/layout/layouttree/LayoutReplaced.h. 74 (WebCore::Layout::ReplacedBox::setCachedImage): 75 (WebCore::Layout::ReplacedBox::cachedImage const): 76 (WebCore::Layout::ReplacedBox::setIntrinsicSize): 77 (WebCore::Layout::ReplacedBox::setIntrinsicRatio): 78 * layout/layouttree/LayoutTreeBuilder.cpp: 79 (WebCore::Layout::TreeBuilder::createLayoutBox): 80 (WebCore::Layout::outputLayoutBox): 81 1 82 2020-02-11 Youenn Fablet <youenn@apple.com> 2 83 -
trunk/Source/WebCore/Headers.cmake
r256304 r256380 686 686 687 687 layout/layouttree/LayoutBox.h 688 layout/layouttree/LayoutReplaced.h689 688 690 689 loader/AdClickAttribution.h -
trunk/Source/WebCore/Sources.txt
r256311 r256380 1454 1454 layout/layouttree/LayoutInlineTextBox.cpp 1455 1455 layout/layouttree/LayoutLineBreakBox.cpp 1456 layout/layouttree/LayoutReplaced .cpp1456 layout/layouttree/LayoutReplacedBox.cpp 1457 1457 layout/layouttree/LayoutTreeBuilder.cpp 1458 1458 layout/tableformatting/TableFormattingContext.cpp -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r256372 r256380 375 375 112FB352239C23C40087054A /* DisplayInlineRect.h in Headers */ = {isa = PBXBuildFile; fileRef = 112FB350239C23C40087054A /* DisplayInlineRect.h */; settings = {ATTRIBUTES = (Private, ); }; }; 376 376 11310CF220BA4A320065A8D0 /* LayoutTreeBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 11100FD7209514DF0081AA6C /* LayoutTreeBuilder.h */; settings = {ATTRIBUTES = (Private, ); }; }; 377 11310CF320BA4A370065A8D0 /* LayoutReplaced .h in Headers */ = {isa = PBXBuildFile; fileRef = 111C615620AD1AE1005B82FA /* LayoutReplaced.h */; settings = {ATTRIBUTES = (Private, ); }; };377 11310CF320BA4A370065A8D0 /* LayoutReplacedBox.h in Headers */ = {isa = PBXBuildFile; fileRef = 111C615620AD1AE1005B82FA /* LayoutReplacedBox.h */; settings = {ATTRIBUTES = (Private, ); }; }; 378 378 11310CF420BA4A3D0065A8D0 /* LayoutIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = 11100FC72092764C0081AA6C /* LayoutIterator.h */; settings = {ATTRIBUTES = (Private, ); }; }; 379 379 11310CF520BA4A4C0065A8D0 /* LayoutDescendantIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = 11B042FB20B0E21400828A6B /* LayoutDescendantIterator.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 5897 5897 11100FD5209514DE0081AA6C /* LayoutTreeBuilder.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = LayoutTreeBuilder.cpp; sourceTree = "<group>"; }; 5898 5898 11100FD7209514DF0081AA6C /* LayoutTreeBuilder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LayoutTreeBuilder.h; sourceTree = "<group>"; }; 5899 111C615620AD1AE1005B82FA /* LayoutReplaced .h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LayoutReplaced.h; sourceTree = "<group>"; };5900 111C615720AD1AE1005B82FA /* LayoutReplaced .cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = LayoutReplaced.cpp; sourceTree = "<group>"; };5899 111C615620AD1AE1005B82FA /* LayoutReplacedBox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LayoutReplacedBox.h; sourceTree = "<group>"; }; 5900 111C615720AD1AE1005B82FA /* LayoutReplacedBox.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = LayoutReplacedBox.cpp; sourceTree = "<group>"; }; 5901 5901 112B34D01E60B8A700BB310A /* SimpleLineLayoutPagination.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SimpleLineLayoutPagination.cpp; sourceTree = "<group>"; }; 5902 5902 112B34D41E60B98300BB310A /* SimpleLineLayoutPagination.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleLineLayoutPagination.h; sourceTree = "<group>"; }; … … 16738 16738 6FFA4BFE23F2FECD007E4EBC /* LayoutLineBreakBox.cpp */, 16739 16739 6FFA4C0023F2FED9007E4EBC /* LayoutLineBreakBox.h */, 16740 111C615720AD1AE1005B82FA /* LayoutReplaced .cpp */,16741 111C615620AD1AE1005B82FA /* LayoutReplaced .h */,16740 111C615720AD1AE1005B82FA /* LayoutReplacedBox.cpp */, 16741 111C615620AD1AE1005B82FA /* LayoutReplacedBox.h */, 16742 16742 11100FD5209514DE0081AA6C /* LayoutTreeBuilder.cpp */, 16743 16743 11100FD7209514DF0081AA6C /* LayoutTreeBuilder.h */, … … 31291 31291 141DC053164834B900371E5A /* LayoutRect.h in Headers */, 31292 31292 A12538D413F9B60A00024754 /* LayoutRepainter.h in Headers */, 31293 11310CF320BA4A370065A8D0 /* LayoutReplaced .h in Headers */,31293 11310CF320BA4A370065A8D0 /* LayoutReplacedBox.h in Headers */, 31294 31294 141DC054164834B900371E5A /* LayoutSize.h in Headers */, 31295 31295 6F7CA3C6208C2957002F29AB /* LayoutState.h in Headers */, -
trunk/Source/WebCore/layout/FormattingContext.cpp
r254933 r256380 36 36 #include "LayoutContext.h" 37 37 #include "LayoutDescendantIterator.h" 38 #include "LayoutReplacedBox.h" 38 39 #include "LayoutState.h" 39 40 #include "Logging.h" … … 325 326 // 10.3.3 Block-level, non-replaced elements in normal flow 326 327 // 10.3.7 Absolutely positioned, non-replaced elements 327 if ((layoutBox.isBlockLevelBox() || layoutBox.isOutOfFlowPositioned()) && !layoutBox. replaced()) {328 if ((layoutBox.isBlockLevelBox() || layoutBox.isOutOfFlowPositioned()) && !layoutBox.isReplacedBox()) { 328 329 // margin-left + border-left-width + padding-left + width + padding-right + border-right-width + margin-right = width of containing block 329 330 auto containingBlockWidth = containingBlockGeometry.contentBoxWidth(); … … 332 333 333 334 // 10.6.4 Absolutely positioned, non-replaced elements 334 if (layoutBox.isOutOfFlowPositioned() && !layoutBox. replaced()) {335 if (layoutBox.isOutOfFlowPositioned() && !layoutBox.isReplacedBox()) { 335 336 // top + margin-top + border-top-width + padding-top + height + padding-bottom + border-bottom-width + margin-bottom + bottom = height of containing block 336 337 auto containingBlockHeight = containingBlockGeometry.contentBoxHeight(); -
trunk/Source/WebCore/layout/FormattingContext.h
r254336 r256380 45 45 46 46 class Box; 47 class ReplacedBox; 47 48 struct ComputedHorizontalMargin; 48 49 struct ComputedVerticalMargin; … … 119 120 ContentWidthAndMargin floatingWidthAndMargin(const Box&, const HorizontalConstraints&, const OverrideHorizontalValues&); 120 121 121 ContentHeightAndMargin inlineReplacedHeightAndMargin(const Box&, const HorizontalConstraints&, Optional<VerticalConstraints>, const OverrideVerticalValues&) const;122 ContentWidthAndMargin inlineReplacedWidthAndMargin(const Box&, const HorizontalConstraints&, const OverrideHorizontalValues&) const;122 ContentHeightAndMargin inlineReplacedHeightAndMargin(const ReplacedBox&, const HorizontalConstraints&, Optional<VerticalConstraints>, const OverrideVerticalValues&) const; 123 ContentWidthAndMargin inlineReplacedWidthAndMargin(const ReplacedBox&, const HorizontalConstraints&, const OverrideHorizontalValues&) const; 123 124 124 125 LayoutSize inFlowPositionedPositionOffset(const Box&, const HorizontalConstraints&) const; … … 165 166 166 167 private: 167 VerticalGeometry outOfFlowReplacedVerticalGeometry(const Box&, const HorizontalConstraints&, const VerticalConstraints&, const OverrideVerticalValues&) const;168 HorizontalGeometry outOfFlowReplacedHorizontalGeometry(const Box&, const HorizontalConstraints&, const OverrideHorizontalValues&) const;168 VerticalGeometry outOfFlowReplacedVerticalGeometry(const ReplacedBox&, const HorizontalConstraints&, const VerticalConstraints&, const OverrideVerticalValues&) const; 169 HorizontalGeometry outOfFlowReplacedHorizontalGeometry(const ReplacedBox&, const HorizontalConstraints&, const OverrideHorizontalValues&) const; 169 170 170 171 VerticalGeometry outOfFlowNonReplacedVerticalGeometry(const Box&, const HorizontalConstraints&, const VerticalConstraints&, const OverrideVerticalValues&) const; 171 172 HorizontalGeometry outOfFlowNonReplacedHorizontalGeometry(const Box&, const HorizontalConstraints&, const OverrideHorizontalValues&); 172 173 173 ContentHeightAndMargin floatingReplacedHeightAndMargin(const Box&, const HorizontalConstraints&, const OverrideVerticalValues&) const;174 ContentWidthAndMargin floatingReplacedWidthAndMargin(const Box&, const HorizontalConstraints&, const OverrideHorizontalValues&) const;174 ContentHeightAndMargin floatingReplacedHeightAndMargin(const ReplacedBox&, const HorizontalConstraints&, const OverrideVerticalValues&) const; 175 ContentWidthAndMargin floatingReplacedWidthAndMargin(const ReplacedBox&, const HorizontalConstraints&, const OverrideHorizontalValues&) const; 175 176 176 177 ContentWidthAndMargin floatingNonReplacedWidthAndMargin(const Box&, const HorizontalConstraints&, const OverrideHorizontalValues&); -
trunk/Source/WebCore/layout/FormattingContextGeometry.cpp
r255257 r256380 300 300 VerticalGeometry FormattingContext::Geometry::outOfFlowNonReplacedVerticalGeometry(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints, const VerticalConstraints& verticalConstraints, const OverrideVerticalValues& overrideVerticalValues) const 301 301 { 302 ASSERT(layoutBox.isOutOfFlowPositioned() && !layoutBox. replaced());302 ASSERT(layoutBox.isOutOfFlowPositioned() && !layoutBox.isReplacedBox()); 303 303 ASSERT(verticalConstraints.logicalHeight); 304 304 … … 419 419 HorizontalGeometry FormattingContext::Geometry::outOfFlowNonReplacedHorizontalGeometry(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints, const OverrideHorizontalValues& overrideHorizontalValues) 420 420 { 421 ASSERT(layoutBox.isOutOfFlowPositioned() && !layoutBox. replaced());421 ASSERT(layoutBox.isOutOfFlowPositioned() && !layoutBox.isReplacedBox()); 422 422 423 423 // 10.3.7 Absolutely positioned, non-replaced elements … … 560 560 } 561 561 562 VerticalGeometry FormattingContext::Geometry::outOfFlowReplacedVerticalGeometry(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints, const VerticalConstraints& verticalConstraints, const OverrideVerticalValues& overrideVerticalValues) const563 { 564 ASSERT( layoutBox.isOutOfFlowPositioned() && layoutBox.replaced());562 VerticalGeometry FormattingContext::Geometry::outOfFlowReplacedVerticalGeometry(const ReplacedBox& replacedBox, const HorizontalConstraints& horizontalConstraints, const VerticalConstraints& verticalConstraints, const OverrideVerticalValues& overrideVerticalValues) const 563 { 564 ASSERT(replacedBox.isOutOfFlowPositioned()); 565 565 ASSERT(verticalConstraints.logicalHeight); 566 566 … … 576 576 577 577 auto& formattingContext = this->formattingContext(); 578 auto& style = layoutBox.style();579 auto& boxGeometry = formattingContext.geometryForBox( layoutBox);578 auto& style = replacedBox.style(); 579 auto& boxGeometry = formattingContext.geometryForBox(replacedBox); 580 580 auto containingBlockHeight = *verticalConstraints.logicalHeight; 581 581 auto containingBlockWidth = horizontalConstraints.logicalWidth; … … 583 583 auto top = computedValueIfNotAuto(style.logicalTop(), containingBlockWidth); 584 584 auto bottom = computedValueIfNotAuto(style.logicalBottom(), containingBlockWidth); 585 auto height = inlineReplacedHeightAndMargin( layoutBox, horizontalConstraints, verticalConstraints, overrideVerticalValues).contentHeight;586 auto computedVerticalMargin = Geometry::computedVerticalMargin( layoutBox, horizontalConstraints);585 auto height = inlineReplacedHeightAndMargin(replacedBox, horizontalConstraints, verticalConstraints, overrideVerticalValues).contentHeight; 586 auto computedVerticalMargin = Geometry::computedVerticalMargin(replacedBox, horizontalConstraints); 587 587 Optional<LayoutUnit> usedMarginBefore = computedVerticalMargin.before; 588 588 Optional<LayoutUnit> usedMarginAfter = computedVerticalMargin.after; … … 594 594 if (!top && !bottom) { 595 595 // #1 596 top = staticVerticalPositionForOutOfFlowPositioned( layoutBox, verticalConstraints);596 top = staticVerticalPositionForOutOfFlowPositioned(replacedBox, verticalConstraints); 597 597 } 598 598 … … 638 638 ASSERT(usedMarginBefore); 639 639 ASSERT(usedMarginAfter); 640 LOG_WITH_STREAM(FormattingContextLayout, stream << "[Position][Height][Margin] -> out-of-flow replaced -> top(" << *top << "px) bottom(" << *bottom << "px) height(" << height << "px) margin(" << *usedMarginBefore << "px, " << *usedMarginAfter << "px) layoutBox(" << & layoutBox << ")");640 LOG_WITH_STREAM(FormattingContextLayout, stream << "[Position][Height][Margin] -> out-of-flow replaced -> top(" << *top << "px) bottom(" << *bottom << "px) height(" << height << "px) margin(" << *usedMarginBefore << "px, " << *usedMarginAfter << "px) layoutBox(" << &replacedBox << ")"); 641 641 return { *top, *bottom, { height, { *usedMarginBefore, *usedMarginAfter } } }; 642 642 } 643 643 644 HorizontalGeometry FormattingContext::Geometry::outOfFlowReplacedHorizontalGeometry(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints, const OverrideHorizontalValues& overrideHorizontalValues) const645 { 646 ASSERT( layoutBox.isOutOfFlowPositioned() && layoutBox.replaced());644 HorizontalGeometry FormattingContext::Geometry::outOfFlowReplacedHorizontalGeometry(const ReplacedBox& replacedBox, const HorizontalConstraints& horizontalConstraints, const OverrideHorizontalValues& overrideHorizontalValues) const 645 { 646 ASSERT(replacedBox.isOutOfFlowPositioned()); 647 647 648 648 // 10.3.8 Absolutely positioned, replaced elements … … 661 661 662 662 auto& formattingContext = this->formattingContext(); 663 auto& style = layoutBox.style();664 auto& boxGeometry = formattingContext.geometryForBox( layoutBox);663 auto& style = replacedBox.style(); 664 auto& boxGeometry = formattingContext.geometryForBox(replacedBox); 665 665 auto containingBlockWidth = horizontalConstraints.logicalWidth; 666 auto isLeftToRightDirection = layoutBox.containingBlock()->style().isLeftToRightDirection();666 auto isLeftToRightDirection = replacedBox.containingBlock()->style().isLeftToRightDirection(); 667 667 668 668 auto left = computedValueIfNotAuto(style.logicalLeft(), containingBlockWidth); 669 669 auto right = computedValueIfNotAuto(style.logicalRight(), containingBlockWidth); 670 auto computedHorizontalMargin = Geometry::computedHorizontalMargin( layoutBox, horizontalConstraints);670 auto computedHorizontalMargin = Geometry::computedHorizontalMargin(replacedBox, horizontalConstraints); 671 671 Optional<LayoutUnit> usedMarginStart = computedHorizontalMargin.start; 672 672 Optional<LayoutUnit> usedMarginEnd = computedHorizontalMargin.end; 673 auto width = inlineReplacedWidthAndMargin( layoutBox, horizontalConstraints, overrideHorizontalValues).contentWidth;673 auto width = inlineReplacedWidthAndMargin(replacedBox, horizontalConstraints, overrideHorizontalValues).contentWidth; 674 674 auto paddingLeft = boxGeometry.paddingLeft().valueOr(0); 675 675 auto paddingRight = boxGeometry.paddingRight().valueOr(0); … … 679 679 if (!left && !right) { 680 680 // #1 681 auto staticHorizontalPosition = staticHorizontalPositionForOutOfFlowPositioned( layoutBox, horizontalConstraints);681 auto staticHorizontalPosition = staticHorizontalPositionForOutOfFlowPositioned(replacedBox, horizontalConstraints); 682 682 if (isLeftToRightDirection) 683 683 left = staticHorizontalPosition; … … 742 742 *right += containingBlockPaddingVerticalEdge; 743 743 744 LOG_WITH_STREAM(FormattingContextLayout, stream << "[Position][Width][Margin] -> out-of-flow replaced -> left(" << *left << "px) right(" << *right << "px) width(" << width << "px) margin(" << *usedMarginStart << "px, " << *usedMarginEnd << "px) layoutBox(" << & layoutBox << ")");744 LOG_WITH_STREAM(FormattingContextLayout, stream << "[Position][Width][Margin] -> out-of-flow replaced -> left(" << *left << "px) right(" << *right << "px) width(" << width << "px) margin(" << *usedMarginStart << "px, " << *usedMarginEnd << "px) layoutBox(" << &replacedBox << ")"); 745 745 return { *left, *right, { width, { *usedMarginStart, *usedMarginEnd }, computedHorizontalMargin } }; 746 746 } … … 748 748 ContentHeightAndMargin FormattingContext::Geometry::complicatedCases(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints, const OverrideVerticalValues& overrideVerticalValues) const 749 749 { 750 ASSERT(!layoutBox. replaced());750 ASSERT(!layoutBox.isReplacedBox()); 751 751 // TODO: Use complicated-case for document renderer for now (see BlockFormattingContext::Geometry::inFlowHeightAndMargin). 752 752 ASSERT((layoutBox.isBlockLevelBox() && layoutBox.isInFlow() && !layoutBox.isOverflowVisible()) || layoutBox.isInlineBlockBox() || layoutBox.isFloatingPositioned() || layoutBox.isDocumentBox() || layoutBox.isTableBox()); … … 779 779 ContentWidthAndMargin FormattingContext::Geometry::floatingNonReplacedWidthAndMargin(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints, const OverrideHorizontalValues& overrideHorizontalValues) 780 780 { 781 ASSERT(layoutBox.isFloatingPositioned() && !layoutBox. replaced());781 ASSERT(layoutBox.isFloatingPositioned() && !layoutBox.isReplacedBox()); 782 782 783 783 // 10.3.5 Floating, non-replaced elements … … 799 799 } 800 800 801 ContentHeightAndMargin FormattingContext::Geometry::floatingReplacedHeightAndMargin(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints, const OverrideVerticalValues& overrideVerticalValues) const802 { 803 ASSERT( layoutBox.isFloatingPositioned() && layoutBox.replaced());801 ContentHeightAndMargin FormattingContext::Geometry::floatingReplacedHeightAndMargin(const ReplacedBox& replacedBox, const HorizontalConstraints& horizontalConstraints, const OverrideVerticalValues& overrideVerticalValues) const 802 { 803 ASSERT(replacedBox.isFloatingPositioned()); 804 804 805 805 // 10.6.2 Inline replaced elements, block-level replaced elements in normal flow, 'inline-block' 806 806 // replaced elements in normal flow and floating replaced elements 807 807 LOG_WITH_STREAM(FormattingContextLayout, stream << "[Height][Margin] -> floating replaced -> redirected to inline replaced"); 808 return inlineReplacedHeightAndMargin( layoutBox, horizontalConstraints, { }, overrideVerticalValues);809 } 810 811 ContentWidthAndMargin FormattingContext::Geometry::floatingReplacedWidthAndMargin(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints, const OverrideHorizontalValues& overrideHorizontalValues) const812 { 813 ASSERT( layoutBox.isFloatingPositioned() && layoutBox.replaced());808 return inlineReplacedHeightAndMargin(replacedBox, horizontalConstraints, { }, overrideVerticalValues); 809 } 810 811 ContentWidthAndMargin FormattingContext::Geometry::floatingReplacedWidthAndMargin(const ReplacedBox& replacedBox, const HorizontalConstraints& horizontalConstraints, const OverrideHorizontalValues& overrideHorizontalValues) const 812 { 813 ASSERT(replacedBox.isFloatingPositioned()); 814 814 815 815 // 10.3.6 Floating, replaced elements … … 817 817 // 1. If 'margin-left' or 'margin-right' are computed as 'auto', their used value is '0'. 818 818 // 2. The used value of 'width' is determined as for inline replaced elements. 819 auto computedHorizontalMargin = Geometry::computedHorizontalMargin( layoutBox, horizontalConstraints);819 auto computedHorizontalMargin = Geometry::computedHorizontalMargin(replacedBox, horizontalConstraints); 820 820 821 821 LOG_WITH_STREAM(FormattingContextLayout, stream << "[Height][Margin] -> floating replaced -> redirected to inline replaced"); 822 822 auto usedMargin = UsedHorizontalMargin { computedHorizontalMargin.start.valueOr(0), computedHorizontalMargin.end.valueOr(0) }; 823 return inlineReplacedWidthAndMargin( layoutBox, horizontalConstraints, { overrideHorizontalValues.width, usedMargin });823 return inlineReplacedWidthAndMargin(replacedBox, horizontalConstraints, { overrideHorizontalValues.width, usedMargin }); 824 824 } 825 825 … … 828 828 ASSERT(layoutBox.isOutOfFlowPositioned()); 829 829 830 if (!layoutBox. replaced())830 if (!layoutBox.isReplacedBox()) 831 831 return outOfFlowNonReplacedVerticalGeometry(layoutBox, horizontalConstraints, verticalConstraints, overrideVerticalValues); 832 return outOfFlowReplacedVerticalGeometry( layoutBox, horizontalConstraints, verticalConstraints, overrideVerticalValues);832 return outOfFlowReplacedVerticalGeometry(downcast<ReplacedBox>(layoutBox), horizontalConstraints, verticalConstraints, overrideVerticalValues); 833 833 } 834 834 … … 837 837 ASSERT(layoutBox.isOutOfFlowPositioned()); 838 838 839 if (!layoutBox. replaced())839 if (!layoutBox.isReplacedBox()) 840 840 return outOfFlowNonReplacedHorizontalGeometry(layoutBox, horizontalConstraints, overrideHorizontalValues); 841 return outOfFlowReplacedHorizontalGeometry( layoutBox, horizontalConstraints, overrideHorizontalValues);841 return outOfFlowReplacedHorizontalGeometry(downcast<ReplacedBox>(layoutBox), horizontalConstraints, overrideHorizontalValues); 842 842 } 843 843 … … 846 846 ASSERT(layoutBox.isFloatingPositioned()); 847 847 848 if (!layoutBox. replaced())848 if (!layoutBox.isReplacedBox()) 849 849 return complicatedCases(layoutBox, horizontalConstraints, overrideVerticalValues); 850 return floatingReplacedHeightAndMargin( layoutBox, horizontalConstraints, overrideVerticalValues);850 return floatingReplacedHeightAndMargin(downcast<ReplacedBox>(layoutBox), horizontalConstraints, overrideVerticalValues); 851 851 } 852 852 … … 855 855 ASSERT(layoutBox.isFloatingPositioned()); 856 856 857 if (!layoutBox. replaced())857 if (!layoutBox.isReplacedBox()) 858 858 return floatingNonReplacedWidthAndMargin(layoutBox, horizontalConstraints, overrideHorizontalValues); 859 return floatingReplacedWidthAndMargin(layoutBox, horizontalConstraints, overrideHorizontalValues); 860 } 861 862 ContentHeightAndMargin FormattingContext::Geometry::inlineReplacedHeightAndMargin(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints, Optional<VerticalConstraints> verticalConstraints, const OverrideVerticalValues& overrideVerticalValues) const 863 { 864 ASSERT((layoutBox.isOutOfFlowPositioned() || layoutBox.isFloatingPositioned() || layoutBox.isInFlow()) && layoutBox.replaced()); 865 859 return floatingReplacedWidthAndMargin(downcast<ReplacedBox>(layoutBox), horizontalConstraints, overrideHorizontalValues); 860 } 861 862 ContentHeightAndMargin FormattingContext::Geometry::inlineReplacedHeightAndMargin(const ReplacedBox& replacedBox, const HorizontalConstraints& horizontalConstraints, Optional<VerticalConstraints> verticalConstraints, const OverrideVerticalValues& overrideVerticalValues) const 863 { 866 864 // 10.6.2 Inline replaced elements, block-level replaced elements in normal flow, 'inline-block' replaced elements in normal flow and floating replaced elements 867 865 // … … 876 874 // #1 877 875 auto& formattingContext = this->formattingContext(); 878 auto computedVerticalMargin = Geometry::computedVerticalMargin( layoutBox, horizontalConstraints);876 auto computedVerticalMargin = Geometry::computedVerticalMargin(replacedBox, horizontalConstraints); 879 877 auto usedVerticalMargin = UsedVerticalMargin::NonCollapsedValues { computedVerticalMargin.before.valueOr(0), computedVerticalMargin.after.valueOr(0) }; 880 auto& style = layoutBox.style(); 881 auto replaced = layoutBox.replaced(); 882 883 auto height = overrideVerticalValues.height ? overrideVerticalValues.height.value() : computedContentHeight(layoutBox, verticalConstraints ? verticalConstraints->logicalHeight : WTF::nullopt); 884 auto heightIsAuto = !overrideVerticalValues.height && isHeightAuto(layoutBox); 878 auto& style = replacedBox.style(); 879 880 auto height = overrideVerticalValues.height ? overrideVerticalValues.height.value() : computedContentHeight(replacedBox, verticalConstraints ? verticalConstraints->logicalHeight : WTF::nullopt); 881 auto heightIsAuto = !overrideVerticalValues.height && isHeightAuto(replacedBox); 885 882 auto widthIsAuto = style.logicalWidth().isAuto(); 886 883 887 if (heightIsAuto && widthIsAuto && replaced ->hasIntrinsicHeight()) {884 if (heightIsAuto && widthIsAuto && replacedBox.hasIntrinsicHeight()) { 888 885 // #2 889 height = replaced ->intrinsicHeight();890 } else if (heightIsAuto && replaced ->hasIntrinsicRatio()) {886 height = replacedBox.intrinsicHeight(); 887 } else if (heightIsAuto && replacedBox.hasIntrinsicRatio()) { 891 888 // #3 892 auto usedWidth = formattingContext.geometryForBox( layoutBox).width();893 height = usedWidth / replaced ->intrinsicRatio();894 } else if (heightIsAuto && replaced ->hasIntrinsicHeight()) {889 auto usedWidth = formattingContext.geometryForBox(replacedBox).width(); 890 height = usedWidth / replacedBox.intrinsicRatio(); 891 } else if (heightIsAuto && replacedBox.hasIntrinsicHeight()) { 895 892 // #4 896 height = replaced ->intrinsicHeight();893 height = replacedBox.intrinsicHeight(); 897 894 } else if (heightIsAuto) { 898 895 // #5 … … 902 899 ASSERT(height); 903 900 904 LOG_WITH_STREAM(FormattingContextLayout, stream << "[Height][Margin] -> inflow replaced -> height(" << *height << "px) margin(" << usedVerticalMargin.before << "px, " << usedVerticalMargin.after << "px) -> layoutBox(" << & layoutBox << ")");901 LOG_WITH_STREAM(FormattingContextLayout, stream << "[Height][Margin] -> inflow replaced -> height(" << *height << "px) margin(" << usedVerticalMargin.before << "px, " << usedVerticalMargin.after << "px) -> layoutBox(" << &replacedBox << ")"); 905 902 return { *height, usedVerticalMargin }; 906 903 } 907 904 908 ContentWidthAndMargin FormattingContext::Geometry::inlineReplacedWidthAndMargin(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints, const OverrideHorizontalValues& overrideHorizontalValues) const 909 { 910 ASSERT((layoutBox.isOutOfFlowPositioned() || layoutBox.isFloatingPositioned() || layoutBox.isInFlow()) && layoutBox.replaced()); 911 905 ContentWidthAndMargin FormattingContext::Geometry::inlineReplacedWidthAndMargin(const ReplacedBox& replacedBox, const HorizontalConstraints& horizontalConstraints, const OverrideHorizontalValues& overrideHorizontalValues) const 906 { 912 907 // 10.3.2 Inline, replaced elements 913 908 // … … 929 924 // If 300px is too wide to fit the device, UAs should use the width of the largest rectangle that has a 2:1 ratio and fits the device instead. 930 925 931 auto computedHorizontalMargin = Geometry::computedHorizontalMargin( layoutBox, horizontalConstraints);926 auto computedHorizontalMargin = Geometry::computedHorizontalMargin(replacedBox, horizontalConstraints); 932 927 933 928 auto usedMarginStart = [&] { … … 943 938 }; 944 939 945 auto replaced = layoutBox.replaced(); 946 ASSERT(replaced); 947 948 auto width = overrideHorizontalValues.width ? overrideHorizontalValues.width : computedContentWidth(layoutBox, horizontalConstraints.logicalWidth); 949 auto heightIsAuto = isHeightAuto(layoutBox); 950 auto height = computedContentHeight(layoutBox); 951 952 if (!width && heightIsAuto && replaced->hasIntrinsicWidth()) { 940 auto width = overrideHorizontalValues.width ? overrideHorizontalValues.width : computedContentWidth(replacedBox, horizontalConstraints.logicalWidth); 941 auto heightIsAuto = isHeightAuto(replacedBox); 942 auto height = computedContentHeight(replacedBox); 943 944 if (!width && heightIsAuto && replacedBox.hasIntrinsicWidth()) { 953 945 // #1 954 width = replaced ->intrinsicWidth();955 } else if ((!width && heightIsAuto && !replaced ->hasIntrinsicWidth() && replaced->hasIntrinsicHeight() && replaced->hasIntrinsicRatio())956 || (!width && height && replaced ->hasIntrinsicRatio())) {946 width = replacedBox.intrinsicWidth(); 947 } else if ((!width && heightIsAuto && !replacedBox.hasIntrinsicWidth() && replacedBox.hasIntrinsicHeight() && replacedBox.hasIntrinsicRatio()) 948 || (!width && height && replacedBox.hasIntrinsicRatio())) { 957 949 // #2 958 width = height.valueOr(replaced ->hasIntrinsicHeight()) * replaced->intrinsicRatio();959 } else if (!width && heightIsAuto && replaced ->hasIntrinsicRatio() && !replaced->hasIntrinsicWidth() && !replaced->hasIntrinsicHeight()) {950 width = height.valueOr(replacedBox.hasIntrinsicHeight()) * replacedBox.intrinsicRatio(); 951 } else if (!width && heightIsAuto && replacedBox.hasIntrinsicRatio() && !replacedBox.hasIntrinsicWidth() && !replacedBox.hasIntrinsicHeight()) { 960 952 // #3 961 953 // FIXME: undefined but surely doable. 962 954 ASSERT_NOT_IMPLEMENTED_YET(); 963 } else if (!width && replaced ->hasIntrinsicWidth()) {955 } else if (!width && replacedBox.hasIntrinsicWidth()) { 964 956 // #4 965 width = replaced ->intrinsicWidth();957 width = replacedBox.intrinsicWidth(); 966 958 } else if (!width) { 967 959 // #5 … … 971 963 ASSERT(width); 972 964 973 LOG_WITH_STREAM(FormattingContextLayout, stream << "[Width][Margin] -> inflow replaced -> width(" << *width << "px) margin(" << usedMarginStart() << "px, " << usedMarginEnd() << "px) -> layoutBox(" << & layoutBox << ")");965 LOG_WITH_STREAM(FormattingContextLayout, stream << "[Width][Margin] -> inflow replaced -> width(" << *width << "px) margin(" << usedMarginStart() << "px, " << usedMarginEnd() << "px) -> layoutBox(" << &replacedBox << ")"); 974 966 return { *width, { usedMarginStart(), usedMarginEnd() }, computedHorizontalMargin }; 975 967 } -
trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.h
r256106 r256380 93 93 ContentHeightAndMargin inFlowNonReplacedHeightAndMargin(const Box&, const HorizontalConstraints&, const OverrideVerticalValues&); 94 94 ContentWidthAndMargin inFlowNonReplacedWidthAndMargin(const Box&, const HorizontalConstraints&, const OverrideHorizontalValues&) const; 95 ContentWidthAndMargin inFlowReplacedWidthAndMargin(const Box&, const HorizontalConstraints&, const OverrideHorizontalValues&) const;95 ContentWidthAndMargin inFlowReplacedWidthAndMargin(const ReplacedBox&, const HorizontalConstraints&, const OverrideHorizontalValues&) const; 96 96 Point staticPositionForOutOfFlowPositioned(const Box&) const; 97 97 -
trunk/Source/WebCore/layout/blockformatting/BlockFormattingContextGeometry.cpp
r255899 r256380 35 35 #include "LayoutChildIterator.h" 36 36 #include "LayoutContext.h" 37 #include "LayoutReplacedBox.h" 37 38 #include "Logging.h" 38 39 #include <wtf/text/TextStream.h> … … 43 44 ContentHeightAndMargin BlockFormattingContext::Geometry::inFlowNonReplacedHeightAndMargin(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints, const OverrideVerticalValues& overrideVerticalValues) 44 45 { 45 ASSERT(layoutBox.isInFlow() && !layoutBox. replaced());46 ASSERT(layoutBox.isInFlow() && !layoutBox.isReplacedBox()); 46 47 ASSERT(layoutBox.isOverflowVisible()); 47 48 … … 201 202 } 202 203 203 ContentWidthAndMargin BlockFormattingContext::Geometry::inFlowReplacedWidthAndMargin(const Box& layoutBox, const HorizontalConstraints& horizontalConstraints, const OverrideHorizontalValues& overrideHorizontalValues) const204 { 205 ASSERT( layoutBox.isInFlow() && layoutBox.replaced());204 ContentWidthAndMargin BlockFormattingContext::Geometry::inFlowReplacedWidthAndMargin(const ReplacedBox& replacedBox, const HorizontalConstraints& horizontalConstraints, const OverrideHorizontalValues& overrideHorizontalValues) const 205 { 206 ASSERT(replacedBox.isInFlow()); 206 207 207 208 // 10.3.4 Block-level, replaced elements in normal flow … … 211 212 212 213 // #1 213 auto usedWidth = inlineReplacedWidthAndMargin( layoutBox, horizontalConstraints, overrideHorizontalValues).contentWidth;214 auto usedWidth = inlineReplacedWidthAndMargin(replacedBox, horizontalConstraints, overrideHorizontalValues).contentWidth; 214 215 // #2 215 auto nonReplacedWidthAndMargin = inFlowNonReplacedWidthAndMargin( layoutBox, horizontalConstraints, OverrideHorizontalValues { usedWidth, overrideHorizontalValues.margin });216 217 LOG_WITH_STREAM(FormattingContextLayout, stream << "[Width][Margin] -> inflow replaced -> width(" << usedWidth << "px) margin(" << nonReplacedWidthAndMargin.usedMargin.start << "px, " << nonReplacedWidthAndMargin.usedMargin.end << "px) -> layoutBox(" << & layoutBox << ")");216 auto nonReplacedWidthAndMargin = inFlowNonReplacedWidthAndMargin(replacedBox, horizontalConstraints, OverrideHorizontalValues { usedWidth, overrideHorizontalValues.margin }); 217 218 LOG_WITH_STREAM(FormattingContextLayout, stream << "[Width][Margin] -> inflow replaced -> width(" << usedWidth << "px) margin(" << nonReplacedWidthAndMargin.usedMargin.start << "px, " << nonReplacedWidthAndMargin.usedMargin.end << "px) -> layoutBox(" << &replacedBox << ")"); 218 219 return { usedWidth, nonReplacedWidthAndMargin.usedMargin, nonReplacedWidthAndMargin.computedMargin }; 219 220 } … … 250 251 // 10.6.2 Inline replaced elements, block-level replaced elements in normal flow, 'inline-block' 251 252 // replaced elements in normal flow and floating replaced elements 252 if (layoutBox. replaced())253 return inlineReplacedHeightAndMargin( layoutBox, horizontalConstraints, { }, overrideVerticalValues);253 if (layoutBox.isReplacedBox()) 254 return inlineReplacedHeightAndMargin(downcast<ReplacedBox>(layoutBox), horizontalConstraints, { }, overrideVerticalValues); 254 255 255 256 ContentHeightAndMargin contentHeightAndMargin; … … 280 281 ASSERT(layoutBox.isInFlow()); 281 282 282 if (!layoutBox. replaced()) {283 if (!layoutBox.isReplacedBox()) { 283 284 if (!layoutBox.establishesTableFormattingContext()) 284 285 return inFlowNonReplacedWidthAndMargin(layoutBox, horizontalConstraints, overrideHorizontalValues); … … 288 289 return inFlowNonReplacedWidthAndMargin(layoutBox, horizontalConstraints, OverrideHorizontalValues { usedWidth, overrideHorizontalValues.margin }); 289 290 } 290 return inFlowReplacedWidthAndMargin( layoutBox, horizontalConstraints, overrideHorizontalValues);291 return inFlowReplacedWidthAndMargin(downcast<ReplacedBox>(layoutBox), horizontalConstraints, overrideHorizontalValues); 291 292 } 292 293 … … 312 313 return { }; 313 314 314 if (auto* replaced = layoutBox.replaced()) { 315 if (replaced->hasIntrinsicWidth()) { 316 auto replacedWidth = replaced->intrinsicWidth(); 315 if (layoutBox.isReplacedBox()) { 316 auto& replacedBox = downcast<ReplacedBox>(layoutBox); 317 if (replacedBox.hasIntrinsicWidth()) { 318 auto replacedWidth = replacedBox.intrinsicWidth(); 317 319 return { replacedWidth, replacedWidth }; 318 320 } -
trunk/Source/WebCore/layout/blockformatting/BlockMarginCollapse.cpp
r256106 r256380 378 378 379 379 // FIXME: Block replaced boxes clearly don't collapse through their margins, but I couldn't find it in the spec yet (and no, it's not a quirk). 380 if (layoutBox. replaced())380 if (layoutBox.isReplacedBox()) 381 381 return false; 382 382 … … 577 577 // Don't pre-compute vertical margins for out of flow boxes. 578 578 ASSERT(layoutBox.isInFlow() || layoutBox.isFloatingPositioned()); 579 ASSERT(!layoutBox. replaced());579 ASSERT(!layoutBox.isReplacedBox()); 580 580 581 581 auto marginsCollapseThrough = this->marginsCollapseThrough(layoutBox); -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp
r256311 r256380 38 38 #include "LayoutContext.h" 39 39 #include "LayoutInlineTextBox.h" 40 #include "LayoutReplacedBox.h" 40 41 #include "LayoutState.h" 41 42 #include "Logging.h" … … 190 191 continue; 191 192 } 192 if (layoutBox->isReplaced ()) {193 if (layoutBox->isReplacedBox()) { 193 194 computeBorderAndPadding(*layoutBox, horizontalConstraints); 194 195 computeWidthAndMargin(*layoutBox, horizontalConstraints); … … 277 278 else if (layoutBox.isInlineBlockBox()) 278 279 contentWidthAndMargin = geometry().inlineBlockWidthAndMargin(layoutBox, horizontalConstraints, usedWidth); 279 else if (layoutBox. replaced())280 contentWidthAndMargin = geometry().inlineReplacedWidthAndMargin( layoutBox, horizontalConstraints, usedWidth);280 else if (layoutBox.isReplacedBox()) 281 contentWidthAndMargin = geometry().inlineReplacedWidthAndMargin(downcast<ReplacedBox>(layoutBox), horizontalConstraints, usedWidth); 281 282 else 282 283 ASSERT_NOT_REACHED(); … … 297 298 else if (layoutBox.isInlineBlockBox()) 298 299 contentHeightAndMargin = geometry().inlineBlockHeightAndMargin(layoutBox, horizontalConstraints, usedHeight); 299 else if (layoutBox. replaced())300 contentHeightAndMargin = geometry().inlineReplacedHeightAndMargin( layoutBox, horizontalConstraints, { }, usedHeight);300 else if (layoutBox.isReplacedBox()) 301 contentHeightAndMargin = geometry().inlineReplacedHeightAndMargin(downcast<ReplacedBox>(layoutBox), horizontalConstraints, { }, usedHeight); 301 302 else 302 303 ASSERT_NOT_REACHED(); -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextGeometry.cpp
r254277 r256380 44 44 45 45 // Exactly as inline replaced elements. 46 if (formattingContextRoot. replaced())47 return inlineReplacedWidthAndMargin( formattingContextRoot, horizontalConstraints, overrideHorizontalValues);46 if (formattingContextRoot.isReplacedBox()) 47 return inlineReplacedWidthAndMargin(downcast<ReplacedBox>(formattingContextRoot), horizontalConstraints, overrideHorizontalValues); 48 48 49 49 // 10.3.9 'Inline-block', non-replaced elements in normal flow … … 67 67 68 68 // 10.6.2 Inline replaced elements, block-level replaced elements in normal flow, 'inline-block' replaced elements in normal flow and floating replaced elements 69 if (layoutBox. replaced())70 return inlineReplacedHeightAndMargin( layoutBox, horizontalConstraints, { }, overrideVerticalValues);69 if (layoutBox.isReplacedBox()) 70 return inlineReplacedHeightAndMargin(downcast<ReplacedBox>(layoutBox), horizontalConstraints, { }, overrideVerticalValues); 71 71 72 72 // 10.6.6 Complicated cases -
trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp
r256304 r256380 402 402 else if (inlineItem.isContainerEnd()) 403 403 appendInlineContainerEnd(inlineItem, logicalWidth); 404 else if (inlineItem.layoutBox(). replaced())404 else if (inlineItem.layoutBox().isReplacedBox()) 405 405 appendReplacedInlineBox(inlineItem, logicalWidth); 406 406 else if (inlineItem.isBox()) … … 505 505 void LineBuilder::appendReplacedInlineBox(const InlineItem& inlineItem, InlineLayoutUnit logicalWidth) 506 506 { 507 ASSERT(inlineItem.layoutBox().isReplaced ());507 ASSERT(inlineItem.layoutBox().isReplacedBox()); 508 508 // FIXME: Surely replaced boxes behave differently. 509 509 appendNonReplacedInlineBox(inlineItem, logicalWidth); … … 618 618 auto& layoutBox = run.layoutBox(); 619 619 auto& boxGeometry = formattingContext().geometryForBox(layoutBox); 620 if (layoutBox. replaced() || layoutBox.isFloatingPositioned())620 if (layoutBox.isReplacedBox() || layoutBox.isFloatingPositioned()) 621 621 return boxGeometry.contentBoxHeight(); 622 622 … … 645 645 646 646 if (run.isBox()) { 647 if (run.layoutBox().isReplaced ())647 if (run.layoutBox().isReplacedBox()) 648 648 return true; 649 649 ASSERT(run.layoutBox().isInlineBlockBox() || run.layoutBox().isInlineTableBox()); -
trunk/Source/WebCore/layout/inlineformatting/LineLayoutContext.cpp
r256304 r256380 228 228 return boxGeometry.marginBoxWidth(); 229 229 230 if (layoutBox. replaced())230 if (layoutBox.isReplacedBox()) 231 231 return boxGeometry.width(); 232 232 -
trunk/Source/WebCore/layout/layouttree/LayoutBox.cpp
r256304 r256380 48 48 , m_isAnonymous(false) 49 49 { 50 if (isReplaced())51 ensureRareData().replaced = makeUnique<Replaced>(*this);52 50 } 53 51 … … 302 300 // An inline box is one that is both inline-level and whose contents participate in its containing inline formatting context. 303 301 // A non-replaced element with a 'display' value of 'inline' generates an inline box. 304 return m_style.display() == DisplayType::Inline && !isReplaced ();302 return m_style.display() == DisplayType::Inline && !isReplacedBox(); 305 303 } 306 304 … … 400 398 } 401 399 402 const Replaced* Box::replaced() const403 {404 return const_cast<Box*>(this)->replaced();405 }406 407 Replaced* Box::replaced()408 {409 if (!isReplaced()) {410 ASSERT(!hasRareData() || !rareData().replaced.get());411 return nullptr;412 }413 ASSERT(hasRareData() && rareData().replaced.get());414 return rareData().replaced.get();415 }416 417 400 void Box::setRowSpan(unsigned rowSpan) 418 401 { -
trunk/Source/WebCore/layout/layouttree/LayoutBox.h
r256311 r256380 28 28 #if ENABLE(LAYOUT_FORMATTING_CONTEXT) 29 29 30 #include "LayoutReplaced.h"31 30 #include "RenderStyle.h" 32 31 #include <wtf/IsoMalloc.h> … … 66 65 InlineTextBox = 1 << 1, 67 66 LineBreakBox = 1 << 2, 68 ContainerFlag = 1 << 3 67 ReplacedBox = 1 << 3, 68 ContainerFlag = 1 << 4 69 69 }; 70 70 typedef unsigned BaseTypeFlags; … … 125 125 bool isTableColumn() const { return style().display() == DisplayType::TableColumn; } 126 126 bool isTableCell() const { return style().display() == DisplayType::TableCell; } 127 bool isReplaced() const { return isImage() || isIFrame(); }128 127 bool isIFrame() const { return m_elementAttributes && m_elementAttributes.value().elementType == ElementType::IFrame; } 129 128 bool isImage() const { return m_elementAttributes && m_elementAttributes.value().elementType == ElementType::Image; } … … 143 142 bool isInlineTextBox() const { return m_baseTypeFlags & InlineTextBox; } 144 143 bool isLineBreakBox() const { return m_baseTypeFlags & LineBreakBox; } 144 bool isReplacedBox() const { return m_baseTypeFlags & ReplacedBox; } 145 145 146 146 bool isPaddingApplicable() const; … … 149 149 void updateStyle(const RenderStyle& newStyle); 150 150 const RenderStyle& style() const { return m_style; } 151 152 const Replaced* replaced() const;153 // FIXME: Temporary until after intrinsic size change is tracked by Replaced.154 Replaced* replaced();155 151 156 152 // FIXME: Find a better place for random DOM things. … … 183 179 BoxRareData() = default; 184 180 185 std::unique_ptr<Replaced> replaced;186 181 unsigned rowSpan { 1 }; 187 182 unsigned columnSpan { 1 }; -
trunk/Source/WebCore/layout/layouttree/LayoutReplacedBox.cpp
r256379 r256380 1 1 /* 2 * Copyright (C) 2018 Apple Inc. All rights reserved.2 * Copyright (C) 2018-2020 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 25 25 26 26 #include "config.h" 27 #include "LayoutReplaced .h"27 #include "LayoutReplacedBox.h" 28 28 29 29 #if ENABLE(LAYOUT_FORMATTING_CONTEXT) 30 30 31 #include "LayoutBox.h"32 31 #include "RenderStyle.h" 33 32 #include <wtf/IsoMallocInlines.h> … … 36 35 namespace Layout { 37 36 38 WTF_MAKE_ISO_ALLOCATED_IMPL(Replaced );37 WTF_MAKE_ISO_ALLOCATED_IMPL(ReplacedBox); 39 38 40 Replaced ::Replaced(const Box& layoutBox)41 : m_layoutBox(makeWeakPtr(layoutBox))39 ReplacedBox::ReplacedBox(RenderStyle&& style) 40 : Box({ }, WTFMove(style), Box::ReplacedBox) 42 41 { 43 42 } 44 43 45 bool Replaced ::hasIntrinsicWidth() const44 bool ReplacedBox::hasIntrinsicWidth() const 46 45 { 47 46 return m_intrinsicSize || m_layoutBox->style().logicalWidth().isIntrinsic(); 48 47 } 49 48 50 bool Replaced ::hasIntrinsicHeight() const49 bool ReplacedBox::hasIntrinsicHeight() const 51 50 { 52 51 return m_intrinsicSize || m_layoutBox->style().logicalHeight().isIntrinsic(); 53 52 } 54 53 55 bool Replaced ::hasIntrinsicRatio() const54 bool ReplacedBox::hasIntrinsicRatio() const 56 55 { 57 56 if (!hasAspectRatio()) … … 60 59 } 61 60 62 LayoutUnit Replaced ::intrinsicWidth() const61 LayoutUnit ReplacedBox::intrinsicWidth() const 63 62 { 64 63 ASSERT(hasIntrinsicWidth()); … … 68 67 } 69 68 70 LayoutUnit Replaced ::intrinsicHeight() const69 LayoutUnit ReplacedBox::intrinsicHeight() const 71 70 { 72 71 ASSERT(hasIntrinsicHeight()); … … 76 75 } 77 76 78 LayoutUnit Replaced ::intrinsicRatio() const77 LayoutUnit ReplacedBox::intrinsicRatio() const 79 78 { 80 79 ASSERT(hasIntrinsicRatio() || (hasIntrinsicWidth() && hasIntrinsicHeight())); … … 86 85 } 87 86 88 bool Replaced ::hasAspectRatio() const87 bool ReplacedBox::hasAspectRatio() const 89 88 { 90 89 return m_layoutBox->isImage() || m_layoutBox->style().aspectRatioType() == AspectRatioType::FromIntrinsic; -
trunk/Source/WebCore/layout/layouttree/LayoutReplacedBox.h
r256379 r256380 1 1 /* 2 * Copyright (C) 2018 Apple Inc. All rights reserved.2 * Copyright (C) 2018-2020 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 29 29 30 30 #include "CachedImage.h" 31 #include "LayoutBox.h" 31 32 #include "LayoutSize.h" 32 33 #include "LayoutUnit.h" … … 37 38 namespace Layout { 38 39 39 class Box; 40 41 // HTMLAudioElement, HTMLCanvasElement. HTMLEmbedElement, HTMLIFrameElement, HTMLImageElement, HTMLInputElement, HTMLObjectElement, HTMLVideoElement. 42 class Replaced { 43 WTF_MAKE_ISO_ALLOCATED(Replaced); 40 class ReplacedBox : public Box { 41 WTF_MAKE_ISO_ALLOCATED(ReplacedBox); 44 42 public: 45 Replaced (const Box&);46 ~Replaced() = default;43 ReplacedBox(RenderStyle&&); 44 virtual ~ReplacedBox() = default; 47 45 48 46 void setCachedImage(CachedImage& cachedImage) { m_cachedImage = &cachedImage; } 49 47 CachedImage* cachedImage() const { return m_cachedImage; } 50 48 51 // FIXME: Temporary until after intrinsic size change is tracked internally s.49 // FIXME: Temporary until after intrinsic size change is tracked internally. 52 50 void setIntrinsicSize(LayoutSize size) { m_intrinsicSize = size; } 53 51 void setIntrinsicRatio(LayoutUnit ratio) { m_intrinsicRatio = ratio; }; … … 71 69 } 72 70 } 71 72 SPECIALIZE_TYPE_TRAITS_LAYOUT_BOX(ReplacedBox, isReplacedBox()) 73 73 74 #endif -
trunk/Source/WebCore/layout/layouttree/LayoutTreeBuilder.cpp
r256311 r256380 46 46 #include "LayoutLineBreakBox.h" 47 47 #include "LayoutPhase.h" 48 #include "LayoutReplacedBox.h" 48 49 #include "LayoutSize.h" 49 50 #include "LayoutState.h" … … 145 146 } 146 147 147 Box& TreeBuilder::create Box(Optional<Box::ElementAttributes> elementAttributes,RenderStyle&& style)148 { 149 auto newBox = makeUnique< Box>(elementAttributes,WTFMove(style));148 Box& TreeBuilder::createReplacedBox(RenderStyle&& style) 149 { 150 auto newBox = makeUnique<ReplacedBox>(WTFMove(style)); 150 151 auto& box = *newBox; 151 152 m_layoutTreeContent.addBox(WTFMove(newBox)); … … 219 220 childLayoutBox->setIsAnonymous(); 220 221 } else if (is<RenderReplaced>(renderer)) { 221 if (displayType == DisplayType::Block) 222 childLayoutBox = &createBox(elementAttributes(renderer), WTFMove(clonedStyle)); 223 else 224 childLayoutBox = &createBox(elementAttributes(renderer), WTFMove(clonedStyle)); 222 childLayoutBox = &createReplacedBox(WTFMove(clonedStyle)); 225 223 // FIXME: We don't yet support all replaced elements and this is temporary anyway. 226 if (childLayoutBox->replaced()) 227 childLayoutBox->replaced()->setIntrinsicSize(downcast<RenderReplaced>(renderer).intrinsicSize()); 224 downcast<ReplacedBox>(*childLayoutBox).setIntrinsicSize(downcast<RenderReplaced>(renderer).intrinsicSize()); 228 225 if (is<RenderImage>(renderer)) { 229 226 auto& imageRenderer = downcast<RenderImage>(renderer); 230 227 if (imageRenderer.shouldDisplayBrokenImageIcon()) 231 childLayoutBox->replaced()->setIntrinsicRatio(1);228 downcast<ReplacedBox>(*childLayoutBox).setIntrinsicRatio(1); 232 229 if (imageRenderer.cachedImage()) 233 childLayoutBox->replaced()->setCachedImage(*imageRenderer.cachedImage());230 downcast<ReplacedBox>(*childLayoutBox).setCachedImage(*imageRenderer.cachedImage()); 234 231 } 235 232 } else { … … 396 393 if (layoutBox.isInlineBox()) 397 394 stream << "SPAN inline box"; 398 else if (layoutBox. replaced())395 else if (layoutBox.isReplacedBox()) 399 396 stream << "IMG replaced inline box"; 400 397 else if (layoutBox.isAnonymous()) -
trunk/Source/WebCore/layout/layouttree/LayoutTreeBuilder.h
r256311 r256380 91 91 Box* createLayoutBox(const Container& parentContainer, const RenderObject& childRenderer); 92 92 93 Box& create Box(Optional<Box::ElementAttributes>,RenderStyle&&);93 Box& createReplacedBox(RenderStyle&&); 94 94 Box& createTextBox(String text, bool canUseSimplifiedTextMeasuring, RenderStyle&&); 95 95 Box& createLineBreakBox(bool isOptional, RenderStyle&&);
Note: See TracChangeset
for help on using the changeset viewer.