blob: 263494b099d7a53cc83aa503318ae6217df00bd6 [file] [log] [blame]
// Copyright 2014 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
(function(shared, scope, testing) {
scope.AnimationTimeline = function() {
this._players = [];
this.currentTime = undefined;
};
scope.AnimationTimeline.prototype = {
// FIXME: This needs to return the wrapped players in Web Animations Next
// TODO: Does this need to be sorted?
// TODO: Do we need to consider needsRetick?
getAnimationPlayers: function() {
this._discardPlayers();
return this._players.slice();
},
_discardPlayers: function() {
this._players = this._players.filter(function(player) {
return player.playState != 'finished' && player.playState != 'idle';
});
},
play: function(source) {
var player = new scope.Player(source);
this._players.push(player);
scope.restartWebAnimationsNextTick();
player.play();
return player;
},
};
var ticking = false;
scope.restartWebAnimationsNextTick = function() {
if (!ticking) {
ticking = true;
requestAnimationFrame(webAnimationsNextTick);
}
};
function webAnimationsNextTick(t) {
var timeline = window.document.timeline;
timeline.currentTime = t;
timeline._discardPlayers();
if (timeline._players.length == 0)
ticking = false;
else
requestAnimationFrame(webAnimationsNextTick);
}
var timeline = new scope.AnimationTimeline();
scope.timeline = timeline;
try {
Object.defineProperty(window.document, 'timeline', {
configurable: true,
get: function() { return timeline; }
});
} catch (e) { }
try {
window.document.timeline = timeline;
} catch (e) { }
})(webAnimationsShared, webAnimationsNext, webAnimationsTesting);