Add more RTP header extension wpt

BUG=chromium:1051821

Change-Id: I4ac1937cd7e4fbcb41280d1f5a2853d02e497825
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4648130
Reviewed-by: Henrik Boström <hbos@chromium.org>
Commit-Queue: Philipp Hancke <phancke@microsoft.com>
Cr-Commit-Position: refs/heads/main@{#1162858}
diff --git a/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html b/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html
index 79eba02..796d35d 100644
--- a/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html
+++ b/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html
@@ -94,7 +94,7 @@
   t.add_cleanup(() => pc.close());
   const transceiver = pc.addTransceiver('audio');
   const capabilities = transceiver.getHeaderExtensionsToNegotiate();
-  let capability = capabilities.find((capability) => {
+  const capability = capabilities.find((capability) => {
       return capability.uri === 'urn:ietf:params:rtp-hdrext:sdes:mid';
   });
   ['sendonly', 'recvonly', 'inactive', 'stopped'].map(direction => {
@@ -109,14 +109,14 @@
   const pc = new RTCPeerConnection();
   t.add_cleanup(() => pc.close());
   const transceiver = pc.addTransceiver('audio');
-  let capabilities = transceiver.getHeaderExtensionsToNegotiate();
-  let selected_capability = capabilities.find((capability) => {
+  const capabilities = transceiver.getHeaderExtensionsToNegotiate();
+  const selected_capability = capabilities.find((capability) => {
       return capability.direction === 'sendrecv' &&
              capability.uri !== 'urn:ietf:params:rtp-hdrext:sdes:mid';
   });
   selected_capability.direction = 'stopped';
   const offered_capabilities = transceiver.getHeaderExtensionsToNegotiate();
-  let altered_capability = capabilities.find((capability) => {
+  const altered_capability = capabilities.find((capability) => {
       return capability.uri === selected_capability.uri &&
              capability.direction === 'stopped';
   });
@@ -292,4 +292,66 @@
   }
 }, 'Prior to negotiation, getNegotiatedHeaderExtensions() returns `stopped` for all extensions.');
 
+promise_test(async t => {
+  const pc1 = new RTCPeerConnection();
+  t.add_cleanup(() => pc1.close());
+  const pc2 = new RTCPeerConnection();
+  t.add_cleanup(() => pc2.close());
+
+  // Disable a non-mandatory extension before first negotiation.
+  const transceiver = pc1.addTransceiver('video');
+  const capabilities = transceiver.getHeaderExtensionsToNegotiate();
+  const selected_capability = capabilities.find((capability) => {
+      return capability.direction === 'sendrecv' &&
+             capability.uri !== 'urn:ietf:params:rtp-hdrext:sdes:mid';
+  });
+  selected_capability.direction = 'stopped';
+  transceiver.setHeaderExtensionsToNegotiate(capabilities);
+
+  await negotiate(pc1, pc2);
+  const negotiated_capabilites = transceiver.getNegotiatedHeaderExtensions();
+
+  const local_negotiated = transceiver.getNegotiatedHeaderExtensions().find(ext => {
+    return ext.uri === selected_capability.uri;
+  });
+  assert_equals(local_negotiated.direction, 'stopped');
+  const remote_negotiated = pc2.getTransceivers()[0].getNegotiatedHeaderExtensions().find(ext => {
+    return ext.uri === selected_capability.uri;
+  });
+  assert_equals(remote_negotiated.direction, 'stopped');
+}, 'Answer header extensions are a subset of the offered header extensions');
+
+promise_test(async t => {
+  const pc1 = new RTCPeerConnection();
+  t.add_cleanup(() => pc1.close());
+  const pc2 = new RTCPeerConnection();
+  t.add_cleanup(() => pc2.close());
+
+  // Disable a non-mandatory extension before first negotiation.
+  const transceiver = pc1.addTransceiver('video');
+  const capabilities = transceiver.getHeaderExtensionsToNegotiate();
+  const selected_capability = capabilities.find((capability) => {
+      return capability.direction === 'sendrecv' &&
+             capability.uri !== 'urn:ietf:params:rtp-hdrext:sdes:mid';
+  });
+  selected_capability.direction = 'stopped';
+  transceiver.setHeaderExtensionsToNegotiate(capabilities);
+
+  await negotiate(pc1, pc2);
+  // Negotiate, switching sides.
+  await negotiate(pc2, pc1);
+
+  // PC2 will re-offer the extension.
+  const remote_reoffered = pc2.getTransceivers()[0].getHeaderExtensionsToNegotiate().find(ext => {
+    return ext.uri === selected_capability.uri;
+  });
+  assert_equals(remote_reoffered.direction, 'sendrecv');
+
+  // But PC1 will still reject the extension.
+  const negotiated_capabilites = transceiver.getNegotiatedHeaderExtensions();
+  const local_negotiated = transceiver.getNegotiatedHeaderExtensions().find(ext => {
+    return ext.uri === selected_capability.uri;
+  });
+  assert_equals(local_negotiated.direction, 'stopped');
+}, 'A subsequent offer from the other side will reoffer extensions not negotiated by the initial offerer');
 </script>