<!DOCTYPE html>
<!--
  Copyright 2022 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.
-->
<!--
  This is a basic test of the fetch event for service workers.
-->

<html>
<head>
  <title>Cobalt Service Worker Fetch Test</title>
  <script src='black_box_js_test_utils.js'></script>
</head>
<body>
  <script>
    h5vcc.storage.clearServiceWorkerCache();

    const unregisterAll = () => navigator.serviceWorker.getRegistrations().then(registrations =>
        Promise.all(registrations.map(r => r.unregister())));
    const unregisterAndNotReached = () => unregisterAll().then(notReached);

    const fetchResource = () => fetch('service_worker_fetch_resource.js').then(r => r.text());
    const timeoutId = window.setTimeout(unregisterAndNotReached, 10000);
    window.activeServiceWorker = null;
    navigator.serviceWorker.onmessage = event => {
      if (event.data.test && event.data.test.indexOf('check-script') === 0) {
        const script = document.createElement('script');
        script.src = 'service_worker_fetch_resource.js';
        document.body.appendChild(script);
        return;
      }
      if (event.data.test && event.data.test.indexOf('check-fetch') === 0) {
        if (event.data.result === 'failed') {
          unregisterAndNotReached();
          return;
        }
        fetchResource().then(body => {
          window.activeServiceWorker.postMessage({test: event.data.test, result: body});
        });
        return;
      }
      if (event.data === 'end-test') {
        unregisterAll().then(() => {
          clearTimeout(timeoutId);
          onEndTest();
        });
        return;
      }
      unregisterAndNotReached();
    };

    navigator.serviceWorker.ready.then(registration => {
      window.activeServiceWorker = registration.active;
      window.activeServiceWorker.postMessage('start-test');
    });

    unregisterAll().then(fetchResource).then(body => {
      if ('window.activeServiceWorker.postMessage("script-not-intercepted");\n' !== body) {
        unregisterAndNotReached();
        return;
      }
      navigator.serviceWorker.register('service_worker_fetch_test.js').catch(() => {
        unregisterAndNotReached();
      });
    });

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