<!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");

      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);
    </script>
  </body>
</html>
