<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Request signals &amp; the cache API</title>
  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>
</head>
<body>
<script>
  promise_test(async () => {
    await caches.delete('test');
    const controller = new AbortController();
    const signal = controller.signal;
    const request = new Request('../resources/data.json', { signal });

    const cache = await caches.open('test');
    await cache.put(request, new Response(''));

    const requests = await cache.keys();

    assert_equals(requests.length, 1, 'Ensuring cleanup worked');

    const [cachedRequest] = requests;

    controller.abort();

    assert_false(cachedRequest.signal.aborted, "Request from cache shouldn't be aborted");

    const data = await fetch(cachedRequest).then(r => r.json());
    assert_equals(data.key, 'value', 'Fetch fully completes');
  }, "Signals are not stored in the cache API");

  promise_test(async () => {
    await caches.delete('test');
    const controller = new AbortController();
    const signal = controller.signal;
    const request = new Request('../resources/data.json', { signal });
    controller.abort();

    const cache = await caches.open('test');
    await cache.put(request, new Response(''));

    const requests = await cache.keys();

    assert_equals(requests.length, 1, 'Ensuring cleanup worked');

    const [cachedRequest] = requests;

    assert_false(cachedRequest.signal.aborted, "Request from cache shouldn't be aborted");

    const data = await fetch(cachedRequest).then(r => r.json());
    assert_equals(data.key, 'value', 'Fetch fully completes');
  }, "Signals are not stored in the cache API, even if they're already aborted");
</script>
</body>
</html>
