aboutsummaryrefslogtreecommitdiff
path: root/catapult/third_party/polymer/components/web-animations-js/src/web-animations-bonus-cancel-events.js
diff options
context:
space:
mode:
Diffstat (limited to 'catapult/third_party/polymer/components/web-animations-js/src/web-animations-bonus-cancel-events.js')
-rw-r--r--catapult/third_party/polymer/components/web-animations-js/src/web-animations-bonus-cancel-events.js83
1 files changed, 83 insertions, 0 deletions
diff --git a/catapult/third_party/polymer/components/web-animations-js/src/web-animations-bonus-cancel-events.js b/catapult/third_party/polymer/components/web-animations-js/src/web-animations-bonus-cancel-events.js
new file mode 100644
index 00000000..3905496f
--- /dev/null
+++ b/catapult/third_party/polymer/components/web-animations-js/src/web-animations-bonus-cancel-events.js
@@ -0,0 +1,83 @@
+// Copyright 2016 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() {
+
+ if (document.createElement('div').animate([]).oncancel !== undefined) {
+ return;
+ }
+
+ if (WEB_ANIMATIONS_TESTING) {
+ var now = function() { return webAnimations1.timeline.currentTime; };
+ } else if (window.performance && performance.now) {
+ var now = function() { return performance.now(); };
+ } else {
+ var now = function() { return Date.now(); };
+ }
+
+ var AnimationCancelEvent = function(target, currentTime, timelineTime) {
+ this.target = target;
+ this.currentTime = currentTime;
+ this.timelineTime = timelineTime;
+
+ this.type = 'cancel';
+ this.bubbles = false;
+ this.cancelable = false;
+ this.currentTarget = target;
+ this.defaultPrevented = false;
+ this.eventPhase = Event.AT_TARGET;
+ this.timeStamp = Date.now();
+ };
+
+ var originalElementAnimate = window.Element.prototype.animate;
+ window.Element.prototype.animate = function(effectInput, options) {
+ var animation = originalElementAnimate.call(this, effectInput, options);
+
+ animation._cancelHandlers = [];
+ animation.oncancel = null;
+
+ var originalCancel = animation.cancel;
+ animation.cancel = function() {
+ originalCancel.call(this);
+ var event = new AnimationCancelEvent(this, null, now());
+ var handlers = this._cancelHandlers.concat(this.oncancel ? [this.oncancel] : []);
+ setTimeout(function() {
+ handlers.forEach(function(handler) {
+ handler.call(event.target, event);
+ });
+ }, 0);
+ };
+
+ var originalAddEventListener = animation.addEventListener;
+ animation.addEventListener = function(type, handler) {
+ if (typeof handler == 'function' && type == 'cancel')
+ this._cancelHandlers.push(handler);
+ else
+ originalAddEventListener.call(this, type, handler);
+ };
+
+ var originalRemoveEventListener = animation.removeEventListener;
+ animation.removeEventListener = function(type, handler) {
+ if (type == 'cancel') {
+ var index = this._cancelHandlers.indexOf(handler);
+ if (index >= 0)
+ this._cancelHandlers.splice(index, 1);
+ } else {
+ originalRemoveEventListener.call(this, type, handler);
+ }
+ };
+
+ return animation;
+ };
+})();