Bug 1119593 - Update gUM tests to use promises consistently, r=drno,jib, a=testonly
authorMartin Thomson <martin.thomson@gmail.com>
Sat, 21 Feb 2015 10:15:04 +1300
changeset 249893 60538ae8bc51d756bb69711b4f05c91d129fe54b
parent 249892 a983c31d2dcde10f4c4b6c3f34de36b2e2d51b62
child 249894 336892fb1df2a799f1d9026bcfd3e79b517ca95b
push id4489
push userraliiev@mozilla.com
push dateMon, 23 Feb 2015 15:17:55 +0000
treeherdermozilla-beta@fd7c3dc24146 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersdrno, jib, testonly
bugs1119593
milestone37.0a2
Bug 1119593 - Update gUM tests to use promises consistently, r=drno,jib, a=testonly Conflicts: dom/media/tests/mochitest/constraints.js Conflicts: dom/media/tests/mochitest/constraints.js
dom/media/tests/mochitest/constraints.js
dom/media/tests/mochitest/mediaStreamPlayback.js
dom/media/tests/mochitest/test_getUserMedia_basicAudio.html
dom/media/tests/mochitest/test_getUserMedia_basicScreenshare.html
dom/media/tests/mochitest/test_getUserMedia_basicVideo.html
dom/media/tests/mochitest/test_getUserMedia_basicVideoAudio.html
dom/media/tests/mochitest/test_getUserMedia_basicWindowshare.html
dom/media/tests/mochitest/test_getUserMedia_gumWithinGum.html
dom/media/tests/mochitest/test_getUserMedia_playAudioTwice.html
dom/media/tests/mochitest/test_getUserMedia_playVideoAudioTwice.html
dom/media/tests/mochitest/test_getUserMedia_playVideoTwice.html
dom/media/tests/mochitest/test_getUserMedia_stopAudioStream.html
dom/media/tests/mochitest/test_getUserMedia_stopAudioStreamWithFollowupAudio.html
dom/media/tests/mochitest/test_getUserMedia_stopVideoAudioStream.html
dom/media/tests/mochitest/test_getUserMedia_stopVideoAudioStreamWithFollowupVideoAudio.html
dom/media/tests/mochitest/test_getUserMedia_stopVideoStream.html
dom/media/tests/mochitest/test_getUserMedia_stopVideoStreamWithFollowupVideo.html
--- a/dom/media/tests/mochitest/constraints.js
+++ b/dom/media/tests/mochitest/constraints.js
@@ -47,28 +47,23 @@ var common_tests = [
 
 
 /**
  * Starts the test run by running through each constraint
  * test by verifying that the right resolution and rejection is fired.
  */
 
 function testConstraints(tests) {
-  function testgum(p, test) {
-    return p.then(function() {
-      return navigator.mediaDevices.getUserMedia(test.constraints);
-    })
-    .then(function() {
-      is(null, test.error, test.message);
-    }, function(reason) {
-      is(reason.name, test.error, test.message + ": " + reason.message);
-    });
+  function testgum(prev, test) {
+    return prev.then(() => navigator.mediaDevices.getUserMedia(test.constraints))
+      .then(() => is(null, test.error, test.message),
+            reason => is(reason.name, test.error, test.message + ": " + reason.message));
   }
 
-  var p = new Promise(function(resolve) { resolve(); });
-  tests.forEach(function(test) {
-    p = testgum(p, test);
-  });
-  p.catch(function(reason) {
-    ok(false, "Unexpected failure: " + reason.message);
-  })
-  .then(SimpleTest.finish);
+  var p = new Promise(resolve => SpecialPowers.pushPrefEnv({
+    set : [ ['media.getusermedia.browser.enabled', false],
+            ['media.getusermedia.screensharing.enabled', false] ]
+  }, resolve));
+
+  tests.reduce(testgum, p)
+    .catch(reason => ok(false, "Unexpected failure: " + reason.message))
+    .then(SimpleTest.finish);
 }
--- a/dom/media/tests/mochitest/mediaStreamPlayback.js
+++ b/dom/media/tests/mochitest/mediaStreamPlayback.js
@@ -32,137 +32,123 @@ MediaStreamPlayback.prototype = {
    *
    * @param {Boolean} isResume specifies if this media element is being resumed
    *                           from a previous run
    * @param {Function} onSuccess the success callback if the media playback
    *                             start and stop cycle completes successfully
    * @param {Function} onError the error callback if the media playback
    *                           start and stop cycle fails
    */
-  playMedia : function MSP_playMedia(isResume, onSuccess, onError) {
-    var self = this;
-
-    this.startMedia(isResume, function() {
-      self.stopMediaElement();
-      onSuccess();
-    }, onError);
+  playMedia : function(isResume) {
+    return this.startMedia(isResume)
+      .then(() => this.stopMediaElement());
   },
 
   /**
    * Starts the media with the associated stream.
    *
    * @param {Boolean} isResume specifies if the media element playback
    *                           is being resumed from a previous run
-   * @param {Function} onSuccess the success function call back
-   *                             if media starts correctly
-   * @param {Function} onError the error function call back
-   *                           if media fails to start
    */
-  startMedia : function MSP_startMedia(isResume, onSuccess, onError) {
-    var self = this;
+  startMedia : function(isResume) {
     var canPlayThroughFired = false;
 
     // If we're initially running this media, check that the time is zero
     if (!isResume) {
       is(this.mediaStream.currentTime, 0,
          "Before starting the media element, currentTime = 0");
     }
 
-    /**
-     * Callback fired when the canplaythrough event is fired. We only
-     * run the logic of this function once, as this event can fire
-     * multiple times while a HTMLMediaStream is playing content from
-     * a real-time MediaStream.
-     */
-    var canPlayThroughCallback = function() {
-      // Disable the canplaythrough event listener to prevent multiple calls
-      canPlayThroughFired = true;
-      self.mediaElement.removeEventListener('canplaythrough',
-        canPlayThroughCallback, false);
+    return new Promise((resolve, reject) => {
+      /**
+       * Callback fired when the canplaythrough event is fired. We only
+       * run the logic of this function once, as this event can fire
+       * multiple times while a HTMLMediaStream is playing content from
+       * a real-time MediaStream.
+       */
+      var canPlayThroughCallback = () => {
+        // Disable the canplaythrough event listener to prevent multiple calls
+        canPlayThroughFired = true;
+        this.mediaElement.removeEventListener('canplaythrough',
+                                              canPlayThroughCallback, false);
 
-      is(self.mediaElement.paused, false,
-        "Media element should be playing");
-      is(self.mediaElement.duration, Number.POSITIVE_INFINITY,
-        "Duration should be infinity");
+        is(this.mediaElement.paused, false,
+           "Media element should be playing");
+        is(this.mediaElement.duration, Number.POSITIVE_INFINITY,
+           "Duration should be infinity");
 
-      // When the media element is playing with a real-time stream, we
-      // constantly switch between having data to play vs. queuing up data,
-      // so we can only check that the ready state is one of those two values
-      ok(self.mediaElement.readyState === HTMLMediaElement.HAVE_ENOUGH_DATA ||
-         self.mediaElement.readyState === HTMLMediaElement.HAVE_CURRENT_DATA,
-         "Ready state shall be HAVE_ENOUGH_DATA or HAVE_CURRENT_DATA");
+        // When the media element is playing with a real-time stream, we
+        // constantly switch between having data to play vs. queuing up data,
+        // so we can only check that the ready state is one of those two values
+        ok(this.mediaElement.readyState === HTMLMediaElement.HAVE_ENOUGH_DATA ||
+           this.mediaElement.readyState === HTMLMediaElement.HAVE_CURRENT_DATA,
+           "Ready state shall be HAVE_ENOUGH_DATA or HAVE_CURRENT_DATA");
+
+        is(this.mediaElement.seekable.length, 0,
+           "Seekable length shall be zero");
+        is(this.mediaElement.buffered.length, 0,
+           "Buffered length shall be zero");
 
-      is(self.mediaElement.seekable.length, 0,
-         "Seekable length shall be zero");
-      is(self.mediaElement.buffered.length, 0,
-         "Buffered length shall be zero");
+        is(this.mediaElement.seeking, false,
+           "MediaElement is not seekable with MediaStream");
+        ok(isNaN(this.mediaElement.startOffsetTime),
+           "Start offset time shall not be a number");
+        is(this.mediaElement.loop, false, "Loop shall be false");
+        is(this.mediaElement.preload, "", "Preload should not exist");
+        is(this.mediaElement.src, "", "No src should be defined");
+        is(this.mediaElement.currentSrc, "",
+           "Current src should still be an empty string");
 
-      is(self.mediaElement.seeking, false,
-         "MediaElement is not seekable with MediaStream");
-      ok(isNaN(self.mediaElement.startOffsetTime),
-         "Start offset time shall not be a number");
-      is(self.mediaElement.loop, false, "Loop shall be false");
-      is(self.mediaElement.preload, "", "Preload should not exist");
-      is(self.mediaElement.src, "", "No src should be defined");
-      is(self.mediaElement.currentSrc, "",
-         "Current src should still be an empty string");
+        var timeUpdateCallback = () => {
+          if (this.mediaStream.currentTime > 0 &&
+              this.mediaElement.currentTime > 0) {
+            this.mediaElement.removeEventListener('timeupdate',
+                                                  timeUpdateCallback, false);
+            resolve();
+          }
+        };
 
-      var timeUpdateFired = false;
+        // When timeupdate fires, we validate time has passed and move
+        // onto the success condition
+        this.mediaElement.addEventListener('timeupdate', timeUpdateCallback,
+                                           false);
 
-      var timeUpdateCallback = function() {
-        if (self.mediaStream.currentTime > 0 &&
-            self.mediaElement.currentTime > 0) {
-          timeUpdateFired = true;
-          self.mediaElement.removeEventListener('timeupdate',
-            timeUpdateCallback, false);
-          onSuccess();
-        }
+        // If timeupdate doesn't fire in enough time, we fail the test
+        setTimeout(() => {
+          this.mediaElement.removeEventListener('timeupdate',
+                                                timeUpdateCallback, false);
+          reject(new Error("timeUpdate event never fired"));
+        }, TIMEUPDATE_TIMEOUT_LENGTH);
       };
 
-      // When timeupdate fires, we validate time has passed and move
-      // onto the success condition
-      self.mediaElement.addEventListener('timeupdate', timeUpdateCallback,
-        false);
-
-      // If timeupdate doesn't fire in enough time, we fail the test
-      setTimeout(function() {
-        if (!timeUpdateFired) {
-          self.mediaElement.removeEventListener('timeupdate',
-            timeUpdateCallback, false);
-          onError("timeUpdate event never fired");
-        }
-      }, TIMEUPDATE_TIMEOUT_LENGTH);
-    };
+      // Adds a listener intended to be fired when playback is available
+      // without further buffering.
+      this.mediaElement.addEventListener('canplaythrough', canPlayThroughCallback,
+                                         false);
 
-    // Adds a listener intended to be fired when playback is available
-    // without further buffering.
-    this.mediaElement.addEventListener('canplaythrough', canPlayThroughCallback,
-      false);
-
-    // Hooks up the media stream to the media element and starts playing it
-    this.mediaElement.mozSrcObject = this.mediaStream;
-    this.mediaElement.play();
+      // Hooks up the media stream to the media element and starts playing it
+      this.mediaElement.mozSrcObject = this.mediaStream;
+      this.mediaElement.play();
 
-    // If canplaythrough doesn't fire in enough time, we fail the test
-    setTimeout(function() {
-      if (!canPlayThroughFired) {
-        self.mediaElement.removeEventListener('canplaythrough',
-          canPlayThroughCallback, false);
-        onError("canplaythrough event never fired");
-      }
-    }, CANPLAYTHROUGH_TIMEOUT_LENGTH);
+      // If canplaythrough doesn't fire in enough time, we fail the test
+      setTimeout(() => {
+        this.mediaElement.removeEventListener('canplaythrough',
+                                              canPlayThroughCallback, false);
+        reject(new Error("canplaythrough event never fired"));
+      }, CANPLAYTHROUGH_TIMEOUT_LENGTH);
+    });
   },
 
   /**
    * Stops the media with the associated stream.
    *
    * Precondition: The media stream and element should both be actively
    *               being played.
    */
-  stopMediaElement : function MSP_stopMediaElement() {
+  stopMediaElement : function() {
     this.mediaElement.pause();
     this.mediaElement.mozSrcObject = null;
   }
 }
 
 
 /**
  * This class is basically the same as MediaStreamPlayback except
@@ -181,69 +167,49 @@ function LocalMediaStreamPlayback(mediaE
 LocalMediaStreamPlayback.prototype = Object.create(MediaStreamPlayback.prototype, {
 
   /**
    * Starts media with a media stream, runs it until a canplaythrough and
    * timeupdate event fires, and calls stop() on the stream.
    *
    * @param {Boolean} isResume specifies if this media element is being resumed
    *                           from a previous run
-   * @param {Function} onSuccess the success callback if the media element
-   *                             successfully fires ended on a stop() call
-   *                             on the stream
-   * @param {Function} onError the error callback if the media element fails
-   *                           to fire an ended callback on a stop() call
-   *                           on the stream
    */
   playMediaWithStreamStop : {
-    value: function (isResume, onSuccess, onError) {
-      var self = this;
-
-      this.startMedia(isResume, function() {
-        self.stopStreamInMediaPlayback(function() {
-          self.stopMediaElement();
-          onSuccess();
-        }, onError);
-      }, onError);
+    value: function(isResume) {
+      return this.startMedia(isResume)
+        .then(() => this.stopStreamInMediaPlayback())
+        .then(() => this.stopMediaElement());
     }
   },
 
   /**
    * Stops the local media stream while it's currently in playback in
    * a media element.
    *
    * Precondition: The media stream and element should both be actively
    *               being played.
    *
-   * @param {Function} onSuccess the success callback if the media element
-   *                             fires an ended event from stop() being called
-   * @param {Function} onError the error callback if the media element
-   *                           fails to fire an ended event from stop() being
-   *                           called
    */
   stopStreamInMediaPlayback : {
-    value: function (onSuccess, onError) {
-      var endedFired = false;
-      var self = this;
+    value: function () {
+      return new Promise((resolve, reject) => {
+        /**
+         * Callback fired when the ended event fires when stop() is called on the
+         * stream.
+         */
+        var endedCallback = () => {
+          this.mediaElement.removeEventListener('ended', endedCallback, false);
+          ok(true, "ended event successfully fired");
+          resolve();
+        };
 
-      /**
-       * Callback fired when the ended event fires when stop() is called on the
-       * stream.
-       */
-      var endedCallback = function() {
-        endedFired = true;
-        self.mediaElement.removeEventListener('ended', endedCallback, false);
-        ok(true, "ended event successfully fired");
-        onSuccess();
-      };
+        this.mediaElement.addEventListener('ended', endedCallback, false);
+        this.mediaStream.stop();
 
-      this.mediaElement.addEventListener('ended', endedCallback, false);
-      this.mediaStream.stop();
-
-      // If ended doesn't fire in enough time, then we fail the test
-      setTimeout(function() {
-        if (!endedFired) {
-          onError("ended event never fired");
-        }
-      }, ENDED_TIMEOUT_LENGTH);
+        // If ended doesn't fire in enough time, then we fail the test
+        setTimeout(() => {
+          reject(new Error("ended event never fired"));
+        }, ENDED_TIMEOUT_LENGTH);
+      });
     }
   }
 });
--- a/dom/media/tests/mochitest/test_getUserMedia_basicAudio.html
+++ b/dom/media/tests/mochitest/test_getUserMedia_basicAudio.html
@@ -1,46 +1,41 @@
 <!DOCTYPE HTML>
 <html>
 <!--
 https://bugzilla.mozilla.org/show_bug.cgi?id=781534
 -->
 <head>
   <meta charset="utf-8">
-  <title>mozGetUserMedia Basic Audio Test</title>
+  <title>getUserMedia Basic Audio Test</title>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="application/javascript" src="head.js"></script>
   <script type="application/javascript" src="mediaStreamPlayback.js"></script>
 </head>
 <body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=781534">mozGetUserMedia Basic Audio Test</a>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=781534">getUserMedia Basic Audio Test</a>
 <p id="display"></p>
 <div id="content" style="display: none">
   <audio id="testAudio"></audio>
 </div>
 <pre id="test">
 <script type="application/javascript">
   /**
    * Run a test to verify that we can complete a start and stop media playback
    * cycle for an audio LocalMediaStream on an audio HTMLMediaElement.
    */
   runTest(function () {
     var testAudio = document.getElementById('testAudio');
     var constraints = {audio: true};
 
-    getUserMedia(constraints, function (aStream) {
+    getUserMedia(constraints).then(aStream => {
       checkMediaStreamTracks(constraints, aStream);
 
       var playback = new LocalMediaStreamPlayback(testAudio, aStream);
-      playback.playMedia(false, function () {
-        aStream.stop();
-        SimpleTest.finish();
-      }, generateErrorCallback());
-
-    }, generateErrorCallback());
-
+      return playback.playMedia(false);
+    }).then(() => SimpleTest.finish(), generateErrorCallback());
   });
 
 </script>
 </pre>
 </body>
 </html>
--- a/dom/media/tests/mochitest/test_getUserMedia_basicScreenshare.html
+++ b/dom/media/tests/mochitest/test_getUserMedia_basicScreenshare.html
@@ -1,23 +1,23 @@
 <!DOCTYPE HTML>
 <html>
 <!--
 https://bugzilla.mozilla.org/show_bug.cgi?id=983504
 -->
 <head>
   <meta charset="utf-8">
-  <title>mozGetUserMedia Basic Screenshare Test</title>
+  <title>getUserMedia Basic Screenshare Test</title>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="application/javascript" src="head.js"></script>
   <script type="application/javascript" src="mediaStreamPlayback.js"></script>
 </head>
 <body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=983504">mozGetUserMedia Basic Screenshare Test</a>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=983504">getUserMedia Basic Screenshare Test</a>
 <p id="display"></p>
 <div id="content" style="display: none">
   <video id="testVideo"></video>
 </div>
 <pre id="test">
 <script type="application/javascript">
   /**
    * Run a test to verify that we can complete a start and stop media playback
@@ -34,25 +34,21 @@ https://bugzilla.mozilla.org/show_bug.cg
     var constraints = {
       video: {
          mozMediaSource: "screen",
          mediaSource: "screen"
       },
       fake: false
     };
 
-    getUserMedia(constraints, function (aStream) {
+    getUserMedia(constraints).then(aStream => {
       checkMediaStreamTracks(constraints, aStream);
 
       var playback = new LocalMediaStreamPlayback(testVideo, aStream);
-      playback.playMediaWithStreamStop(false, function () {
-        aStream.stop();
-        SimpleTest.finish();
-      }, generateErrorCallback());
-
-    }, generateErrorCallback());
+      return playback.playMediaWithStreamStop(false);
+    }).then(() => SimpleTest.finish(), generateErrorCallback());
 
   });
 
 </script>
 </pre>
 </body>
 </html>
--- a/dom/media/tests/mochitest/test_getUserMedia_basicVideo.html
+++ b/dom/media/tests/mochitest/test_getUserMedia_basicVideo.html
@@ -1,46 +1,41 @@
 <!DOCTYPE HTML>
 <html>
 <!--
 https://bugzilla.mozilla.org/show_bug.cgi?id=781534
 -->
 <head>
   <meta charset="utf-8">
-  <title>mozGetUserMedia Basic Video Test</title>
+  <title>getUserMedia Basic Video Test</title>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="application/javascript" src="head.js"></script>
   <script type="application/javascript" src="mediaStreamPlayback.js"></script>
 </head>
 <body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=781534">mozGetUserMedia Basic Video Test</a>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=781534">getUserMedia Basic Video Test</a>
 <p id="display"></p>
 <div id="content" style="display: none">
   <video id="testVideo"></video>
 </div>
 <pre id="test">
 <script type="application/javascript">
   /**
    * Run a test to verify that we can complete a start and stop media playback
    * cycle for an video LocalMediaStream on a video HTMLMediaElement.
    */
   runTest(function () {
     var testVideo = document.getElementById('testVideo');
     var constraints = {video: true};
 
-    getUserMedia(constraints, function (aStream) {
+    getUserMedia(constraints).then(aStream => {
       checkMediaStreamTracks(constraints, aStream);
 
       var playback = new LocalMediaStreamPlayback(testVideo, aStream);
-      playback.playMedia(false, function () {
-        aStream.stop();
-        SimpleTest.finish();
-      }, generateErrorCallback());
-
-    }, generateErrorCallback());
-
+      return playback.playMedia(false);
+    }).then(() => SimpleTest.finish(), generateErrorCallback());
   });
 
 </script>
 </pre>
 </body>
 </html>
--- a/dom/media/tests/mochitest/test_getUserMedia_basicVideoAudio.html
+++ b/dom/media/tests/mochitest/test_getUserMedia_basicVideoAudio.html
@@ -1,45 +1,41 @@
 <!DOCTYPE HTML>
 <html>
 <!--
 https://bugzilla.mozilla.org/show_bug.cgi?id=781534
 -->
 <head>
   <meta charset="utf-8">
-  <title>mozGetUserMedia Basic Video & Audio Test</title>
+  <title>getUserMedia Basic Video & Audio Test</title>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="application/javascript" src="head.js"></script>
   <script type="application/javascript" src="mediaStreamPlayback.js"></script>
 </head>
 <body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=781534">mozGetUserMedia Basic Video & Audio Test</a>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=781534">getUserMedia Basic Video & Audio Test</a>
 <p id="display"></p>
 <div id="content" style="display: none">
   <video id="testVideoAudio"></video>
 </div>
 <pre id="test">
-<script type="application/javascript">
+  <script type="application/javascript">
   /**
    * Run a test to verify that we can complete a start and stop media playback
    * cycle for a video and audio LocalMediaStream on a video HTMLMediaElement.
    */
   runTest(function () {
     var testVideoAudio = document.getElementById('testVideoAudio');
     var constraints = {video: true, audio: true};
 
-    getUserMedia(constraints, function (aStream) {
+    getUserMedia(constraints).then(aStream => {
       checkMediaStreamTracks(constraints, aStream);
 
       var playback = new LocalMediaStreamPlayback(testVideoAudio, aStream);
-      playback.playMedia(false, function () {
-        aStream.stop();
-        SimpleTest.finish();
-      }, generateErrorCallback());
-
-    }, generateErrorCallback());
+      return playback.playMedia(false);
+    }).then(() => SimpleTest.finish(), generateErrorCallback());
   });
 
 </script>
 </pre>
 </body>
 </html>
--- a/dom/media/tests/mochitest/test_getUserMedia_basicWindowshare.html
+++ b/dom/media/tests/mochitest/test_getUserMedia_basicWindowshare.html
@@ -1,23 +1,23 @@
 <!DOCTYPE HTML>
 <html>
 <!--
 https://bugzilla.mozilla.org/show_bug.cgi?id=983504
 -->
 <head>
   <meta charset="utf-8">
-  <title>mozGetUserMedia Basic Windowshare Test</title>
+  <title>getUserMedia Basic Windowshare Test</title>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="application/javascript" src="head.js"></script>
   <script type="application/javascript" src="mediaStreamPlayback.js"></script>
 </head>
 <body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1038926">mozGetUserMedia Basic Windowshare Test</a>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1038926">getUserMedia Basic Windowshare Test</a>
 <p id="display"></p>
 <div id="content" style="display: none">
   <video id="testVideo"></video>
 </div>
 <pre id="test">
 <script type="application/javascript">
   /**
    * Run a test to verify that we can complete a start and stop media playback
@@ -34,25 +34,21 @@ https://bugzilla.mozilla.org/show_bug.cg
     var constraints = {
       video: {
          mozMediaSource: "window",
          mediaSource: "window"
       },
       fake: false
     };
 
-    getUserMedia(constraints, function (aStream) {
+    getUserMedia(constraints).then(aStream => {
       checkMediaStreamTracks(constraints, aStream);
 
       var playback = new LocalMediaStreamPlayback(testVideo, aStream);
-      playback.playMediaWithStreamStop(false, function () {
-        aStream.stop();
-        SimpleTest.finish();
-      }, generateErrorCallback());
-
-    }, generateErrorCallback());
+      return playback.playMediaWithStreamStop(false);
+    }).then(() => SimpleTest.finish(), generateErrorCallback());
 
   });
 
 </script>
 </pre>
 </body>
 </html>
--- a/dom/media/tests/mochitest/test_getUserMedia_gumWithinGum.html
+++ b/dom/media/tests/mochitest/test_getUserMedia_gumWithinGum.html
@@ -1,56 +1,53 @@
-<!DOCTYPE HTML>
+<!DOCTYPE HTML>
 <html>
 <!--
 https://bugzilla.mozilla.org/show_bug.cgi?id=822109
 -->
 <head>
   <meta charset="utf-8">
-  <title>mozGetUserMedia gum within gum</title>
+  <title>getUserMedia gum within gum</title>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="application/javascript" src="head.js"></script>
   <script type="application/javascript" src="mediaStreamPlayback.js"></script>
 </head>
 <body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=822109">mozGetUserMedia gum within gum</a>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=822109">getUserMedia gum within gum</a>
 <p id="display"></p>
 <div id="content" style="display: none">
   <video id="testVideo"></video>
   <audio id="testAudio"></audio>
 </div>
 <pre id="test">
 <script type="application/javascript">
   /**
    * Run a test that we can complete a playback cycle for a video,
    * then upon completion, do a playback cycle with audio, such that
    * the audio gum call happens within the video gum call.
    */
   runTest(function () {
-    getUserMedia({video: true}, function(videoStream) {
-      var testVideo = document.getElementById('testVideo');
-      var videoStreamPlayback = new LocalMediaStreamPlayback(testVideo,
-        videoStream);
-
-      videoStreamPlayback.playMedia(false, function() {
-        getUserMedia({audio: true}, function(audioStream) {
-          var testAudio = document.getElementById('testAudio');
-          var audioStreamPlayback = new LocalMediaStreamPlayback(testAudio,
-            audioStream);
+    getUserMedia({video: true})
+      .then(videoStream => {
+        var testVideo = document.getElementById('testVideo');
+        var videoStreamPlayback = new LocalMediaStreamPlayback(testVideo,
+                                                               videoStream);
 
-          audioStreamPlayback.playMedia(false, function() {
-            audioStream.stop();
-            videoStream.stop();
-            SimpleTest.finish();
-          }, generateErrorCallback());
+        return videoStreamPlayback.playMedia(false)
+          .then(() => getUserMedia({audio: true}))
+          .then(audioStream => {
+            var testAudio = document.getElementById('testAudio');
+            var audioStreamPlayback = new LocalMediaStreamPlayback(testAudio,
+                                                                   audioStream);
 
-        }, generateErrorCallback());
-
-      }, generateErrorCallback());
-
-    }, generateErrorCallback());
+            return audioStreamPlayback.playMedia(false)
+              .then(() => audioStream.stop());
+          })
+          .then(() => videoStream.stop());
+      })
+      .then(() => SimpleTest.finish(), generateErrorCallback());
   });
 
 </script>
 </pre>
 </body>
 </html>
--- a/dom/media/tests/mochitest/test_getUserMedia_playAudioTwice.html
+++ b/dom/media/tests/mochitest/test_getUserMedia_playAudioTwice.html
@@ -1,46 +1,39 @@
-<!DOCTYPE HTML>
+<!DOCTYPE HTML>
 <html>
 <!--
 https://bugzilla.mozilla.org/show_bug.cgi?id=822109
 -->
 <head>
   <meta charset="utf-8">
-  <title>mozGetUserMedia Play Audio Twice</title>
+  <title>getUserMedia Play Audio Twice</title>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="application/javascript" src="head.js"></script>
   <script type="application/javascript" src="mediaStreamPlayback.js"></script>
 </head>
 <body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=822109">mozGetUserMedia Play Audio Twice</a>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=822109">getUserMedia Play Audio Twice</a>
 <p id="display"></p>
 <div id="content" style="display: none">
   <audio id="testAudio"></audio>
 </div>
 <pre id="test">
 <script type="application/javascript">
   /**
    * Run a test that we can complete an audio playback cycle twice in a row.
    */
   runTest(function () {
-    getUserMedia({audio: true}, function(audioStream) {
+    getUserMedia({audio: true}).then(audioStream => {
       var testAudio = document.getElementById('testAudio');
       var audioStreamPlayback = new LocalMediaStreamPlayback(testAudio,
         audioStream);
 
-      audioStreamPlayback.playMedia(false, function() {
-
-        audioStreamPlayback.playMedia(true, function() {
-          audioStream.stop();
-          SimpleTest.finish();
-        }, generateErrorCallback());
-
-      }, generateErrorCallback());
-
-    }, generateErrorCallback());
+      return audioStreamPlayback.playMedia(false)
+        .then(() => audioStreamPlayback.playMedia(true))
+        .then(() => audioStream.stop());
+    }).then(() => SimpleTest.finish(), generateErrorCallback());
   });
-
 </script>
 </pre>
 </body>
 </html>
--- a/dom/media/tests/mochitest/test_getUserMedia_playVideoAudioTwice.html
+++ b/dom/media/tests/mochitest/test_getUserMedia_playVideoAudioTwice.html
@@ -1,45 +1,39 @@
-<!DOCTYPE HTML>
+<!DOCTYPE HTML>
 <html>
 <!--
 https://bugzilla.mozilla.org/show_bug.cgi?id=822109
 -->
 <head>
   <meta charset="utf-8">
-  <title>mozGetUserMedia Play Video and Audio Twice</title>
+  <title>getUserMedia Play Video and Audio Twice</title>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="application/javascript" src="head.js"></script>
   <script type="application/javascript" src="mediaStreamPlayback.js"></script>
 </head>
 <body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=822109">mozGetUserMedia Play Video and Audio Twice</a>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=822109">getUserMedia Play Video and Audio Twice</a>
 <p id="display"></p>
 <div id="content" style="display: none">
   <video id="testVideo"></video>
 </div>
 <pre id="test">
 <script type="application/javascript">
   /**
    * Run a test that we can complete a video playback cycle twice in a row.
    */
   runTest(function () {
-    getUserMedia({video: true, audio: true}, function(stream) {
+    getUserMedia({video: true, audio: true}).then(stream => {
       var testVideo = document.getElementById('testVideo');
       var streamPlayback = new LocalMediaStreamPlayback(testVideo, stream);
 
-      streamPlayback.playMedia(false, function() {
-
-        streamPlayback.playMedia(true, function() {
-          stream.stop();
-          SimpleTest.finish();
-        }, generateErrorCallback());
-
-      }, generateErrorCallback());
-
-    }, generateErrorCallback());
+      return streamPlayback.playMedia(false)
+        .then(() => streamPlayback.playMedia(true))
+        .then(() => stream.stop());
+    }).then(() => SimpleTest.finish(), generateErrorCallback());
   });
 
 </script>
 </pre>
 </body>
 </html>
--- a/dom/media/tests/mochitest/test_getUserMedia_playVideoTwice.html
+++ b/dom/media/tests/mochitest/test_getUserMedia_playVideoTwice.html
@@ -1,46 +1,39 @@
-<!DOCTYPE HTML>
+<!DOCTYPE HTML>
 <html>
 <!--
 https://bugzilla.mozilla.org/show_bug.cgi?id=822109
 -->
 <head>
   <meta charset="utf-8">
-  <title>mozGetUserMedia Play Video Twice</title>
+  <title>getUserMedia Play Video Twice</title>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="application/javascript" src="head.js"></script>
   <script type="application/javascript" src="mediaStreamPlayback.js"></script>
 </head>
 <body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=822109">mozGetUserMedia Play Video Twice</a>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=822109">getUserMedia Play Video Twice</a>
 <p id="display"></p>
 <div id="content" style="display: none">
   <video id="testVideo"></video>
 </div>
 <pre id="test">
 <script type="application/javascript">
   /**
    * Run a test that we can complete a video playback cycle twice in a row.
    */
   runTest(function () {
-    getUserMedia({video: true}, function(videoStream) {
+    getUserMedia({video: true}).then(stream => {
       var testVideo = document.getElementById('testVideo');
-      var videoStreamPlayback = new LocalMediaStreamPlayback(testVideo,
-        videoStream);
-
-      videoStreamPlayback.playMedia(false, function() {
+      var streamPlayback = new LocalMediaStreamPlayback(testVideo, stream);
 
-        videoStreamPlayback.playMedia(true, function() {
-          videoStream.stop();
-          SimpleTest.finish();
-        }, generateErrorCallback());
-
-      }, generateErrorCallback());
-
-    }, generateErrorCallback());
+      return streamPlayback.playMedia(false)
+        .then(() => streamPlayback.playMedia(true))
+        .then(() => stream.stop());
+    }).then(() => SimpleTest.finish(), generateErrorCallback());
   });
 
 </script>
 </pre>
 </body>
 </html>
--- a/dom/media/tests/mochitest/test_getUserMedia_stopAudioStream.html
+++ b/dom/media/tests/mochitest/test_getUserMedia_stopAudioStream.html
@@ -1,39 +1,40 @@
-<!DOCTYPE HTML>
+<!DOCTYPE HTML>
 <html>
 <!--
 https://bugzilla.mozilla.org/show_bug.cgi?id=822109
 -->
 <head>
   <meta charset="utf-8">
-  <title>mozGetUserMedia Stop Audio Stream</title>
+  <title>getUserMedia Stop Audio Stream</title>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="application/javascript" src="head.js"></script>
   <script type="application/javascript" src="mediaStreamPlayback.js"></script>
 </head>
 <body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=822109">mozGetUserMedia Stop Audio Stream</a>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=822109">getUserMedia Stop Audio Stream</a>
 <p id="display"></p>
 <div id="content" style="display: none">
   <audio id="testAudio"></video>
 </div>
 <pre id="test">
 <script type="application/javascript">
   /**
    * Run a test to verify that we can start an audio stream in a media element,
    * call stop() on the stream, and successfully get an ended event fired.
    */
   runTest(function () {
-    getUserMedia({audio: true}, function(stream) {
-      var testAudio = document.getElementById('testAudio');
-      var audioStreamPlayback = new LocalMediaStreamPlayback(testAudio, stream);
+    getUserMedia({audio: true})
+      .then(stream => {
+        var testAudio = document.getElementById('testAudio');
+        var streamPlayback = new LocalMediaStreamPlayback(testAudio, stream);
 
-      audioStreamPlayback.playMediaWithStreamStop(false, SimpleTest.finish,
-        generateErrorCallback());
-    }, generateErrorCallback());
+        return streamPlayback.playMediaWithStreamStop(false);
+      })
+      .then(() => SimpleTest.finish(), generateErrorCallback());
   });
 
 </script>
 </pre>
 </body>
 </html>
--- a/dom/media/tests/mochitest/test_getUserMedia_stopAudioStreamWithFollowupAudio.html
+++ b/dom/media/tests/mochitest/test_getUserMedia_stopAudioStreamWithFollowupAudio.html
@@ -1,51 +1,48 @@
-<!DOCTYPE HTML>
+<!DOCTYPE HTML>
 <html>
 <!--
 https://bugzilla.mozilla.org/show_bug.cgi?id=822109
 -->
 <head>
   <meta charset="utf-8">
-  <title>mozGetUserMedia Stop Audio Stream With Followup Audio</title>
+  <title>getUserMedia Stop Audio Stream With Followup Audio</title>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="application/javascript" src="head.js"></script>
   <script type="application/javascript" src="mediaStreamPlayback.js"></script>
 </head>
 <body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=822109">mozGetUserMedia Stop Audio Stream With Followup Audio</a>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=822109">getUserMedia Stop Audio Stream With Followup Audio</a>
 <p id="display"></p>
 <div id="content" style="display: none">
   <audio id="testAudio"></audio>
 </div>
 <pre id="test">
 <script type="application/javascript">
   /**
    * Run a test to verify that I can complete an audio gum playback in a media
    * element, stop the stream, and then complete another audio gum playback
    * in a media element.
    */
   runTest(function () {
-    getUserMedia({audio: true}, function(firstStream) {
-      var testAudio = document.getElementById('testAudio');
-      var streamPlayback = new LocalMediaStreamPlayback(testAudio, firstStream);
-
-      streamPlayback.playMediaWithStreamStop(false, function() {
-        getUserMedia({audio: true}, function(secondStream) {
-          streamPlayback.mediaStream = secondStream;
+    getUserMedia({audio: true})
+      .then(firstStream => {
+        var testAudio = document.getElementById('testAudio');
+        var streamPlayback = new LocalMediaStreamPlayback(testAudio, firstStream);
 
-          streamPlayback.playMedia(false, function() {
-            secondStream.stop();
-            SimpleTest.finish();
-          }, generateErrorCallback());
+        return streamPlayback.playMediaWithStreamStop(false)
+          .then(() => getUserMedia({audio: true}))
+          .then(secondStream => {
+            streamPlayback.mediaStream = secondStream;
 
-        }, generateErrorCallback());
-
-      }, generateErrorCallback());
-
-    }, generateErrorCallback());
+            return streamPlayback.playMedia(false)
+              .then(() => secondStream.stop());
+          });
+      })
+      .then(() => SimpleTest.finish(), generateErrorCallback());
   });
 
 </script>
 </pre>
 </body>
 </html>
--- a/dom/media/tests/mochitest/test_getUserMedia_stopVideoAudioStream.html
+++ b/dom/media/tests/mochitest/test_getUserMedia_stopVideoAudioStream.html
@@ -1,40 +1,41 @@
 <!DOCTYPE HTML>
 <html>
 <!--
 https://bugzilla.mozilla.org/show_bug.cgi?id=822109
 -->
 <head>
   <meta charset="utf-8">
-  <title>mozGetUserMedia Stop Video Audio Stream</title>
+  <title>getUserMedia Stop Video Audio Stream</title>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="application/javascript" src="head.js"></script>
   <script type="application/javascript" src="mediaStreamPlayback.js"></script>
 </head>
 <body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=822109">mozGetUserMedia Stop Video Audio Stream</a>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=822109">getUserMedia Stop Video Audio Stream</a>
 <p id="display"></p>
 <div id="content" style="display: none">
   <video id="testVideo"></video>
 </div>
 <pre id="test">
 <script type="application/javascript">
   /**
    * Run a test to verify that we can start a video+audio stream in a
    * media element, call stop() on the stream, and successfully get an
    * ended event fired.
    */
   runTest(function () {
-    getUserMedia({video: true, audio: true}, function(stream) {
-      var testVideo = document.getElementById('testVideo');
-      var streamPlayback = new LocalMediaStreamPlayback(testVideo, stream);
+    getUserMedia({video: true, audio: true})
+      .then(stream => {
+        var testVideo = document.getElementById('testVideo');
+        var streamPlayback = new LocalMediaStreamPlayback(testVideo, stream);
 
-      streamPlayback.playMediaWithStreamStop(false, SimpleTest.finish,
-        generateErrorCallback());
-    }, generateErrorCallback());
+        return streamPlayback.playMediaWithStreamStop(false);
+      })
+      .then(() => SimpleTest.finish(), generateErrorCallback());
   });
 
 </script>
 </pre>
 </body>
 </html>
--- a/dom/media/tests/mochitest/test_getUserMedia_stopVideoAudioStreamWithFollowupVideoAudio.html
+++ b/dom/media/tests/mochitest/test_getUserMedia_stopVideoAudioStreamWithFollowupVideoAudio.html
@@ -1,51 +1,48 @@
-<!DOCTYPE HTML>
+<!DOCTYPE HTML>
 <html>
 <!--
 https://bugzilla.mozilla.org/show_bug.cgi?id=822109
 -->
 <head>
   <meta charset="utf-8">
-  <title>mozGetUserMedia Stop Video+Audio Stream With Followup Video+Audio</title>
+  <title>getUserMedia Stop Video+Audio Stream With Followup Video+Audio</title>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="application/javascript" src="head.js"></script>
   <script type="application/javascript" src="mediaStreamPlayback.js"></script>
 </head>
 <body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=822109">mozGetUserMedia Stop Video+Audio Stream With Followup Video+Audio</a>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=822109">getUserMedia Stop Video+Audio Stream With Followup Video+Audio</a>
 <p id="display"></p>
 <div id="content" style="display: none">
   <video id="testVideo"></video>
 </div>
 <pre id="test">
 <script type="application/javascript">
   /**
    * Run a test to verify that I can complete an video+audio gum playback in a
    * media element, stop the stream, and then complete another video+audio gum
    * playback in a media element.
    */
   runTest(function () {
-    getUserMedia({video: true, audio: true}, function(firstStream) {
-      var testVideo = document.getElementById('testVideo');
-      var streamPlayback = new LocalMediaStreamPlayback(testVideo, firstStream);
-
-      streamPlayback.playMediaWithStreamStop(false, function() {
-        getUserMedia({video: true, audio: true}, function(secondStream) {
-          streamPlayback.mediaStream = secondStream;
+    getUserMedia({video: true, audio: true})
+      .then(stream => {
+        var testVideo = document.getElementById('testVideo');
+        var streamPlayback = new LocalMediaStreamPlayback(testVideo, stream);
 
-          streamPlayback.playMedia(false, function() {
-            secondStream.stop();
-            SimpleTest.finish();
-          }, generateErrorCallback());
+        return streamPlayback.playMediaWithStreamStop(false)
+          .then(() => getUserMedia({video: true, audio: true}))
+          .then(secondStream => {
+            streamPlayback.mediaStream = secondStream;
 
-        }, generateErrorCallback());
-
-      }, generateErrorCallback());
-
-    }, generateErrorCallback());
+            return streamPlayback.playMedia(false)
+              .then(() => secondStream.stop());
+          });
+      })
+      .then(() => SimpleTest.finish(), generateErrorCallback());
   });
 
 </script>
 </pre>
 </body>
 </html>
--- a/dom/media/tests/mochitest/test_getUserMedia_stopVideoStream.html
+++ b/dom/media/tests/mochitest/test_getUserMedia_stopVideoStream.html
@@ -1,39 +1,41 @@
-<!DOCTYPE HTML>
+<!DOCTYPE HTML>
 <html>
 <!--
 https://bugzilla.mozilla.org/show_bug.cgi?id=822109
 -->
 <head>
   <meta charset="utf-8">
-  <title>mozGetUserMedia Stop Video Stream</title>
+  <title>getUserMedia Stop Video Stream</title>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="application/javascript" src="head.js"></script>
   <script type="application/javascript" src="mediaStreamPlayback.js"></script>
 </head>
 <body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=822109">mozGetUserMedia Stop Video Stream</a>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=822109">getUserMedia Stop Video Audio Stream</a>
 <p id="display"></p>
 <div id="content" style="display: none">
   <video id="testVideo"></video>
 </div>
 <pre id="test">
 <script type="application/javascript">
   /**
-   * Run a test to verify that we can start a video stream in a media element,
-   * call stop() on the stream, and successfully get an ended event fired.
+   * Run a test to verify that we can start a video stream in a
+   * media element, call stop() on the stream, and successfully get an
+   * ended event fired.
    */
   runTest(function () {
-    getUserMedia({video: true}, function(stream) {
-      var testVideo = document.getElementById('testVideo');
-      var videoStreamPlayback = new LocalMediaStreamPlayback(testVideo, stream);
+    getUserMedia({video: true})
+      .then(stream => {
+        var testVideo = document.getElementById('testVideo');
+        var streamPlayback = new LocalMediaStreamPlayback(testVideo, stream);
 
-      videoStreamPlayback.playMediaWithStreamStop(false, SimpleTest.finish,
-        generateErrorCallback());
-    }, generateErrorCallback());
+        return streamPlayback.playMediaWithStreamStop(false);
+      })
+      .then(() => SimpleTest.finish(), generateErrorCallback());
   });
 
 </script>
 </pre>
 </body>
 </html>
--- a/dom/media/tests/mochitest/test_getUserMedia_stopVideoStreamWithFollowupVideo.html
+++ b/dom/media/tests/mochitest/test_getUserMedia_stopVideoStreamWithFollowupVideo.html
@@ -1,52 +1,48 @@
-<!DOCTYPE HTML>
+<!DOCTYPE HTML>
 <html>
 <!--
 https://bugzilla.mozilla.org/show_bug.cgi?id=822109
 -->
 <head>
   <meta charset="utf-8">
-  <title>mozGetUserMedia Stop Video Stream With Followup Video</title>
+  <title>getUserMedia Stop Video Stream With Followup Video</title>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="application/javascript" src="head.js"></script>
   <script type="application/javascript" src="mediaStreamPlayback.js"></script>
 </head>
 <body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=822109">mozGetUserMedia Stop Video Stream With Followup Video</a>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=822109">getUserMedia Stop Video Stream With Followup Video</a>
 <p id="display"></p>
 <div id="content" style="display: none">
   <video id="testVideo"></video>
 </div>
 <pre id="test">
 <script type="application/javascript">
   /**
-   * Run a test to verify that I can complete an audio gum playback in a media
-   * element, stop the stream, and then complete another audio gum playback
-   * in a media element.
+   * Run a test to verify that I can complete an video gum playback in a
+   * media element, stop the stream, and then complete another video gum
+   * playback in a media element.
    */
   runTest(function () {
-    getUserMedia({video: true}, function(firstStream) {
-      var testVideo = document.getElementById('testVideo');
-      var streamPlayback = new LocalMediaStreamPlayback(testVideo,
-        firstStream);
-
-      streamPlayback.playMediaWithStreamStop(false, function() {
-        getUserMedia({video: true}, function(secondStream) {
-          streamPlayback.mediaStream = secondStream;
+    getUserMedia({video: true})
+      .then(stream => {
+        var testVideo = document.getElementById('testVideo');
+        var streamPlayback = new LocalMediaStreamPlayback(testVideo, stream);
 
-          streamPlayback.playMedia(false, function() {
-            secondStream.stop();
-            SimpleTest.finish();
-          }, generateErrorCallback());
+        return streamPlayback.playMediaWithStreamStop(false)
+          .then(() => getUserMedia({video: true}))
+          .then(secondStream => {
+            streamPlayback.mediaStream = secondStream;
 
-        }, generateErrorCallback());
-
-      }, generateErrorCallback());
-
-    }, generateErrorCallback());
+            return streamPlayback.playMedia(false)
+              .then(() => secondStream.stop());
+          });
+      })
+      .then(() => SimpleTest.finish(), generateErrorCallback());
   });
 
 </script>
 </pre>
 </body>
 </html>