chromium/third_party/blink/web_tests/media/autoplay-muted-conditions.html

<!DOCTYPE html>
<title>Test autoplay muted behaviour in various system conditions.</title>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<body></body>
<script>
var tests = [
  {
    name: 'regular conditions',
    conditions: {
      dataSaver: false,
      cellular: false,
    },
    expectations: {
      autoplay: true
    }
  },
  {
    name: 'cellular connections',
    conditions: {
      dataSaver: false,
      cellular: true,
    },
    expectations: {
      autoplay: true
    }
  },
  {
    name: 'cellular connections with Data Saver',
    conditions: {
      dataSaver: true,
      cellular: true,
    },
    expectations: {
      autoplay: true
    }
  },
  {
    name: 'Data Saver',
    conditions: {
      dataSaver: true,
      cellular: false,
    },
    expectations: {
      autoplay: true
    }
  },
];

var asyncTests = tests.map(test => async_test('Testing autoplay behaviour for ' + test.name));

var currentTest = 0;
function runNextTest() {
  asyncTests[currentTest].done();

  ++currentTest;
  if (currentTest == tests.length)
    return;

  asyncTests[currentTest].step_func(runTest(asyncTests[currentTest], tests[currentTest]));
}

function runTest(t, test) {
  // Sanity checks for 'conditions'.
  assert_true('dataSaver' in test.conditions);
  assert_true('cellular' in test.conditions);

  internals.setSaveDataEnabled(test.conditions.dataSaver);
  if (test.conditions.cellular)
    internals.setNetworkConnectionInfoOverride(true, 'cellular3g', '4g', 100, 2.0);
  else
    internals.setNetworkConnectionInfoOverride(true, 'wifi', '4g', 100, 2.0);

  // Generic required settings.
  internals.settings.setAutoplayPolicy('user-gesture-required');
  internals.runtimeFlags.autoplayMutedVideosEnabled = true;

  t.add_cleanup(() => {
    internals.setSaveDataEnabled(false);
    internals.clearNetworkConnectionInfoOverride();
    internals.settings.setAutoplayPolicy('no-user-gesture-required');
    internals.runtimeFlags.autoplayMutedVideosEnabled = false;
  });

  var count = 0;
  [ 'attribute', 'method' ].forEach(type => {
    var media = document.createElement('video');
    document.body.appendChild(media);

    var expectedEvents = [];
    if (test.expectations.autoplay)
      expectedEvents = [ 'play', 'playing' ];
    else
      expectedEvents = [ 'suspend' ];

    var eventWatcher = new EventWatcher(t, media, expectedEvents);
    eventWatcher.wait_for(expectedEvents).then(_ => {
      if (test.expectations.autoplay) {
        assert_equals(media.readyState, media.HAVE_ENOUGH_DATA);
        assert_false(media.paused);
      } else {
        assert_true(media.paused);
      }

      document.body.removeChild(media);
      ++count;
      if (count == 2)
        runNextTest();
    });

    media.muted = true;
    media.src = 'content/test.ogv';

    if (type == 'attribute')
      media.autoplay = true;
    else if (type == 'method')
      media.play().catch(e => {});
  });
}

asyncTests[currentTest].step_func(runTest(asyncTests[currentTest], tests[currentTest]));

</script>