Changeset 286206 in webkit


Ignore:
Timestamp:
Nov 29, 2021 2:00:51 AM (8 months ago)
Author:
svillar@igalia.com
Message:

[css-flexbox] Add support for replaced elements with intrinsic ratio and no intrinsic size
https://bugs.webkit.org/show_bug.cgi?id=231952
<rdar://problem/84662305>

Reviewed by Manuel Rego Casasnovas.

Source/WebCore:

It might be the case that replaced elements have intrinsic aspect ratio but no
intrinsic dimensions. Actually that's quite common for SVGs for example. We're
incorrectly assuming that flex items with no intrinsic dimensions didn't have
intrinsic aspect ratios which is wrong.

Added new checks that are able to detect those cases were we have an intrinsic
aspect ratio even though there are no intrinsic dimensions.

  • rendering/RenderFlexibleBox.cpp:

(WebCore::isRenderReplacedWithIntrinsicAspectRatio):
(WebCore::childHasAspectRatio):
Consider replaced elements with intrinsic ratios and no intrinsic dimensions.
(WebCore::RenderFlexibleBox::computeMainSizeFromAspectRatioUsing const):
Let replaced elements compute the aspect ratio by themselves.
(WebCore::RenderFlexibleBox::childHasComputableAspectRatio const):

  • rendering/RenderReplaced.cpp:

(WebCore::RenderReplaced::computeIntrinsicAspectRatio const): New method that
computes the aspect ratio for replaced elements.

  • rendering/RenderReplaced.h:

