<!DOCTYPE html>
<meta charset="utf-8">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="helper.js" type="module"></script>

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

  function ws_connect(url) {
    return new Promise(function(resolve,reject) {
      const ws = new WebSocket(url);
      ws.onopen = function () { resolve(); };
      ws.onerror = function(error) { reject(error); };
    });
  }

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

    // In order to validate DBSC is applying to a WebSocket handshake,
    // we need an endpoint that can validate the cookie was refreshed
    // without triggering a refresh itself. Add an excluded endpoint to
    // do that.
    await configureServer({ scopeSpecificationItems: [
      {
      "type": "exclude",
      "domain": location.hostname,
      "path": "/device-bound-session-credentials/excludeInScopeSpecification"
      },
    ]});

    // 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);

    // Confirm that a request has the cookie set.
    const authResponse = await fetch('verify_authenticated.py');
    assert_equals(authResponse.status, 200);

    // Confirm that expiring the cookie still leads to a request with the cookie set (refresh occurs).
    expireCookie(expectedCookieAndAttributes);
    assert_false(documentHasCookie(expectedCookieAndValue));

    // Start a WebSocket handshake. This will fail, but DBSC will still apply to the request.
    try {
      await ws_connect(`wss://${location.host}/device-bound-session-credentials/websocket`);
    } catch (error) {
    }

    // Confirm we're logged in by checking the excluded endpoint.
    const authResponseAfterExpiry = await fetch('excludeInScopeSpecification/excluded_verify_authenticated.py');
    assert_equals(authResponseAfterExpiry.status, 200);
    assert_true(documentHasCookie(expectedCookieAndValue));
  }, "An established session applies to WebSocket handshakes");
</script>
