Bug 1371166 - Update media recorder principal test to behave more like MediaElement principal test. r=jib
☠☠ backed out by bf4634a50775 ☠ ☠
authorBryce Van Dyk <bvandyk@mozilla.com>
Fri, 21 Jul 2017 15:59:27 +1200
changeset 419181 736042ec645d1c4c64af0528365768e40ee24e56
parent 419180 162b4c3253c4d7acfb7251be61fdf5ec52f58a24
child 419182 955998eefbe8462e3fa9964962eb8ee6b05200dd
push id7566
push usermtabara@mozilla.com
push dateWed, 02 Aug 2017 08:25:16 +0000
treeherdermozilla-beta@86913f512c3c [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjib
bugs1371166
milestone56.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 1371166 - Update media recorder principal test to behave more like MediaElement principal test. r=jib Update the MediaRecorder principal test to behave more like test_mixed_principals.html. This involves preloading metadata and using a longer video to test with. This particular combination currently results in multiple requests being made for the resource, however this is not a robust solution in that the behaviour of the MediaCache and associated objects may change and break this. This fixes the issue for now as best I can tell, but a follow up gtest or may be a more sensible long term solution. MozReview-Commit-ID: F9gnnzGt3Cu
dom/media/test/test_mediarecorder_principals.html
--- a/dom/media/test/test_mediarecorder_principals.html
+++ b/dom/media/test/test_mediarecorder_principals.html
@@ -10,84 +10,80 @@ https://bugzilla.mozilla.org/show_bug.cg
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
   <script type="text/javascript" src="manifest.js"></script>
 </head>
 <body>
 <div>
   <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1018299">Test for MediaRecorder Principal Handling</a>
 </div>
 
-<video id="v1" preload="auto"></video>
-<video id="v2" preload="auto"></video>
+<video id="v1" preload="metadata"></video>
+<video id="v2" preload="metadata"></video>
 
 <pre id="test">
 <script type="text/javascript">
 SimpleTest.waitForExplicitFinish();
 
-var pushPrefs = (...p) => SpecialPowers.pushPrefEnv({set: p});
-var throwOutside = e => setTimeout(() => { throw e; });
+let throwOutside = e => setTimeout(() => { throw e; });
 
 // Generate a random key. The first load with that key will return
 // data, the second and subsequent loads with that key will return a redirect
 // to a different origin ('localhost:8888' will be redirected to 'example.org',
-// and 'example.org' will be redirected to 'localhost:8888'). We rely on the
-// fact that Ogg will do a seek to the end of the resource, triggering a new
-// load with the same key which will return a same-origin resource.
+// and 'example.org' will be redirected to 'localhost:8888').
 // Loading data from two different origins should be detected by the media
 // cache and result in a null principal so that the MediaRecorder usages below
 // fail.
+// This test relies on that preloading the metadata then loading a sufficiently
+// long video will result in two separate requests to load the resource. This
+// ends up relying on the impl of MediaCache and friends and we should probably
+// replace this test with a more robust gtest or the like.
 let key = Math.floor(Math.random()*100000000);
 let interval;
 
 function testPrincipals(resource) {
   if (!resource) {
     todo(false, "No types supported");
     return;
   }
-  // Reduce cache size and cache-ahead to make HTMLMediaElement do partial requests.
-  return pushPrefs(['media.cache_readahead_limit', 2],
-                   ['media.cache_size', 192])
-  .then(() => {
-    // First test: Load file from same-origin first, then get redirected to
-    // another origin before attempting to record stream.
-    let video = document.getElementById("v1");
-    video.src =
-        "http://mochi.test:8888/tests/dom/media/test/dynamic_redirect.sjs?key=v1_" +
-        key + "&res=" + resource.name;
-    video.load();
-    // To limit readahead, avoid racing with playback and "catching up" mode.
-    return new Promise(resolve => video.oncanplaythrough = resolve).then(() => {
-      video.play();
-      interval = setInterval(() => info("video.currentTime = "+ video.currentTime), 1000);
+  // First test: Load file from same-origin first, then get redirected to
+  // another origin before attempting to record stream.
+  let video = document.getElementById("v1");
+  video.src =
+      "http://mochi.test:8888/tests/dom/media/test/dynamic_redirect.sjs?key=v1_" +
+      key + "&res=" + resource.name;
+  video.load();
+  // To limit readahead, avoid racing with playback and "catching up" mode.
+  return new Promise(resolve => video.onloadeddata = resolve).then(() => {
+    video.play();
+    interval = setInterval(() => info("video.currentTime = "+ video.currentTime), 1000);
 
-      let msg = "mediaRecorder.start() must throw SecurityError";
-      return new Promise(resolve => video.onplaying = resolve)
-      .then(() => waitUntil(() => video.currentTime > resource.duration / 2))
-      // Test failure of the next step only, so "catch-bypass" any errors above.
-      .then(() => Promise.resolve()
-        .then(() => new MediaRecorder(video.mozCaptureStreamUntilEnded()).start())
-        .then(() => ok(false, msg), e => is(e.name, "SecurityError", msg)), 0)
-      .then(() => clearInterval(interval));
-    });
+    let msg = "mediaRecorder.start() must throw SecurityError";
+    return new Promise(resolve => video.onplaying = resolve)
+    .then(() => waitUntil(() => video.currentTime > resource.duration / 5))
+    // Test failure of the next step only, so "catch-bypass" any errors above.
+    .then(() => Promise.resolve()
+      .then(() => new MediaRecorder(video.mozCaptureStreamUntilEnded()).start())
+      .then(() => ok(false, msg), e => is(e.name, "SecurityError", msg)), 0)
+    .then(() => clearInterval(interval));
   })
   .then(() => {
     // Second test: Load file from same-origin first, but record ASAP, before
     // getting redirected to another origin.
     let video = document.getElementById("v2");
     video.src =
         "http://mochi.test:8888/tests/dom/media/test/dynamic_redirect.sjs?key=v2_" +
         key + "&res=" + resource.name;
     video.load();
     let rec, hasStopped, hasEnded = new Promise(r => video.onended = r);
     let data = [];
 
     let msgNoThrow = "mediaRecorder.start() should not throw here";
     let msgSecErr = "mediaRecorder.onerror must fire SecurityError";
     let msgOnStop = "mediaRecorder.onstop must also have fired";
-    return new Promise(resolve => video.onloadedmetadata = resolve).then(() => {
+    return new Promise(resolve => video.onloadeddata = resolve).then(() => {
       rec = new MediaRecorder(video.mozCaptureStreamUntilEnded());
       rec.ondataavailable = e => data.push(e.data);
       rec.start();
       hasStopped = new Promise(resolve => rec.onstop = resolve);
       video.play();
     })
     .then(() => ok(true, msgNoThrow), e => is(e.name, null, msgNoThrow))
     .then(() => Promise.race([
@@ -96,17 +92,17 @@ function testPrincipals(resource) {
     ]))
     .then(() => ok(false, msgSecErr), e => is(e.name, "SecurityError", msgSecErr))
     .then(() => Promise.race([hasStopped, hasEnded.then(() => Promise.reject())]))
     .then(() => ok(true, msgOnStop), e => ok(false, msgOnStop))
     .then(() => clearInterval(interval));
   });
 }
 
-testPrincipals(getPlayableVideo(gSeekTests))
+testPrincipals({ name:"pixel_aspect_ratio.mp4", type:"video/mp4", duration:28 })
 .catch(e => throwOutside(e))
 .then(() => SimpleTest.finish())
 .catch(e => throwOutside(e));
 
 var stop = stream => stream.getTracks().forEach(track => track.stop());
 var wait = ms => new Promise(resolve => setTimeout(resolve, ms));
 var waitUntil = f => new Promise(resolve => {
   var ival = setInterval(() => f() && resolve(clearInterval(ival)), 100);