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

<head>
  <title>Verify that XHR on workers correctly follows CSP</title>
  <script src='black_box_js_test_utils.js'></script>
</head>

<body>
  <script>
    var worker;
    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 attempts to do an XHR request that is blocked by CSP.
    worker = new Worker('worker_csp_test.js');
    worker.onmessage = function (event) {
      console.log('worker got onmessage', event.data);
      notReached();
    };
    worker.onerror = function (event) {
      ++worker_onerror_count;
      console.log('worker got onerror', event.message);
      // Note: Worker execution errors currently don't pass line or column
      // number in the error message.
      assertIncludes('SecurityError', event.message);
      assertIncludes('worker_csp_test.js', event.filename);
      assertEqual(1, worker_onerror_count);
      window.setTimeout(
        () => {
          assertEqual(1, worker_onerror_count);
          assertEqual(0, window_onerror_count);
          worker.terminate();
          onEndTest();
        }, 250);
    };

  </script>
</body>
