<!DOCTYPE html>
<meta charset=utf-8>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
async_test(t => {
    const c1 = new BroadcastChannel('blob');
    const c2 = new BroadcastChannel('blob');
    const c3 = new BroadcastChannel('blob');

    let readCount = 0;
    c2.onmessage = t.step_func(e => {
        // check blob
        assert_true('blob' in e.data);
        assert_true(e.data.blob instanceof Blob);
        assert_equals(e.data.blob.size, 6);
        const reader = new FileReader();
        reader.onerror = t.unreached_func();
        reader.onload = t.step_func(() => {
            assert_equals(reader.result, 'foobar');
            if (++readCount == 2)
              t.done();
          });
        reader.readAsText(e.data.blob);
      });
    c3.onmessage = c2.onmessage;
    (() => {
      c1.postMessage({blob: new Blob(['foo', 'bar'])});
    })();
    // TODO(https://github.com/web-platform-tests/wpt/issues/7899): Change to
    // some sort of cross-browser GC trigger.
    if (self.gc) self.gc();
  }, 'Blobs work on BroadcastChannel');

async_test(t => {
    const c1 = new BroadcastChannel('blobworker');
    const c2 = new BroadcastChannel('blobworker');
    const events = [];

    const verifyEvents = function() {
        assert_equals(events.length, 5);
        assert_equals(events[0], 'from worker');
        assert_equals(events[1], 'from worker');
        assert_true(events[2].blob instanceof Blob);
        assert_equals(events[2].blob.size, 11);
        assert_true(events[3].blob instanceof Blob);
        assert_equals(events[3].blob.size, 11);
        assert_equals(events[4], 'done');
        const reader = new FileReader();
        reader.onerror = t.unreached_func();
        reader.onload = t.step_func(() => {
            assert_equals(reader.result, 'hello-world');
            t.done();
          });
        reader.readAsText(events[3].blob);
    };

    let receivedDone = false;
    let receivedWorkerDone = false;

    c1.onmessage = e => events.push(e.data);
    c2.onmessage = e => events.push(e.data);
    c2.addEventListener('message', t.step_func(e => {
        if (e.data.blob)
          c1.postMessage('done');
        if (e.data === 'done')
          receivedDone = true;
        if (receivedDone && receivedWorkerDone)
          verifyEvents();
      }));

    const worker = new Worker('resources/worker.js');
    worker.onmessage = t.step_func(e => {
        receivedWorkerDone = true;
        if (receivedDone && receivedWorkerDone)
          verifyEvents();
      });
    worker.postMessage({channel: 'blobworker'});
    worker.postMessage({blob: ['hello-world']});

  }, 'Blobs work with workers on BroadcastChannel');

</script>
