Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement align-content on block containers #21522

Merged
merged 1 commit into from Dec 10, 2023

Conversation

fantasai
Copy link
Contributor

@fantasai fantasai commented Dec 8, 2023

4c9ed16

Implement align-content on block containers
https://bugs.webkit.org/show_bug.cgi?id=266085
rdar://114740670

Reviewed by Alan Baradlay.

Implements 'align-content' on block containers by shifting the contents
of RenderBlockFlow if there is extra space after sizing. See
  https://www.w3.org/TR/css-align/#distribution-block

Alignment is not supported if the box is fragmented.

To support this, adds methods for shifting content in the block axis to:
- FloatingObjects
- legacy RenderLineBoxList
- modern LineLayout

Also implements the requirement that non-normal 'align-content' values
establish a new formatting context.

* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-001-expected.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-001-ref.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-001.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-002.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-003.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-004.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-005.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-006.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-007.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-008.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-009.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-010.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-011.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-content-010-aligned-ref.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-content-010-expected.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-content-010-unaligned-ref.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-content-010.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-content-020-aligned-ref.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-content-020-expected.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-content-020-unaligned-ref.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-content-020.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-overflow-010-expected.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-overflow-010-ref.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-overflow-010.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-overflow-020-expected.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-overflow-020-ref.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-overflow-020.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-overflow-000-expected.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-overflow-000-ref.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-overflow-000.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-simple-height-change.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-table-cell.html: Added.
* Source/WebCore/layout/integration/inline/LayoutIntegrationLineLayout.cpp:
(WebCore::LayoutIntegration::LineLayout::shiftLinesBy): Implement shifting line boxes and their contents.
* Source/WebCore/layout/integration/inline/LayoutIntegrationLineLayout.h: Add API to shift line boxes and their contents.
* Source/WebCore/rendering/FloatingObjects.cpp:
(WebCore::FloatingObjects::shiftFloatsBy): Implement shifting floats while avoiding side-effects.
* Source/WebCore/rendering/FloatingObjects.h: Add APIs for shifting all floats by a fixed amount.
* Source/WebCore/rendering/RenderBlockFlow.cpp:
(WebCore::RenderBlockFlow::layoutBlock): Shift for align-content, trigger abspos reflow if shifted.
(WebCore::RenderBlockFlow::shiftForAlignContent): Implement method to shift content per align-content.
* Source/WebCore/rendering/RenderBlockFlow.h: Add shiftForAlignContent()
* Source/WebCore/rendering/RenderElement.cpp:
(WebCore::RenderElement::createsNewFormattingContext const): Establish new formatting context.
* Source/WebCore/rendering/RenderLineBoxList.cpp:
(WebCore::RenderLineBoxList::shiftLinesBy): Implement method to shift lines by delta.
* Source/WebCore/rendering/RenderLineBoxList.h: Add API to shift lines by delta.
* Source/WebCore/rendering/style/StyleContentAlignmentData.cpp:
(WebCore::StyleContentAlignmentData::isStartward const): Add convenience method for 'start'-equivalent values.
(WebCore::StyleContentAlignmentData::isEndward const): Add convenience method for 'end'-equivalent values.
(WebCore::StyleContentAlignmentData::isCentered const): Add convenience method for 'center'-equivalent values.
* Source/WebCore/rendering/style/StyleContentAlignmentData.h:
(WebCore::StyleContentAlignmentData::isNormal const): Add convenience method to correctly check for 'normal'.

Canonical link: https://commits.webkit.org/271818@main

a6c133a

Misc iOS, tvOS & watchOS macOS Linux Windows
βœ… πŸ§ͺ style βœ… πŸ›  ios βœ… πŸ›  mac βœ… πŸ›  wpe βœ… πŸ›  wincairo
βœ… πŸ§ͺ bindings βœ… πŸ›  ios-sim βœ… πŸ›  mac-AS-debug ❌ πŸ§ͺ wpe-wk2
βœ… πŸ§ͺ webkitperl βœ… πŸ§ͺ ios-wk2 βœ… πŸ§ͺ api-mac βœ… πŸ§ͺ api-wpe
βœ… πŸ§ͺ ios-wk2-wpt βœ… πŸ§ͺ mac-wk1 βœ… πŸ›  gtk
βœ… πŸ›  πŸ§ͺ jsc βœ… πŸ§ͺ api-ios   πŸ§ͺ mac-wk2 βœ… πŸ§ͺ gtk-wk2
βœ… πŸ›  πŸ§ͺ jsc-arm64 βœ… πŸ›  tv ❌ πŸ§ͺ mac-AS-debug-wk2 βœ… πŸ§ͺ api-gtk
βœ… πŸ›  tv-sim βœ… πŸ§ͺ mac-wk2-stress βœ… πŸ›  jsc-armv7
βœ… πŸ›  watch βœ… πŸ§ͺ jsc-armv7-tests
βœ… πŸ›  πŸ§ͺ unsafe-merge βœ… πŸ›  watch-sim

