https://github.com/web-platform-tests/wpt
Raw File
Tip revision: 9868ad502b989cff5d9a64ac8c0fee9c98f3a5b8 authored by Andy Paicu on 23 March 2018, 15:46:19 UTC
Remove browsing context name on cross origin navigation
Tip revision: 9868ad5
RTCDTMFSender-insertDTMF.https.html
<!doctype html>
<meta charset=utf-8>
<title>RTCDTMFSender.prototype.insertDTMF</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="RTCPeerConnection-helper.js"></script>
<script src="RTCDTMFSender-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
  //   generateAnswer

  // The following helper functions are called from RTCDTMFSender-helper.js
  //   createDtmfSender
  //   test_tone_change_events
  //   getTransceiver

  /*
    7.  Peer-to-peer DTMF
      partial interface RTCRtpSender {
        readonly attribute RTCDTMFSender? dtmf;
      };

      interface RTCDTMFSender : EventTarget {
        void insertDTMF(DOMString tones,
                        optional unsigned long duration = 100,
                        optional unsigned long interToneGap = 70);
                 attribute EventHandler ontonechange;
        readonly attribute DOMString    toneBuffer;
      };
   */

  /*
    7.2.  insertDTMF
      The tones parameter is treated as a series of characters.

      The characters 0 through 9, A through D, #, and * generate the associated
      DTMF tones.

      The characters a to d MUST be normalized to uppercase on entry and are
      equivalent to A to D.

      As noted in [RTCWEB-AUDIO] Section 3, support for the characters 0 through 9,
      A through D, #, and * are required.

      The character ',' MUST be supported, and indicates a delay of 2 seconds
      before processing the next character in the tones parameter.

      All other characters (and only those other characters) MUST be considered
      unrecognized.
   */
  promise_test(t => {
    return createDtmfSender()
  .then(dtmfSender => {
      dtmfSender.insertDTMF('');
      dtmfSender.insertDTMF('012345689');
      dtmfSender.insertDTMF('ABCD');
      dtmfSender.insertDTMF('abcd');
      dtmfSender.insertDTMF('#*');
      dtmfSender.insertDTMF(',');
      dtmfSender.insertDTMF('0123456789ABCDabcd#*,');
    });
  }, 'insertDTMF() should succeed if tones contains valid DTMF characters');


  /*
    7.2.  insertDTMF
      6.  If tones contains any unrecognized characters, throw an
          InvalidCharacterError.
   */
  promise_test(t => {
    return createDtmfSender()
    .then(dtmfSender => {
      assert_throws('InvalidCharacterError', () =>
        // 'F' is invalid
        dtmfSender.insertDTMF('123FFABC'));

      assert_throws('InvalidCharacterError', () =>
        // 'E' is invalid
        dtmfSender.insertDTMF('E'));

      assert_throws('InvalidCharacterError', () =>
        // ' ' is invalid
        dtmfSender.insertDTMF('# *'));
    });
  }, 'insertDTMF() should throw InvalidCharacterError if tones contains invalid DTMF characters');

  /*
    7.2.  insertDTMF
      3.  If transceiver.stopped is true, throw an InvalidStateError.
   */
  test(t => {
    const pc = new RTCPeerConnection();
    const transceiver = pc.addTransceiver('audio');
    const dtmfSender = transceiver.sender.dtmf;

    transceiver.stop();
    assert_throws('InvalidStateError', () => dtmfSender.insertDTMF(''));

  }, 'insertDTMF() should throw InvalidStateError if transceiver is stopped');

  /*
    7.2.  insertDTMF
      4.  If transceiver.currentDirection is recvonly or inactive, throw an InvalidStateError.
   */
  promise_test(t => {
    const pc = new RTCPeerConnection();
    const transceiver = pc.addTransceiver('audio', {
      direction: 'recvonly'
    });
    const dtmfSender = transceiver.sender.dtmf;

    return pc.createOffer()
    .then(offer =>
      pc.setLocalDescription(offer)
      .then(() => generateAnswer(offer)))
    .then(() => {
      assert_equals(transceiver.currentDirection, 'inactive');
      assert_throws('InvalidStateError', () => dtmfSender.insertDTMF(''));
    });
  }, 'insertDTMF() should throw InvalidStateError if transceiver.currentDirection is recvonly');

  promise_test(t => {
    const pc = new RTCPeerConnection();
    const transceiver = pc.addTransceiver('audio', {
      direction: 'inactive'
    });
    const dtmfSender = transceiver.sender.dtmf;

    return pc.createOffer()
    .then(offer =>
      pc.setLocalDescription(offer)
      .then(() => generateAnswer(offer)))
    .then(() => {
      assert_equals(transceiver.currentDirection, 'inactive');
      assert_throws('InvalidStateError', () => dtmfSender.insertDTMF(''));
    });
  }, 'insertDTMF() should throw InvalidStateError if transceiver.currentDirection is inactive');

  /*
    7.2.  insertDTMF
      The characters a to d MUST be normalized to uppercase on entry and are
      equivalent to A to D.

      7.  Set the object's toneBuffer attribute to tones.
   */
  promise_test(() => {
    return createDtmfSender()
    .then(dtmfSender => {
      dtmfSender.insertDTMF('123');
      assert_equals(dtmfSender.toneBuffer, '123');

      dtmfSender.insertDTMF('ABC');
      assert_equals(dtmfSender.toneBuffer, 'ABC');

      dtmfSender.insertDTMF('bcd');
      assert_equals(dtmfSender.toneBuffer, 'BCD');
    });
  }, 'insertDTMF() should set toneBuffer to provided tones normalized, with old tones overridden');

  promise_test(t => {
    let dtmfSender;
    let sender;
    let pc = new RTCPeerConnection();
    return getTrackFromUserMedia('audio')
      .then(([track, mediaStream]) => {
        sender = pc.addTrack(track, mediaStream);
        return pc.createOffer();
      }).then(offer => {
        pc.setLocalDescription(offer);
        dtmfSender = sender.dtmf;
        pc.removeTrack(sender);
        pc.close();
        assert_throws('InvalidStateError', () =>
                      dtmfSender.insertDTMF('123'));
      });
  }, 'insertDTMF() after remove and close should reject');

</script>
back to top