/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

// Check that the AnimationsActor can pause/play a given list of animations at once.

// List of selectors that match "all" animated nodes in the test page.
// This list misses a bunch of animated nodes on purpose. Only the ones that
// have infinite animations are listed. This is done to avoid intermittents
// caused when finite animations are already done playing by the time the test
// runs.
const ALL_ANIMATED_NODES = [
  ".simple-animation",
  ".multiple-animations",
  ".delayed-animation",
];

add_task(async function () {
  const { target, walker, animations } = await initAnimationsFrontForUrl(
    MAIN_DOMAIN + "animation.html"
  );

  info("Pause all animations in the test document");
  await toggleAndCheckStates(walker, animations, ALL_ANIMATED_NODES, "paused");

  info("Play all animations in the test document");
  await toggleAndCheckStates(walker, animations, ALL_ANIMATED_NODES, "running");

  await target.destroy();
  gBrowser.removeCurrentTab();
});

async function toggleAndCheckStates(walker, animations, selectors, playState) {
  info(
    "Checking the playState of all the nodes that have infinite running " +
      "animations"
  );

  for (const selector of selectors) {
    const players = await getPlayersFor(walker, animations, selector);

    if (playState === "paused") {
      await animations.pauseSome(players);
    } else {
      await animations.playSome(players);
    }

    info("Getting the AnimationFront for node " + selector);
    const player = players[0];
    await checkPlayState(player, selector, playState);
  }
}

async function getPlayersFor(walker, animations, selector) {
  const node = await walker.querySelector(walker.rootNode, selector);
  return animations.getAnimationPlayersForNode(node);
}

async function checkPlayState(player, selector, expectedState) {
  const state = await player.getCurrentState();
  is(
    state.playState,
    expectedState,
    "The playState of node " + selector + " is " + expectedState
  );
}