for (auto& object : m_boxTree.renderers()) {
Layout::Box& layoutBox = *object->layoutBox();
if (layoutBox.isOutOfFlowPositioned() && layoutBox.style().hasStaticBlockPosition(isHorizontalWritingMode)) {
RenderBox& renderer = downcast<RenderBox>(m_boxTree.rendererForLayoutBox(layoutBox));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
RenderBox& renderer = downcast<RenderBox>(m_boxTree.rendererForLayoutBox(layoutBox));
auto& renderer = downcast<RenderBox>(m_boxTree.rendererForLayoutBox(layoutBox));

Is this downcast guaranteed to succeed? Are we guaranteed to get a RenderBox here?
Also this might need smart pointers

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not super familiar with the layout integration layer myself, but I copied the logic from here: https://searchfox.org/wubkat/source/Source/WebCore/layout/integration/inline/LayoutIntegrationLineLayout.cpp#417

    for (auto& renderObject : m_boxTree.renderers()) {
        auto& layoutBox = *renderObject->layoutBox();
        if (!layoutBox.isFloatingPositioned() && !layoutBox.isOutOfFlowPositioned())
            continue;
        if (layoutBox.isLineBreakBox())
            continue;
        auto& renderer = downcast<RenderBox>(m_boxTree.rendererForLayoutBox(layoutBox));

If that's working off of valid assumptions, then my understanding is that this will work, too.

Source/WebCore/rendering/FloatingObjects.cpp Show resolved Hide resolved
Source/WebCore/rendering/FloatingObjects.cpp Outdated Show resolved Hide resolved
Source/WebCore/rendering/LegacyInlineBox.cpp Outdated Show resolved Hide resolved
Source/WebCore/rendering/LegacyInlineFlowBox.cpp Outdated Show resolved Hide resolved
Source/WebCore/rendering/RenderBlockFlow.cpp Outdated Show resolved Hide resolved
Source/WebCore/rendering/RenderLineBoxList.cpp Outdated Show resolved Hide resolved
@Ahmad-S792 Ahmad-S792 added the Layout and Rendering For bugs with layout and rendering of Web pages. label Dec 8, 2023
@fantasai
Copy link
Contributor Author

fantasai commented Dec 8, 2023

I kinda prefer to not use auto since it makes the code easier to read (especially for newcomers) when the types are made explicit. I can change it if it's required, though.

Source/WebCore/rendering/FloatingObjects.cpp Outdated Show resolved Hide resolved
Source/WebCore/rendering/FloatingObjects.h Outdated Show resolved Hide resolved
Source/WebCore/rendering/LegacyInlineFlowBox.cpp Outdated Show resolved Hide resolved
Source/WebCore/rendering/RenderBlockFlow.cpp Outdated Show resolved Hide resolved
Source/WebCore/rendering/RenderBlockFlow.cpp Outdated Show resolved Hide resolved
Source/WebCore/rendering/RenderLineBoxList.cpp Outdated Show resolved Hide resolved
Source/WebCore/rendering/style/StyleContentAlignmentData.h Outdated Show resolved Hide resolved
@@ -197,6 +197,20 @@ AggressiveTileRetentionEnabled:
WebCore:
default: false

AlignContentOnBlocksEnabled:
type: bool
status: stable
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are we really at stable yet? I would start with testable or preview

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can always switch it off later if it's a problem, but Greg asked me to land this today if possible, even if it wasn't perfect.

Source/WebCore/rendering/RenderBlockFlow.h Outdated Show resolved Hide resolved
@@ -35,4 +35,57 @@ TextStream& operator<<(TextStream& ts, const StyleContentAlignmentData& o)
return ts << o.position() << " " << o.distribution() << " " << o.overflow();
}

bool StyleContentAlignmentData::isStartward(bool isRTL, bool isFlexReverse) const
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't like isStartward, but I'm not sure what this is trying to compute so can't suggest a better name.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's representing all the values that would be equivalent to start, so, mapping to start (vs end vs center) per flex-direction / direction / fallback alignment.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How does something like isEquivalentToContentPositionStart sound?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well... It's a little odd for e.g. ContentDistribution::SpaceBetween, for example, or ContentPosition::Baseline. They're not equivalent to start, but they fall back to it.

@webkit-ews-buildbot webkit-ews-buildbot added the merging-blocked Applied to prevent a change from being merged label Dec 8, 2023
@fantasai fantasai force-pushed the align-content branch 2 times, most recently from 905f7ac to e5055e9 Compare December 9, 2023 00:09
ASSERT(renderer->layer());
CheckedRef layer = *renderer->layer();
layer->setStaticBlockPosition(layer->staticBlockPosition() + blockShift);
renderer->setChildNeedsLayout(MarkOnlyThis);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what guarantees that we end up running layout on this renderer?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nothing inherent to the line layout object, but my logic goes:

  • for everything that we're a containing block for, we're running positioned box layout after the align-content shifting
  • for everything that our ancestors are a containing block for, they need to wait until we're done with layout to be able to place static positioned boxes that are our descendants anyway, so they need to be running positioned box layout after we're done here anyway

It's not foolproof logic, and there's possibly something I missed here, but I think that should capture most of it...

LayoutUnit shiftY = (m_horizontalWritingMode) ? blockShift : 0_lu;

for (auto& floater : m_set) {
floater->m_frameRect.move(shiftX, shiftY);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd rather use public API (which could do both of these)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason I didn't go that route was that I didn't want anyone else trying to modify e.g. an individual FloatObject directly, because that could break some invariants in the FloatObjects tracking logic.

Since we're shifting every Float together by the same delta simultaneously, we're not breaking that logic. But if some external caller tried to that, things would likely break. Note that there are setX() and setY() methods on the FloatObject, but I'm specifically bypassing their checks here. I don't want anyone other than this method to be able to do that, though, because this method guarantees they're all moved together.

Source/WebCore/rendering/RenderBlockFlow.cpp Outdated Show resolved Hide resolved
@fantasai fantasai force-pushed the align-content branch 2 times, most recently from b80b86b to 522100b Compare December 9, 2023 02:25
Copy link
Member

@nt1m nt1m left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are a few more places we could infer types.

Source/WebCore/rendering/RenderLineBoxList.cpp Outdated Show resolved Hide resolved
Source/WebCore/rendering/RenderBlockFlow.cpp Show resolved Hide resolved
}

for (auto& object : m_boxTree.renderers()) {
Layout::Box& layoutBox = *object->layoutBox();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Layout::Box& layoutBox = *object->layoutBox();
auto& layoutBox = *object->layoutBox();

The variable name is pretty self explanatory -> auto

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wish it was, but everything here is representing a layout box. In fact, because this is peeling its way through the integration layers, it's all representing the same layout box, they're all just different types representing the same layout box. Tbh, the fact "layoutBox" is referencing the type Layout::Box was totally lost on me when I was reading this code (because everything here uses auto). It's only self-explanatory when you're an expert in this codebase.

Source/WebCore/rendering/LegacyInlineBox.cpp Outdated Show resolved Hide resolved
Source/WebCore/rendering/LegacyInlineFlowBox.cpp Outdated Show resolved Hide resolved
Source/WebCore/rendering/RenderBlockFlow.cpp Outdated Show resolved Hide resolved
Source/WebCore/rendering/FloatingObjects.cpp Show resolved Hide resolved
@alanbaradlay alanbaradlay added safe-merge-queue Applied to automatically send a pull-request to merge-queue after passing EWS checks and removed merging-blocked Applied to prevent a change from being merged labels Dec 9, 2023
@webkit-ews-buildbot webkit-ews-buildbot added the merging-blocked Applied to prevent a change from being merged label Dec 9, 2023
@alanbaradlay alanbaradlay added unsafe-merge-queue Applied to send a pull request to merge-queue, but skip building and testing and removed merging-blocked Applied to prevent a change from being merged safe-merge-queue Applied to automatically send a pull-request to merge-queue after passing EWS checks labels Dec 10, 2023
@webkit-ews-buildbot webkit-ews-buildbot added merging-blocked Applied to prevent a change from being merged and removed unsafe-merge-queue Applied to send a pull request to merge-queue, but skip building and testing labels Dec 10, 2023
@alanbaradlay alanbaradlay added unsafe-merge-queue Applied to send a pull request to merge-queue, but skip building and testing and removed merging-blocked Applied to prevent a change from being merged labels Dec 10, 2023
https://bugs.webkit.org/show_bug.cgi?id=266085
rdar://114740670

Reviewed by Alan Baradlay.

Implements 'align-content' on block containers by shifting the contents
of RenderBlockFlow if there is extra space after sizing. See
  https://www.w3.org/TR/css-align/#distribution-block

Alignment is not supported if the box is fragmented.

To support this, adds methods for shifting content in the block axis to:
- FloatingObjects
- legacy RenderLineBoxList
- modern LineLayout

Also implements the requirement that non-normal 'align-content' values
establish a new formatting context.

* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-001-expected.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-001-ref.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-001.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-002.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-003.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-004.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-005.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-006.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-007.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-008.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-009.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-010.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-011.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-content-010-aligned-ref.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-content-010-expected.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-content-010-unaligned-ref.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-content-010.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-content-020-aligned-ref.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-content-020-expected.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-content-020-unaligned-ref.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-content-020.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-overflow-010-expected.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-overflow-010-ref.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-overflow-010.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-overflow-020-expected.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-overflow-020-ref.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-break-overflow-020.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-overflow-000-expected.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-overflow-000-ref.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-overflow-000.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-block-simple-height-change.html: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-align/blocks/align-content-table-cell.html: Added.
* Source/WebCore/layout/integration/inline/LayoutIntegrationLineLayout.cpp:
(WebCore::LayoutIntegration::LineLayout::shiftLinesBy): Implement shifting line boxes and their contents.
* Source/WebCore/layout/integration/inline/LayoutIntegrationLineLayout.h: Add API to shift line boxes and their contents.
* Source/WebCore/rendering/FloatingObjects.cpp:
(WebCore::FloatingObjects::shiftFloatsBy): Implement shifting floats while avoiding side-effects.
* Source/WebCore/rendering/FloatingObjects.h: Add APIs for shifting all floats by a fixed amount.
* Source/WebCore/rendering/RenderBlockFlow.cpp:
(WebCore::RenderBlockFlow::layoutBlock): Shift for align-content, trigger abspos reflow if shifted.
(WebCore::RenderBlockFlow::shiftForAlignContent): Implement method to shift content per align-content.
* Source/WebCore/rendering/RenderBlockFlow.h: Add shiftForAlignContent()
* Source/WebCore/rendering/RenderElement.cpp:
(WebCore::RenderElement::createsNewFormattingContext const): Establish new formatting context.
* Source/WebCore/rendering/RenderLineBoxList.cpp:
(WebCore::RenderLineBoxList::shiftLinesBy): Implement method to shift lines by delta.
* Source/WebCore/rendering/RenderLineBoxList.h: Add API to shift lines by delta.
* Source/WebCore/rendering/style/StyleContentAlignmentData.cpp:
(WebCore::StyleContentAlignmentData::isStartward const): Add convenience method for 'start'-equivalent values.
(WebCore::StyleContentAlignmentData::isEndward const): Add convenience method for 'end'-equivalent values.
(WebCore::StyleContentAlignmentData::isCentered const): Add convenience method for 'center'-equivalent values.
* Source/WebCore/rendering/style/StyleContentAlignmentData.h:
(WebCore::StyleContentAlignmentData::isNormal const): Add convenience method to correctly check for 'normal'.

Canonical link: https://commits.webkit.org/271818@main
@webkit-commit-queue
Copy link
Collaborator

Committed 271818@main (4c9ed16): https://commits.webkit.org/271818@main

Reviewed commits have been landed. Closing PR #21522 and removing active labels.

@webkit-commit-queue webkit-commit-queue merged commit 4c9ed16 into WebKit:main Dec 10, 2023
@webkit-commit-queue webkit-commit-queue removed the unsafe-merge-queue Applied to send a pull request to merge-queue, but skip building and testing label Dec 10, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Layout and Rendering For bugs with layout and rendering of Web pages.
Projects
None yet
10 participants