// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

(async function() {
  TestRunner.addResult(
      `Tests the matching performed in AnimationModel of groups composed of animations, which are applied through a variety of selectors.\n`);
  await TestRunner.loadModule('elements_test_runner');
  await TestRunner.loadModule('animation');
  await TestRunner.showPanel('elements');
  await TestRunner.loadHTML(`
      <style>
      div {
          animation-duration: 1ms;
      }

      .long {
          animation-duration: 2ms;
      }

      .expandWidth {
          animation-name: expandWidthAnim;
      }

      .expand {
          animation-name: expandWidthAnim, expandHeightAnim !important;
      }

      @keyframes expandWidthAnim {
          from {
              width: 100px;
          }
          to {
              width: 200px;
          }
      }

      @keyframes expandHeightAnim {
          from {
              height: 100px;
          }
          to {
              height: 200px;
          }
      }
      </style>

      <div id="node1" style="background-color: red; height: 100px"></div>
      <div id="node2" style="background-color: red; height: 100px"></div>
      <div id="node3" style="background-color: red; height: 100px"></div>
      <div id="node4" style="background-color: red; height: 100px"></div>
    `);
  await TestRunner.evaluateInPagePromise(`
      function restartAnimation(id, name)
      {
          var element = document.getElementById(id);
          element.classList.remove(name);
          // Force style recalc.
          element.offsetHeight;
          element.classList.add(name);
      }

      function toggleClass(id, name, enabled)
      {
          document.getElementById(id).classList.toggle(name, enabled);
      }
  `);

  var groupIds = [];
  var i = 0;
  var stepNumber = 0;
  var model = TestRunner.mainTarget.model(Animation.AnimationModel);
  model.ensureEnabled();
  model.addEventListener(Animation.AnimationModel.Events.AnimationGroupStarted, groupStarted);
  // Each step triggers a new animation group.
  var steps = [
    'restartAnimation(\'node1\', \'expandWidth\')',
    'restartAnimation(\'node2\', \'expandWidth\')',
    'toggleClass(\'node1\', \'expandWidth\', false); restartAnimation(\'node1\', \'expand\')',
    'restartAnimation(\'node3\', \'expand\')',
    'restartAnimation(\'node3\', \'expand\')',
    'restartAnimation(\'node2\', \'expand\')',  // expandWidthAnim doesn't restart, new group.
    'toggleClass(\'node1\', \'long\', true); restartAnimation(\'node1\', \'expand\')',
    'toggleClass(\'node3\', \'long\', true); restartAnimation(\'node3\', \'expand\')',
    'toggleClass(\'node2\', \'long\', true); restartAnimation(\'node2\', \'expand\')',
    'toggleClass(\'node2\', \'expandWidth\', false); toggleClass(\'node2\', \'long\', true); restartAnimation(\'node2\', \'expand\')',

  ];
  TestRunner.evaluateInPage(steps[0]);

  function groupStarted(event) {
    TestRunner.addResult('>> ' + steps[stepNumber]);
    var group = event.data;

    if (groupIds.indexOf(group.id()) !== -1) {
      TestRunner.addResult('Group #' + groupIds.indexOf(group.id()) + ' started again!\n');
    } else {
      TestRunner.addResult('New group #' + groupIds.length + ' started.\n');
      groupIds.push(group.id());
    }
    stepNumber++;
    if (stepNumber < steps.length)
      TestRunner.evaluateInPage(steps[stepNumber]);
    else
      TestRunner.completeTest();
  }
})();
