chromium/third_party/blink/web_tests/wpt_internal/html/semantics/embedded-content/the-iframe-element/iframe-subsequent-navigations-crash.sub.html

<!DOCTYPE html>
<head>
  <title>Subsequent navigations to lazily loaded iframes do not crash the renderer</title>
  <link rel="author" title="Dom Farolino" href="mailto:[email protected]">
  <link rel="help" href="https://html.spec.whatwg.org/multipage/urls-and-fetching.html#lazy-loading-attributes">
  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>
</head>

<body>
  <!-- This is used to represent the top of the viewport, so we can scroll the
       below-viewport iframe out-of-view later in the test -->
  <div id="top_div"></div>
  <div style="height:1000vh;"></div>
  <iframe id="below_viewport" loading="lazy"
          src="http://{{domains[www]}}:{{ports[https][0]}}/html/semantics/embedded-content/the-iframe-element/resources/subframe.html">
  </iframe>

<script>
  const t = async_test();
  const iframe = document.querySelector('#below_viewport');
  const top_div = document.querySelector('#top_div');

  let has_window_load_fired = false;

  // This should be triggered first.
  window.addEventListener('load', t.step_func(() => {
    has_window_load_fired = true;
    // Scroll the loading=lazy below-viewport iframe into view, so that it loads.
    iframe.scrollIntoView();
  }));

  iframe.onload = t.step_func_done(async () => {
    assert_true(has_window_load_fired,
                "The loading=lazy below-viewport iframe should not block the " +
                "window load event");
    await changeIframeSourceAndScrollToTop();
  });

  async function changeIframeSourceAndScrollToTop() {
    // Lazily load a different iframe.
    iframe.src =
      'http://{{domains[www2]}}:{{ports[https][0]}}/html/semantics/embedded-content/the-iframe-element/resources/subframe.html'
    await new Promise(resolve => {
      iframe.onload = resolve;
    });

    top_div.scrollIntoView();

    await new Promise(resolve => {
      setTimeout(resolve, 500);
    });

    iframe.scrollIntoView();
  }
</script>
</body>