<!doctype html><!-- webkit-test-runner [ enableCSSAnimationsAndCSSTransitionsBackedByWebAnimations=true ] -->
<meta charset=utf-8>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="../resources/testcommon.js"></script>
<body>
<div id="log"></div>
<script>
'use strict';

test(function(t) {
  var div = addDiv(t);

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

  var 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(function(t) {
  addStyle(t, { '.init::after': 'content: ""; width: 0px; height: 0px; ' +
                                'transition: all 10s;',
                '.change::after': 'width: 100px; height: 100px;' });
  var div = addDiv(t, { class: 'init' });
  flushComputedStyle(div);
  div.classList.add('change');

  var 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(function(t) {
  addStyle(t, { '.init::after': 'content: ""; width: 0px; transition: all 10s;',
                '.change::after': 'width: 100px;' });
  var div = addDiv(t, { class: 'init' });
  flushComputedStyle(div);
  div.classList.add('change');
  var pseudoTarget = document.getAnimations()[0].effect.target;
  var effect = new KeyframeEffectReadOnly(pseudoTarget,
                                          { background: ["blue", "red"] },
                                          3000);
  var newAnim = new Animation(effect, document.timeline);
  newAnim.play();

  var 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 ' +
                'KeyframeEffectReadOnly 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>
</body>
