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

<head>
  <title>Verify that worker loading correctly follows CSP</title>
  <script src='black_box_js_test_utils.js'></script>
</head>

<body>
  <script>
    var window_onerror_count = 0;
    var worker_onerror_count = 0;
    window.onerror = (message, filename, lineno, colno, error) => {
      ++window_onerror_count;
      console.log('window got onerror', message);
      notReached();
    }

    // This worker is blocked because the URL isn't allowed by CSP.
    try {
      var blocked_worker = new Worker('https://www.google.com/blocked_worker.js');
      blocked_worker.onerror = function (event) {
        ++worker_onerror_count;
        console.log('worker got onerror', event.message);
        if (event.message.includes('blocked_worker.js')) {
          assertIncludes('rejected by security policy', event.message);
          assertEqual('https://www.google.com/blocked_worker.js', event.filename);
        } else {
          notReached();
        }
        if (worker_onerror_count == 1) {
          window.setTimeout(
            () => {
              assertEqual(1, worker_onerror_count);
              assertEqual(0, window_onerror_count);
              onEndTest();
            }, 250);

        }
      };
    } catch (error) {
      // The error is thrown asynchronously after the Worker constructor.
      notReached();
    }
  </script>
</body>
