<!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>
