/**
 * Tests autoplay on a page and its subframes.
 */

// Tracks the results and how many active tests we have running.
let activeTests;
let testExpectations = {};
let callback;

function tearDown(result) {
  // Reset the flag state.
  window.internals.settings.setAutoplayPolicy('no-user-gesture-required');
  let canAutoplay = true;

  // Ensure that play failed because autoplay was blocked. If playback failed
  // for another reason then we don't care because autoplay is always checked
  // first.
  if (result && result.name == 'NotAllowedError')
    canAutoplay = false;

  receivedResult({
    url: window.location.href,
    message: canAutoplay
  });
}

function receivedResult(data) {
  // Forward the result to the top frame.
  if (!callback) {
    top.postMessage(data, '*');
    return;
  }

  activeTests--;
  assert_equals(testExpectations[data.url], data.message);

  if (!activeTests)
    callback();
}

function runVideoTest() {
  const video = document.createElement('video');
  video.src = '/media-resources/content/test.ogv';
  video.play().then(tearDown, tearDown);
}

function simulateViewportClick() {
  chrome.gpuBenchmarking.pointerActionSequence([
      {"source": "mouse",
       "actions": [
       { "name": "pointerDown", "x": 0, "y": 0 },
       { "name": "pointerUp" } ]}]);
}

function simulateFrameClick() {
  const frame = document.getElementsByTagName('iframe')[0];
  const rect = frame.getBoundingClientRect();

  chrome.gpuBenchmarking.pointerActionSequence([
      {"source": "mouse",
       "actions": [
       {
         "name": "pointerDown",
         "x": rect.left + (rect.width / 2),
         "y": rect.top + (rect.height / 2)
       },
       { "name": "pointerUp" } ]}]);
}

function runTest(expectations) {
  async_test((t) => {
    testExpectations = expectations;
    activeTests = Object.keys(expectations).length;
    callback = t.step_func_done();
  });
}

window.addEventListener('load', () => {
  if (!window.testRunner)
    return;

  // Setup the flags before the test is run.
  window.internals.settings.setAutoplayPolicy('document-user-activation-required');

  // Setup the event listener to forward messages.
  window.addEventListener('message', (e) => {
    if (callback) {
      receivedResult(e.data);
    } else {
      top.postMessage(e.data, '*');
    }
  });

  runVideoTest();
}, { once: true });
