chromium/third_party/blink/web_tests/fast/history/scroll-restoration/scroll-restoration-fragment-navigation-crossdoc.html

<!DOCTYPE html>
<style>
  iframe {
    height: 300px;
    width: 300px;
  }
</style>

<body>
  <iframe></iframe>
</body>

<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script type="text/javascript">
  'use strict';
  var iframe = document.querySelector('iframe');
  var loadCount = 0;

  // The test does the following navigation steps for iframe
  // 1. load page-with-fragment.html#fragment
  // 2. load blank2
  // 3. go back to page-with-fragment.html 
  async_test(function(t) {
    iframe.src = './resources/page-with-fragment.html#fragment';

    iframe.onload = t.step_func(function() {
      loadCount += 1;
      switch (loadCount) {
        case 1:
          t.step(function() {
            assert_regexp_match(iframe.contentWindow.location.href, /page-with-fragment/, 'should be on page-with-fragment page');
            // wait one animation frame to ensure layout is run and fragment scrolling is complete
            iframe.contentWindow.requestAnimationFrame(function() {
              assert_equals(iframe.contentWindow.scrollY, 800, 'should scroll to fragment');

              iframe.contentWindow.history.scrollRestoration = 'manual';
              assert_equals(iframe.contentWindow.history.scrollRestoration, 'manual');

              // navigate to new page
              setTimeout(function() {
                iframe.src = './resources/blank1.html';
              }, 0);
            });
          });
          break;
        case 2:
          t.step(function() {
            assert_regexp_match(iframe.contentWindow.location.href, /blank1/, 'should be on second blank page');
            assert_equals(iframe.contentWindow.history.scrollRestoration, 'auto', 'new page loads should set scrollRestoration to "auto"');

            setTimeout(function() {
              iframe.contentWindow.history.back();
            }, 0);
          });
          break;
        case 3:
          t.step(function() {
            // coming back from history, scrollRestoration should be set to manual and respected
            assert_regexp_match(iframe.contentWindow.location.href, /page-with-fragment/, 'should be back on page-with-fragment page');
            iframe.contentWindow.requestAnimationFrame(function() {
              assert_equals(iframe.contentWindow.history.scrollRestoration, 'manual', 'navigating back should retain scrollRestoration value');
              assert_equals(iframe.contentWindow.scrollX, 0, 'should not scroll to fragment');
              assert_equals(iframe.contentWindow.scrollY, 0, 'should not scroll to fragment');
              t.done();
            });
          });
          break;
        default:
          assert_unreached('iframe should load 3 times');
      }
    });
  }, 'Manual scroll restoration should take precedent over scrolling to fragment');
</script>