<!--
/*
-->
<!doctype html>
<title>same-origin checks</title>
<meta name="timeout" content="long">
<link rel=help href="https://html.spec.whatwg.org/multipage/workers.html#dom-sharedworker">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<script>
// Needed to prevent a race condition if a worker throws an exception that may or may
// not propogate to the window before the tests finish
setup({allow_uncaught_exception: true});

function testSharedWorkerHelper(t, script) {
  try {
    var worker = new SharedWorker(script, '');
    worker.onerror = t.step_func_done(function(e) {
      assert_true(e instanceof Event);
    });
  } catch (e) {
    assert_throws("SecurityError", () => {throw e}, "DOMExceptions thrown on cross-origin SharedWorker construction must be SecurityErrors");
    t.done();
  }
}

test(function() {
  assert_throws("SecurityError", function() { new SharedWorker('unsupported:', ''); });
}, "unsupported_scheme");

async_test(function() {
  var worker = new SharedWorker('data:,onconnect = function(e) { e.ports[0].postMessage(1); }', '');
  worker.port.onmessage = this.step_func_done(function(e) {
    assert_equals(e.data, 1);
  });
}, "data_url");

async_test(function(t) {
  testSharedWorkerHelper(this, 'javascript:""');
}, "javascript_url");

async_test(function(t) {
  testSharedWorkerHelper(this, 'about:blank');
}, "about_blank");

async_test(function(t) {
  testSharedWorkerHelper(this, 'http://www.opera.com/');
}, "opera_com");

async_test(function(t) {
  testSharedWorkerHelper(this, location.protocol+'//'+location.hostname+':81/');
}, "port_81");

async_test(function(t) {
  testSharedWorkerHelper(this, 'https://'+location.hostname+':80/');
}, "https_port_80");

async_test(function(t) {
  testSharedWorkerHelper(this, 'https://'+location.hostname+':8000/');
}, "https_port_8000");

async_test(function(t) {
  testSharedWorkerHelper(this, 'http://'+location.hostname+':8012/');
}, "http_port_8012");
</script>
<!--
*/
//-->
