<!doctype html>
<html>
  <head>
    <meta charset=utf-8>
    <title>Test SharedWorkerGlobalScope.isSecureContext for HTTP creator</title>
    <meta name="help" href="https://w3c.github.io/webappsec-secure-contexts/#monkey-patching-global-object">
    <script src=/resources/testharness.js></script>
    <script src=/resources/testharnessreport.js></script>
    <script src="server-locations.sub.js"></script>
  </head>
  <body>
    <script>
      var t1 = async_test("Shared worker");
      var t2 = async_test("Nested worker in shared worker");
      var t3 = async_test("Shared worker from https subframe");
      var t4 = async_test("Nested worker from shared worker from https subframe");
      var t5 = async_test("Shared worker from data URL");

      t1.step(function() {
        var w = new SharedWorker("support/shared-worker-script.js");
        w.port.onmessage = t1.step_func_done(function(e) {
          assert_true(e.data);
        });
        w.port.start();
      });

      t2.step(function() {
        var w = new SharedWorker("support/parent-shared-worker-script.js");
        w.port.onmessage = t2.step_func_done(function(e) {
          assert_true(e.data);
        });
        w.port.start();
      });

      onmessage = function(e) {
        var data = e.data;
        if (data.type == "shared") {
          t3.step(function() {
            assert_false(data.exception);
            assert_false(data.error);
            assert_true(data.isSecureContext);
          });
          t3.done();
        } else if (data.type == "nested") {
          t4.step(function() {
            assert_false(data.exception);
            assert_false(data.error);
            assert_true(data.isSecureContext);
          });
          t4.done();
        } else {
          t3.step(function() {
            assert_unreached("Unknown message");
          });
          t3.done();
          t4.step(function() {
            assert_unreached("Unknown message");
          });
          t4.done();
        }
      }

      var ifr = document.createElement("iframe");
      ifr.src = https_dir3 + "support/https-subframe-shared.html";
      document.body.appendChild(ifr);

      t5.step(function() {
        var w = new SharedWorker(
          `data:text/javascript,addEventListener("connect", function (e) {
             var port = e.ports[0];
             port.start();
             port.postMessage(isSecureContext);
          });`
        );
        w.port.onmessage = t5.step_func_done(function(e) {
          assert_true(e.data);
        });
        w.port.start();
      });
    </script>
  </body>
</html>
