<!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>
      /*
       * The goal of this test is to check that we do the right thing if the
       * same SharedWorker is used first from an secure context and then from
       * an insecure context.
       *
       * To do this, we load a subframe which loads a SharedWorker
       * and communicates back to us whether that worker and a child dedicated
       * worker it spawns think they are secure contexts. Async tests t1 and t2
       * track these two workers.
       *
       * After we have heard from both workers in the subframe, we open an
       * insecure (http) popup, which loads the same exact subframe.  This
       * subframe is still is same-origin with
       * us but not a secure context, since its parent is http, not https.  Then
       * we wait to hear about the status of the workers in the popup's
       * subframe.  Async tests t3 and t4 track these two workers.
       *
       */
      var t1 = async_test("Shared worker in subframe");
      var t2 = async_test("Nested worker in shared worker in subframe");
      var t3 = async_test("Shared worker in popup");
      var t4 = async_test("Nested worker from shared worker in popup");

      var messageCount = 0;
      var popup = null;
      onmessage = function(e) {
        ++messageCount;
        if (messageCount == 4 && popup) {
          popup.close();
        }
        var data = e.data;
        if (data.type == "shared") {
          // This is a message from our shared worker; check whether it's the
          // one in the popup or in our subframe.
          if (data.fromPopup) {
            t3.step(function() {
              assert_false(data.exception, "No exception should be present.");
              assert_true(data.error, "SharedWorker connection should error out.");
            });
            t3.done();
          } else {
            t1.step(function() {
              assert_false(data.exception, "SharedWorker should not throw an exception.");
              assert_false(data.error, "SharedWorker connection should not generate an error.");
              assert_true(data.isSecureContext, "SharedWorker is a secure context");
            });
            t1.done();
          }
        } else if (data.type == "nested") {
          // This is a message from our shared worker's nested dedicated worker;
          // check whether it's the one in the popup or in our subframe.
          if (data.fromPopup) {
            t4.step(function() {
              assert_false(data.exception, "No exception should be present.");
              assert_true(data.error, "SharedWorker connection should error out.");
            });
            t4.done();
          } else {
            t2.step(function() {
              assert_false(data.exception, "SharedWorker should not throw an exception.");
              assert_false(data.error, "SharedWorker connection should not generate an error.");
              assert_true(data.isSecureContext, "SharedWorker is a secure context");
            });
            t2.done();
          }
        } else {
          if (popup) {
            popup.close();
          }
          t1.step(function() {
            assert_unreached("Unknown message");
          });
          t1.done();
          t2.step(function() {
            assert_unreached("Unknown message");
          });
          t2.done();
          t3.step(function() {
            assert_unreached("Unknown message");
          });
          t3.done();
          t4.step(function() {
            assert_unreached("Unknown message");
          });
          t4.done();
        }

        if (messageCount == 2) {
          // Got both messages from our child; time to open our popup
          popup = window.open(http_dir + "support/shared-worker-insecure-popup.html?https_dir4");
        }
      }

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