commit ba9378d24791d6d54ebddf982f0b40b7f06fcaa0 parent 77e85858b76cd864fe7bc75f81745b49081539d5 Author: Jonathan Kew <jkew@mozilla.com> Date: Thu, 13 Nov 2025 22:58:03 +0000 Bug 1999972 - Add 'none' keyword to CSS position-anchor property, and make it the initial value. r=firefox-style-system-reviewers,layout-reviewers,emilio Differential Revision: https://phabricator.services.mozilla.com/D272521 Diffstat:
11 files changed, 29 insertions(+), 22 deletions(-)
diff --git a/layout/base/AnchorPositioningUtils.cpp b/layout/base/AnchorPositioningUtils.cpp @@ -771,7 +771,11 @@ const nsAtom* AnchorPositioningUtils::GetUsedAnchorName( return aAnchorName; } - const auto defaultAnchor = aPositioned->StylePosition()->mPositionAnchor; + const auto& defaultAnchor = aPositioned->StylePosition()->mPositionAnchor; + if (defaultAnchor.IsNone()) { + return nullptr; + } + if (defaultAnchor.IsIdent()) { return defaultAnchor.AsIdent().AsAtom(); } diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp @@ -1013,7 +1013,7 @@ nsStylePosition::nsStylePosition() mHeight(StyleSize::Auto()), mMinHeight(StyleSize::Auto()), mMaxHeight(StyleMaxSize::None()), - mPositionAnchor(StylePositionAnchor::Auto()), + mPositionAnchor(StylePositionAnchor::None()), mPositionVisibility(StylePositionVisibility::ALWAYS), mPositionTryFallbacks(StylePositionTryFallbacks()), mPositionTryOrder(StylePositionTryOrder::Normal), diff --git a/layout/style/res/html.css b/layout/style/res/html.css @@ -957,6 +957,7 @@ dialog:popover-open { [popover] { position: fixed; + position-anchor: auto; inset: 0; width: fit-content; height: fit-content; diff --git a/layout/style/test/property_database.js b/layout/style/test/property_database.js @@ -13339,9 +13339,16 @@ if (IsCSSPropertyPrefEnabled("layout.css.anchor-positioning.enabled")) { domProp: "positionAnchor", inherited: false, type: CSS_TYPE_LONGHAND, - initial_values: ["auto"], - other_values: ["--foo"], - invalid_values: ["none", "--foo, auto", "auto, --bar", "foo"], + initial_values: ["none"], + other_values: ["auto", "--foo"], + invalid_values: [ + "normal", + "none, auto", + "--foo none", + "--foo, auto", + "auto, --bar", + "foo", + ], }; gCSSProperties["position-area"] = { diff --git a/servo/components/style/properties/longhands/position.mako.rs b/servo/components/style/properties/longhands/position.mako.rs @@ -248,7 +248,7 @@ ${helpers.predefined_type( ${helpers.predefined_type( "position-anchor", "PositionAnchor", - "computed::PositionAnchor::auto()", + "computed::PositionAnchor::None", engines="gecko", animation_type="discrete", rule_types_allowed=DEFAULT_RULES_AND_POSITION_TRY, diff --git a/servo/components/style/values/specified/position.rs b/servo/components/style/values/specified/position.rs @@ -481,24 +481,14 @@ impl Parse for AnchorScope { )] #[repr(u8)] pub enum PositionAnchor { + /// `none` + None, /// `auto` Auto, /// `<dashed-ident>` Ident(DashedIdent), } -impl PositionAnchor { - /// Return the `auto` value. - pub fn auto() -> Self { - Self::Auto - } - - /// Returns whether this is the `auto` value. - pub fn is_auto(&self) -> bool { - *self == Self::Auto - } -} - #[derive( Clone, Copy, diff --git a/testing/web-platform/tests/css/css-anchor-position/anchor-function-pseudo-element-implicit-anchor.html b/testing/web-platform/tests/css/css-anchor-position/anchor-function-pseudo-element-implicit-anchor.html @@ -16,6 +16,7 @@ body { margin: 0 } width: 100px; height: 100px; position: absolute; + position-anchor: auto; } #target.moved { margin-top: 200px; diff --git a/testing/web-platform/tests/css/css-anchor-position/position-anchor-basics.html b/testing/web-platform/tests/css/css-anchor-position/position-anchor-basics.html @@ -15,10 +15,10 @@ <script> // position-anchor: <anchor-element> -// <anchor-element> = auto | <dashed-ident> +// <anchor-element> = none | auto | <dashed-ident> +test_valid_value('position-anchor', 'none'); test_valid_value('position-anchor', 'auto'); test_valid_value('position-anchor', '--foo'); -test_invalid_value('position-anchor', 'none'); test_invalid_value('position-anchor', 'foo-bar'); test_invalid_value('position-anchor', '--foo --bar') test_invalid_value('position-anchor', '--foo, --bar') @@ -26,12 +26,13 @@ test_invalid_value('position-anchor', '100px'); test_invalid_value('position-anchor', '100%'); // Computed value: as specified +test_computed_value('position-anchor', 'none'); test_computed_value('position-anchor', 'auto'); test_computed_value('position-anchor', '--foo'); -// Initial: auto +// Initial: none // Inherited: no -assert_not_inherited('position-anchor', 'auto', '--foo'); +assert_not_inherited('position-anchor', 'none', '--foo'); // Animation type: discrete test_no_interpolation({ diff --git a/testing/web-platform/tests/css/css-anchor-position/position-area-pseudo-element-implicit-anchor-dynamic.html b/testing/web-platform/tests/css/css-anchor-position/position-area-pseudo-element-implicit-anchor-dynamic.html @@ -15,6 +15,7 @@ body { margin: 0 } width: 100px; height: 100px; position: absolute; + position-anchor: auto; } #target.moved { margin-top: 100px; diff --git a/testing/web-platform/tests/css/css-anchor-position/position-area-pseudo-element-implicit-anchor.html b/testing/web-platform/tests/css/css-anchor-position/position-area-pseudo-element-implicit-anchor.html @@ -15,6 +15,7 @@ body { margin: 0 } width: 100px; height: 100px; position: absolute; + position-anchor: auto; } #target::before { position-area: center right; diff --git a/testing/web-platform/tests/css/css-anchor-position/pseudo-element-implicit-anchor.html b/testing/web-platform/tests/css/css-anchor-position/pseudo-element-implicit-anchor.html @@ -6,6 +6,7 @@ #anchor::after { content: ""; position: absolute; + position-anchor: auto; width: 100px; height: 100px; bottom: anchor(top);