Commit 70ec3d2f authored by Chris Pearce's avatar Chris Pearce
Browse files

Bug 1457048 - Test that whitelisted origins are able to autoplay. r=bryce

MozReview-Commit-ID: 9kLIx8MzCY8

--HG--
extra : rebase_source : 32179f99a521582026ac5068c3d355dcf4713570
parent fcba2de1
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -25,3 +25,15 @@ function log(msg) {
  log_pane.appendChild(document.createTextNode(msg));
  log_pane.appendChild(document.createElement("br"));
}

const autoplayPermission = "autoplay-media";

async function pushAutoplayAllowedPermission() {
  return new Promise((resolve, reject) => {
    SpecialPowers.pushPermissions([{
      'type': autoplayPermission,
      'allow': true,
      'context': document
    }], resolve);
  });
}
+54 −0
Original line number Diff line number Diff line
<!DOCTYPE HTML>
<html>

<head>
  <title>Autoplay policy window</title>
  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
  <script type="text/javascript" src="manifest.js"></script>
  <script type="text/javascript" src="AutoplayTestUtils.js"></script>
</head>

<body>
  <pre id="test">
      <script>

        window.ok = window.opener.ok;
        window.is = window.opener.is;
        window.info = window.opener.info;

        async function testAutoplayPermission(testCase, parentWindow) {
          info("trying to play origin=" + testCase.origin + " shouldPlay=" + testCase.shouldPlay);
          const url = testCase.origin + "/tests/dom/media/test/file_autoplay_policy_activation_frame.html"
          info("canPlayIn " + url);

          // Create a child iframe...
          var frame = document.createElement("iframe");
          frame.src = url;
          // Wait for it to load...
          document.body.appendChild(frame);
          info("awaiting loaded");
          await once(frame, "load");
          // Ask the child iframe to try to play video.
          info("loaded, trying to play");
          frame.contentWindow.postMessage("play-audible", "*");
          // Wait for the iframe to tell us whether it could play video.
          let result = await nextWindowMessage();
          is(result.data.played, testCase.shouldPlay, testCase.message);
        }

        nextWindowMessage().then(
          async (event) => {
            try {
              await testAutoplayPermission(event.data, event.source);
            } catch (e) {
              ok(false, "Caught exception " + e + " " + e.message + " " + e.stackTrace);
            }
            event.source.postMessage("done", "*");
          });

      </script>
    </pre>
</body>

</html>
+3 −0
Original line number Diff line number Diff line
@@ -442,6 +442,7 @@ support-files =
  file_autoplay_policy_unmute_pauses.html
  file_autoplay_policy_activation_window.html
  file_autoplay_policy_activation_frame.html
  file_autoplay_policy_permission.html
  file_autoplay_policy_play_before_loadedmetadata.html
  flac-s24.flac
  flac-s24.flac^headers^
@@ -704,6 +705,8 @@ skip-if = android_version == '23' # bug 1424903
skip-if = android_version == '23' # bug 1424903
[test_autoplay_policy_play_before_loadedmetadata.html]
skip-if = android_version == '23' # bug 1424903
[test_autoplay_policy_permission.html]
skip-if = android_version == '23' # bug 1424903
[test_buffered.html]
skip-if = android_version == '15' || android_version == '22' # bug 1308388, android(bug 1232305)
[test_bug448534.html]
+77 −0
Original line number Diff line number Diff line
<!DOCTYPE HTML>
<html>

<head>
  <title>Autoplay policy test</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>
  <script type="text/javascript" src="AutoplayTestUtils.js"></script>
</head>

<body>
  <pre id="test">
      <script>

        // Tests that origins with "autoplay-media" permission can autoplay.

        gTestPrefs.push(["media.autoplay.enabled", false],
          ["media.autoplay.enabled.user-gestures-needed", true]);

        SpecialPowers.pushPrefEnv({ 'set': gTestPrefs }, () => {
          runTest();
        });

        async function canPlayIn(testCase) {
          // Run test in a new window, to ensure its user gesture
          // activation state isn't tainted by preceeding tests.
          let child = window.open("file_autoplay_policy_permission.html", "", "width=500,height=500");
          await once(child, "load");
          child.postMessage(testCase, "*");
          let result = await nextWindowMessage();
          child.close();
          return result.played == true;
        }

        async function runTest() {
          // First verify that we can't play in a document unwhitelisted.
          is(window.origin, "http://mochi.test:8888", "Origin should be as we assume, otherwise the rest of the test is bogus!");

          await canPlayIn({
            origin: "http://mochi.test:8888",
            shouldPlay: false,
            message: "Should not be able to play unwhitelisted."
          });

          // Add our origin to the whitelist.
          await pushAutoplayAllowedPermission();

          // Now we should be able to play...
          await canPlayIn({
            origin: "http://mochi.test:8888",
            shouldPlay: true,
            message: "Should be able to play since whitelisted."
          });

          // But sub-origins should not.
          await canPlayIn({
            origin: "http://test1.mochi.test:8888",
            shouldPlay: false,
            message: "Sub origin should not count as whitelisted."
          });
          await canPlayIn({
            origin: "http://sub1.test1.mochi.test:8888",
            shouldPlay: false,
            message: "Sub-sub-origins should not count as whitelisted."
          });

          SimpleTest.finish();
        }

        SimpleTest.waitForExplicitFinish();

      </script>
    </pre>
</body>

</html>
 No newline at end of file