chromium/third_party/blink/web_tests/fast/css/sticky/sticky-ancestor-scroller-changed.html

<!DOCTYPE html>
<title>Changing the ancestor scroller of a position:sticky element should not crash</title>
<link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" />
<meta name="assert" content="This test checks that changing the ancestor scroller of a position:sticky element should not crash." />

<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>

<style>
.outerScroller {
  position: relative;
  overflow: scroll;
  height: 500px;
  width: 100px;
}

.innerScroller {
  position: relative;
  height: 100px;
}

.sticky {
  position: sticky;
  top: 0;
  height: 50px;
  width: 50px;
}

.padding {
  height: 200px;
}
</style>

<div class='outerScroller'>
  <div class='innerScroller'>
    <div class='sticky'></div>
    <div class='padding'></div>
  </div>
</div>

<script>
test(() => {
  var outerScroller = document.querySelector('.outerScroller');
  var innerScroller = document.querySelector('.innerScroller');
  var sticky = document.querySelector('.sticky');

  // Querying the offsetTop will force compositing inputs update, setting the
  // outer scroller as the ancestor scroller of the sticky element.
  var offsetTop = sticky.offsetTop;

  // Make the outer scroller non-scrollable (i.e. overflow: visible), and the
  // inner scroller into an actual scroller.
  outerScroller.style.overflow = 'visible';
  innerScroller.style.overflow = 'scroll';

  // Querying the offsetTop will force compositing inputs update. This update will
  // change the ancestor scroller from the (now non-scrollable) outer scroller
  // to the inner one, and should not crash.
  offsetTop = sticky.offsetTop;
}, 'Transitioning a sticky away from an ancestor overflow layer that does not have a scrollable area should not crash');
</script>