<!DOCTYPE html>
<meta charset="utf-8">
<title>DBSC does not refresh cross-site fetch without credentials</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/get-host-info.sub.js"></script>
<script src="helper.js" type="module"></script>

<script type="module">
  import { documentHasCookie, expireCookie, waitForCookie, addCookieAndSessionCleanup, setupShardedServerState, configureServer } from "./helper.js";

  promise_test(async t => {
    const testId = await setupShardedServerState();
    const expectedCookieAndValue = "auth_cookie=abcdef0123";
    const expectedCookieAndAttributes = `${expectedCookieAndValue};Domain=${location.hostname};Path=/device-bound-session-credentials`;
    addCookieAndSessionCleanup(t);

    // Prompt starting a session, and wait until registration completes.
    const loginResponse = await fetch('login.py');
    assert_equals(loginResponse.status, 200);
    await waitForCookie(expectedCookieAndValue, /*expectCookie=*/true);

    // Expire the cookies
    expireCookie(expectedCookieAndAttributes);

    // Setup for receiving messages
    let messageCallbacks = [];
    function messageListener(event) {
      if (messageCallbacks.length > 0) {
          messageCallbacks[0](event.data);
          messageCallbacks.shift();
      }
    };
    window.addEventListener("message", messageListener);
    t.add_cleanup(() => {
      window.removeEventListener("message", messageListener);
    });

    function getMessage() {
        return new Promise((resolve, reject) => {
            messageCallbacks.push(resolve);
        });
    }

    // Create a cross-site iframe that's going to try to fetch without credentials
    let iframe = document.createElement('iframe');
    iframe.src = `${get_host_info().HTTPS_NOTSAMESITE_ORIGIN}/device-bound-session-credentials/fetch-verify-authenticated.https.html`;
    document.body.appendChild(iframe);

    let statusCode = await getMessage();
    assert_equals(statusCode, 401);

    // We should not have refreshed.
    assert_false(documentHasCookie(expectedCookieAndValue));
  }, "A cross-site fetch without credentials should not refresh");
</script>
