// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Counter used to give webkit animations unique names. var animationCounter = 0; function addAnimation(code) { var name = 'anim' + animationCounter; animationCounter++; var rules = document.createTextNode( '@-webkit-keyframes ' + name + ' {' + code + '}'); var el = document.createElement('style'); el.type = 'text/css'; el.appendChild(rules); el.setAttribute('id', name); document.body.appendChild(el); return name; } /** * Generates css code for fading in an element by animating the height. * @param {number} targetHeight The desired height in pixels after the animation * ends. * @return {string} The css code for the fade in animation. */ function getFadeInAnimationCode(targetHeight) { return '0% { opacity: 0; height: 0; } ' + '80% { height: ' + (targetHeight + 4) + 'px; }' + '100% { opacity: 1; height: ' + targetHeight + 'px; }'; } /** * Fades in an element. Used for both printing options and error messages * appearing underneath the textfields. * @param {HTMLElement} el The element to be faded in. */ function fadeInElement(el) { if (el.classList.contains('visible')) return; el.classList.remove('closing'); el.hidden = false; el.style.height = 'auto'; var height = el.offsetHeight; el.style.height = height + 'px'; var animName = addAnimation(getFadeInAnimationCode(height)); var eventTracker = new EventTracker(); eventTracker.add(el, 'webkitAnimationEnd', onFadeInAnimationEnd.bind(el, eventTracker), false); el.style.webkitAnimationName = animName; el.classList.add('visible'); } /** * Fades out an element. Used for both printing options and error messages * appearing underneath the textfields. * @param {HTMLElement} el The element to be faded out. */ function fadeOutElement(el) { if (!el.classList.contains('visible')) return; el.style.height = 'auto'; var height = el.offsetHeight; el.style.height = height + 'px'; var animName = addAnimation(''); var eventTracker = new EventTracker(); eventTracker.add(el, 'webkitTransitionEnd', onFadeOutTransitionEnd.bind(el, animName, eventTracker), false); el.classList.add('closing'); el.classList.remove('visible'); } /** * Executes when a fade out animation ends. * @param {string} animationName The name of the animation to be removed. * @param {EventTracker} eventTracker The |EventTracker| object that was used * for adding this listener. * @param {WebkitTransitionEvent} event The event that triggered this listener. * @this {HTMLElement} The element where the transition occurred. */ function onFadeOutTransitionEnd(animationName, eventTracker, event) { if (event.propertyName != 'height') return; fadeInOutCleanup(animationName); eventTracker.remove(this, 'webkitTransitionEnd'); this.hidden = true; } /** * Executes when a fade in animation ends. * @param {EventTracker} eventTracker The |EventTracker| object that was used * for adding this listener. * @param {WebkitAnimationEvent} event The event that triggered this listener. * @this {HTMLElement} The element where the transition occurred. */ function onFadeInAnimationEnd(eventTracker, event) { this.style.height = ''; this.style.webkitAnimationName = ''; fadeInOutCleanup(event.animationName); eventTracker.remove(this, 'webkitAnimationEnd'); } /** * Removes the