Commit e1402cf5 authored by Philip Rogers's avatar Philip Rogers Committed by Commit Bot

Add a UseCounter for position: sticky

This patch adds a UseCounter for position: sticky by tracking when new
StickyConstraints are added. This feat is achieved by removing non-const
access to PaintLayerScrollableArea::GetStickyConstraintsMap and adding
an explicit "AddStickyConstraints" function that increments the counter.

Bug: 1109232
Change-Id: Ic0543c6e3501019ada58aeec2c3885c3854c7897
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2317607
Auto-Submit: Philip Rogers <pdr@chromium.org>
Commit-Queue: Chris Harrelson <chrishtr@chromium.org>
Reviewed-by: default avatarChris Harrelson <chrishtr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#791493}
parent 2f160adc
......@@ -2686,6 +2686,7 @@ enum WebFeature {
kV8PointerEvent_AzimuthAngle_AttributeGetter = 3351,
kV8PointerEvent_AltitudeAngle_AttributeGetter = 3352,
kCrossBrowsingContextGroupMainFrameNulledNonEmptyNameAccessed = 3353,
kPositionSticky = 3354,
// Add new features immediately above this line. Don't change assigned
// numbers of any item, and don't reuse removed slots.
......
......@@ -1066,7 +1066,7 @@ void LayoutBoxModelObject::UpdateStickyPositionConstraints() const {
}
PaintLayerScrollableArea* scrollable_area =
Layer()->AncestorOverflowLayer()->GetScrollableArea();
scrollable_area->GetStickyConstraintsMap().Set(Layer(), constraints);
scrollable_area->AddStickyConstraints(Layer(), constraints);
}
bool LayoutBoxModelObject::IsSlowRepaintConstrainedObject() const {
......@@ -1125,19 +1125,20 @@ PhysicalOffset LayoutBoxModelObject::StickyPositionOffset() const {
if (!ancestor_overflow_layer || !ancestor_overflow_layer->GetScrollableArea())
return PhysicalOffset();
StickyConstraintsMap& constraints_map =
ancestor_overflow_layer->GetScrollableArea()->GetStickyConstraintsMap();
auto it = constraints_map.find(Layer());
if (it == constraints_map.end())
auto* constraints =
ancestor_overflow_layer->GetScrollableArea()->GetStickyConstraints(
Layer());
if (!constraints)
return PhysicalOffset();
StickyPositionScrollingConstraints* constraints = &it->value;
// The sticky offset is physical, so we can just return the delta computed in
// absolute coords (though it may be wrong with transforms).
PhysicalRect constraining_rect = ComputeStickyConstrainingRect();
constraining_rect.Move(PhysicalOffset::FromFloatPointRound(
ancestor_overflow_layer->GetScrollableArea()->ScrollPosition()));
return constraints->ComputeStickyOffset(constraining_rect, constraints_map);
return constraints->ComputeStickyOffset(
constraining_rect,
ancestor_overflow_layer->GetScrollableArea()->GetStickyConstraintsMap());
}
PhysicalOffset LayoutBoxModelObject::AdjustedPositionRelativeTo(
......
......@@ -2102,6 +2102,21 @@ void PaintLayerScrollableArea::UpdateResizerStyle(
}
}
StickyPositionScrollingConstraints*
PaintLayerScrollableArea::GetStickyConstraints(PaintLayer* layer) {
auto it = EnsureRareData().sticky_constraints_map_.find(layer);
if (it == EnsureRareData().sticky_constraints_map_.end())
return nullptr;
return &it->value;
}
void PaintLayerScrollableArea::AddStickyConstraints(
PaintLayer* layer,
StickyPositionScrollingConstraints constraints) {
UseCounter::Count(GetLayoutBox()->GetDocument(), WebFeature::kPositionSticky);
EnsureRareData().sticky_constraints_map_.Set(layer, constraints);
}
void PaintLayerScrollableArea::InvalidateAllStickyConstraints() {
if (PaintLayerScrollableAreaRareData* d = RareData()) {
for (PaintLayer* sticky_layer : d->sticky_constraints_map_.Keys()) {
......
......@@ -529,9 +529,11 @@ class CORE_EXPORT PaintLayerScrollableArea final
had_vertical_scrollbar_before_relayout_ = val;
}
StickyConstraintsMap& GetStickyConstraintsMap() {
const StickyConstraintsMap& GetStickyConstraintsMap() {
return EnsureRareData().sticky_constraints_map_;
}
StickyPositionScrollingConstraints* GetStickyConstraints(PaintLayer*);
void AddStickyConstraints(PaintLayer*, StickyPositionScrollingConstraints);
void InvalidateAllStickyConstraints();
void InvalidateStickyConstraintsFor(PaintLayer*);
......
......@@ -1268,6 +1268,25 @@ TEST_P(PaintLayerScrollableAreaTest, CompositedStickyDescendant) {
->Translation2D());
}
TEST_P(PaintLayerScrollableAreaTest, StickyPositionUseCounter) {
SetBodyInnerHTML(R"HTML(
<div style="overflow: scroll; width: 500px; height: 300px;">
<div id=test></div>
<div id=forcescroll style="width: 10px; height: 700px;"></div>
</div>
)HTML");
EXPECT_FALSE(GetDocument().IsUseCounted(WebFeature::kPositionSticky));
auto* test = GetElementById("test");
test->setAttribute(html_names::kStyleAttr, "position: sticky;");
UpdateAllLifecyclePhasesForTest();
EXPECT_FALSE(GetDocument().IsUseCounted(WebFeature::kPositionSticky));
test->setAttribute(html_names::kStyleAttr, "top: 0; position: sticky;");
UpdateAllLifecyclePhasesForTest();
EXPECT_TRUE(GetDocument().IsUseCounted(WebFeature::kPositionSticky));
}
// Delayed scroll offset clamping should not crash. https://crbug.com/842495
TEST_P(PaintLayerScrollableAreaTest, IgnoreDelayedScrollOnDestroyedLayer) {
SetBodyInnerHTML(R"HTML(
......
......@@ -28541,6 +28541,7 @@ Called by update_use_counter_feature_enum.py.-->
<int value="3352" label="V8PointerEvent_AltitudeAngle_AttributeGetter"/>
<int value="3353"
label="CrossBrowsingContextGroupMainFrameNulledNonEmptyNameAccessed"/>
<int value="3354" label="PositionSticky"/>
</enum>
<enum name="FeaturePolicyAllowlistType">
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment