Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(79)

Unified Diff: third_party/polymer/components/web-animations-js/src/animation.js

Issue 3010683002: Update Polymer components. (Closed)
Patch Set: Rebase Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/polymer/components/web-animations-js/src/animation.js
diff --git a/third_party/polymer/components/web-animations-js/src/animation.js b/third_party/polymer/components/web-animations-js/src/animation.js
new file mode 100644
index 0000000000000000000000000000000000000000..e9f648268755122a359704b7b50b1d02bc3a5d0d
--- /dev/null
+++ b/third_party/polymer/components/web-animations-js/src/animation.js
@@ -0,0 +1,279 @@
+// 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) {
+
+ shared.sequenceNumber = 0;
+
+ var AnimationEvent = function(target, currentTime, timelineTime) {
+ this.target = target;
+ this.currentTime = currentTime;
+ this.timelineTime = timelineTime;
+
+ this.type = 'finish';
+ this.bubbles = false;
+ this.cancelable = false;
+ this.currentTarget = target;
+ this.defaultPrevented = false;
+ this.eventPhase = Event.AT_TARGET;
+ this.timeStamp = Date.now();
+ };
+
+ scope.Animation = function(effect) {
+ this.id = '';
+ if (effect && effect._id) {
+ this.id = effect._id;
+ }
+ this._sequenceNumber = shared.sequenceNumber++;
+ this._currentTime = 0;
+ this._startTime = null;
+ this._paused = false;
+ this._playbackRate = 1;
+ this._inTimeline = true;
+ this._finishedFlag = true;
+ this.onfinish = null;
+ this._finishHandlers = [];
+ this._effect = effect;
+ this._inEffect = this._effect._update(0);
+ this._idle = true;
+ this._currentTimePending = false;
+ };
+
+ scope.Animation.prototype = {
+ _ensureAlive: function() {
+ // If an animation is playing backwards and is not fill backwards/both
+ // then it should go out of effect when it reaches the start of its
+ // active interval (currentTime == 0).
+ if (this.playbackRate < 0 && this.currentTime === 0) {
+ this._inEffect = this._effect._update(-1);
+ } else {
+ this._inEffect = this._effect._update(this.currentTime);
+ }
+ if (!this._inTimeline && (this._inEffect || !this._finishedFlag)) {
+ this._inTimeline = true;
+ scope.timeline._animations.push(this);
+ }
+ },
+ _tickCurrentTime: function(newTime, ignoreLimit) {
+ if (newTime != this._currentTime) {
+ this._currentTime = newTime;
+ if (this._isFinished && !ignoreLimit)
+ this._currentTime = this._playbackRate > 0 ? this._totalDuration : 0;
+ this._ensureAlive();
+ }
+ },
+ get currentTime() {
+ if (this._idle || this._currentTimePending)
+ return null;
+ return this._currentTime;
+ },
+ set currentTime(newTime) {
+ newTime = +newTime;
+ if (isNaN(newTime))
+ return;
+ scope.restart();
+ if (!this._paused && this._startTime != null) {
+ this._startTime = this._timeline.currentTime - newTime / this._playbackRate;
+ }
+ this._currentTimePending = false;
+ if (this._currentTime == newTime)
+ return;
+ if (this._idle) {
+ this._idle = false;
+ this._paused = true;
+ }
+ this._tickCurrentTime(newTime, true);
+ scope.applyDirtiedAnimation(this);
+ },
+ get startTime() {
+ return this._startTime;
+ },
+ set startTime(newTime) {
+ newTime = +newTime;
+ if (isNaN(newTime))
+ return;
+ if (this._paused || this._idle)
+ return;
+ this._startTime = newTime;
+ this._tickCurrentTime((this._timeline.currentTime - this._startTime) * this.playbackRate);
+ scope.applyDirtiedAnimation(this);
+ },
+ get playbackRate() {
+ return this._playbackRate;
+ },
+ set playbackRate(value) {
+ if (value == this._playbackRate) {
+ return;
+ }
+ var oldCurrentTime = this.currentTime;
+ this._playbackRate = value;
+ this._startTime = null;
+ if (this.playState != 'paused' && this.playState != 'idle') {
+ this._finishedFlag = false;
+ this._idle = false;
+ this._ensureAlive();
+ scope.applyDirtiedAnimation(this);
+ }
+ if (oldCurrentTime != null) {
+ this.currentTime = oldCurrentTime;
+ }
+ },
+ get _isFinished() {
+ return !this._idle && (this._playbackRate > 0 && this._currentTime >= this._totalDuration ||
+ this._playbackRate < 0 && this._currentTime <= 0);
+ },
+ get _totalDuration() { return this._effect._totalDuration; },
+ get playState() {
+ if (this._idle)
+ return 'idle';
+ if ((this._startTime == null && !this._paused && this.playbackRate != 0) || this._currentTimePending)
+ return 'pending';
+ if (this._paused)
+ return 'paused';
+ if (this._isFinished)
+ return 'finished';
+ return 'running';
+ },
+ _rewind: function() {
+ if (this._playbackRate >= 0) {
+ this._currentTime = 0;
+ } else if (this._totalDuration < Infinity) {
+ this._currentTime = this._totalDuration;
+ } else {
+ throw new DOMException(
+ 'Unable to rewind negative playback rate animation with infinite duration',
+ 'InvalidStateError');
+ }
+ },
+ play: function() {
+ this._paused = false;
+ if (this._isFinished || this._idle) {
+ this._rewind();
+ this._startTime = null;
+ }
+ this._finishedFlag = false;
+ this._idle = false;
+ this._ensureAlive();
+ scope.applyDirtiedAnimation(this);
+ },
+ pause: function() {
+ if (!this._isFinished && !this._paused && !this._idle) {
+ this._currentTimePending = true;
+ } else if (this._idle) {
+ this._rewind();
+ this._idle = false;
+ }
+ this._startTime = null;
+ this._paused = true;
+ },
+ finish: function() {
+ if (this._idle)
+ return;
+ this.currentTime = this._playbackRate > 0 ? this._totalDuration : 0;
+ this._startTime = this._totalDuration - this.currentTime;
+ this._currentTimePending = false;
+ scope.applyDirtiedAnimation(this);
+ },
+ cancel: function() {
+ if (!this._inEffect)
+ return;
+ this._inEffect = false;
+ this._idle = true;
+ this._paused = false;
+ this._isFinished = true;
+ this._finishedFlag = true;
+ this._currentTime = 0;
+ this._startTime = null;
+ this._effect._update(null);
+ // effects are invalid after cancellation as the animation state
+ // needs to un-apply.
+ scope.applyDirtiedAnimation(this);
+ },
+ reverse: function() {
+ this.playbackRate *= -1;
+ this.play();
+ },
+ addEventListener: function(type, handler) {
+ if (typeof handler == 'function' && type == 'finish')
+ this._finishHandlers.push(handler);
+ },
+ removeEventListener: function(type, handler) {
+ if (type != 'finish')
+ return;
+ var index = this._finishHandlers.indexOf(handler);
+ if (index >= 0)
+ this._finishHandlers.splice(index, 1);
+ },
+ _fireEvents: function(baseTime) {
+ if (this._isFinished) {
+ if (!this._finishedFlag) {
+ var event = new AnimationEvent(this, this._currentTime, baseTime);
+ var handlers = this._finishHandlers.concat(this.onfinish ? [this.onfinish] : []);
+ setTimeout(function() {
+ handlers.forEach(function(handler) {
+ handler.call(event.target, event);
+ });
+ }, 0);
+ this._finishedFlag = true;
+ }
+ } else {
+ this._finishedFlag = false;
+ }
+ },
+ _tick: function(timelineTime, isAnimationFrame) {
+ if (!this._idle && !this._paused) {
+ if (this._startTime == null) {
+ if (isAnimationFrame) {
+ this.startTime = timelineTime - this._currentTime / this.playbackRate;
+ }
+ } else if (!this._isFinished) {
+ this._tickCurrentTime((timelineTime - this._startTime) * this.playbackRate);
+ }
+ }
+
+ if (isAnimationFrame) {
+ this._currentTimePending = false;
+ this._fireEvents(timelineTime);
+ }
+ },
+ get _needsTick() {
+ return (this.playState in {'pending': 1, 'running': 1}) || !this._finishedFlag;
+ },
+ _targetAnimations: function() {
+ var target = this._effect._target;
+ if (!target._activeAnimations) {
+ target._activeAnimations = [];
+ }
+ return target._activeAnimations;
+ },
+ _markTarget: function() {
+ var animations = this._targetAnimations();
+ if (animations.indexOf(this) === -1) {
+ animations.push(this);
+ }
+ },
+ _unmarkTarget: function() {
+ var animations = this._targetAnimations();
+ var index = animations.indexOf(this);
+ if (index !== -1) {
+ animations.splice(index, 1);
+ }
+ },
+ };
+
+ if (WEB_ANIMATIONS_TESTING) {
+ testing.webAnimations1Animation = scope.Animation;
+ }
+
+})(webAnimationsShared, webAnimations1, webAnimationsTesting);

Powered by Google App Engine
This is Rietveld 408576698