Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
- This WPT test may be referenced by the following Test IDs:
            
- /shadow-dom/scroll-restore-shadow.html - WPT Dashboard Interop Dashboard
 
 
<!doctype html>
<meta charset="utf-8">
<title>Scroll position restore on shadow tree</title>
<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
  scroll-box {
    display: block;
    width: 100px;
    height: 100px;
    margin: 10px;
    border: 1px solid;
    &::part(box) {
      width: 100px;
      height: 100px;
      overflow: auto;
    }
    > .content {
      height: 500px;
      background-image: linear-gradient(blue, green);
    }
  }
  #wrapper {
    position: relative;
    display: inline-block;
    border: 1px solid;
    &.change {
      /* Changing display rebuilds the layout tree */
      display: block;
      position: absolute;
    }
  }
</style>
<!-- It's important that the shadow trees below are the same -->
<div id="wrapper">
  <scroll-box>
    <template shadowrootmode="open">
      <div part="box"><slot></slot></div>
    </template>
    <div class="content"></div>
  </scroll-box>
  <scroll-box>
    <template shadowrootmode="open">
      <div part="box"><slot></slot></div>
    </template>
    <div class="content"></div>
  </scroll-box>
</div>
<script>
promise_test(async function() {
  let wrapper = document.getElementById("wrapper");
  let [sb1, sb2] = wrapper.querySelectorAll("scroll-box");
  sb1 = sb1.shadowRoot.querySelector("div[part=box]");
  sb2 = sb2.shadowRoot.querySelector("div[part=box]");
  sb1.scrollTop = 100;
  sb2.scrollTop = 200;
  assert_equals(sb1.scrollTop, 100, "scrollTop 1 is reasonable");
  assert_equals(sb2.scrollTop, 200, "scrollTop 2 is reasonable");
  wrapper.classList.add("change");
  assert_equals(sb1.scrollTop, 100, "scrollTop 1 hasn't changed");
  assert_equals(sb2.scrollTop, 200, "scrollTop 2 hasn't changed");
  await new Promise(r => {
    requestAnimationFrame(() => requestAnimationFrame(r));
  });
  // For good measure
  assert_equals(sb1.scrollTop, 100, "scrollTop 1 hasn't changed after rAF");
  assert_equals(sb2.scrollTop, 200, "scrollTop 2 hasn't changed after rAF");
});
</script>