Implement non-overlay mode for ::overscroll-area-parent [chromium/src : main]

0 views
Skip to first unread message

Robert Flack (Gerrit)

unread,
Feb 5, 2026, 4:50:44 PMFeb 5
to Philip Rogers, Menard, Alexis, chromium...@chromium.org, apavlo...@chromium.org, blink-re...@chromium.org, blink-re...@chromium.org, blink-rev...@chromium.org, blink-revi...@chromium.org, blink-rev...@chromium.org, blink-rev...@chromium.org, blink-...@chromium.org, zol...@webkit.org
Attention needed from Philip Rogers

Robert Flack added 2 comments

Patchset-level comments
File-level comment, Patchset 3 (Latest):
Robert Flack . resolved

Hey Philip, I think I need some guidance on how best to add support for entering multiple scroll translation transforms when we start the scrolling contents. In particular, you can see the ScrollTranslation for the content is inside the ScrollTranslation for the `::overscroll-area-parent` and we end up trying to switch directly to that context for the chunk.

File third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc
Line 987, Patchset 3 (Latest): return {};
Robert Flack . unresolved

@p...@chromium.org How can we enter multiple scroll translations for a single chunk? The comment above implies that we should call this for each level but that's not happening with the current logic when entering a non-overlay scrollable area inside of multiple `::overscroll-area-parent` pseudos.

