<!doctype html>
<meta charset=utf-8>
<title>CSSTransition.effect.target</title>
<!-- TODO: Add a more specific link for this once it is specified. -->
<link rel="help" href="https://drafts.csswg.org/css-transitions-2/#csstransition">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/helper.js"></script>
<div id="log"></div>
<script>
'use strict';

test(t => {
  const div = addDiv(t);

  div.style.left = '0px';
  getComputedStyle(div).transitionProperty;
  div.style.transition = 'left 100s';
  div.style.left = '100px';

  const animation = div.getAnimations()[0];
  assert_equals(animation.effect.target, div,
    'Animation.target is the animatable div');
}, 'Returned CSS transitions have the correct Animation.target');

test(t => {
  addStyle(t, { '.init::after': 'content: ""; width: 0px; height: 0px; ' +
                                'transition: all 10s;',
                '.change::after': 'width: 100px; height: 100px;' });
  const div = addDiv(t, { class: 'init' });
  getComputedStyle(div).width;
  div.classList.add('change');

  const anims = document.getAnimations();
  assert_equals(anims.length, 2,
                'Got transitions running on ::after pseudo element');
  assert_equals(anims[0].effect.target, anims[1].effect.target,
                'Both transitions return the same target object');
}, 'effect.target should return the same CSSPseudoElement object each time');

test(t => {
  addStyle(t, { '.init::after': 'content: ""; width: 0px; transition: all 10s;',
                '.change::after': 'width: 100px;' });
  const div = addDiv(t, { class: 'init' });
  getComputedStyle(div).width;
  div.classList.add('change');
  const pseudoTarget = document.getAnimations()[0].effect.target;
  const effect = new KeyframeEffect(pseudoTarget,
                                    { background: ["blue", "red"] },
                                    3000);
  const newAnim = new Animation(effect, document.timeline);
  newAnim.play();

  const anims = document.getAnimations();
  assert_equals(anims.length, 2,
                'Got animations running on ::after pseudo element');
  assert_not_equals(anims[0], newAnim,
                    'The scriped-generated animation appears last');
  assert_equals(newAnim.effect.target, pseudoTarget,
                'The effect.target of the scripted-generated animation is ' +
                'the same as the one from the argument of ' +
                'KeyframeEffect constructor');
  assert_equals(anims[0].effect.target, newAnim.effect.target,
                'Both the transition and the scripted-generated animation ' +
                'return the same target object');
}, 'effect.target from the script-generated animation should return the same ' +
   'CSSPseudoElement object as that from the CSS generated transition');

</script>
