<!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 workers.
-->

<html>
<head>
  <title>Cobalt Worker postMessage() Test</title>
  <script src='black_box_js_test_utils.js'></script>
</head>
<body>
  <script>
    const timeoutId = window.setTimeout(notReached, 10000);
    window.sharedArrayBufferFromWorker = null;
    window.sharedArrayBufferFromWorkerView = null;
    window.sharedArrayBufferFromWindow = new SharedArrayBuffer(4);
    window.sharedArrayBufferFromWindowView = new Uint8Array(window.sharedArrayBufferFromWindow);
    const worker = new Worker('worker_post_message_test.js');
    worker.addEventListener('message', event => {
      if (event.data === 'ready') {
        const arrayBuffer = new ArrayBuffer(3);
        const arrayBufferView = new Uint8Array(arrayBuffer);
        arrayBufferView[0] = 4;
        arrayBufferView[1] = 5;
        arrayBufferView[2] = 6;
        worker.postMessage({
          type: 'check-data',
          data: {
            number: 1,
            array: [2, 3],
            string: 'abc',
            arrayBuffer,
            sharedArrayBuffer: sharedArrayBufferFromWindow,
          },
        });
        return;
      }
      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);
        worker.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;
        worker.postMessage({
          type: 'check-shared-array-buffers',
          index: 0,
          value: 47,
        })
        return;
      }
      if (event.data.type === 'check-shared-array-buffers-done') {
        clearTimeout(timeoutId);
        onEndTest();
        return;
      }
      console.log(JSON.stringify(event.data));
      notReached();
    });

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