| <!doctype html> | 
 | <meta charset=utf-8> | 
 | <title>RTCPeerConnection.prototype.setRemoteDescription rollback</title> | 
 | <script src="/resources/testharness.js"></script> | 
 | <script src="/resources/testharnessreport.js"></script> | 
 | <script src="RTCPeerConnection-helper.js"></script> | 
 | <script> | 
 |  'use strict'; | 
 |  | 
 |  // Test is based on the following editor draft: | 
 |  // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html | 
 |  | 
 |  // The following helper functions are called from RTCPeerConnection-helper.js: | 
 |  // generateOffer | 
 |  // assert_session_desc_equals | 
 |  // test_state_change_event | 
 |  | 
 |  /* | 
 |  4.3.2. Interface Definition | 
 |  [Constructor(optional RTCConfiguration configuration)] | 
 |  interface RTCPeerConnection : EventTarget { | 
 |  Promise<void> setLocalDescription( | 
 |  RTCSessionDescriptionInit description); | 
 |  | 
 |  readonly attribute RTCSessionDescription? localDescription; | 
 |  readonly attribute RTCSessionDescription? currentLocalDescription; | 
 |  readonly attribute RTCSessionDescription? pendingLocalDescription; | 
 |  | 
 |  Promise<void> setRemoteDescription( | 
 |  RTCSessionDescriptionInit description); | 
 |  | 
 |  readonly attribute RTCSessionDescription? remoteDescription; | 
 |  readonly attribute RTCSessionDescription? currentRemoteDescription; | 
 |  readonly attribute RTCSessionDescription? pendingRemoteDescription; | 
 |  ... | 
 |  }; | 
 |  | 
 |  4.6.2. RTCSessionDescription Class | 
 |  dictionary RTCSessionDescriptionInit { | 
 |  required RTCSdpType type; | 
 |  DOMString sdp = ""; | 
 |  }; | 
 |  | 
 |  4.6.1. RTCSdpType | 
 |  enum RTCSdpType { | 
 |  "offer", | 
 |  "pranswer", | 
 |  "answer", | 
 |  "rollback" | 
 |  }; | 
 |  */ | 
 |  | 
 |  /* | 
 |  4.3.1.6. Set the RTCSessionSessionDescription | 
 |  2.2.3. Otherwise, if description is set as a remote description, then run one | 
 |  of the following steps: | 
 |  - If description is of type "rollback", then this is a rollback. | 
 |  Set connection.pendingRemoteDescription to null and signaling state to stable. | 
 |  */ | 
 |  promise_test(t => { | 
 |  const pc = new RTCPeerConnection(); | 
 |  | 
 |  test_state_change_event(t, pc, ['have-remote-offer', 'stable']); | 
 |  | 
 |  return generateOffer({ data: true }) | 
 |  .then(offer => pc.setRemoteDescription(offer)) | 
 |  .then(() => { | 
 |  assert_equals(pc.signalingState, 'have-remote-offer'); | 
 |  assert_not_equals(pc.remoteDescription, null); | 
 |  assert_not_equals(pc.pendingRemoteDescription, null); | 
 |  assert_equals(pc.currentRemoteDescription, null); | 
 |  | 
 |  return pc.setRemoteDescription({ type: 'rollback' }); | 
 |  }) | 
 |  .then(() => { | 
 |  assert_equals(pc.signalingState, 'stable'); | 
 |  assert_equals(pc.remoteDescription, null); | 
 |  assert_equals(pc.pendingRemoteDescription, null); | 
 |  assert_equals(pc.currentRemoteDescription, null); | 
 |  }); | 
 |  }, 'setRemoteDescription(rollback) in have-remote-offer state should revert to stable state'); | 
 |  | 
 |  /* | 
 |  4.3.1.6. Set the RTCSessionSessionDescription | 
 |  2.3. If the description's type is invalid for the current signaling state of | 
 |  connection, then reject p with a newly created InvalidStateError and abort | 
 |  these steps. | 
 |  | 
 |  [jsep] | 
 |  4.1.8.2. Rollback | 
 |  - Rollback can only be used to cancel proposed changes; | 
 |  there is no support for rolling back from a stable state to a | 
 |  previous stable state | 
 |  */ | 
 |  promise_test(t => { | 
 |  const pc = new RTCPeerConnection(); | 
 |  return promise_rejects(t, 'InvalidStateError', | 
 |  pc.setRemoteDescription({ type: 'rollback' })); | 
 |  }, `setRemoteDescription(rollback) from stable state should reject with InvalidStateError`); | 
 |  | 
 |  promise_test(t => { | 
 |  const pc = new RTCPeerConnection(); | 
 |  return generateOffer({ audio: true }) | 
 |  .then(offer => pc.setRemoteDescription(offer)) | 
 |  .then(() => pc.setRemoteDescription({ | 
 |  type: 'rollback', | 
 |  sdp: '!<Invalid SDP Content>;' | 
 |  })); | 
 |  }, `setRemoteDescription(rollback) should ignore invalid sdp content and succeed`); | 
 |  | 
 | </script> |