Revision ac4966fa4dcda8e22ade19e03ed6690de7b9cece authored by Henrik Boström on 28 March 2018, 15:48:04 UTC, committed by Chromium WPT Sync on 28 March 2018, 15:48:04 UTC
This exposes RTCRtpSender.getStats() in JavaScript (behind flag) which
implements the stats selection algorithm[1] for senders.

[1] https://w3c.github.io/webrtc-pc/#dfn-stats-selection-algorithm

Bug: 680172
Change-Id: I8117c87f475d1c78fa3301fc2d821f0c3a21281f
Reviewed-on: https://chromium-review.googlesource.com/975306
Commit-Queue: Henrik Boström <hbos@chromium.org>
Reviewed-by: Philip Jägenstedt <foolip@chromium.org>
Reviewed-by: Harald Alvestrand <hta@chromium.org>
Reviewed-by: Taylor Brandstetter <deadbeef@chromium.org>
Cr-Commit-Position: refs/heads/master@{#546493}
1 parent f9c1a50
Raw File
workers.html
<!DOCTYPE html>
<meta charset=utf-8>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>

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

    c1.onmessage = e => events.push(e);
    c2.onmessage = e => events.push(e);

    let doneCount = 0;
    c2.addEventListener('message', t.step_func(e => {
        if (e.data == 'from worker') {
          c2.postMessage('from c2');
          c1.postMessage('done');
        } else if (e.data == 'done') {
          assert_equals(events.length, 4);
          assert_equals(events[0].data, 'from worker');
          assert_equals(events[0].target, c1);
          assert_equals(events[1].data, 'from worker');
          assert_equals(events[1].target, c2);
          assert_equals(events[2].data, 'from c2');
          assert_equals(events[3].data, 'done');
          if (++doneCount == 2) t.done();
        }
      }));

    let worker = new Worker('resources/worker.js');
    worker.onmessage = t.step_func(e => {
        assert_array_equals(e.data, ['from c2', 'done']);
        if (++doneCount == 2) t.done();
      });
    worker.postMessage({channel: 'worker'});

  }, 'BroadcastChannel works in workers');

async_test(t => {
    let c1 = new BroadcastChannel('shared worker');
    let c2 = new BroadcastChannel('shared worker');
    let events = [];

    c1.onmessage = e => events.push(e);
    c2.onmessage = e => events.push(e);

    let doneCount = 0;
    c2.addEventListener('message', t.step_func(e => {
        if (e.data == 'from worker') {
          c2.postMessage('from c2');
          c1.postMessage('done');
        } else if (e.data == 'done') {
          assert_equals(events.length, 4);
          assert_equals(events[0].data, 'from worker');
          assert_equals(events[0].target, c1);
          assert_equals(events[1].data, 'from worker');
          assert_equals(events[1].target, c2);
          assert_equals(events[2].data, 'from c2');
          assert_equals(events[3].data, 'done');
          if (++doneCount == 2) t.done();
        }
      }));

    let worker = new SharedWorker('resources/worker.js');
    worker.port.onmessage = t.step_func(e => {
        assert_array_equals(e.data, ['from c2', 'done']);
        if (++doneCount == 2) t.done();
      });
    worker.port.postMessage({channel: 'shared worker'});

  }, 'BroadcastChannel works in shared workers');

async_test(t => {
    let c = new BroadcastChannel('worker-close');
    let events = [];

    c.onmessage = e => events.push('c1: ' + e.data);

    let worker = new Worker('resources/worker.js');
    worker.onmessage = t.step_func(e => {
        assert_array_equals(events, ['c1: from worker', 'c2: echo'],
                            'messages in document');
        assert_array_equals(e.data, ['done'], 'messages in worker');
        t.done();
      });

    c.addEventListener('message', e => {
        if (e.data == 'from worker') {
          c.close();
          if (self.gc) self.gc();
          window.setTimeout(() => {
              let c2 = new BroadcastChannel('worker-close');
              c2.onmessage = e => {
                  events.push('c2: ' + e.data);
                  c2.postMessage('done');
                };
              worker.postMessage({ping: 'echo'});
            }, 1);
        }
      });

    worker.postMessage({channel: 'worker-close'});

  }, 'Closing and re-opening a channel works.');

async_test(t => {
  function workerCode() {
    close();
    var bc = new BroadcastChannel('worker-test');
    postMessage(true);
  }

  var workerBlob = new Blob([workerCode.toString() + ";workerCode();"], {type:"application/javascript"});

  var w = new Worker(URL.createObjectURL(workerBlob));
  w.onmessage = function(e) {
    assert_true(e.data, "BroadcastChannel created on worker shutdown.");
    t.done();
  }
}, 'BroadcastChannel created after a worker self.close()');

</script>
back to top