<!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.
-->
<!--
  Note: This is a very basic test of the existing minimal Web Worker
  functionality. This can be expanded as more functionality is implemented,
  but probably will be superseded by Web Platform Tests.
-->

<head>
  <title>Cobalt Web Worker Test</title>
  <script src='black_box_js_test_utils.js'></script>
</head>

<body>
  <script>
    var window_error_event_count = 0;
    var worker_error_event_count = 0;
    window.onerror = function (message) {
      window_error_event_count += 1;
      console.error('window got onerror', message);
      notReached();
    };

    var message_event_count = 0;

    // This is expected trigger an error event on the Worker object.
    var worker_with_error = new Worker('web_worker_test_with_syntax_error.js',
      { name: 'worker_with_error' });
    worker_with_error.onerror = function (event) {
      worker_error_event_count += 1;
      assertIncludes('TypeError: self.Foo is not a function', event.message);
    };

    var worker = new Worker('web_worker_test.js', { name: 'test_worker' });
    worker.onerror = function (event) {
      worker_error_event_count += 1;
      console.error('worker got onerror', event.message);
      notReached();
    };
    worker.onmessage = function (event) {
      message_event_count += 1;
      switch (message_event_count) {
        case 1:
          assertEqual('web worker test loaded', event.data);
          break;
        case 2:
          // The first script is expected to execute even though the next
          // one has a syntax error.
          assertEqual('Imported Script 1', event.data);
          break;
        case 3:
          assertEqual('Imported Script Before Syntax Error', event.data);
          break;
        case 4:
          assertEqual('Expected exception message 4: SyntaxError', event.data);
          break;
        case 5:
          assertEqual('Expected exception message 5: SyntaxError', event.data);
          worker.postMessage('import scripts now');
          worker.postMessage('just some data');
          worker.postMessage('a special message');
          break;
        case 6:
          // Scripts loaded with importScripts are guaranteed to execute
          // in order.
          assertEqual('Imported Script 1', event.data);
          break;
        case 7:
          assertEqual('Imported Script 2', event.data);
          break;
        case 8:
          assertEqual('Imported Script 3', event.data);
          break;
        case 9:
          assertEqual('worker received import scripts now', event.data);
          break;
        case 10:
          assertEqual('IMPORT SCRIPTS NOW', event.data);
          break;
        case 11:
          assertEqual('worker received just some data', event.data);
          break;
        case 12:
          assertEqual('JUST SOME DATA', event.data);
          break;
        case 13:
          assertEqual('worker received a special message', event.data);
          break;
        case 14:
          assertEqual('A SPECIAL MESSAGE', event.data);
          worker.terminate();
          window.setTimeout(
            () => {
              assertEqual(14, message_event_count);
              assertEqual(0, window_error_event_count);
              assertEqual(1, worker_error_event_count);
              onEndTest();
            }, 250);
          break;
      }
    };
  </script>
</body>
