<!DOCTYPE html>
<!--
  Copyright 2023 The Cobalt Authors. All Rights Reserved.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<html>
<head>
  <title>Cobalt Service Worker Fetch Main Resource</title>
  <script src='black_box_js_test_utils.js'></script>
</head>
<body>
  <script>
    const unregisterAll = () => navigator.serviceWorker.getRegistrations().then(registrations =>
        Promise.all(registrations.map(r => r.unregister())));
    const fail = msg => {
      if (msg) {
        console.error(msg);
      }
      unregisterAll().then(notReached);
    };
    const success = () => unregisterAll().then(() => {
      clearTimeout(timeoutId);
      onEndTest();
    });
    const assertEquals = (expected, actual, msg) => {
      if (expected === actual) {
        return;
      }
      const errorMessage = `Expected: '${expected}', but was '${actual}'`;
      fail(msg ? `${msg}(${errorMessage})` : errorMessage);
    };
    const timeoutId = window.setTimeout(fail, 5000);
    navigator.serviceWorker.onmessage = event => {
      const requests = event.data;
      assertEquals(2, requests.length);
      // The sub resource is black_box_js_test_utils.js.
      const [mainResourceRequest, subResourceRequest] = requests;
      assertEquals('navigate', mainResourceRequest.mode);
      assertEquals('cors', subResourceRequest.mode);
      success();
    };

    navigator.serviceWorker.getRegistration().then(registration => {
      if (!registration || !registration.active) {
        fail('Expected active registration, but none present.');
      }
      registration.active.postMessage('start');
    });

    setupFinished();
  </script>
</body>
</html>
