Index: third_party/polymer/components/web-animations-js/src/web-animations-bonus-cancel-events.js |
diff --git a/third_party/polymer/components/web-animations-js/src/web-animations-bonus-cancel-events.js b/third_party/polymer/components/web-animations-js/src/web-animations-bonus-cancel-events.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3905496f480a741f03b76100284cd076dda95e33 |
--- /dev/null |
+++ b/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; |
+ }; |
+})(); |