Test page:
```html
<!DOCTYPE html>
<style>
#container {
width: 200px;
height: 200px;
border: 1px solid black;
overflow: auto;
padding: 16px;
padding-right: 32px;
box-sizing: border-box;
}
#dismiss {
width: 500%;
height: 500%;
/* Overflows each edge by 100%. */
top: -200%;
left: -200%;
box-sizing: border-box;
background: radial-gradient(rgba(255, 255, 255, 0), rgba(0, 0, 0, 0.7));
pointer-events: none;
}
</style>
<div id="container" overscrollcontainer>
<div id="dismiss"></div>
<div id="content">
<h2>Content</h2>
<p>This is the content area.</p>
<p>There is a dismissable area that can be swiped to from any edge.</p>
<p>You can also scroll the content down...</p>
<p>to view the rest of this text.</p>
</div>
</div>
<button id=button command="toggle-overscroll" commandfor="dismiss">Dismiss</button>
<button id=button2 command="toggle-overscroll" commandfor="dismiss">Dismiss</button>
```
The resulting property trees and paint chunks are as follows:
```
[3431098:3431098:0205/202337.267305:INFO:third_party/blink/renderer/core/paint/paint_property_tree_printer.cc:230] Transform tree:
root 0xa3c004316a0 {"flattensInheritedTransform":false,"in_subtree_of_page_scale":false,"scroll":"0xa3c004317a8"}
VisualViewport Scale Node 0xa3c00563fd0 {"changed":"node-add-remove","flattensInheritedTransform":false,"in_subtree_of_page_scale":false,"directCompositingReasons":"Viewport","compositorElementId":"(576)"}
VisualViewport Translate Node 0xa3c005641c8 {"changed":"node-add-remove","flattensInheritedTransform":false,"directCompositingReasons":"Viewport","scroll":"0xa3c005640d8"}
PaintOffsetTranslation (LayoutView #document) 0xa3c005642d0 {"changed":"node-add-remove"}
ScrollTranslation (LayoutView #document) 0xa3c00564598 {"changed":"node-add-remove","directCompositingReasons":"RootScroller","scroll":"0xa3c005644a8"}
PaintOffsetTranslation (LayoutBlockFlow DIV id='container') 0xa3c005646a0 {"changed":"node-add-remove","translation2d":"[8 8]"}
PaintOffsetTranslation (LayoutBlockFlow (positioned, children-inline) ::internal-overscroll-area-parent) 0xa3c00564a70 {"changed":"node-add-remove","translation2d":"[1 1]"}
ScrollTranslation (LayoutBlockFlow (positioned, children-inline) ::internal-overscroll-area-parent) 0xa3c00564d38 {"changed":"node-add-remove","translation2d":"[-366 -396]","scroll":"0xa3c00564c48"}
ScrollTranslation (LayoutBlockFlow DIV id='container') 0xa3c00564968 {"changed":"node-add-remove","scroll":"0xa3c00564878"}
[3431098:3431098:0205/202337.287213:INFO:third_party/blink/renderer/core/paint/paint_property_tree_printer.cc:235] Clip tree:
root 0xa3c00431898 {"localTransformSpace":"0xa3c004316a0","rect":"-8.38861e+06,-8.38861e+06 1.67772e+07x1.67772e+07"}
OverflowClip (LayoutView #document) 0xa3c005643d8 {"changed":"node-add-remove","localTransformSpace":"0xa3c005642d0","rect":"0,0 800x600"}
OverflowClip (LayoutBlockFlow DIV id='container') 0xa3c005647a8 {"changed":"node-add-remove","localTransformSpace":"0xa3c005646a0","rect":"1,1 183x198"}
OverflowClip (LayoutBlockFlow (positioned, children-inline) ::internal-overscroll-area-parent) 0xa3c00564b78 {"changed":"node-add-remove","localTransformSpace":"0xa3c00564a70","rect":"0,0 183x198"}
[3431098:3431098:0205/202337.293982:INFO:third_party/blink/renderer/core/paint/paint_property_tree_printer.cc:239] Effect tree:
root 0xa3c00431600 {"localTransformSpace":"0xa3c004316a0","outputClip":"0xa3c00431898"}
Caret 0xa3c00544e10 {"changed":"node-add-remove","localTransformSpace":"0xa3c004316a0","outputClip":"(nil)","opacity":0.00100000004749745,"directCompositingReasons":"ActiveOpacityAnimation","compositorElementId":"(138)"}
[3431098:3431098:0205/202337.299675:INFO:third_party/blink/renderer/core/paint/paint_property_tree_printer.cc:243] Scroll tree:
root 0xa3c004317a8 {"containerRect":"-8388608,-8388608 16777215x16777215","contentsRect":"-8388608,-8388608 16777215x16777215"}
VisualViewport Scroll Node 0xa3c005640d8 {"changed":"node-add-remove","containerRect":"0,0 800x600","contentsRect":"0,0 800x600","userScrollable":"both","maxScrollOffsetAffectedByPageScale":"true","compositorElementId":"(580)"}
Scroll (LayoutView #document) 0xa3c005644a8 {"changed":"node-add-remove","containerRect":"0,0 800x600","contentsRect":"0,0 800x600","overflowClipNode":"0xa3c005643d8","userScrollable":"both","compositorElementId":"(836)"}
Scroll (LayoutBlockFlow (positioned, children-inline) ::internal-overscroll-area-parent) 0xa3c00564c48 {"changed":"node-add-remove","containerRect":"0,0 183x198","contentsRect":"0,0 915x990","overflowClipNode":"0xa3c00564b78","userScrollable":"both","compositorElementId":"(1028)","snap_container_rect":"0,0 183x198","snap_area_rects":["366,396 183x198","0,0 915x990"]}
Scroll (LayoutBlockFlow DIV id='container') 0xa3c00564878 {"changed":"node-add-remove","containerRect":"1,1 183x198","contentsRect":"1,1 183x363","overflowClipNode":"0xa3c005647a8","userScrollable":"both","compositorElementId":"(964)"}
[3431098:3431098:0205/202337.317354:VERBOSE1:third_party/blink/renderer/platform/graphics/paint/paint_controller.cc:852] PaintController::CommitNewDisplayItems() completed
[3431098:3431098:0205/202337.327462:INFO:third_party/blink/renderer/platform/graphics/paint/paint_controller_debug_data.cc:119] current paint artifact: [
{
"subsequence": "client: 0xa3c00520f50 LayoutView #document",
"chunks": [
{
"chunk": "LayoutView #document 0xa3c00520e38:LayoutView #document:ScrollHitTest:0",
"state": "t:0xa3c005642d0 c:0xa3c00431898 e:0xa3c00431600",
"bounds": "0,0 800x600",
"displayItems": []
},
{
"chunk": "Scrolling background of LayoutView #document 0xa3c004a20b8:Scrolling background of LayoutView #document:DrawingDocumentBackground:0",
"state": "t:0xa3c00564598 c:0xa3c005643d8 e:0xa3c00431600",
"bounds": "0,0 800x600",
"displayItems": [
"0: 0xa3c004a20b8:Scrolling background of LayoutView #document:DrawingDocumentBackground:0",
"1: 0xa3c005219f8:LayoutBlockFlow (inline, children-inline) BUTTON id='button':DrawingBoxDecorationBackground:0",
"2: 0xa3c00521b38:LayoutText #text:DrawingPaintPhaseForeground:0",
"3: 0xa3c00521ba8:LayoutText #text:DrawingPaintPhaseForeground:0",
"4: 0xa3c00521c18:LayoutBlockFlow (inline, children-inline) BUTTON id='button2':DrawingBoxDecorationBackground:0",
"5: 0xa3c00521cb8:LayoutText #text:DrawingPaintPhaseForeground:0"
]
},
{
"subsequence": "client: 0xa3c005211d0 LayoutBlockFlow DIV id='container'",
"chunks": [
{
"chunk": "LayoutBlockFlow DIV id='container' 0xa3c005211d0:LayoutBlockFlow DIV id='container':LayerChunk:0",
"state": "t:0xa3c005646a0 c:0xa3c005643d8 e:0xa3c00431600",
"bounds": "0,0 200x200",
"displayItems": [
"6: 0xa3c00521138:LayoutBlockFlow DIV id='container':DrawingBoxDecorationBackground:0"
]
},
{
"chunk": "LayoutBlockFlow DIV id='container' 0xa3c00521138:LayoutBlockFlow DIV id='container':ScrollHitTest:0",
"state": "t:0xa3c005646a0 c:0xa3c005643d8 e:0xa3c00431600",
"bounds": "0,0 200x200",
"displayItems": []
},
{
"chunk": "VerticalScrollbar 0xa3c0055c340:VerticalScrollbar:ScrollbarVertical:0",
"state": "t:0xa3c005646a0 c:0xa3c005643d8 e:0xa3c00431600",
"bounds": "184,1 15x198",
"displayItems": [
"7: 0xa3c0055c340:VerticalScrollbar:ScrollbarVertical:0"
]
},
{
"chunk": "LayoutBlockFlow DIV id='container' 0xa3c00521138:LayoutBlockFlow DIV id='container':ClipPaintPhaseSelfBlockBackgroundOnly:0",
"state": "t:0xa3c00564968 c:0xa3c005647a8 e:0xa3c00431600",
"bounds": "0,0 185x365",
"displayItems": [
"8: 0xa3c00521548:LayoutText #text:DrawingPaintPhaseForeground:0",
"9: 0xa3c00521658:LayoutText #text:DrawingPaintPhaseForeground:0",
"10: 0xa3c00521658:LayoutText #text:DrawingPaintPhaseForeground:1",
"11: 0xa3c00521768:LayoutText #text:DrawingPaintPhaseForeground:0",
"12: 0xa3c00521768:LayoutText #text:DrawingPaintPhaseForeground:1",
"13: 0xa3c00521768:LayoutText #text:DrawingPaintPhaseForeground:2",
"14: 0xa3c00521768:LayoutText #text:DrawingPaintPhaseForeground:3",
"15: 0xa3c00521878:LayoutText #text:DrawingPaintPhaseForeground:0",
"16: 0xa3c00521878:LayoutText #text:DrawingPaintPhaseForeground:1",
"17: 0xa3c00521988:LayoutText #text:DrawingPaintPhaseForeground:0",
"18: 0xa3c00521988:LayoutText #text:DrawingPaintPhaseForeground:1"
]
},
{
"subsequence": "client: 0xa3c005212c0 LayoutBlockFlow (positioned, children-inline) ::internal-overscroll-area-parent",
"chunks": [
{
"chunk": "LayoutBlockFlow (positioned, children-inline) ::internal-overscroll-area-parent 0xa3c005212c0:LayoutBlockFlow (positioned, children-inline) ::internal-overscroll-area-parent:LayerChunk:0",
"state": "t:0xa3c00564a70 c:0xa3c005647a8 e:0xa3c00431600",
"bounds": "0,0 183x198",
"displayItems": []
},
{
"chunk": "LayoutBlockFlow (positioned, children-inline) ::internal-overscroll-area-parent 0xa3c00521228:LayoutBlockFlow (positioned, children-inline) ::internal-overscroll-area-parent:ScrollHitTest:0",
"state": "t:0xa3c00564a70 c:0xa3c005647a8 e:0xa3c00431600",
"bounds": "0,0 183x198",
"displayItems": []
},
{
"chunk": "LayoutBlockFlow (positioned, children-inline) ::internal-overscroll-area-parent 0xa3c00521228:LayoutBlockFlow (positioned, children-inline) ::internal-overscroll-area-parent:ClipPaintPhaseSelfBlockBackgroundOnly:0",
"state": "t:0xa3c00564d38 c:0xa3c00564b78 e:0xa3c00431600",
"bounds": "0,0 915x990",
"displayItems": []
}
]
},
{
"subsequence": "client: 0xa3c005213b0 LayoutBlockFlow (positioned) DIV id='dismiss'",
"chunks": [
{
"chunk": "LayoutBlockFlow (positioned) DIV id='dismiss' 0xa3c005213b0:LayoutBlockFlow (positioned) DIV id='dismiss':LayerChunk:0",
"state": "t:0xa3c00564d38 c:0xa3c00564b78 e:0xa3c00431600",
"bounds": "0,0 915x990",
"displayItems": [
"19: 0xa3c00521318:LayoutBlockFlow (positioned) DIV id='dismiss':DrawingBoxDecorationBackground:0"
]
}
]
}
]
}
]
},
{
"chunk": "Inner Viewport Scroll Layer 0xa3c004079b8:Inner Viewport Scroll Layer:ForeignLayerViewportScroll:0",
"state": "t:0xa3c005641c8 c:0xa3c00431898 e:0xa3c00431600",
"bounds": "0,0 800x600",
"displayItems": [
"20: 0xa3c004079b8:Inner Viewport Scroll Layer:ForeignLayerViewportScroll:0"
]
}
]
```
Open in Gerrit

Related details

Attention is currently required from:
  • Philip Rogers
