Index: third_party/polymer/components/web-animations-js/src/timeline.js |
diff --git a/third_party/polymer/components/web-animations-js/src/timeline.js b/third_party/polymer/components/web-animations-js/src/timeline.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2b213b5550efeda3ef89a9a10708410f896cac57 |
--- /dev/null |
+++ b/third_party/polymer/components/web-animations-js/src/timeline.js |
@@ -0,0 +1,101 @@ |
+// 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) { |
+ var originalRequestAnimationFrame = window.requestAnimationFrame; |
+ window.requestAnimationFrame = function(f) { |
+ return originalRequestAnimationFrame(function(x) { |
+ scope.timeline._updateAnimationsPromises(); |
+ f(x); |
+ scope.timeline._updateAnimationsPromises(); |
+ }); |
+ }; |
+ |
+ scope.AnimationTimeline = function() { |
+ this._animations = []; |
+ this.currentTime = undefined; |
+ }; |
+ |
+ scope.AnimationTimeline.prototype = { |
+ getAnimations: function() { |
+ this._discardAnimations(); |
+ return this._animations.slice(); |
+ }, |
+ _updateAnimationsPromises: function() { |
+ scope.animationsWithPromises = scope.animationsWithPromises.filter(function(animation) { |
+ return animation._updatePromises(); |
+ }); |
+ }, |
+ _discardAnimations: function() { |
+ this._updateAnimationsPromises(); |
+ this._animations = this._animations.filter(function(animation) { |
+ return animation.playState != 'finished' && animation.playState != 'idle'; |
+ }); |
+ }, |
+ _play: function(effect) { |
+ var animation = new scope.Animation(effect, this); |
+ this._animations.push(animation); |
+ scope.restartWebAnimationsNextTick(); |
+ // Use animation._animation.play() here, NOT animation.play(). |
+ // |
+ // Timeline.play calls new scope.Animation(effect) which (indirectly) calls Timeline.play on |
+ // effect's children, and Animation.play is also recursive. We only need to call play on each |
+ // animation in the tree once. |
+ animation._updatePromises(); |
+ animation._animation.play(); |
+ animation._updatePromises(); |
+ return animation; |
+ }, |
+ play: function(effect) { |
+ if (effect) { |
+ effect.remove(); |
+ } |
+ return this._play(effect); |
+ } |
+ }; |
+ |
+ var ticking = false; |
+ |
+ scope.restartWebAnimationsNextTick = function() { |
+ if (!ticking) { |
+ ticking = true; |
+ requestAnimationFrame(webAnimationsNextTick); |
+ } |
+ }; |
+ |
+ function webAnimationsNextTick(t) { |
+ var timeline = scope.timeline; |
+ timeline.currentTime = t; |
+ timeline._discardAnimations(); |
+ if (timeline._animations.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); |