Bug 899878 - Mochitest for recording media with no timeslice for media recording API. r=roc
authorJason Smith <jsmith@mozilla.com>
Tue, 20 Aug 2013 23:40:29 -0700
changeset 156620 cf3db1cabcb200595d3f318cc096bd1f647ba3b2
parent 156619 26d92ba69fe622fc1532a65de4ee835ccb55dbb7
child 156621 2654e3d27d419b83294ff1ac3f49a5a9b94cfcb0
push id2961
push userlsblakk@mozilla.com
push dateMon, 28 Oct 2013 21:59:28 +0000
treeherdermozilla-beta@73ef4f13486f [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersroc
bugs899878
milestone26.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 899878 - Mochitest for recording media with no timeslice for media recording API. r=roc
content/media/test/Makefile.in
content/media/test/test_mediarecorder_record_no_timeslice.html
--- a/content/media/test/Makefile.in
+++ b/content/media/test/Makefile.in
@@ -120,16 +120,17 @@ MOCHITEST_FILES = \
 		test_mediarecorder_record_audiocontext.html \
 		test_mediarecorder_record_stopms.html \
 		test_mozHasAudio.html \
 		test_source_media.html \
 		test_autoplay_contentEditable.html \
 		test_bug448534.html \
 		test_bug463162.xhtml \
 		test_decoder_disable.html \
+		test_mediarecorder_record_no_timeslice.html \
 		test_mediarecorder_reload_crash.html \
 		test_media_selection.html \
 		test_playback.html \
 		test_seekLies.html \
 		test_media_sniffer.html \
 		contentType.sjs \
 		test_streams_srcObject.html \
 		test_reset_src.html \
new file mode 100644
--- /dev/null
+++ b/content/media/test/test_mediarecorder_record_no_timeslice.html
@@ -0,0 +1,117 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Test MediaRecorder Record No Timeslice</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+  <script type="text/javascript" src="manifest.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+var manager = new MediaTestManager;
+
+/**
+ * Starts a test on every media recorder file included to check that a
+ * stream derived from the file can be recorded with no time slice provided.
+ */
+function startTest(test, token) {
+  var element = document.createElement('audio');
+  var expectedMimeType = test.type.substring(0, test.type.indexOf(';'));
+
+  element.token = token;
+  manager.started(token);
+
+  element.src = test.name;
+  element.test = test;
+  element.stream = element.mozCaptureStream();
+
+  var mediaRecorder = new MediaRecorder(element.stream);
+  var onStopFired = false;
+  var onDataAvailableFired = false;
+
+  mediaRecorder.onerror = function () {
+    ok(false, 'Unexpected onerror callback fired');
+  };
+
+  mediaRecorder.onwarning = function () {
+    ok(false, 'Unexpected onwarning callback fired');
+  };
+
+  // This handler verifies that only a single onstop event handler is fired.
+  mediaRecorder.onstop = function () {
+    if (onStopFired) {
+      ok(false, 'onstop unexpectedly fired more than once');
+    } else {
+      onStopFired = true;
+
+      // ondataavailable should always fire before onstop
+      if (onDataAvailableFired) {
+        manager.finished(token);
+      } else {
+        ok(false, 'onstop fired without an ondataavailable event first');
+      }
+    }
+  };
+
+  // This handler verifies that only a single ondataavailable event handler
+  // is fired with the blob generated having greater than zero size
+  // and a correct mime type.
+  mediaRecorder.ondataavailable = function (evt) {
+    if (onDataAvailableFired) {
+      ok(false, 'ondataavailable unexpectedly fired more than once');
+    } else {
+      onDataAvailableFired = true;
+
+      ok(evt instanceof BlobEvent,
+         'Events fired from ondataavailable should be BlobEvent');
+      is(evt.type, 'dataavailable',
+         'Event type should dataavailable');
+      ok(evt.data.size > 0,
+         'Blob data received should be greater than zero');
+      is(evt.data.type, expectedMimeType,
+         'Blob data received should have type = ' + expectedMimeType);
+
+      is(mediaRecorder.mimeType, expectedMimeType,
+         'Mime type in ondataavailable = ' + expectedMimeType);
+
+      // onstop should not have fired before ondataavailable
+      if (onStopFired) {
+        ok(false, 'ondataavailable unexpectedly fired later than onstop');
+        manager.finished(token);
+      }
+    }
+  };
+
+  element.oncanplaythrough = function () {
+    // If content has ended, skip the test
+    if (element.ended) {
+      ok(true, 'ended fired before canplaythrough, skipping test');
+      manager.finished(token);
+    } else {
+      // If content hasn't ended, start recording
+      mediaRecorder.start();
+      is(mediaRecorder.state, 'recording',
+         'Media recorder should be recording');
+      is(mediaRecorder.stream, element.stream,
+         'Media recorder stream = element stream at the start of recording');
+
+      // When ended fires, stop recording
+      element.onended = function () {
+        mediaRecorder.stop();
+        is(mediaRecorder.state, 'inactive',
+           'Media recorder is inactive afer being stopped');
+        is(mediaRecorder.stream, element.stream,
+           'Media recorder stream = element stream post recording');
+      }
+    }
+  }
+
+  element.play();
+}
+
+manager.runTests(gMediaRecorderTests, startTest);
+</script>
+</pre>
+</body>
+</html>