Submit Requirements:
  • requirement satisfiedCode-Coverage
  • requirement satisfiedCode-Owners
  • requirement is not satisfiedCode-Review
  • requirement is not satisfiedNo-Unresolved-Comments
  • requirement is not satisfiedReview-Enforcement
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
Gerrit-MessageType: comment
Gerrit-Project: chromium/src
Gerrit-Branch: main
Gerrit-Change-Id: I4a0aea4fb911f2b076953a23cef0168d5b37f517
Gerrit-Change-Number: 7545871
Gerrit-PatchSet: 3
Gerrit-Owner: Robert Flack <fla...@chromium.org>
Gerrit-Reviewer: Philip Rogers <p...@chromium.org>
Gerrit-CC: Menard, Alexis <alexis...@intel.com>
Gerrit-Attention: Philip Rogers <p...@chromium.org>
Gerrit-Comment-Date: Thu, 05 Feb 2026 21:50:39 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
satisfied_requirement
unsatisfied_requirement
open
diffy

Philip Rogers (Gerrit)

unread,
Feb 6, 2026, 2:34:35 PMFeb 6
to Robert Flack, Stephen Chenney, Dirk Schulze, AyeAye, Vladimir Levin, Menard, Alexis, chromium...@chromium.org, fserb...@chromium.org, fmalit...@chromium.org, blink-reviews-p...@chromium.org, kinuko...@chromium.org, drott+bl...@chromium.org, apavlo...@chromium.org, blink-re...@chromium.org, blink-re...@chromium.org, blink-rev...@chromium.org, blink-revi...@chromium.org, blink-rev...@chromium.org, blink-rev...@chromium.org, blink-...@chromium.org, zol...@webkit.org
Attention needed from Robert Flack

Philip Rogers added 1 comment

File third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc
Philip Rogers

This code is for raster inducing scroll. Normally, scrollers have clips, and so we can't nest without hitting clips, but you are adding that ability. I think we probably need to implement something like the logic in ConversionContext<Result>::SwitchToClip. I wonder if we should temporarily force composited scrolling (CompositingReasonFinder::ShouldForcePreferCompositingToLCDText) for this case, to separate out this tricky change from the overall change?

Open in Gerrit

Related details

Attention is currently required from:
  • Robert Flack
Submit Requirements:
  • requirement satisfiedCode-Coverage
  • requirement satisfiedCode-Owners
  • requirement is not satisfiedCode-Review
  • requirement is not satisfiedNo-Unresolved-Comments
  • requirement is not satisfiedReview-Enforcement
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
Gerrit-MessageType: comment
Gerrit-Project: chromium/src
Gerrit-Branch: main
Gerrit-Change-Id: I4a0aea4fb911f2b076953a23cef0168d5b37f517
Gerrit-Change-Number: 7545871
Gerrit-PatchSet: 3
Gerrit-Owner: Robert Flack <fla...@chromium.org>
Gerrit-Reviewer: Philip Rogers <p...@chromium.org>
Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
Gerrit-CC: Menard, Alexis <alexis...@intel.com>
Gerrit-CC: Stephen Chenney <sche...@chromium.org>
Gerrit-CC: Vladimir Levin <vmp...@chromium.org>
Gerrit-Attention: Robert Flack <fla...@chromium.org>
Gerrit-Comment-Date: Fri, 06 Feb 2026 19:34:23 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
Comment-In-Reply-To: Robert Flack <fla...@chromium.org>
satisfied_requirement
unsatisfied_requirement
open
diffy

Philip Rogers (Gerrit)

unread,
Feb 6, 2026, 2:41:04 PMFeb 6
to Robert Flack, Stephen Chenney, Dirk Schulze, AyeAye, Vladimir Levin, Menard, Alexis, chromium...@chromium.org, fserb...@chromium.org, fmalit...@chromium.org, blink-reviews-p...@chromium.org, kinuko...@chromium.org, drott+bl...@chromium.org, apavlo...@chromium.org, blink-re...@chromium.org, blink-re...@chromium.org, blink-rev...@chromium.org, blink-revi...@chromium.org, blink-rev...@chromium.org, blink-rev...@chromium.org, blink-...@chromium.org, zol...@webkit.org
File third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc
Philip Rogers

Wait, looking closer, is the clip tree hierarchy different from the scroll tree hierarchy? Is that intended?

Gerrit-Comment-Date: Fri, 06 Feb 2026 19:40:55 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
Comment-In-Reply-To: Philip Rogers <p...@chromium.org>
Comment-In-Reply-To: Robert Flack <fla...@chromium.org>
satisfied_requirement
unsatisfied_requirement
open
diffy

Robert Flack (Gerrit)

unread,
Feb 20, 2026, 2:43:03 PMFeb 20
to Vladimir Levin, Stephen Chenney, Dirk Schulze, AyeAye, Philip Rogers, Menard, Alexis, chromium...@chromium.org, fserb...@chromium.org, fmalit...@chromium.org, blink-reviews-p...@chromium.org, kinuko...@chromium.org, drott+bl...@chromium.org, apavlo...@chromium.org, blink-re...@chromium.org, blink-re...@chromium.org, blink-rev...@chromium.org, blink-revi...@chromium.org, blink-rev...@chromium.org, blink-rev...@chromium.org, blink-...@chromium.org, zol...@webkit.org
Attention needed from Philip Rogers and Vladimir Levin

Robert Flack voted and added 1 comment

Votes added by Robert Flack

Commit-Queue+1

1 comment

File third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc
Line 987, Patchset 3: return {};
Robert Flack . resolved
Robert Flack

This was not intentional, though does raise the question of whether it should be allowed. For now though, the clipping follows what you would expect. Forcing composited scrolling for these scrollers nicely avoided the dcheck, thanks for the suggestion!

Open in Gerrit

Related details

Attention is currently required from:
  • Philip Rogers
  • Vladimir Levin
