UNPKG

web-animations-js

Version:

JavaScript implementation of the Web Animations API

84 lines (72 loc) 2.83 kB
// 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; }; })();