<!--
/*
-->
<!doctype html>
<title>setting members of worker.port</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<script>
setup(function() {
  window.worker = new SharedWorker('#', '');
});
test(function() {
  worker.port.postMessage = 1;
  assert_equals(worker.port.postMessage, 1);
}, 'postMessage');
test(function() {
  worker.port.start = 1;
  assert_equals(worker.port.start, 1);
}, 'start');
test(function() {
  worker.port.close = 1;
  assert_equals(worker.port.close, 1);
}, 'close');
test(function() {
  var f = function(){};
  worker.port.onmessage = f;
  assert_equals(worker.port.onmessage, f, 'function(){}');
  worker.port.onmessage = 1;
  assert_equals(worker.port.onmessage, null, '1');
  worker.port.onmessage = f;
  worker.port.onmessage = ';';
  assert_equals(worker.port.onmessage, null, '";"');
  worker.port.onmessage = f;
  worker.port.onmessage = {handleEvent:function(){}};
  assert_equals(worker.port.onmessage, null, '{handleEvent:function(){}}');
  worker.port.onmessage = f;
  worker.port.onmessage = null;
  assert_equals(worker.port.onmessage, null, 'null');
  worker.port.onmessage = f;
  worker.port.onmessage = undefined;
  assert_equals(worker.port.onmessage, null, 'undefined');
}, 'onmessage');
test(function() {
  worker.port.addEventListener = 1;
  assert_equals(worker.port.addEventListener, 1);
}, 'addEventListener');
test(function() {
  worker.port.removeEventListener = 1;
  assert_equals(worker.port.removeEventListener, 1);
}, 'removeEventListener');
test(function() {
  worker.port.despatchEvent = 1;
  assert_equals(worker.port.despatchEvent, 1);
}, 'despatchEvent');
</script>
<!--
*/
//-->