Submit Requirements:
    • requirement satisfiedCode-Coverage
    • requirement satisfiedCode-Owners
    • requirement is not satisfiedCode-Review
    • requirement is not satisfiedReview-Enforcement
    Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
    Gerrit-MessageType: comment
    Gerrit-Project: chromium/src
    Gerrit-Branch: main
    Gerrit-Change-Id: I4a0aea4fb911f2b076953a23cef0168d5b37f517
    Gerrit-Change-Number: 7545871
    Gerrit-PatchSet: 5
    Gerrit-Owner: Robert Flack <fla...@chromium.org>
    Gerrit-Reviewer: Philip Rogers <p...@chromium.org>
    Gerrit-Reviewer: Robert Flack <fla...@chromium.org>
    Gerrit-Reviewer: Vladimir Levin <vmp...@chromium.org>
    Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
    Gerrit-CC: Menard, Alexis <alexis...@intel.com>
    Gerrit-CC: Stephen Chenney <sche...@chromium.org>
    Gerrit-Attention: Philip Rogers <p...@chromium.org>
    Gerrit-Attention: Vladimir Levin <vmp...@chromium.org>
    Gerrit-Comment-Date: Fri, 20 Feb 2026 19:42:59 +0000
    Gerrit-HasComments: Yes
    Gerrit-Has-Labels: Yes
    satisfied_requirement
    unsatisfied_requirement
    open
    diffy

    Vladimir Levin (Gerrit)

    unread,
    Feb 20, 2026, 3:23:43 PMFeb 20
    to Robert Flack, Chromium LUCI CQ, Stephen Chenney, Dirk Schulze, AyeAye, Philip Rogers, Menard, Alexis, chromium...@chromium.org, fserb...@chromium.org, fmalit...@chromium.org, blink-reviews-p...@chromium.org, kinuko...@chromium.org, drott+bl...@chromium.org, apavlo...@chromium.org, blink-re...@chromium.org, blink-re...@chromium.org, blink-rev...@chromium.org, blink-revi...@chromium.org, blink-rev...@chromium.org, blink-rev...@chromium.org, blink-...@chromium.org, zol...@webkit.org
    Attention needed from Philip Rogers and Robert Flack

    Vladimir Levin added 5 comments

    File third_party/blink/renderer/core/layout/layout_object.cc
    Line 3891, Patchset 5 (Latest): EInternalOverscrollArea::kAuto) {
    Vladimir Levin . resolved

    nit: since these are internal, we might wanna consider changing "auto" to something more representative of "non-overlay" but I don't have any good ideas.

    Line 3899, Patchset 5 (Latest): IsPseudo(kPseudoIdOverscrollAreaParent)
    Vladimir Levin . unresolved

    Interesting. Just clarifying: is this to support multiple overscroll areas being active at the same time, which push the contents "below" them but not "above" them?

    Might be worth a brief comment here

    File third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.cc
    Line 449, Patchset 5 (Latest): // TODO(flackr): Support raster inducing scroll on non-overlay overscroll
    Vladimir Levin . unresolved

    nit: can you file a bug and reference it here?

    File third_party/blink/renderer/core/paint/object_paint_properties.h
    Line 132, Patchset 5 (Latest): kContent = 10,
    Vladimir Levin . unresolved

    nit: kContentTranslation

    File third_party/blink/renderer/core/paint/paint_layer.cc
    Line 882, Patchset 5 (Latest): if (box->Style()->IsInternalOverscrollArea() || box->IsScrollContainer()) {
    Vladimir Levin . unresolved

    while here, and looking for micro-optimizations, we might wanna switch the order of this disjunction

    Open in Gerrit

    Related details

    Attention is currently required from:
    • Philip Rogers
    • Robert Flack
    Submit Requirements:
      • requirement satisfiedCode-Coverage
      • requirement satisfiedCode-Owners
      • requirement is not satisfiedCode-Review
      • requirement is not satisfiedNo-Unresolved-Comments
      • requirement is not satisfiedReview-Enforcement
      Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
      Gerrit-MessageType: comment
      Gerrit-Project: chromium/src
      Gerrit-Branch: main
      Gerrit-Change-Id: I4a0aea4fb911f2b076953a23cef0168d5b37f517
      Gerrit-Change-Number: 7545871
      Gerrit-PatchSet: 5
      Gerrit-Owner: Robert Flack <fla...@chromium.org>
      Gerrit-Reviewer: Philip Rogers <p...@chromium.org>
      Gerrit-Reviewer: Robert Flack <fla...@chromium.org>
      Gerrit-Reviewer: Vladimir Levin <vmp...@chromium.org>
      Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
      Gerrit-CC: Menard, Alexis <alexis...@intel.com>
      Gerrit-CC: Stephen Chenney <sche...@chromium.org>
      Gerrit-Attention: Philip Rogers <p...@chromium.org>
      Gerrit-Attention: Robert Flack <fla...@chromium.org>
      Gerrit-Comment-Date: Fri, 20 Feb 2026 20:23:38 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Philip Rogers (Gerrit)

      unread,
      Feb 20, 2026, 7:04:57 PMFeb 20
      to Robert Flack, Chromium LUCI CQ, Vladimir Levin, Stephen Chenney, Dirk Schulze, AyeAye, Menard, Alexis, chromium...@chromium.org, fserb...@chromium.org, fmalit...@chromium.org, blink-reviews-p...@chromium.org, kinuko...@chromium.org, drott+bl...@chromium.org, apavlo...@chromium.org, blink-re...@chromium.org, blink-re...@chromium.org, blink-rev...@chromium.org, blink-revi...@chromium.org, blink-rev...@chromium.org, blink-rev...@chromium.org, blink-...@chromium.org, zol...@webkit.org
      Attention needed from Robert Flack

      Philip Rogers added 6 comments

      File third_party/blink/renderer/core/paint/object_paint_properties.h
      Line 268, Patchset 5 (Latest): ADD_TRANSFORM(ContentTranslation, NodeId::kContent)
      Philip Rogers . unresolved

      I think you need to update FragmentData::ContentsTransform.

      Line 235, Patchset 5 (Latest): // +-[ ScrollTranslation ]
      Philip Rogers . unresolved

      Please update this diagram with your new node

      Also update third_party/blink/renderer/core/paint/paint_property_tree_printer.cc

      File third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
      Line 3095, Patchset 5 (Latest): const LayoutBox* box = DynamicTo<LayoutBox>(object_);
      Philip Rogers . unresolved
      Please add
      ```
      DCHECK(NeedsPaintPropertyUpdate());
      DCHECK(NeedsScrollAndScrollTranslation(
      object_, full_context_.direct_compositing_reasons));
      ```
      Line 3097, Patchset 5 (Latest): return;
      Philip Rogers . unresolved

      Rather than returning, I think we need to clear any existing nodes with OnClearTransform(properties_->ClearContentTranslation());.

      Line 3171, Patchset 5 (Latest): OnClearEffect(properties_->ClearScrollCornerEffect());
      Philip Rogers . unresolved

      Do you need to clear the new translation here?

      File third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc
      Robert Flack . unresolved
      Philip Rogers

      I think it might be better to investigate the clip tree / scroll tree issue, because that seems likely to cause you other tricky issues.

      Can you add a test like CSSClipAbsPositionDescendant to `third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc` that asserts the hierarchy of the clip and scroll trees are what you want?

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Robert Flack
      Gerrit-Attention: Robert Flack <fla...@chromium.org>
      Gerrit-Comment-Date: Sat, 21 Feb 2026 00:04:48 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Robert Flack (Gerrit)

      unread,
      Feb 26, 2026, 4:41:51 PM (8 days ago) Feb 26
      to Chromium LUCI CQ, Vladimir Levin, Stephen Chenney, Dirk Schulze, AyeAye, Philip Rogers, Menard, Alexis, chromium...@chromium.org, fserb...@chromium.org, fmalit...@chromium.org, blink-reviews-p...@chromium.org, kinuko...@chromium.org, drott+bl...@chromium.org, apavlo...@chromium.org, blink-re...@chromium.org, blink-re...@chromium.org, blink-rev...@chromium.org, blink-revi...@chromium.org, blink-rev...@chromium.org, blink-rev...@chromium.org, blink-...@chromium.org, zol...@webkit.org
      Attention needed from Philip Rogers and Vladimir Levin

      Robert Flack added 10 comments

      Patchset-level comments
      File-level comment, Patchset 8 (Latest):
      Robert Flack . resolved

      There is still an issue with multiple overscroll areas not correctly displaying / hit testing but they do have the correct geometry returned by getBoundingClientRect - see expected test failure.

      File third_party/blink/renderer/core/layout/layout_object.cc
      Line 3899, Patchset 5: IsPseudo(kPseudoIdOverscrollAreaParent)
      Vladimir Levin . resolved

      Interesting. Just clarifying: is this to support multiple overscroll areas being active at the same time, which push the contents "below" them but not "above" them?

      Might be worth a brief comment here

      Robert Flack

      Done

      File third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.cc
      Line 449, Patchset 5: // TODO(flackr): Support raster inducing scroll on non-overlay overscroll
      Vladimir Levin . resolved

      nit: can you file a bug and reference it here?

      Robert Flack

      Sounds like something I'd ask for, done.

      File third_party/blink/renderer/core/paint/object_paint_properties.h
      Line 268, Patchset 5: ADD_TRANSFORM(ContentTranslation, NodeId::kContent)
      Philip Rogers . resolved

      I think you need to update FragmentData::ContentsTransform.

      Robert Flack

      Done

      Line 235, Patchset 5: // +-[ ScrollTranslation ]
      Philip Rogers . resolved

      Please update this diagram with your new node

      Also update third_party/blink/renderer/core/paint/paint_property_tree_printer.cc

      Robert Flack

      Done

      Line 132, Patchset 5: kContent = 10,
      Vladimir Levin . resolved

      nit: kContentTranslation

      Robert Flack

      Done

      File third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
      Line 3095, Patchset 5: const LayoutBox* box = DynamicTo<LayoutBox>(object_);
      Philip Rogers . resolved
      Please add
      ```
      DCHECK(NeedsPaintPropertyUpdate());
      DCHECK(NeedsScrollAndScrollTranslation(
      object_, full_context_.direct_compositing_reasons));
      ```
      Robert Flack

      Done

      Line 3097, Patchset 5: return;
      Philip Rogers . resolved

      Rather than returning, I think we need to clear any existing nodes with OnClearTransform(properties_->ClearContentTranslation());.

      Robert Flack

      Done, presumably we need to clear in any of the paths where we don't create it - i.e. the other early return path later?

      Line 3171, Patchset 5: OnClearEffect(properties_->ClearScrollCornerEffect());
      Philip Rogers . resolved

      Do you need to clear the new translation here?

      Robert Flack

      Done. Yes I think so.

      File third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc
      Robert Flack

      Sorry, when I said it "follows what you would expect", I meant I have updated it to construct the expected tree which matches the scroll tree, what I had in the original output was not expected I agree. I've added testing of the clip tree in OverscrollAreaTrackerPageTest.OverscrollPropertyTrees.

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Philip Rogers
      • Vladimir Levin
      Submit Requirements:
      • requirement satisfiedCode-Coverage
      • requirement satisfiedCode-Owners
      • requirement is not satisfiedCode-Review
      • requirement is not satisfiedNo-Unresolved-Comments
      • requirement is not satisfiedReview-Enforcement
      Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
      Gerrit-MessageType: comment
      Gerrit-Project: chromium/src
      Gerrit-Branch: main
      Gerrit-Change-Id: I4a0aea4fb911f2b076953a23cef0168d5b37f517
      Gerrit-Change-Number: 7545871
      Gerrit-PatchSet: 8
      Gerrit-Owner: Robert Flack <fla...@chromium.org>
      Gerrit-Reviewer: Philip Rogers <p...@chromium.org>
      Gerrit-Reviewer: Robert Flack <fla...@chromium.org>
      Gerrit-Reviewer: Vladimir Levin <vmp...@chromium.org>
      Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
      Gerrit-CC: Menard, Alexis <alexis...@intel.com>
      Gerrit-CC: Stephen Chenney <sche...@chromium.org>
      Gerrit-Attention: Philip Rogers <p...@chromium.org>
      Gerrit-Attention: Vladimir Levin <vmp...@chromium.org>
      Gerrit-Comment-Date: Thu, 26 Feb 2026 21:41:45 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      Comment-In-Reply-To: Philip Rogers <p...@chromium.org>
      Comment-In-Reply-To: Robert Flack <fla...@chromium.org>
      Comment-In-Reply-To: Vladimir Levin <vmp...@chromium.org>
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Vladimir Levin (Gerrit)

      unread,
      Feb 26, 2026, 5:28:12 PM (8 days ago) Feb 26
      to Robert Flack, Chromium LUCI CQ, Stephen Chenney, Dirk Schulze, AyeAye, Philip Rogers, Menard, Alexis, chromium...@chromium.org, fserb...@chromium.org, fmalit...@chromium.org, blink-reviews-p...@chromium.org, kinuko...@chromium.org, drott+bl...@chromium.org, apavlo...@chromium.org, blink-re...@chromium.org, blink-re...@chromium.org, blink-rev...@chromium.org, blink-revi...@chromium.org, blink-rev...@chromium.org, blink-rev...@chromium.org, blink-...@chromium.org, zol...@webkit.org
      Attention needed from Philip Rogers and Robert Flack

      Vladimir Levin added 6 comments

      File third_party/blink/renderer/core/layout/physical_box_fragment.cc
      Line 760, Patchset 8 (Latest):gfx::Vector2d PhysicalBoxFragment::PixelSnappedOverscrollContentOffset() const {
      Vladimir Levin . unresolved

      I am not understanding how this function is used or what value it returns.

      This is adding all of the pixel snapped scrolled content offset (which I think is a scroll offset from each of these things, right?), but it's accumulating it unconditionally regardless of the content drawn. In the other function, we do this only up to the overscroll area parent that the element resides in.

      The problem here is that this is called on the container itself, and presumably wants to know the offset of its content, but the offset of its content depends on the content, no?

      Line 778, Patchset 8 (Latest): return IsScrollContainer() ? To<LayoutBox>(*GetLayoutObject())
      Vladimir Levin . unresolved

      Is this change required or just clean up?

      File third_party/blink/renderer/core/layout/physical_fragment.h
      Line 407, Patchset 8 (Latest): bool IsNonOverlayOverscrollScrollContainer() const {
      Vladimir Levin . resolved

      nit: we might want to think of a term for non-overlay that doesn't have a negation in its name

      File third_party/blink/renderer/core/paint/box_fragment_painter.cc
      Line 2352, Patchset 8 (Latest): GetPhysicalFragment().PixelSnappedOverscrollContentOffset()) -
      Vladimir Levin . unresolved

      Continuing my thought from the other comment: I guess because it's used here, and we know that the partially affected objects are all self painting paint layers, we know that we always want the total offset from all of the overscroll area parents.

      I don't know where, but we might wanna document this somehow

      File third_party/blink/renderer/core/paint/paint_property_tree_builder.h
      Line 75, Patchset 8 (Latest): if (!is_overlay) {
      Vladimir Levin . unresolved

      Is this clipping the content to the container?

      Line 52, Patchset 8 (Latest): is_overlay ? scroll_translation
      Vladimir Levin . unresolved

      I'm not sure I follow/remember this (could use a few comments):

      • I believe this is setting the overscroll area parent's scroll/transform on the container (assuming one overscroll area parent), *not* on the menu element, right?
      • the content transition is then the translation we apply to the content? Why is it itself in overlay and the parent in non-overlay... I don't get that part.

      further down also if we're not in overlay, then we also set the content translation's parent to be the overscroll transform. But in that case content translation is itself scroll translation's parent

      So we get overscroll_transform -> content_translation -> scroll_translation

      is that right? I'm again not sure I follow why this is structured this way.

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Philip Rogers
      • Robert Flack
      Gerrit-Attention: Robert Flack <fla...@chromium.org>
      Gerrit-Comment-Date: Thu, 26 Feb 2026 22:28:07 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Robert Flack (Gerrit)

      unread,
      Feb 27, 2026, 12:28:58 PM (7 days ago) Feb 27
      to Chromium LUCI CQ, Vladimir Levin, Stephen Chenney, Dirk Schulze, AyeAye, Philip Rogers, Menard, Alexis, chromium...@chromium.org, fserb...@chromium.org, fmalit...@chromium.org, blink-reviews-p...@chromium.org, kinuko...@chromium.org, drott+bl...@chromium.org, apavlo...@chromium.org, blink-re...@chromium.org, blink-re...@chromium.org, blink-rev...@chromium.org, blink-revi...@chromium.org, blink-rev...@chromium.org, blink-rev...@chromium.org, blink-...@chromium.org, zol...@webkit.org
      Attention needed from Philip Rogers and Vladimir Levin

      Robert Flack added 6 comments

      File third_party/blink/renderer/core/layout/physical_box_fragment.cc
      Line 760, Patchset 8:gfx::Vector2d PhysicalBoxFragment::PixelSnappedOverscrollContentOffset() const {
      Vladimir Levin . unresolved

      I am not understanding how this function is used or what value it returns.

      This is adding all of the pixel snapped scrolled content offset (which I think is a scroll offset from each of these things, right?), but it's accumulating it unconditionally regardless of the content drawn. In the other function, we do this only up to the overscroll area parent that the element resides in.

      The problem here is that this is called on the container itself, and presumably wants to know the offset of its content, but the offset of its content depends on the content, no?

      Robert Flack

      In the other function, we do this only up to the overscroll area parent that the element resides in.

      This function is only called for the overscrollcontainer to determine how much the content has been shifted. Since `::-internal-overscroll-area-parents` are self painting layers they don't use this offset. Perhaps they need to account for it as well, but I think it's not here - it should be handled the same way as self painting content within a scrolling container.

      Line 778, Patchset 8: return IsScrollContainer() ? To<LayoutBox>(*GetLayoutObject())
      Vladimir Levin . unresolved

      Is this change required or just clean up?

      Robert Flack

      To simplify the caller, we now call this function whether it is a scroll container or not. Otherwise I'd have to check on the caller side whether it is a scroller before calling PixelSnappedScrolledContentOffset.

      File third_party/blink/renderer/core/layout/physical_fragment.h
      Line 407, Patchset 8: bool IsNonOverlayOverscrollScrollContainer() const {
      Vladimir Levin . resolved

      nit: we might want to think of a term for non-overlay that doesn't have a negation in its name

      Robert Flack

      Agreed, it could be used instead of Auto in the internal css property value as well.

      File third_party/blink/renderer/core/paint/box_fragment_painter.cc
      Line 2352, Patchset 8: GetPhysicalFragment().PixelSnappedOverscrollContentOffset()) -
      Vladimir Levin . resolved

      Continuing my thought from the other comment: I guess because it's used here, and we know that the partially affected objects are all self painting paint layers, we know that we always want the total offset from all of the overscroll area parents.

      I don't know where, but we might wanna document this somehow

      Robert Flack

      Acknowledged

      File third_party/blink/renderer/core/paint/paint_layer.cc
      Line 882, Patchset 5: if (box->Style()->IsInternalOverscrollArea() || box->IsScrollContainer()) {
      Vladimir Levin . resolved

      while here, and looking for micro-optimizations, we might wanna switch the order of this disjunction

      Robert Flack

      Done

      File third_party/blink/renderer/core/paint/paint_property_tree_builder.h
      Line 75, Patchset 8: if (!is_overlay) {
      Vladimir Levin . unresolved

      Is this clipping the content to the container?

      Robert Flack

      This is clipping the content to the `::-internal-overscroll-area-parent` clip, see discussion about the clip tree here https://chromium-review.git.corp.google.com/c/chromium/src/+/7545871/comment/2369d91d_a082f465/

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Philip Rogers
      • Vladimir Levin
      Submit Requirements:
      • requirement satisfiedCode-Coverage
      • requirement satisfiedCode-Owners
      • requirement is not satisfiedCode-Review
      • requirement is not satisfiedNo-Unresolved-Comments
      • requirement is not satisfiedReview-Enforcement
      Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
      Gerrit-MessageType: comment
      Gerrit-Project: chromium/src
      Gerrit-Branch: main
      Gerrit-Change-Id: I4a0aea4fb911f2b076953a23cef0168d5b37f517
      Gerrit-Change-Number: 7545871
      Gerrit-PatchSet: 9
      Gerrit-Owner: Robert Flack <fla...@chromium.org>
      Gerrit-Reviewer: Philip Rogers <p...@chromium.org>
      Gerrit-Reviewer: Robert Flack <fla...@chromium.org>
      Gerrit-Reviewer: Vladimir Levin <vmp...@chromium.org>
      Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
      Gerrit-CC: Menard, Alexis <alexis...@intel.com>
      Gerrit-CC: Stephen Chenney <sche...@chromium.org>
      Gerrit-Attention: Philip Rogers <p...@chromium.org>
      Gerrit-Attention: Vladimir Levin <vmp...@chromium.org>
      Gerrit-Comment-Date: Fri, 27 Feb 2026 17:28:52 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      Comment-In-Reply-To: Vladimir Levin <vmp...@chromium.org>
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Philip Rogers (Gerrit)

      unread,
      Feb 27, 2026, 4:36:51 PM (7 days ago) Feb 27
      to Robert Flack, Chromium LUCI CQ, Vladimir Levin, Stephen Chenney, Dirk Schulze, AyeAye, Menard, Alexis, chromium...@chromium.org, fserb...@chromium.org, fmalit...@chromium.org, blink-reviews-p...@chromium.org, kinuko...@chromium.org, drott+bl...@chromium.org, apavlo...@chromium.org, blink-re...@chromium.org, blink-re...@chromium.org, blink-rev...@chromium.org, blink-revi...@chromium.org, blink-rev...@chromium.org, blink-rev...@chromium.org, blink-...@chromium.org, zol...@webkit.org
      Attention needed from Robert Flack and Vladimir Levin

      Philip Rogers added 2 comments

      File third_party/blink/renderer/core/paint/object_paint_properties.h
      Line 237, Patchset 9 (Latest): // +-[ ContentTranslation ]
      Philip Rogers . unresolved

      Can you audit all calls of ReplacedContentTransform() and ScrollTranslation() and see if any need to be adjusted to include ContentTranslation()?

      File third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc
      Robert Flack . resolved
      Philip Rogers

      Sounds good!

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Robert Flack
      • Vladimir Levin
      Gerrit-Attention: Robert Flack <fla...@chromium.org>
      Gerrit-Attention: Vladimir Levin <vmp...@chromium.org>
      Gerrit-Comment-Date: Fri, 27 Feb 2026 21:36:44 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Vladimir Levin (Gerrit)

      unread,
      Mar 2, 2026, 3:33:27 PM (4 days ago) Mar 2
      to Robert Flack, Chromium LUCI CQ, Stephen Chenney, Dirk Schulze, AyeAye, Philip Rogers, Menard, Alexis, chromium...@chromium.org, fserb...@chromium.org, fmalit...@chromium.org, blink-reviews-p...@chromium.org, kinuko...@chromium.org, drott+bl...@chromium.org, apavlo...@chromium.org, blink-re...@chromium.org, blink-re...@chromium.org, blink-rev...@chromium.org, blink-revi...@chromium.org, blink-rev...@chromium.org, blink-rev...@chromium.org, blink-...@chromium.org, zol...@webkit.org
      Attention needed from Robert Flack

      Vladimir Levin added 2 comments

      File third_party/blink/renderer/core/layout/physical_box_fragment.cc
      Line 760, Patchset 8:gfx::Vector2d PhysicalBoxFragment::PixelSnappedOverscrollContentOffset() const {
      Vladimir Levin . resolved

      I am not understanding how this function is used or what value it returns.

      This is adding all of the pixel snapped scrolled content offset (which I think is a scroll offset from each of these things, right?), but it's accumulating it unconditionally regardless of the content drawn. In the other function, we do this only up to the overscroll area parent that the element resides in.

      The problem here is that this is called on the container itself, and presumably wants to know the offset of its content, but the offset of its content depends on the content, no?

      Robert Flack

      In the other function, we do this only up to the overscroll area parent that the element resides in.

      This function is only called for the overscrollcontainer to determine how much the content has been shifted. Since `::-internal-overscroll-area-parents` are self painting layers they don't use this offset. Perhaps they need to account for it as well, but I think it's not here - it should be handled the same way as self painting content within a scrolling container.

      Vladimir Levin

      Yeah, this makes sense. Maybe just a comment is enough to say "This is for content not in overscroll areas"

      Line 778, Patchset 8: return IsScrollContainer() ? To<LayoutBox>(*GetLayoutObject())
      Vladimir Levin . resolved

      Is this change required or just clean up?

      Robert Flack

      To simplify the caller, we now call this function whether it is a scroll container or not. Otherwise I'd have to check on the caller side whether it is a scroller before calling PixelSnappedScrolledContentOffset.

      Vladimir Levin

      Acknowledged

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Robert Flack
      Gerrit-Comment-Date: Mon, 02 Mar 2026 20:33:20 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Robert Flack (Gerrit)

      unread,
      Mar 2, 2026, 9:26:35 PM (4 days ago) Mar 2
      to Chromium LUCI CQ, Vladimir Levin, Stephen Chenney, Dirk Schulze, AyeAye, Philip Rogers, Menard, Alexis, chromium...@chromium.org, fserb...@chromium.org, fmalit...@chromium.org, blink-reviews-p...@chromium.org, kinuko...@chromium.org, drott+bl...@chromium.org, apavlo...@chromium.org, blink-re...@chromium.org, blink-re...@chromium.org, blink-rev...@chromium.org, blink-revi...@chromium.org, blink-rev...@chromium.org, blink-rev...@chromium.org, blink-...@chromium.org, zol...@webkit.org
      Attention needed from Philip Rogers

      Robert Flack voted and added 3 comments

      Votes added by Robert Flack

      Commit-Queue+1

      3 comments

      Patchset-level comments
      File-level comment, Patchset 11:
      Robert Flack . resolved

      I have fixed the issue after diagramming it. I've transcribed the tree into comments on the all important SetOverscrollParent method and added a complete test of the transform tree hierarchy to the unit test. It is hit testing and visually correct now with multiple containing overscroll areas.

      File third_party/blink/renderer/core/paint/object_paint_properties.h
      Line 237, Patchset 9: // +-[ ContentTranslation ]
      Philip Rogers . unresolved

      Can you audit all calls of ReplacedContentTransform() and ScrollTranslation() and see if any need to be adjusted to include ContentTranslation()?

      Robert Flack

      I think I have accounted for all of these. Typically everywhere we want to know the actual translation will just use the ScrollTranslation directly.

      File third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
      Line 3204, Patchset 11: PhysicalOffset(To<LayoutBox>(object_).ScrollOrigin());
      Robert Flack . unresolved

      It may be possible to add the additional offset into the paint offset here rather than creating a dedicated ContentTranslation node.

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Philip Rogers
      Submit Requirements:
      • requirement satisfiedCode-Coverage
      • requirement satisfiedCode-Owners
      • requirement is not satisfiedCode-Review
      • requirement is not satisfiedNo-Unresolved-Comments
      • requirement is not satisfiedReview-Enforcement
      Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
      Gerrit-MessageType: comment
      Gerrit-Project: chromium/src
      Gerrit-Branch: main
      Gerrit-Change-Id: I4a0aea4fb911f2b076953a23cef0168d5b37f517
      Gerrit-Change-Number: 7545871
      Gerrit-PatchSet: 11
      Gerrit-Owner: Robert Flack <fla...@chromium.org>
      Gerrit-Reviewer: Philip Rogers <p...@chromium.org>
      Gerrit-Reviewer: Robert Flack <fla...@chromium.org>
      Gerrit-Reviewer: Vladimir Levin <vmp...@chromium.org>
      Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
      Gerrit-CC: Menard, Alexis <alexis...@intel.com>
      Gerrit-CC: Stephen Chenney <sche...@chromium.org>
      Gerrit-Attention: Philip Rogers <p...@chromium.org>
      Gerrit-Comment-Date: Tue, 03 Mar 2026 02:26:29 +0000
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Robert Flack (Gerrit)

      unread,
      Mar 5, 2026, 9:25:53 PM (yesterday) Mar 5
      to Chromium LUCI CQ, Vladimir Levin, Stephen Chenney, Dirk Schulze, AyeAye, Philip Rogers, Menard, Alexis, chromium...@chromium.org, fserb...@chromium.org, fmalit...@chromium.org, blink-reviews-p...@chromium.org, kinuko...@chromium.org, drott+bl...@chromium.org, apavlo...@chromium.org, blink-re...@chromium.org, blink-re...@chromium.org, blink-rev...@chromium.org, blink-revi...@chromium.org, blink-rev...@chromium.org, blink-rev...@chromium.org, blink-...@chromium.org, zol...@webkit.org
      Attention needed from Philip Rogers

      Robert Flack voted and added 3 comments

      Votes added by Robert Flack

      Commit-Queue+1

      3 comments

      Patchset-level comments
      File-level comment, Patchset 20 (Latest):
      Robert Flack . resolved

      I think this is working as expected now. I had to move the content clip to be outside of the overflow clip so that the overflow follows the same transform chain.

      File third_party/blink/renderer/core/paint/object_paint_properties.h
      Line 237, Patchset 9: // +-[ ContentTranslation ]
      Philip Rogers . resolved

      Can you audit all calls of ReplacedContentTransform() and ScrollTranslation() and see if any need to be adjusted to include ContentTranslation()?

      Robert Flack

      I think I have accounted for all of these. Typically everywhere we want to know the actual translation will just use the ScrollTranslation directly.

      Robert Flack

      Done

      File third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
      Line 3204, Patchset 11: PhysicalOffset(To<LayoutBox>(object_).ScrollOrigin());
      Robert Flack . resolved

      It may be possible to add the additional offset into the paint offset here rather than creating a dedicated ContentTranslation node.

      Robert Flack

      Actually I think it's necessary to have a node below the paint offset for the overflow clip to ensure that we have the correct parent tree.

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Philip Rogers
      Submit Requirements:
      • requirement satisfiedCode-Coverage
      • requirement satisfiedCode-Owners
      • requirement is not satisfiedCode-Review
      • requirement is not satisfiedNo-Unresolved-Comments
      • requirement is not satisfiedReview-Enforcement
      Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
      Gerrit-MessageType: comment
      Gerrit-Project: chromium/src
      Gerrit-Branch: main
      Gerrit-Change-Id: I4a0aea4fb911f2b076953a23cef0168d5b37f517
      Gerrit-Change-Number: 7545871
      Gerrit-PatchSet: 20
      Gerrit-Owner: Robert Flack <fla...@chromium.org>
      Gerrit-Reviewer: Philip Rogers <p...@chromium.org>
      Gerrit-Reviewer: Robert Flack <fla...@chromium.org>
      Gerrit-Reviewer: Vladimir Levin <vmp...@chromium.org>
      Gerrit-CC: Dirk Schulze <dsch...@chromium.org>
      Gerrit-CC: Menard, Alexis <alexis...@intel.com>
      Gerrit-CC: Stephen Chenney <sche...@chromium.org>
      Gerrit-Attention: Philip Rogers <p...@chromium.org>
      Gerrit-Comment-Date: Fri, 06 Mar 2026 02:25:46 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: Yes
      Comment-In-Reply-To: Philip Rogers <p...@chromium.org>
      Comment-In-Reply-To: Robert Flack <fla...@chromium.org>
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Vladimir Levin (Gerrit)

      unread,
      3:59 PM (7 hours ago) 3:59 PM
      to Robert Flack, Chromium LUCI CQ, Stephen Chenney, Dirk Schulze, AyeAye, Philip Rogers, Menard, Alexis, chromium...@chromium.org, fserb...@chromium.org, fmalit...@chromium.org, blink-reviews-p...@chromium.org, kinuko...@chromium.org, drott+bl...@chromium.org, apavlo...@chromium.org, blink-re...@chromium.org, blink-re...@chromium.org, blink-rev...@chromium.org, blink-revi...@chromium.org, blink-rev...@chromium.org, blink-rev...@chromium.org, blink-...@chromium.org, zol...@webkit.org
      Attention needed from Philip Rogers and Robert Flack

      Vladimir Levin added 8 comments

      File third_party/blink/renderer/core/paint/paint_property_tree_builder.h
      Line 42, Patchset 20 (Latest): // The ::-internal-overscroll-area is always a direct child of the
      Vladimir Levin . unresolved

      nit: s/area/area-parent/

      Line 52, Patchset 8: is_overlay ? scroll_translation
      Vladimir Levin . resolved

      I'm not sure I follow/remember this (could use a few comments):

      • I believe this is setting the overscroll area parent's scroll/transform on the container (assuming one overscroll area parent), *not* on the menu element, right?
      • the content transition is then the translation we apply to the content? Why is it itself in overlay and the parent in non-overlay... I don't get that part.

      further down also if we're not in overlay, then we also set the content translation's parent to be the overscroll transform. But in that case content translation is itself scroll translation's parent

      So we get overscroll_transform -> content_translation -> scroll_translation

      is that right? I'm again not sure I follow why this is structured this way.

      Vladimir Levin

      Acknowledged

      File third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
      Line 3139, Patchset 20 (Latest): overscroll_container->GetLayoutBox()->Style()->InternalOverscrollArea() !=
      Vladimir Levin . resolved

      nit: we need to, at some point, to create a bunch of short direct functions to "name the state"

      Line 3152, Patchset 20 (Latest): return;
      Vladimir Levin . unresolved

      OnClearTransform here too?

      Line 3166, Patchset 20 (Latest): if (const auto* transform = properties_->ContentTranslation()) {
      Vladimir Levin . unresolved

      I think this needs to run even if we don't need paint property update

      Line 3204, Patchset 20 (Latest): OnClearTransform(properties_->ClearContentTranslation());
      Vladimir Levin . unresolved

      not necessary? (you said so)

      File third_party/blink/web_tests/wpt_internal/overscroll-gestures/overscroll-top.html
      Vladimir Levin . unresolved

      convert this test to an overlay hit-testing one

      Vladimir Levin . unresolved

      nit:

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Philip Rogers
      • Robert Flack
      Gerrit-Attention: Robert Flack <fla...@chromium.org>
      Gerrit-Comment-Date: Fri, 06 Mar 2026 20:59:41 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      Comment-In-Reply-To: Vladimir Levin <vmp...@chromium.org>
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy

      Philip Rogers (Gerrit)

      unread,
      6:21 PM (5 hours ago) 6:21 PM
      to Robert Flack, Chromium LUCI CQ, Vladimir Levin, Stephen Chenney, Dirk Schulze, AyeAye, Menard, Alexis, chromium...@chromium.org, fserb...@chromium.org, fmalit...@chromium.org, blink-reviews-p...@chromium.org, kinuko...@chromium.org, drott+bl...@chromium.org, apavlo...@chromium.org, blink-re...@chromium.org, blink-re...@chromium.org, blink-rev...@chromium.org, blink-revi...@chromium.org, blink-rev...@chromium.org, blink-rev...@chromium.org, blink-...@chromium.org, zol...@webkit.org
      Attention needed from Robert Flack

      Philip Rogers added 3 comments

      File third_party/blink/renderer/core/paint/fragment_data.cc
      Line 77, Patchset 20 (Latest): if (properties->ContentTranslation()) {
      Philip Rogers . unresolved

      Is the order here correct? I think we need to basically go from lowest to highest in the diagram in third_party/blink/renderer/core/paint/object_paint_properties.h, which would mean moving the ContentTranslation check down below the Perspective check.

      File third_party/blink/renderer/core/paint/object_paint_properties.h
      Line 132, Patchset 20 (Latest): kContentTranslation = 10,
      Philip Rogers . unresolved

      nit: keep the order the same as the transform tree diagram below? In other words, put kContentTranslation above kPerspective?

      File third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
      Line 3121, Patchset 20 (Latest): if (!NeedsPaintPropertyUpdate()) {
      Philip Rogers . unresolved

      Paint properties have a dirty bit (SetNeedsPaintPropertyUpdate()) and any changes to the inputs of this function need to also call SetNeedsPaintPropertyUpdate. For example, PaintLayer::UpdateScrollableArea calls SetNeedsPaintPropertyUpdate when PaintLayer::RequiresScrollableArea changes. Do all changes to the inputs of this function result in SetNeedsPaintPropertyUpdate being called? It's not obvious to me if the InternalOverscrollArea or GetOverscrollAreaTracker or scroll offset changes do or not.

      As an example, we use the kPseudoIdOverscrollAreaParent scroll offset below. Scroll offset changes normally invalidate paint properties in PaintLayerScrollableArea::UpdateScrollOffset, but in this case, do we need to change that function to also invalidate another layout object's paint properties too?

      Open in Gerrit

      Related details

      Attention is currently required from:
      • Robert Flack
      Gerrit-Attention: Robert Flack <fla...@chromium.org>
      Gerrit-Comment-Date: Fri, 06 Mar 2026 23:21:44 +0000
      Gerrit-HasComments: Yes
      Gerrit-Has-Labels: No
      satisfied_requirement
      unsatisfied_requirement
      open
      diffy
      Reply all
      Reply to author
      Forward
      0 new messages