chromium/third_party/blink/web_tests/external/wpt/navigation-api/navigation-methods/return-value/navigate-204-205-download.html

<!doctype html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/helpers.js"></script>

<body>
<script>
const tests = [
  ["204s", "/common/blank.html?pipe=status(204)"],
  ["205s", "/common/blank.html?pipe=status(205)"],
  ["Content-Disposition: attachment responses", "/common/blank.html?pipe=header(Content-Disposition,attachment)"]
];

for (const [description, url] of tests) {
  promise_test(async t => {
    const i = document.createElement("iframe");
    i.src = "/common/blank.html";
    document.body.append(i);
    await new Promise(resolve => i.onload = resolve);

    // This seems to be important? Without it the (outer) window load event
    // doesn't fire, and the test harness hangs forever. This is probably a
    // Chromium bug, but maybe a testharness bug, especially since explicit_done
    // doesn't seem to help?
    t.add_cleanup(() => i.remove());

    let navigateCount = 0;
    i.contentWindow.navigation.onnavigate = () => { ++navigateCount; };
    i.contentWindow.navigation.onnavigatesuccess = t.unreached_func("onnavigatesuccess should not be called");
    i.contentWindow.navigation.onnavigateerror = t.unreached_func("onnavigateerror should not be called");

    const result = i.contentWindow.navigation.navigate(url);

    assert_equals(navigateCount, 1);
    assertNeverSettles(t, result, i.contentWindow);

    await new Promise(resolve => t.step_timeout(resolve, 50));
    assert_equals(i.contentWindow.location.href, i.src);
    assert_equals(i.contentWindow.navigation.transition, null);
  }, `navigate() promises to ${description} never settle`);
}
</script>