Reland "Implement correct z-order of overlay scrollbars"

This reverts commit a0d2f696348eddcd758fd1d67d99f1a93b31fd3e.

Fix crbug.com/980086 by calling MarkAncestorChainForFlagsUpdate() from
DirtyStackingContextZOrderLists() to ensure z-order lists are updated in
UpdateDescendantDependentFlags() when scrollbar existence changes.

Original change's description:
> Revert "Implement correct z-order of overlay scrollbars"
>
> This reverts commit 128c75781f5ead66e1a16eea79ccfe4010f0807a.
>
> Reason for revert: crbug.com/980086
>
> Original change's description:
> > Implement correct z-order of overlay scrollbars
> >
> > Previously we implemented z-ordering of composited overlay scrollbars
> > in GraphicsLayerTreeBuilder which reparents overlay scrollbar
> > GraphicsLayers of scrollers with higher z-order scrollable contents.
> > The overlay scrollbar GraphicsLayers are inserted into the
> > GraphicsLayer of the stacking context above all scrolling contents
> > GraphicsLayers, to ensure the overlay scrollbars to be above any
> > scrolling contents.
> >
> > However, the logic doesn't work for all overlay scrollbars in
> > CompositeAfterPaint and non-composited scrollbars in
> > pre-CompositedAfterPaint because these scrollbars are not controlled
> > by GraphicsLayerTreeBuilder.
> >
> > This CL let PaintLayerStackingNode also manage z-order of overlay
> > scrollbars. If any scroller with overlay scrollbars has any stacked
> > contents that have higher z-order than the scroller, the overlay
> > scrollbars will be inserted after the highest z-order scrolling
> > contents in the z-order list.
> >
> > Also add a paint phase for overlay scrollbars. This is not strictly
> > necessary for now because all scrollers with overlay scrollbars are
> > self-painting. However, this allows us in the future to let scrollers
> > not self-painting to achieve perfect painting order.
> >
> > Bug: 918155
> > Change-Id: Iccae1cbcde8de46158267e45bab2a13a027db3ec
> > Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1461536
> > Commit-Queue: Xianzhu Wang <[email protected]>
> > Reviewed-by: Chris Harrelson <[email protected]>
> > Cr-Commit-Position: refs/heads/master@{#672748}
>
> [email protected],[email protected]
>
> Bug: 918155, 980086
> Change-Id: Icccb9ec7af7ef424306afade0c80015e4c5c5c6f
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1684022
> Reviewed-by: Xianzhu Wang <[email protected]>
> Commit-Queue: Xianzhu Wang <[email protected]>
> Cr-Commit-Position: refs/heads/master@{#674526}

# Not skipping CQ checks because original CL landed > 1 day ago.

Bug: 918155, 980086
Change-Id: I5f001477512de5ebbaa7a4fe62c1ef1bb76e442a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1691331
Reviewed-by: Chris Harrelson <[email protected]>
Commit-Queue: Xianzhu Wang <[email protected]>
Cr-Commit-Position: refs/heads/master@{#675683}
diff --git a/third_party/blink/web_tests/FlagExpectations/enable-blink-features=CompositeAfterPaint b/third_party/blink/web_tests/FlagExpectations/enable-blink-features=CompositeAfterPaint
index 178b7a5..cc1c846 100644
--- a/third_party/blink/web_tests/FlagExpectations/enable-blink-features=CompositeAfterPaint
+++ b/third_party/blink/web_tests/FlagExpectations/enable-blink-features=CompositeAfterPaint
@@ -441,6 +441,9 @@
 crbug.com/940033 virtual/fractional_scrolling_threaded/fast/scrolling/wheel-scrolling-over-custom-scrollbar.html [ Failure ]
 crbug.com/940033 virtual/threaded/fast/scrolling/wheel-scrolling-over-custom-scrollbar.html [ Failure ]
 
+crbug.com/918155 scrollbars/overlay-scrollbar-over-child-layer.html [ Failure ]
+crbug.com/918155 virtual/prefer_compositing_to_lcd_text/scrollbars/overlay-scrollbar-over-child-layer.html [ Failure ]
+
 crbug.com/979389 ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling.htm [ Failure ]
 
 # Crash during PictureLayer::GetPicture() when DisplayItemList is finished twice.
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index e699a087a..4d3b31e 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -352,7 +352,6 @@
 # Subpixel rounding differences that are incorrect.
 crbug.com/836886 virtual/prefer_compositing_to_lcd_text/compositing/overflow/scaled-overflow.html [ Failure ]
 crbug.com/836886 compositing/overflow/scaled-overflow.html [ Failure ]
-crbug.com/836886 compositing/scrollbars/nested-overlay-scrollbars.html [ Failure ]
 # Flaky subpixel AA difference (not necessarily incorrect, but flaky)
 crbug.com/921105 virtual/threaded/animations/skew-notsequential-compositor.html [ Failure Pass ]
 crbug.com/921105 virtual/disable-blink-gen-property-trees/animations/skew-notsequential-compositor.html [ Skip ]
@@ -363,6 +362,10 @@
 crbug.com/954591 external/wpt/css/css-transforms/composited-under-rotateY-180deg.html [ Failure ]
 crbug.com/954591 external/wpt/css/css-transforms/composited-under-rotateY-180deg-clip.html [ Failure ]
 
+# Fixed in CompositeAfterPaint.
+crbug.com/918155 virtual/prefer_compositing_to_lcd_text/scrollbars/overlay-scrollbar-over-child-layer-nested-2.html [ Failure ]
+crbug.com/918155 virtual/prefer_compositing_to_lcd_text/scrollbars/overlay-scrollbar-over-child-layer-nested.html [ Failure ]
+
 # ====== Paint team owned tests to here ======
 
 crbug.com/922249 virtual/android/fullscreen/compositor-touch-hit-rects-fullscreen-video-controls.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/compositing/overflow/scrollbar-layer-placement-negative-z-index-child.html b/third_party/blink/web_tests/compositing/overflow/scrollbar-layer-placement-negative-z-index-child.html
index 45beb68..54f3f8b 100644
--- a/third_party/blink/web_tests/compositing/overflow/scrollbar-layer-placement-negative-z-index-child.html
+++ b/third_party/blink/web_tests/compositing/overflow/scrollbar-layer-placement-negative-z-index-child.html
@@ -43,9 +43,9 @@
   }
 </style>
 <div class="outer">
-<div class="scroller">
-<div class="content"></div>
-</div>
+  <div class="scroller">
+    <div class="content"></div>
+  </div>
 </div>
 <script>
 if (window.testRunner) {
diff --git a/third_party/blink/web_tests/compositing/scrollbars/nested-overlay-scrollbars-expected.png b/third_party/blink/web_tests/compositing/scrollbars/nested-overlay-scrollbars-expected.png
index 219172d..1fa1711d 100644
--- a/third_party/blink/web_tests/compositing/scrollbars/nested-overlay-scrollbars-expected.png
+++ b/third_party/blink/web_tests/compositing/scrollbars/nested-overlay-scrollbars-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/compositing/scrollbars/nested-overlay-scrollbars-expected.txt b/third_party/blink/web_tests/compositing/scrollbars/nested-overlay-scrollbars-expected.txt
index abd8db5..32b2959 100644
--- a/third_party/blink/web_tests/compositing/scrollbars/nested-overlay-scrollbars-expected.txt
+++ b/third_party/blink/web_tests/compositing/scrollbars/nested-overlay-scrollbars-expected.txt
@@ -18,7 +18,7 @@
       "backgroundColor": "#FFFFFF"
     },
     {
-      "name": "LayoutBlockFlow (positioned) DIV id='outer'",
+      "name": "LayoutNGBlockFlow (positioned) DIV id='outer'",
       "position": [8, 8],
       "bounds": [404, 404]
     },
@@ -35,7 +35,7 @@
       "transform": 1
     },
     {
-      "name": "LayoutBlockFlow (positioned) DIV id='inner'",
+      "name": "LayoutNGBlockFlow (positioned) DIV id='inner'",
       "position": [10, 510],
       "bounds": [204, 204],
       "transform": 1
@@ -60,7 +60,7 @@
       "transform": 1
     },
     {
-      "name": "LayoutBlockFlow (positioned) DIV id='grey'",
+      "name": "LayoutNGBlockFlow (positioned) DIV id='grey'",
       "position": [12, 512],
       "bounds": [100, 800],
       "contentsOpaque": true,
@@ -68,7 +68,7 @@
       "transform": 1
     },
     {
-      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV id='spacer')",
+      "name": "Squashing Layer (first squashed layer: LayoutNGBlockFlow (positioned) DIV id='spacer')",
       "position": [12, 2512],
       "bounds": [5000, 1000],
       "transform": 1
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/scrollbars/nested-overlay-scrollbars-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/scrollbars/nested-overlay-scrollbars-expected.txt
new file mode 100644
index 0000000..abd8db5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/scrollbars/nested-overlay-scrollbars-expected.txt
@@ -0,0 +1,129 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV id='outer'",
+      "position": [8, 8],
+      "bounds": [404, 404]
+    },
+    {
+      "name": "Scrolling Layer",
+      "position": [10, 10],
+      "bounds": [400, 400],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "position": [10, 10],
+      "bounds": [400, 704],
+      "transform": 1
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV id='inner'",
+      "position": [10, 510],
+      "bounds": [204, 204],
+      "transform": 1
+    },
+    {
+      "name": "Scrolling Layer",
+      "position": [12, 512],
+      "bounds": [200, 200],
+      "drawsContent": false,
+      "transform": 1
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "position": [12, 512],
+      "bounds": [5000, 9000],
+      "transform": 1
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "position": [10, 10],
+      "drawsContent": false,
+      "transform": 1
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV id='grey'",
+      "position": [12, 512],
+      "bounds": [100, 800],
+      "contentsOpaque": true,
+      "backgroundColor": "#808080",
+      "transform": 1
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV id='spacer')",
+      "position": [12, 2512],
+      "bounds": [5000, 1000],
+      "transform": 1
+    },
+    {
+      "name": "Overflow Controls Host Layer",
+      "position": [12, 512],
+      "bounds": [204, 204],
+      "drawsContent": false,
+      "transform": 1
+    },
+    {
+      "name": "Horizontal Scrollbar Layer",
+      "position": [14, 707],
+      "bounds": [193, 7],
+      "drawsContent": false,
+      "transform": 1
+    },
+    {
+      "name": "Vertical Scrollbar Layer",
+      "position": [207, 514],
+      "bounds": [7, 193],
+      "drawsContent": false,
+      "transform": 1
+    },
+    {
+      "name": "Scroll Corner Layer",
+      "position": [207, 707],
+      "bounds": [7, 7],
+      "transform": 1
+    },
+    {
+      "name": "Overflow Controls Host Layer",
+      "position": [8, 8],
+      "bounds": [404, 404],
+      "drawsContent": false
+    },
+    {
+      "name": "Vertical Scrollbar Layer",
+      "position": [403, 10],
+      "bounds": [7, 400],
+      "drawsContent": false
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [0, -304, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/overflow/scrollbar-layer-placement-negative-z-index-child-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/overflow/scrollbar-layer-placement-negative-z-index-child-expected.txt
new file mode 100644
index 0000000..7e910706
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/overflow/scrollbar-layer-placement-negative-z-index-child-expected.txt
@@ -0,0 +1,67 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV class='outer'",
+      "bounds": [352, 294]
+    },
+    {
+      "name": "LayoutBlockFlow (relative positioned) DIV class='content'",
+      "position": [79, 79],
+      "bounds": [196, 212],
+      "contentsOpaque": true,
+      "backgroundColor": "#DDDDDD"
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV class='outer' (foreground) Layer",
+      "bounds": [352, 294]
+    },
+    {
+      "name": "LayoutBlockFlow DIV class='scroller'",
+      "position": [32, 32],
+      "bounds": [290, 230],
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "position": [67, 67],
+      "bounds": [220, 160],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "position": [67, 67],
+      "bounds": [220, 236],
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Overflow Controls Host Layer",
+      "position": [62, 62],
+      "bounds": [230, 170],
+      "drawsContent": false
+    },
+    {
+      "name": "Vertical Scrollbar Layer",
+      "position": [280, 67],
+      "bounds": [7, 160],
+      "drawsContent": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/scrollbars/nested-overlay-scrollbars-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/scrollbars/nested-overlay-scrollbars-expected.txt
new file mode 100644
index 0000000..abd8db5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/scrollbars/nested-overlay-scrollbars-expected.txt
@@ -0,0 +1,129 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV id='outer'",
+      "position": [8, 8],
+      "bounds": [404, 404]
+    },
+    {
+      "name": "Scrolling Layer",
+      "position": [10, 10],
+      "bounds": [400, 400],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "position": [10, 10],
+      "bounds": [400, 704],
+      "transform": 1
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV id='inner'",
+      "position": [10, 510],
+      "bounds": [204, 204],
+      "transform": 1
+    },
+    {
+      "name": "Scrolling Layer",
+      "position": [12, 512],
+      "bounds": [200, 200],
+      "drawsContent": false,
+      "transform": 1
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "position": [12, 512],
+      "bounds": [5000, 9000],
+      "transform": 1
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "position": [10, 10],
+      "drawsContent": false,
+      "transform": 1
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV id='grey'",
+      "position": [12, 512],
+      "bounds": [100, 800],
+      "contentsOpaque": true,
+      "backgroundColor": "#808080",
+      "transform": 1
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV id='spacer')",
+      "position": [12, 2512],
+      "bounds": [5000, 1000],
+      "transform": 1
+    },
+    {
+      "name": "Overflow Controls Host Layer",
+      "position": [12, 512],
+      "bounds": [204, 204],
+      "drawsContent": false,
+      "transform": 1
+    },
+    {
+      "name": "Horizontal Scrollbar Layer",
+      "position": [14, 707],
+      "bounds": [193, 7],
+      "drawsContent": false,
+      "transform": 1
+    },
+    {
+      "name": "Vertical Scrollbar Layer",
+      "position": [207, 514],
+      "bounds": [7, 193],
+      "drawsContent": false,
+      "transform": 1
+    },
+    {
+      "name": "Scroll Corner Layer",
+      "position": [207, 707],
+      "bounds": [7, 7],
+      "transform": 1
+    },
+    {
+      "name": "Overflow Controls Host Layer",
+      "position": [8, 8],
+      "bounds": [404, 404],
+      "drawsContent": false
+    },
+    {
+      "name": "Vertical Scrollbar Layer",
+      "position": [403, 10],
+      "bounds": [7, 400],
+      "drawsContent": false
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [0, -304, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/compositing/scrollbars/nested-overlay-scrollbars-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/compositing/scrollbars/nested-overlay-scrollbars-expected.txt
new file mode 100644
index 0000000..1fa1391d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/compositing/scrollbars/nested-overlay-scrollbars-expected.txt
@@ -0,0 +1,56 @@
+{
+  "layers": [
+    {
+      "name": "Scrolling background of LayoutView #document",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "LayoutNGBlockFlow (positioned) DIV id='grey'",
+      "position": [2, 2],
+      "bounds": [100, 800],
+      "contentsOpaque": true,
+      "backgroundColor": "#808080",
+      "transform": 3
+    },
+    {
+      "name": "LayoutNGBlockFlow (positioned) DIV id='inner'",
+      "position": [2, 2],
+      "bounds": [200, 200],
+      "transform": 3
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [8, 8, 0, 1]
+      ]
+    },
+    {
+      "id": 2,
+      "parent": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [0, -304, 0, 1]
+      ]
+    },
+    {
+      "id": 3,
+      "parent": 2,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [2, 502, 0, 1]
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/scrollbars/nested-scroll-overlay-scrollbar-expected.html b/third_party/blink/web_tests/scrollbars/nested-scroll-overlay-scrollbar-expected.html
new file mode 100644
index 0000000..337c2f68
--- /dev/null
+++ b/third_party/blink/web_tests/scrollbars/nested-scroll-overlay-scrollbar-expected.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<div id="outer" style="width: 200px; height: 200px; overflow: scroll">
+  <div style="background: green; height: 100px"></div>
+  <div style="height: 110px"></div>
+</div>
+<script>
+if (window.internals) {
+  internals.runtimeFlags.overlayScrollbarsEnabled = true;
+  internals.settings.setMockScrollbarsEnabled(true);
+}
+</script>
diff --git a/third_party/blink/web_tests/scrollbars/nested-scroll-overlay-scrollbar.html b/third_party/blink/web_tests/scrollbars/nested-scroll-overlay-scrollbar.html
new file mode 100644
index 0000000..9a9eba03
--- /dev/null
+++ b/third_party/blink/web_tests/scrollbars/nested-scroll-overlay-scrollbar.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<div style="width: 200px; height: 200px; overflow: scroll">
+  <!-- The intermediate div doesn't have layout overflow. -->
+  <div style="height: 210px; overflow: scroll">
+    <div style="background: green; width: 300px; height: 100px"></div>
+  </div>
+</div>
+<script>
+if (window.internals) {
+  internals.runtimeFlags.overlayScrollbarsEnabled = true;
+  internals.settings.setMockScrollbarsEnabled(true);
+}
+</script>
diff --git a/third_party/blink/web_tests/scrollbars/overlay-scrollbar-interleaving-z-order-expected.html b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-interleaving-z-order-expected.html
new file mode 100644
index 0000000..be7860a2
--- /dev/null
+++ b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-interleaving-z-order-expected.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<div id="container" style="width: 200px; height: 200px; overflow: scroll">
+  <div id="content" style="background: green; width: 210px; height: 150px"></div>
+  <div style="height: 60px"></div>
+</div>
+<div style="position: absolute; top: 80px; left: 80px; z-index: -1; background: blue; width: 200px; height: 200px"></div>
+<div style="position: absolute; top: 120px; left: 120px; z-index: 20; background: yellow; width: 200px; height: 200px"></div>
+<script>
+if (window.internals) {
+  internals.runtimeFlags.overlayScrollbarsEnabled = true;
+  internals.settings.setMockScrollbarsEnabled(true);
+}
+</script>
diff --git a/third_party/blink/web_tests/scrollbars/overlay-scrollbar-interleaving-z-order.html b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-interleaving-z-order.html
new file mode 100644
index 0000000..fe92316
--- /dev/null
+++ b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-interleaving-z-order.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<div id="container" style="width: 200px; height: 200px; overflow: scroll; position: relative">
+  <div id="content" style="position: absolute; z-index: 10; background: green; width: 210px; height: 150px"></div>
+  <div style="height: 210px"></div>
+</div>
+<div style="position: absolute; top: 80px; left: 80px; z-index: 5; background: blue; width: 200px; height: 200px"></div>
+<div style="position: absolute; top: 120px; left: 120px; z-index: 20; background: yellow; width: 200px; height: 200px"></div>
+<script>
+if (window.internals) {
+  internals.runtimeFlags.overlayScrollbarsEnabled = true;
+  internals.settings.setMockScrollbarsEnabled(true);
+}
+</script>
diff --git a/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-expected.html b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-expected.html
new file mode 100644
index 0000000..49c1ce68
--- /dev/null
+++ b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-expected.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<div style="width: 200px; height: 200px; overflow: scroll">
+  <div style="background: green; width: 300px; height: 100px"></div>
+  <div style="height: 210px"></div>
+</div>
+<script>
+if (window.internals) {
+  internals.runtimeFlags.overlayScrollbarsEnabled = true;
+  internals.settings.setMockScrollbarsEnabled(true);
+}
+</script>
diff --git a/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested-1-expected.html b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested-1-expected.html
new file mode 100644
index 0000000..0b104dd8
--- /dev/null
+++ b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested-1-expected.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<div style="width: 200px; height: 200px; overflow: scroll">
+  <div style="background: green; width: 200px; height: 70px"></div>
+  <!-- This div let the top-level div have the same layout overflow as in the test. -->
+  <div style="width: 210px; height: 220px"></div>
+</div>
+<script>
+if (window.internals) {
+  internals.runtimeFlags.overlayScrollbarsEnabled = true;
+  internals.settings.setMockScrollbarsEnabled(true);
+}
+</script>
diff --git a/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested-1.html b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested-1.html
new file mode 100644
index 0000000..26445a4c
--- /dev/null
+++ b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested-1.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<div style="position: relative; width: 200px; height: 200px; overflow: scroll">
+  <!-- the intermediate div doesn't have layout overflow. -->
+  <div style="position: relative; width: 210px; height: 80px; overflow: scroll">
+    <div style="position: absolute; z-index: 5; background: green; width: 200px; height: 70px"></div>
+  </div>
+  <div style="height: 210px"></div>
+</div>
+<script>
+if (window.internals) {
+  internals.runtimeFlags.overlayScrollbarsEnabled = true;
+  internals.settings.setMockScrollbarsEnabled(true);
+}
+</script>
diff --git a/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested-2-expected.html b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested-2-expected.html
new file mode 100644
index 0000000..e4b3bae
--- /dev/null
+++ b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested-2-expected.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<div style="width: 200px; height: 200px; overflow: scroll">
+  <div style="background: green; width: 210px; height: 80px"></div>
+  <div style="height: 210px"></div>
+</div>
+<script>
+if (window.internals) {
+  internals.runtimeFlags.overlayScrollbarsEnabled = true;
+  internals.settings.setMockScrollbarsEnabled(true);
+}
+</script>
diff --git a/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested-2.html b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested-2.html
new file mode 100644
index 0000000..30fdcc3
--- /dev/null
+++ b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested-2.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<style>
+  #intermediate::-webkit-scrollbar { display: none; }
+</style>
+<div style="position: relative; width: 200px; height: 200px; overflow: scroll">
+  <!-- The intermediate div's scrollbars are hidden. -->
+  <div id="intermediate" style="position: relative; width: 210px; height: 80px; overflow: scroll">
+    <div style="position: absolute; z-index: 5; background: green; width: 300px; height: 100px"></div>
+  </div>
+  <div style="height: 210px"></div>
+</div>
+<script>
+if (window.internals) {
+  internals.runtimeFlags.overlayScrollbarsEnabled = true;
+  internals.settings.setMockScrollbarsEnabled(true);
+}
+</script>
diff --git a/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested-3-expected.html b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested-3-expected.html
new file mode 100644
index 0000000..e4b3bae
--- /dev/null
+++ b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested-3-expected.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<div style="width: 200px; height: 200px; overflow: scroll">
+  <div style="background: green; width: 210px; height: 80px"></div>
+  <div style="height: 210px"></div>
+</div>
+<script>
+if (window.internals) {
+  internals.runtimeFlags.overlayScrollbarsEnabled = true;
+  internals.settings.setMockScrollbarsEnabled(true);
+}
+</script>
diff --git a/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested-3.html b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested-3.html
new file mode 100644
index 0000000..e3b043e2
--- /dev/null
+++ b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested-3.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<div style="position: relative; width: 200px; height: 200px; overflow: scroll">
+  <!-- The intermediate div's overflow is hidden. -->
+  <div style="position: relative; width: 210px; height: 80px; overflow: hidden">
+    <div style="position: absolute; z-index: 5; background: green; width: 300px; height: 100px"></div>
+  </div>
+  <div style="height: 210px"></div>
+</div>
+<script>
+if (window.internals) {
+  internals.runtimeFlags.overlayScrollbarsEnabled = true;
+  internals.settings.setMockScrollbarsEnabled(true);
+}
+</script>
diff --git a/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested-expected.html b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested-expected.html
new file mode 100644
index 0000000..447fcfb6
--- /dev/null
+++ b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested-expected.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<div style="width: 200px; height: 200px; overflow: scroll">
+  <div style="width: 210px; height: 80px; overflow: scroll">
+    <div style="background: green; width: 300px; height: 200px"></div>
+  </div>
+  <div style="height: 210px"></div>
+</div>
+<script>
+if (window.internals) {
+  internals.runtimeFlags.overlayScrollbarsEnabled = true;
+  internals.settings.setMockScrollbarsEnabled(true);
+}
+</script>
diff --git a/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested.html b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested.html
new file mode 100644
index 0000000..a915f1c
--- /dev/null
+++ b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer-nested.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<div style="position: relative; width: 200px; height: 200px; overflow: scroll">
+  <div style="position: relative; width: 210px; height: 80px; overflow: scroll">
+    <div style="position: absolute; z-index: 5; background: green; width: 300px; height: 100px"></div>
+  </div>
+  <div style="height: 210px"></div>
+</div>
+<script>
+if (window.internals) {
+  internals.runtimeFlags.overlayScrollbarsEnabled = true;
+  internals.settings.setMockScrollbarsEnabled(true);
+}
+</script>
diff --git a/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer.html b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer.html
new file mode 100644
index 0000000..4220153
--- /dev/null
+++ b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-child-layer.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<div id="container" style="width: 200px; height: 200px; overflow: scroll">
+  <div id="content" style="position: relative; background: green; width: 300px; height: 100px"></div>
+  <div style="height: 210px"></div>
+</div>
+<script>
+if (window.internals) {
+  internals.runtimeFlags.overlayScrollbarsEnabled = true;
+  internals.settings.setMockScrollbarsEnabled(true);
+}
+</script>
diff --git a/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-negative-z-child-layer-expected.html b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-negative-z-child-layer-expected.html
new file mode 100644
index 0000000..b136cfb
--- /dev/null
+++ b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-negative-z-child-layer-expected.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<div id="container" style="width: 200px; height: 200px; overflow: scroll">
+  <div id="content" style="background: green; width: 300px; height: 100px"></div>
+  <div style="height: 210px"></div>
+</div>
+<script>
+if (window.internals) {
+  internals.runtimeFlags.overlayScrollbarsEnabled = true;
+  internals.settings.setMockScrollbarsEnabled(true);
+}
+</script>
diff --git a/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-negative-z-child-layer.html b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-negative-z-child-layer.html
new file mode 100644
index 0000000..a8adb7f
--- /dev/null
+++ b/third_party/blink/web_tests/scrollbars/overlay-scrollbar-over-negative-z-child-layer.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<div id="container" style="width: 200px; height: 200px; overflow: scroll">
+  <div id="content" style="position: relative; z-index: -1; background: green; width: 300px; height: 100px"></div>
+  <div style="height: 210px"></div>
+</div>
+<script>
+if (window.internals) {
+  internals.runtimeFlags.overlayScrollbarsEnabled = true;
+  internals.settings.setMockScrollbarsEnabled(true);
+}
+</script>
diff --git a/third_party/blink/web_tests/virtual/disable-blink-gen-property-trees/compositing/overflow/scrollbar-layer-placement-negative-z-index-child-expected.png b/third_party/blink/web_tests/virtual/disable-blink-gen-property-trees/compositing/overflow/scrollbar-layer-placement-negative-z-index-child-expected.png
index 57f073e..d3100be 100644
--- a/third_party/blink/web_tests/virtual/disable-blink-gen-property-trees/compositing/overflow/scrollbar-layer-placement-negative-z-index-child-expected.png
+++ b/third_party/blink/web_tests/virtual/disable-blink-gen-property-trees/compositing/overflow/scrollbar-layer-placement-negative-z-index-child-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/disable-blink-gen-property-trees/compositing/overflow/scrollbar-layer-placement-negative-z-index-child-expected.txt b/third_party/blink/web_tests/virtual/disable-blink-gen-property-trees/compositing/overflow/scrollbar-layer-placement-negative-z-index-child-expected.txt
index 54bb628..d6d5879 100644
--- a/third_party/blink/web_tests/virtual/disable-blink-gen-property-trees/compositing/overflow/scrollbar-layer-placement-negative-z-index-child-expected.txt
+++ b/third_party/blink/web_tests/virtual/disable-blink-gen-property-trees/compositing/overflow/scrollbar-layer-placement-negative-z-index-child-expected.txt
@@ -18,34 +18,22 @@
       "backgroundColor": "#FFFFFF"
     },
     {
-      "name": "LayoutBlockFlow (positioned) DIV class='outer'",
+      "name": "LayoutNGBlockFlow (positioned) DIV class='outer'",
       "bounds": [352, 294]
     },
     {
-      "name": "LayoutBlockFlow (relative positioned) DIV class='content'",
+      "name": "LayoutNGBlockFlow (relative positioned) DIV class='content'",
       "position": [79, 79],
       "bounds": [196, 212],
       "contentsOpaque": true,
       "backgroundColor": "#DDDDDD"
     },
     {
-      "name": "Overflow Controls Host Layer",
-      "position": [62, 62],
-      "bounds": [230, 170],
-      "drawsContent": false
-    },
-    {
-      "name": "Vertical Scrollbar Layer",
-      "position": [280, 67],
-      "bounds": [7, 160],
-      "drawsContent": false
-    },
-    {
-      "name": "LayoutBlockFlow (positioned) DIV class='outer' (foreground) Layer",
+      "name": "LayoutNGBlockFlow (positioned) DIV class='outer' (foreground) Layer",
       "bounds": [352, 294]
     },
     {
-      "name": "LayoutBlockFlow DIV class='scroller'",
+      "name": "LayoutNGBlockFlow DIV class='scroller'",
       "position": [32, 32],
       "bounds": [290, 230],
       "backgroundColor": "#FFFFFF"
@@ -61,6 +49,18 @@
       "position": [67, 67],
       "bounds": [220, 236],
       "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Overflow Controls Host Layer",
+      "position": [62, 62],
+      "bounds": [230, 170],
+      "drawsContent": false
+    },
+    {
+      "name": "Vertical Scrollbar Layer",
+      "position": [280, 67],
+      "bounds": [7, 160],
+      "drawsContent": false
     }
   ]
 }
diff --git a/third_party/blink/web_tests/virtual/disable-blink-gen-property-trees/compositing/scrollbars/nested-overlay-scrollbars-expected.png b/third_party/blink/web_tests/virtual/disable-blink-gen-property-trees/compositing/scrollbars/nested-overlay-scrollbars-expected.png
new file mode 100644
index 0000000..219172d
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/disable-blink-gen-property-trees/compositing/scrollbars/nested-overlay-scrollbars-expected.png
Binary files differ