LayoutTests:

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r286200 r286206  
     12021-10-27  Sergio Villar Senin  <svillar@igalia.com>
     2
     3        [css-flexbox] Add support for replaced elements with intrinsic ratio and no intrinsic size
     4        https://bugs.webkit.org/show_bug.cgi?id=231952
     5        <rdar://problem/84662305>
     6
     7        Reviewed by Manuel Rego Casasnovas.
     8
     9        * TestExpectations: Unskipped a test case that is now passing.
     10
    1112021-11-28  Matt Woodrow  <matt.woodrow@gmail.com>
    212
  • trunk/LayoutTests/TestExpectations

    r286148 r286206  
    42434243# SVGs as flex items.
    42444244webkit.org/b/221474 imported/w3c/web-platform-tests/css/css-flexbox/svg-root-as-flex-item-002.html [ ImageOnlyFailure ]
    4245 webkit.org/b/221474 imported/w3c/web-platform-tests/css/css-flexbox/svg-root-as-flex-item-003.html [ ImageOnlyFailure ]
    42464245
    42474246# The test works fine but the expected result fails due to a missing layout.
  • trunk/Source/WebCore/ChangeLog

    r286205 r286206  
     12021-10-27  Sergio Villar Senin  <svillar@igalia.com>
     2
     3        [css-flexbox] Add support for replaced elements with intrinsic ratio and no intrinsic size
     4        https://bugs.webkit.org/show_bug.cgi?id=231952
     5        <rdar://problem/84662305>
     6
     7        Reviewed by Manuel Rego Casasnovas.
     8
     9        It might be the case that replaced elements have intrinsic aspect ratio but no
     10        intrinsic dimensions. Actually that's quite common for SVGs for example. We're
     11        incorrectly assuming that flex items with no intrinsic dimensions didn't have
     12        intrinsic aspect ratios which is wrong.
     13
     14        Added new checks that are able to detect those cases were we have an intrinsic
     15        aspect ratio even though there are no intrinsic dimensions.
     16
     17        * rendering/RenderFlexibleBox.cpp:
     18        (WebCore::isRenderReplacedWithIntrinsicAspectRatio):
     19        (WebCore::childHasAspectRatio):
     20        Consider replaced elements with intrinsic ratios and no intrinsic dimensions.
     21        (WebCore::RenderFlexibleBox::computeMainSizeFromAspectRatioUsing const):
     22        Let replaced elements compute the aspect ratio by themselves.
     23        (WebCore::RenderFlexibleBox::childHasComputableAspectRatio const):
     24        * rendering/RenderReplaced.cpp:
     25        (WebCore::RenderReplaced::computeIntrinsicAspectRatio const): New method that
     26        computes the aspect ratio for replaced elements.
     27        * rendering/RenderReplaced.h:
     28
    1292021-11-29  Kimmo Kinnunen  <kkinnunen@apple.com>
    230
  • trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp

    r285885 r286206  
    3838#include "RenderLayer.h"
    3939#include "RenderLayoutState.h"
     40#include "RenderObjectEnums.h"
     41#include "RenderReplaced.h"
    4042#include "RenderStyleConstants.h"
     43#include "RenderSVGRoot.h"
    4144#include "RenderView.h"
    4245#include "WritingMode.h"
     
    615618}
    616619
     620// FIXME: consider adding this check to RenderBox::hasIntrinsicAspectRatio(). We could even make it
     621// virtual returning false by default. RenderReplaced will overwrite it with the current implementation
     622// plus this extra check. See wkb.ug/231955.
     623static bool isRenderReplacedWithIntrinsicAspectRatio(const RenderBox& child)
     624{
     625    if (!is<RenderReplaced>(child))
     626        return false;
     627    // It's common for some replaced elements, such as SVGs, to have intrinsic aspect ratios but no intrinsic sizes.
     628    // That's why it isn't enough just to check for intrinsic sizes in those cases.
     629    return downcast<RenderReplaced>(child).computeIntrinsicAspectRatio() > 0;
     630};
     631
    617632static bool childHasAspectRatio(const RenderBox& child)
    618633{
    619     return child.hasIntrinsicAspectRatio() || child.style().hasAspectRatio();
     634    return child.hasIntrinsicAspectRatio() || child.style().hasAspectRatio() || isRenderReplacedWithIntrinsicAspectRatio(child);
    620635}
    621636
     
    884899    }
    885900
    886     const LayoutSize& childIntrinsicSize = child.intrinsicSize();
    887901    double ratio;
    888     if (child.style().aspectRatioType() == AspectRatioType::Ratio || (child.style().aspectRatioType() == AspectRatioType::AutoAndRatio && childIntrinsicSize.isEmpty()))
    889         ratio = child.style().aspectRatioWidth() / child.style().aspectRatioHeight();
     902    if (is<RenderReplaced>(child))
     903        ratio = downcast<RenderReplaced>(child).computeIntrinsicAspectRatio();
    890904    else {
    891         ASSERT(childIntrinsicSize.height());
    892         ratio = childIntrinsicSize.width().toFloat() / childIntrinsicSize.height().toFloat();
     905        auto childIntrinsicSize = child.intrinsicSize();
     906        if (child.style().aspectRatioType() == AspectRatioType::Ratio || (child.style().aspectRatioType() == AspectRatioType::AutoAndRatio && childIntrinsicSize.isEmpty()))
     907            ratio = child.style().aspectRatioWidth() / child.style().aspectRatioHeight();
     908        else {
     909            ASSERT(childIntrinsicSize.height());
     910            ratio = childIntrinsicSize.width().toFloat() / childIntrinsicSize.height().toFloat();
     911        }
    893912    }
    894913    if (isHorizontalFlow())
     
    935954    if (!childHasAspectRatio(child))
    936955        return false;
    937     return child.intrinsicSize().height() || child.style().hasAspectRatio();
     956    return child.intrinsicSize().height() || child.style().hasAspectRatio() || isRenderReplacedWithIntrinsicAspectRatio(child);
    938957}
    939958
  • trunk/Source/WebCore/rendering/RenderReplaced.cpp

    r286100 r286206  
    476476}
    477477
     478double RenderReplaced::computeIntrinsicAspectRatio() const
     479{
     480    double intrinsicRatio;
     481    FloatSize intrinsicSize;
     482    computeAspectRatioInformationForRenderBox(embeddedContentBox(), intrinsicSize, intrinsicRatio);
     483    return intrinsicRatio;
     484}
     485
    478486RoundedRect RenderReplaced::roundedContentBoxRect() const
    479487{
  • trunk/Source/WebCore/rendering/RenderReplaced.h

    r278253 r286206  
    5252    bool isContentLikelyVisibleInViewport();
    5353    bool needsPreferredWidthsRecalculation() const override;
     54
     55    double computeIntrinsicAspectRatio() const;
    5456
    5557protected:
Note: See TracChangeset for help on using the changeset viewer.