<!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.
-->
<!--
  Tests postMessage() for service workers.
-->

<html>
<head>
  <title>Cobalt Service Worker postMessage() 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 timeoutId = window.setTimeout(unregisterAndNotReached, 10000);
    window.sharedArrayBufferFromWorker = null;
    window.sharedArrayBufferFromWorkerView = null;
    window.sharedArrayBufferFromWindow = new SharedArrayBuffer(4);
    window.sharedArrayBufferFromWindowView = new Uint8Array(window.sharedArrayBufferFromWindow);
    window.activeServiceWorker = null;
    navigator.serviceWorker.onmessage = event => {
      if (event.data.type === 'check-data') {
        const data = event.data.data;
        assertEqual(1, data.number);
        assertEqual(2, data.array.length);
        assertEqual(2, data.array[0]);
        assertEqual(3, data.array[1]);
        assertEqual('abc', data.string);
        assertEqual(3, data.arrayBuffer.byteLength);
        const arrayBufferView = new Uint8Array(data.arrayBuffer);
        assertEqual(4, arrayBufferView[0]);
        assertEqual(5, arrayBufferView[1]);
        assertEqual(6, arrayBufferView[2]);
        assertEqual(5, data.sharedArrayBuffer.byteLength);
        window.sharedArrayBufferFromWorker = data.sharedArrayBuffer;
        window.sharedArrayBufferFromWorkerView = new Uint8Array(window.sharedArrayBufferFromWorker);
        window.activeServiceWorker.postMessage({
          type: 'update-shared-array-buffers',
          index: 1,
          value: 42,
        });
        return;
      }
      if (event.data.type === 'update-shared-array-buffers-done') {
        assertEqual(42, window.sharedArrayBufferFromWindowView[1]);
        assertEqual(42, window.sharedArrayBufferFromWorkerView[1]);
        window.sharedArrayBufferFromWindowView[0] = 47;
        window.sharedArrayBufferFromWorkerView[0] = 47;
        window.activeServiceWorker.postMessage({
          type: 'check-shared-array-buffers',
          index: 0,
          value: 47,
        })
        return;
      }
      if (event.data.type === 'check-shared-array-buffers-done') {
        unregisterAll().then(() => {
          clearTimeout(timeoutId);
          onEndTest();
        });
        return;
      }
      console.log(JSON.stringify(event.data));
      unregisterAndNotReached();
    };

    navigator.serviceWorker.ready.then(registration => {
      window.activeServiceWorker = registration.active;
      const arrayBuffer = new ArrayBuffer(3);
      const arrayBufferView = new Uint8Array(arrayBuffer);
      arrayBufferView[0] = 4;
      arrayBufferView[1] = 5;
      arrayBufferView[2] = 6;
      window.activeServiceWorker.postMessage({
        type: 'check-data',
        data: {
          number: 1,
          array: [2, 3],
          string: 'abc',
          arrayBuffer,
          sharedArrayBuffer: sharedArrayBufferFromWindow,
        },
      });
    });

    unregisterAll().then(() => {
      navigator.serviceWorker.register('service_worker_post_message_test.js').catch(() => {
        unregisterAndNotReached();
      });
    });

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