<!doctype html>
<meta charset=utf-8>
<title>RTCPeerConnection onsignalingstatechanged</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="RTCPeerConnection-helper.js"></script>
<script>

promise_test(async t => {
  const [track] = (await getNoiseStream({video: true})).getTracks();
  t.add_cleanup(() => track.stop());
  const pc1 = new RTCPeerConnection();
  t.add_cleanup(() => pc1.close());
  const pc2 = new RTCPeerConnection();
  t.add_cleanup(() => pc2.close());
  pc1.addTrack(track, new MediaStream());
  await pc1.setLocalDescription(await pc1.createOffer());
  const events = [];
  pc2.onsignalingstatechange = t.step_func(e => {
    const [transceiver] = pc2.getTransceivers();
    assert_equals(transceiver.currentDirection, null);
    events.push(pc2.signalingState);
  });
  await pc2.setRemoteDescription(pc1.localDescription);
  assert_equals(events.length, 1, "event fired");
  assert_equals(events[0], "have-remote-offer");

  pc2.onsignalingstatechange = t.step_func(e => {
    const [transceiver] = pc2.getTransceivers();
    assert_equals(transceiver.currentDirection, "recvonly");
    events.push(pc2.signalingState);
  });
  await pc2.setLocalDescription(await pc2.createAnswer());
  assert_equals(events.length, 2, "event fired");
  assert_equals(events[1], "stable");
}, 'Negotiation methods fire signalingstatechange events');

promise_test(async t => {
  const pc1 = new RTCPeerConnection();
  t.add_cleanup(() => pc1.close());
  const pc2 = new RTCPeerConnection();
  const stream = await getNoiseStream({ audio: true });
  t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));

  stream.getTracks().forEach(track => pc1.addTrack(track, stream));
  exchangeIceCandidates(pc1, pc2);
  exchangeOfferAnswer(pc1, pc2);
  await listenToIceConnected(pc2);

  pc2.onsignalingstatechange = t.unreached_func();
  pc2.close();
  assert_equals(pc2.signalingState, 'closed');
  await new Promise(r => t.step_timeout(r, 100));
}, 'Closing a PeerConnection should not fire signalingstatechange event');

promise_test(async t => {
  const pc1 = new RTCPeerConnection();
  t.add_cleanup(() => pc1.close());
  const pc2 = new RTCPeerConnection();
  t.add_cleanup(() => pc2.close());

  pc2.addTransceiver('video');

  pc1.ontrack = t.unreached_func();
  pc1.onsignalingstatechange = t.step_func(e => {
    pc1.ontrack = null;
  });
  await pc1.setRemoteDescription(await pc2.createOffer());
}, 'signalingstatechange is the first event to fire');

</script>
