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