diff options
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.js | 83 |
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; + }; +})(); |