<!DOCTYPE HTML>
<html>
<head>
  <title>Test for BroadcastChannel</title>
  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>

<div id="content"></div>

<script type="application/javascript">

var tests = [
 'hello world',
 123,
 null,
 true,
 new Date(),
 [ 1, 'test', true, new Date() ],
 { a: true, b:  null, c: new Date(), d: [ true, false, {} ] },
 new Blob([123], { type: 'plain/text' })
];

var currentTest = null;

function getType(a) {
  if (a === null || a === undefined)
    return 'null';

  if (Array.isArray(a))
    return 'array';

  if (typeof a == 'object')
    return 'object';

  return 'primitive';
}

function compare(a, b) {
  is (getType(a), getType(b), 'Type matches');

  var type = getType(a);
  if (type == 'array') {
    is (a.length, b.length, 'Array.length matches');
    for (var i = 0; i < a.length; ++i) {
      compare(a[i], b[i]);
    }

    return;
  }

  if (type == 'object') {
    ok (a !== b, 'They should not match');

    var aProps = [];
    for (var p in a) aProps.push(p);

    var bProps = [];
    for (var p in b) bProps.push(p);

    is (aProps.length, bProps.length, 'Props match');
    is (aProps.sort().toSource(), bProps.sort().toSource(), 'Props match - using toSource()');

    for (var p in a) {
      compare(a[p], b[p]);
    }

    return;
  }

  if (type != 'null') {
    is (a.toSource(), b.toSource(), 'Matching using toSource()');
  }
}

function runTest() {
  var count = 2;

  var bc = new BroadcastChannel("foobar");
  ok(bc, "BroadcastChannel can be created");

  bc.onmessage = function(event) {
    ok(count < 2, "Still comparing...");
    info("bc: " + currentTest);
    compare(event.data, currentTest);
    ++count;
    next();
  }

  var bc2 = new BroadcastChannel("foobar");
  ok(bc2, "BroadcastChannel can be created");

  var toSkip = true;
  bc2.onmessage = function(event) {
    toSkip = !toSkip;
    if (toSkip) return;

    ok(count < 2, "Still comparing...");
    info("bc2: " + currentTest);
    compare(event.data, currentTest);
    ++count;
    next();
  }

  function next() {
    if (count < 2) {
      return;
    }

    is(count, 2, "Just 2 comparations");
    count = 0;

    if (!tests.length) {
      SimpleTest.finish();
      return;
    }

    currentTest = tests.shift();
    bc.postMessage(currentTest);
    info("Posted: " + currentTest);
  }

  var worker = new Worker("broadcastchannel_worker_any.js");
  worker.onmessage = function(event) {
    if (event.data == "READY") {
      next();
    }
  };
}

SimpleTest.waitForExplicitFinish();
runTest();

</script>
</body>
</html>