blob: 3905496f480a741f03b76100284cd076dda95e33 [file] [log] [blame]
// 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;
};
})();