<!doctype html>
<title>ForceLoadAtTop blocks scroll on load</title>
<meta charset=utf-8>
<link rel="help" href="https://wicg.github.io/ScrollToTextFragment/">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/common/utils.js"></script>
<script src="stash.js"></script>

<!--See comment in scroll-to-text-fragment.html for why this test has the
structure it has -->
<script>

let test_cases = [
  {
    fragment: '#:~:text=target',
    type: 'text fragment'
  },
  {
    fragment: '#target:~:text=target',
    type: 'text fragment with element fallback'
  },
  {
    fragment: '#target',
    type: 'element fragment'
  },
  {
    fragment: '#history',
    type: 'history scroll restoration'
  },
];

let document_policy_value = [
  'force-load-at-top',
  'no-force-load-at-top'
];

for (const value of document_policy_value) {
  // If no-force-load-at-top is specified we expect to allow scrolling,
  // otherwise scroll on load should be blocked.
  const scroll_expected = value == 'no-force-load-at-top';
  const block_verb = scroll_expected ? "must not" : "must";

  for (const test_case of test_cases) {
    promise_test(t => new Promise((resolve, reject) => {
      let key = token();

      test_driver.bless('Open a URL with a text fragment directive', () => {
        window.open(`${value}-target.html?key=${key}${test_case.fragment}`, '_blank', 'noopener');
      });

      fetchResults(key, resolve, reject);
    }).then(data => {
      assert_equals(data.scrolled, scroll_expected);
    }), `${value} ${block_verb} block scroll on load from ${test_case.type}.`);
  }
}
</script>
