text: suite('effect-callback', function() {
    setup(function() {
      document.timeline._players = [];
      webAnimations1.timeline._players = [];
    });
  
    test('animations starting in the future are not in effect', function() {
      var fractions = [];
      tick(100);
      var player = document.body.animate(function(fraction) { fractions.push(fraction); }, 1000);
      player.startTime = 1000;
      tick(200);
      tick(1000);
      tick(1100);
      assert.deepEqual(fractions, [null, 0, 0.1]);
    });
  
    test('duration 0 players get sampled at least once', function() {
      var timeFraction;
      tick(0);
      var player = document.body.animate(function(t) {
        timeFraction = t;
      }, {duration: 0, fill: 'both'});
      tick(100);
      assert.equal(timeFraction, 1);
      assert.equal(isTicking(), false);
    });
  
    test('players added during custom effect callbacks get updated in the same tick', function() {
      var player;
      var called = false;
      tick(0);
      document.body.animate(function() {
        player = document.body.animate(function() {
          called = true;
        }, 1);
      }, 2);
      tick(1);
      assert.isTrue(player.startTime >= 0);
      assert.isFalse(called);
    });
  
    test('custom effect should be called after cancel', function() {
      var fractions = [];
      var player = document.body.animate(function(fraction) { fractions.push(fraction); }, 1000);
      tick(0);
      tick(500);
      player.cancel();
      tick(501);
      assert.deepEqual(fractions, [0, 0.5, null]);
    });
  
    test('element.animate is given animation', function() {
      var callbackAnim;
      var player = document.body.animate(function(t, target, a) {
        callbackAnim = a;
      }, 100);
      tick(50);
      tick(150);
      assert.equal(isTicking(), false);
      assert(callbackAnim, 'callback should be set');
      assert.equal(callbackAnim.target, document.body);
    });
  
    test('effect callback on animation is given source animation', function() {
      var callbackAnim;
      var anim = new Animation(document.body, function(t, target, a) {
        callbackAnim = a;
      }, 1000);
      var player = document.timeline.play(anim);
      tick(50);
      tick(550);
      assert.equal(player.currentTime, 500);
      assert.equal(callbackAnim, anim);
    });
  });
  