<!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;
    window.onerror = function (message) {
        window_error_event_count += 1;
        assertIncludes('TypeError: self.Foo is not a function', message);
        console.log('window got onerror', message);
    };

    var message_event_count = 0;
    console.log('running');

    // This is expected trigger a an error event on window.
    var worker_with_error = new Worker('web_worker_test_with_syntax_error.js');

    var worker = new Worker('web_worker_test.js');
    console.log(worker);
    worker.onmessage = function (event) {
        message_event_count += 1;
        console.log('window got message', message_event_count, 'from worker:', event.data);
        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(1, window_error_event_count);
                        onEndTest();
                    }, 250);
                break;
        }
    };
    worker.onerror = function (event) {
        console.log('window got onerror');
        notReached();
    };
    console.log('end');
</script>
</body>
