| <!DOCTYPE html> |
| <!-- |
| Scrollbar layer geometry stress test. |
| |
| A is a stacking context; its scrollbars are not re-parented. |
| |
| B gets re-parented, but isn't clipped by any ancestor. |
| |
| C and D are re-parented, and clipped by two non-stacking ancestors. |
| |
| One of D's clipping ancestors is positioned, triggering the |
| "compositingStackingContext != compositingContainer" path |
| in CLM::updateOverflowControlsHostLayerGeometry. |
| |
| The scrollers, stacking contexts, and outer clipping ancestors |
| all have borders (creating non-zero clip offsets) and box shadows |
| (causing main GraphicsLayer to be offset from its LayoutObject), |
| with varying thicknesses. |
| --> |
| <script> |
| if (window.internals) { |
| internals.useMockOverlayScrollbars(); |
| internals.settings.setPreferCompositingToLCDTextEnabled(true); |
| } |
| </script> |
| <style> |
| .outer { |
| position: absolute; |
| z-index: 0; |
| will-change: transform; |
| left: 21px; |
| top: 21px; |
| width: 300px; |
| height: 242px; |
| box-shadow: 0 0 12px 3px #feb; |
| border: 5px solid #eda; |
| } |
| .C, .D { top: 312px; } |
| .B, .D { left: 370px; } |
| .clipper { |
| overflow: hidden; |
| margin-left: 11px; |
| margin-top: 11px; |
| width: 272px; |
| height: 180px; |
| border: 3px solid #aaa; |
| box-shadow: 0 0 0 7px #afa; |
| } |
| .D .clipper { |
| position: relative; |
| } |
| .clipper2 { |
| overflow: hidden; |
| margin-left: 3px; |
| margin-top: 3px; |
| width: 260px; |
| height: 100px; |
| border: 3px solid #fac; |
| } |
| .scroller { |
| overflow: auto; |
| margin-left: 36px; |
| margin-top: 36px; |
| width: 220px; |
| height: 160px; |
| box-shadow: 0 0 12px 12px #aaf; |
| border: 5px solid blue; |
| background-color: white; |
| } |
| .clipper .scroller { |
| margin-left: 15px; |
| margin-top: 15px; |
| } |
| .A .scroller { |
| position: relative; |
| z-index: 0; |
| } |
| .content { |
| position: relative; |
| height: 200px; |
| margin: 12px; |
| padding: 6px; |
| background-color: #ddd; |
| } |
| </style> |
| <div class="outer A"> |
| <div class="scroller"> |
| <div class="content"></div> |
| </div> |
| </div> |
| <div class="outer B"> |
| <div class="scroller"> |
| <div class="content"></div> |
| </div> |
| </div> |
| <div class="outer C"> |
| <div class="clipper"> |
| <div class="clipper2"> |
| <div class="scroller"> |
| <div class="content"></div> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="outer D"> |
| <div class="clipper"> |
| <div class="clipper2"> |
| <div class="scroller"> |
| <div class="content"></div> |
| </div> |
| </div> |
| </div> |
| </div> |
| <script> |
| if (window.testRunner) { |
| testRunner.dumpAsTextWithPixelResults(); |
| testRunner.setCustomTextOutput(internals.layerTreeAsText(document)); |
| } |
| </script> |