angularjs-rails 1.2.0.rc2 → 1.2.0.rc3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/angularjs-rails/version.rb +2 -1
- data/vendor/assets/javascripts/angular-animate.js +237 -101
- data/vendor/assets/javascripts/angular-cookies.js +1 -1
- data/vendor/assets/javascripts/angular-loader.js +10 -5
- data/vendor/assets/javascripts/angular-mocks.js +160 -30
- data/vendor/assets/javascripts/angular-resource.js +15 -7
- data/vendor/assets/javascripts/angular-route.js +33 -40
- data/vendor/assets/javascripts/angular-sanitize.js +12 -3
- data/vendor/assets/javascripts/angular-scenario.js +11786 -10305
- data/vendor/assets/javascripts/angular-touch.js +13 -14
- data/vendor/assets/javascripts/angular.js +2328 -1207
- data/vendor/assets/javascripts/unstable/angular-cookies.js +0 -0
- data/vendor/assets/javascripts/unstable/angular-loader.js +0 -0
- data/vendor/assets/javascripts/unstable/angular-mobile.js +0 -0
- data/vendor/assets/javascripts/unstable/angular-mocks.js +0 -0
- data/vendor/assets/javascripts/unstable/angular-resource.js +0 -0
- data/vendor/assets/javascripts/unstable/angular-sanitize.js +0 -0
- data/vendor/assets/javascripts/unstable/angular-scenario.js +0 -0
- data/vendor/assets/javascripts/unstable/angular.js +0 -0
- metadata +47 -6
- data/vendor/assets/javascripts/angular-bootstrap-prettify.js +0 -1835
- data/vendor/assets/javascripts/angular-bootstrap.js +0 -175
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5310c15961be67da6400b9e92357d2df624a877e
|
4
|
+
data.tar.gz: 7e245f7dbdd0374e0a878245d6222c8e960f1906
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a714cf4a158029a91236fce46489d04e94f07ed56bc7219ea7dc58199f42b7737d39c160dce3557c0d0e66c821c05fb8ff0e8f0b41e1948e7f61e29cb5593f7
|
7
|
+
data.tar.gz: 11c319302e864cd8e1f7b0ef977443ac14cecb7be116e5e617d2f9ebdacf7d2acf400eed06d57519c4d3ae7c6f57eaae1e884f955aef45ecd2d16803cec474fe
|
data/README.md
CHANGED
@@ -14,7 +14,7 @@ Add the following directive to your JavaScript manifest file (application.js):
|
|
14
14
|
|
15
15
|
If you desire to require (optional) Angular files, you may include them as well in your JavaScript manifest file (application.js). For example:
|
16
16
|
|
17
|
-
//= require angular-
|
17
|
+
//= require angular-animate
|
18
18
|
//= require angular-resource
|
19
19
|
|
20
20
|
To use the 'unstable' branch, add the following directive to your JavaScript manifest file (application.js):
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.2.0-rc.
|
2
|
+
* @license AngularJS v1.2.0-rc.3
|
3
3
|
* (c) 2010-2012 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -32,7 +32,7 @@
|
|
32
32
|
* | {@link ng.directive:ngInclude#animations ngInclude} | enter and leave |
|
33
33
|
* | {@link ng.directive:ngSwitch#animations ngSwitch} | enter and leave |
|
34
34
|
* | {@link ng.directive:ngIf#animations ngIf} | enter and leave |
|
35
|
-
* | {@link ng.directive:
|
35
|
+
* | {@link ng.directive:ngClass#animations ngClass} | add and remove |
|
36
36
|
* | {@link ng.directive:ngShow#animations ngShow & ngHide} | add and remove (the ng-hide class value) |
|
37
37
|
*
|
38
38
|
* You can find out more information about animations upon visiting each directive page.
|
@@ -207,6 +207,7 @@ angular.module('ngAnimate', ['ng'])
|
|
207
207
|
var selectors = $animateProvider.$$selectors;
|
208
208
|
|
209
209
|
var NG_ANIMATE_STATE = '$$ngAnimateState';
|
210
|
+
var NG_ANIMATE_CLASS_NAME = 'ng-animate';
|
210
211
|
var rootAnimateState = {running:true};
|
211
212
|
$provide.decorator('$animate', ['$delegate', '$injector', '$sniffer', '$rootElement', '$timeout', '$rootScope',
|
212
213
|
function($delegate, $injector, $sniffer, $rootElement, $timeout, $rootScope) {
|
@@ -222,8 +223,11 @@ angular.module('ngAnimate', ['ng'])
|
|
222
223
|
//the empty string value is the default animation
|
223
224
|
//operation which performs CSS transition and keyframe
|
224
225
|
//animations sniffing. This is always included for each
|
225
|
-
//element animation procedure
|
226
|
-
|
226
|
+
//element animation procedure if the browser supports
|
227
|
+
//transitions and/or keyframe animations
|
228
|
+
if ($sniffer.transitions || $sniffer.animations) {
|
229
|
+
classes.push('');
|
230
|
+
}
|
227
231
|
|
228
232
|
for(var i=0; i < classes.length; i++) {
|
229
233
|
var klass = classes[i],
|
@@ -288,6 +292,7 @@ angular.module('ngAnimate', ['ng'])
|
|
288
292
|
* @param {function()=} done callback function that will be called once the animation is complete
|
289
293
|
*/
|
290
294
|
enter : function(element, parent, after, done) {
|
295
|
+
this.enabled(false, element);
|
291
296
|
$delegate.enter(element, parent, after);
|
292
297
|
$rootScope.$$postDigest(function() {
|
293
298
|
performAnimation('enter', 'ng-enter', element, parent, after, function() {
|
@@ -324,6 +329,8 @@ angular.module('ngAnimate', ['ng'])
|
|
324
329
|
* @param {function()=} done callback function that will be called once the animation is complete
|
325
330
|
*/
|
326
331
|
leave : function(element, done) {
|
332
|
+
cancelChildAnimations(element);
|
333
|
+
this.enabled(false, element);
|
327
334
|
$rootScope.$$postDigest(function() {
|
328
335
|
performAnimation('leave', 'ng-leave', element, null, null, function() {
|
329
336
|
$delegate.leave(element, done);
|
@@ -362,6 +369,8 @@ angular.module('ngAnimate', ['ng'])
|
|
362
369
|
* @param {function()=} done callback function that will be called once the animation is complete
|
363
370
|
*/
|
364
371
|
move : function(element, parent, after, done) {
|
372
|
+
cancelChildAnimations(element);
|
373
|
+
this.enabled(false, element);
|
365
374
|
$delegate.move(element, parent, after);
|
366
375
|
$rootScope.$$postDigest(function() {
|
367
376
|
performAnimation('move', 'ng-move', element, null, null, function() {
|
@@ -452,12 +461,30 @@ angular.module('ngAnimate', ['ng'])
|
|
452
461
|
* Globally enables/disables animations.
|
453
462
|
*
|
454
463
|
*/
|
455
|
-
enabled : function(value) {
|
456
|
-
|
457
|
-
|
464
|
+
enabled : function(value, element) {
|
465
|
+
switch(arguments.length) {
|
466
|
+
case 2:
|
467
|
+
if(value) {
|
468
|
+
cleanup(element);
|
469
|
+
}
|
470
|
+
else {
|
471
|
+
var data = element.data(NG_ANIMATE_STATE) || {};
|
472
|
+
data.structural = true;
|
473
|
+
data.running = true;
|
474
|
+
element.data(NG_ANIMATE_STATE, data);
|
475
|
+
}
|
476
|
+
break;
|
477
|
+
|
478
|
+
case 1:
|
479
|
+
rootAnimateState.running = !value;
|
480
|
+
break;
|
481
|
+
|
482
|
+
default:
|
483
|
+
value = !rootAnimateState.running
|
484
|
+
break;
|
458
485
|
}
|
459
|
-
return
|
460
|
-
|
486
|
+
return !!value;
|
487
|
+
}
|
461
488
|
};
|
462
489
|
|
463
490
|
/*
|
@@ -484,52 +511,52 @@ angular.module('ngAnimate', ['ng'])
|
|
484
511
|
|
485
512
|
//skip the animation if animations are disabled, a parent is already being animated
|
486
513
|
//or the element is not currently attached to the document body.
|
487
|
-
if ((parent.inheritedData(NG_ANIMATE_STATE) || disabledAnimation).running) {
|
488
|
-
|
489
|
-
//data or className values since this happens earlier than that
|
490
|
-
//and also use a timeout so that it won't be asynchronous
|
491
|
-
$timeout(onComplete || noop, 0, false);
|
514
|
+
if ((parent.inheritedData(NG_ANIMATE_STATE) || disabledAnimation).running || animations.length == 0) {
|
515
|
+
done();
|
492
516
|
return;
|
493
517
|
}
|
494
518
|
|
495
519
|
var ngAnimateState = element.data(NG_ANIMATE_STATE) || {};
|
496
520
|
|
497
|
-
|
498
|
-
//to cancel that animation and fire any required callbacks
|
521
|
+
var isClassBased = event == 'addClass' || event == 'removeClass';
|
499
522
|
if(ngAnimateState.running) {
|
523
|
+
if(isClassBased && ngAnimateState.structural) {
|
524
|
+
onComplete && onComplete();
|
525
|
+
return;
|
526
|
+
}
|
527
|
+
|
528
|
+
//if an animation is currently running on the element then lets take the steps
|
529
|
+
//to cancel that animation and fire any required callbacks
|
530
|
+
$timeout.cancel(ngAnimateState.flagTimer);
|
500
531
|
cancelAnimations(ngAnimateState.animations);
|
501
|
-
ngAnimateState.done();
|
532
|
+
(ngAnimateState.done || noop)();
|
502
533
|
}
|
503
534
|
|
504
535
|
element.data(NG_ANIMATE_STATE, {
|
505
536
|
running:true,
|
537
|
+
structural:!isClassBased,
|
506
538
|
animations:animations,
|
507
539
|
done:done
|
508
540
|
});
|
509
541
|
|
542
|
+
//the ng-animate class does nothing, but it's here to allow for
|
543
|
+
//parent animations to find and cancel child animations when needed
|
544
|
+
element.addClass(NG_ANIMATE_CLASS_NAME);
|
545
|
+
|
510
546
|
forEach(animations, function(animation, index) {
|
511
547
|
var fn = function() {
|
512
548
|
progress(index);
|
513
549
|
};
|
514
550
|
|
515
551
|
if(animation.start) {
|
516
|
-
|
517
|
-
animation.
|
518
|
-
|
519
|
-
animation.endFn = animation.start(element, fn);
|
520
|
-
}
|
552
|
+
animation.endFn = isClassBased ?
|
553
|
+
animation.start(element, className, fn) :
|
554
|
+
animation.start(element, fn);
|
521
555
|
} else {
|
522
556
|
fn();
|
523
557
|
}
|
524
558
|
});
|
525
559
|
|
526
|
-
function cancelAnimations(animations) {
|
527
|
-
var isCancelledFlag = true;
|
528
|
-
forEach(animations, function(animation) {
|
529
|
-
(animation.endFn || noop)(isCancelledFlag);
|
530
|
-
});
|
531
|
-
}
|
532
|
-
|
533
560
|
function progress(index) {
|
534
561
|
animations[index].done = true;
|
535
562
|
(animations[index].endFn || noop)();
|
@@ -542,118 +569,218 @@ angular.module('ngAnimate', ['ng'])
|
|
542
569
|
function done() {
|
543
570
|
if(!done.hasBeenRun) {
|
544
571
|
done.hasBeenRun = true;
|
545
|
-
element.
|
572
|
+
var data = element.data(NG_ANIMATE_STATE);
|
573
|
+
if(data) {
|
574
|
+
/* only structural animations wait for reflow before removing an
|
575
|
+
animation, but class-based animations don't. An example of this
|
576
|
+
failing would be when a parent HTML tag has a ng-class attribute
|
577
|
+
causing ALL directives below to skip animations during the digest */
|
578
|
+
if(isClassBased) {
|
579
|
+
cleanup(element);
|
580
|
+
} else {
|
581
|
+
data.flagTimer = $timeout(function() {
|
582
|
+
cleanup(element);
|
583
|
+
}, 0, false);
|
584
|
+
element.data(NG_ANIMATE_STATE, data);
|
585
|
+
}
|
586
|
+
}
|
546
587
|
(onComplete || noop)();
|
547
588
|
}
|
548
589
|
}
|
549
590
|
}
|
591
|
+
|
592
|
+
function cancelChildAnimations(element) {
|
593
|
+
angular.forEach(element[0].querySelectorAll('.' + NG_ANIMATE_CLASS_NAME), function(element) {
|
594
|
+
element = angular.element(element);
|
595
|
+
var data = element.data(NG_ANIMATE_STATE);
|
596
|
+
if(data) {
|
597
|
+
cancelAnimations(data.animations);
|
598
|
+
cleanup(element);
|
599
|
+
}
|
600
|
+
});
|
601
|
+
}
|
602
|
+
|
603
|
+
function cancelAnimations(animations) {
|
604
|
+
var isCancelledFlag = true;
|
605
|
+
forEach(animations, function(animation) {
|
606
|
+
(animation.endFn || noop)(isCancelledFlag);
|
607
|
+
});
|
608
|
+
}
|
609
|
+
|
610
|
+
function cleanup(element) {
|
611
|
+
element.removeClass(NG_ANIMATE_CLASS_NAME);
|
612
|
+
element.removeData(NG_ANIMATE_STATE);
|
613
|
+
}
|
550
614
|
}]);
|
551
615
|
|
552
|
-
$animateProvider.register('', ['$window','$sniffer', '$timeout', function($window, $sniffer, $timeout) {
|
553
|
-
var noop = angular.noop;
|
616
|
+
$animateProvider.register('', ['$window', '$sniffer', '$timeout', function($window, $sniffer, $timeout) {
|
554
617
|
var forEach = angular.forEach;
|
555
618
|
|
556
|
-
//
|
557
|
-
var
|
558
|
-
|
619
|
+
// Detect proper transitionend/animationend event names.
|
620
|
+
var transitionProp, transitionendEvent, animationProp, animationendEvent;
|
621
|
+
|
622
|
+
// If unprefixed events are not supported but webkit-prefixed are, use the latter.
|
623
|
+
// Otherwise, just use W3C names, browsers not supporting them at all will just ignore them.
|
624
|
+
// Note: Chrome implements `window.onwebkitanimationend` and doesn't implement `window.onanimationend`
|
625
|
+
// but at the same time dispatches the `animationend` event and not `webkitAnimationEnd`.
|
626
|
+
// Register both events in case `window.onanimationend` is not supported because of that,
|
627
|
+
// do the same for `transitionend` as Safari is likely to exhibit similar behavior.
|
628
|
+
// Also, the only modern browser that uses vendor prefixes for transitions/keyframes is webkit
|
629
|
+
// therefore there is no reason to test anymore for other vendor prefixes: http://caniuse.com/#search=transition
|
630
|
+
if (window.ontransitionend === undefined && window.onwebkittransitionend !== undefined) {
|
631
|
+
transitionProp = 'WebkitTransition';
|
632
|
+
transitionendEvent = 'webkitTransitionEnd transitionend';
|
633
|
+
} else {
|
634
|
+
transitionProp = 'transition';
|
635
|
+
transitionendEvent = 'transitionend';
|
636
|
+
}
|
559
637
|
|
560
|
-
|
561
|
-
|
562
|
-
|
638
|
+
if (window.onanimationend === undefined && window.onwebkitanimationend !== undefined) {
|
639
|
+
animationProp = 'WebkitAnimation';
|
640
|
+
animationendEvent = 'webkitAnimationEnd animationend';
|
641
|
+
} else {
|
642
|
+
animationProp = 'animation';
|
643
|
+
animationendEvent = 'animationend';
|
644
|
+
}
|
563
645
|
|
564
646
|
var durationKey = 'Duration',
|
565
|
-
delayKey = 'Delay',
|
566
647
|
propertyKey = 'Property',
|
648
|
+
delayKey = 'Delay',
|
567
649
|
animationIterationCountKey = 'IterationCount',
|
568
650
|
ELEMENT_NODE = 1;
|
569
651
|
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
652
|
+
var NG_ANIMATE_PARENT_KEY = '$ngAnimateKey';
|
653
|
+
var lookupCache = {};
|
654
|
+
var parentCounter = 0;
|
655
|
+
|
656
|
+
var animationReflowQueue = [], animationTimer, timeOut = false;
|
657
|
+
function afterReflow(callback) {
|
658
|
+
animationReflowQueue.push(callback);
|
659
|
+
$timeout.cancel(animationTimer);
|
660
|
+
animationTimer = $timeout(function() {
|
661
|
+
angular.forEach(animationReflowQueue, function(fn) {
|
662
|
+
fn();
|
663
|
+
});
|
664
|
+
animationReflowQueue = [];
|
665
|
+
animationTimer = null;
|
666
|
+
lookupCache = {};
|
667
|
+
}, 10, false);
|
668
|
+
}
|
669
|
+
|
670
|
+
function getElementAnimationDetails(element, cacheKey, onlyCheckTransition) {
|
671
|
+
var data = lookupCache[cacheKey];
|
672
|
+
if(!data) {
|
673
|
+
var transitionDuration = 0, transitionDelay = 0,
|
674
|
+
animationDuration = 0, animationDelay = 0;
|
675
|
+
|
676
|
+
//we want all the styles defined before and after
|
577
677
|
forEach(element, function(element) {
|
578
678
|
if (element.nodeType == ELEMENT_NODE) {
|
579
679
|
var elementStyles = $window.getComputedStyle(element) || {};
|
580
|
-
|
581
|
-
|
582
|
-
|
680
|
+
|
681
|
+
transitionDuration = Math.max(parseMaxTime(elementStyles[transitionProp + durationKey]), transitionDuration);
|
682
|
+
|
683
|
+
if(!onlyCheckTransition) {
|
684
|
+
transitionDelay = Math.max(parseMaxTime(elementStyles[transitionProp + delayKey]), transitionDelay);
|
685
|
+
|
686
|
+
animationDelay = Math.max(parseMaxTime(elementStyles[animationProp + delayKey]), animationDelay);
|
687
|
+
|
688
|
+
var aDuration = parseMaxTime(elementStyles[animationProp + durationKey]);
|
689
|
+
|
690
|
+
if(aDuration > 0) {
|
691
|
+
aDuration *= parseInt(elementStyles[animationProp + animationIterationCountKey]) || 1;
|
692
|
+
}
|
693
|
+
|
694
|
+
animationDuration = Math.max(aDuration, animationDuration);
|
695
|
+
}
|
583
696
|
}
|
584
697
|
});
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
698
|
+
data = {
|
699
|
+
transitionDelay : transitionDelay,
|
700
|
+
animationDelay : animationDelay,
|
701
|
+
transitionDuration : transitionDuration,
|
702
|
+
animationDuration : animationDuration
|
703
|
+
};
|
704
|
+
lookupCache[cacheKey] = data;
|
589
705
|
}
|
706
|
+
return data;
|
707
|
+
}
|
590
708
|
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
709
|
+
function parseMaxTime(str) {
|
710
|
+
var total = 0, values = angular.isString(str) ? str.split(/\s*,\s*/) : [];
|
711
|
+
forEach(values, function(value) {
|
712
|
+
total = Math.max(parseFloat(value) || 0, total);
|
713
|
+
});
|
714
|
+
return total;
|
715
|
+
}
|
598
716
|
|
599
|
-
|
600
|
-
|
717
|
+
function getCacheKey(element) {
|
718
|
+
var parent = element.parent();
|
719
|
+
var parentID = parent.data(NG_ANIMATE_PARENT_KEY);
|
720
|
+
if(!parentID) {
|
721
|
+
parent.data(NG_ANIMATE_PARENT_KEY, ++parentCounter);
|
722
|
+
parentID = parentCounter;
|
723
|
+
}
|
724
|
+
return parentID + '-' + element[0].className;
|
725
|
+
}
|
601
726
|
|
602
|
-
|
603
|
-
parseMaxTime(elementStyles[vendorAnimationProp + delayKey]));
|
727
|
+
function animate(element, className, done) {
|
604
728
|
|
605
|
-
|
606
|
-
|
729
|
+
var cacheKey = getCacheKey(element);
|
730
|
+
if(getElementAnimationDetails(element, cacheKey, true).transitionDuration > 0) {
|
607
731
|
|
608
|
-
|
609
|
-
|
732
|
+
done();
|
733
|
+
return;
|
734
|
+
}
|
610
735
|
|
611
|
-
|
612
|
-
animationDuration *= Math.max(parseInt(elementStyles[w3cAnimationProp + animationIterationCountKey]) || 0,
|
613
|
-
parseInt(elementStyles[vendorAnimationProp + animationIterationCountKey]) || 0,
|
614
|
-
1);
|
615
|
-
}
|
736
|
+
element.addClass(className);
|
616
737
|
|
617
|
-
|
618
|
-
transitionDelay + transitionDuration,
|
619
|
-
duration);
|
620
|
-
}
|
621
|
-
});
|
738
|
+
var timings = getElementAnimationDetails(element, cacheKey + ' ' + className);
|
622
739
|
|
623
740
|
/* there is no point in performing a reflow if the animation
|
624
741
|
timeout is empty (this would cause a flicker bug normally
|
625
|
-
in the page
|
626
|
-
|
627
|
-
|
742
|
+
in the page. There is also no point in performing an animation
|
743
|
+
that only has a delay and no duration */
|
744
|
+
var maxDuration = Math.max(timings.transitionDuration, timings.animationDuration);
|
745
|
+
if(maxDuration > 0) {
|
746
|
+
var maxDelayTime = Math.max(timings.transitionDelay, timings.animationDelay) * 1000,
|
747
|
+
startTime = Date.now(),
|
748
|
+
node = element[0];
|
628
749
|
|
629
750
|
//temporarily disable the transition so that the enter styles
|
630
751
|
//don't animate twice (this is here to avoid a bug in Chrome/FF).
|
631
|
-
|
632
|
-
|
752
|
+
if(timings.transitionDuration > 0) {
|
753
|
+
node.style[transitionProp + propertyKey] = 'none';
|
754
|
+
}
|
633
755
|
|
634
756
|
var activeClassName = '';
|
635
757
|
forEach(className.split(' '), function(klass, i) {
|
636
758
|
activeClassName += (i > 0 ? ' ' : '') + klass + '-active';
|
637
759
|
});
|
638
760
|
|
639
|
-
//
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
761
|
+
// This triggers a reflow which allows for the transition animation to kick in.
|
762
|
+
var css3AnimationEvents = animationendEvent + ' ' + transitionendEvent;
|
763
|
+
|
764
|
+
afterReflow(function() {
|
765
|
+
if(timings.transitionDuration > 0) {
|
766
|
+
node.style[transitionProp + propertyKey] = '';
|
767
|
+
}
|
768
|
+
element.addClass(activeClassName);
|
769
|
+
});
|
644
770
|
|
645
|
-
|
771
|
+
element.on(css3AnimationEvents, onAnimationProgress);
|
646
772
|
|
647
|
-
//
|
648
|
-
//there is no need to attach this internally to the
|
649
|
-
//timeout done method
|
773
|
+
// This will automatically be called by $animate so
|
774
|
+
// there is no need to attach this internally to the
|
775
|
+
// timeout done method.
|
650
776
|
return function onEnd(cancelled) {
|
777
|
+
element.off(css3AnimationEvents, onAnimationProgress);
|
651
778
|
element.removeClass(className);
|
652
779
|
element.removeClass(activeClassName);
|
653
780
|
|
654
|
-
//
|
655
|
-
//function not called for this animation therefore
|
656
|
-
//this must be also called
|
781
|
+
// Only when the animation is cancelled is the done()
|
782
|
+
// function not called for this animation therefore
|
783
|
+
// this must be also called.
|
657
784
|
if(cancelled) {
|
658
785
|
done();
|
659
786
|
}
|
@@ -664,13 +791,22 @@ angular.module('ngAnimate', ['ng'])
|
|
664
791
|
done();
|
665
792
|
}
|
666
793
|
|
667
|
-
function
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
794
|
+
function onAnimationProgress(event) {
|
795
|
+
event.stopPropagation();
|
796
|
+
var ev = event.originalEvent || event;
|
797
|
+
var timeStamp = ev.$manualTimeStamp || ev.timeStamp || Date.now();
|
798
|
+
/* $manualTimeStamp is a mocked timeStamp value which is set
|
799
|
+
* within browserTrigger(). This is only here so that tests can
|
800
|
+
* mock animations properly. Real events fallback to event.timeStamp,
|
801
|
+
* or, if they don't, then a timeStamp is automatically created for them.
|
802
|
+
* We're checking to see if the timeStamp surpasses the expected delay,
|
803
|
+
* but we're using elapsedTime instead of the timeStamp on the 2nd
|
804
|
+
* pre-condition since animations sometimes close off early */
|
805
|
+
if(Math.max(timeStamp - startTime, 0) >= maxDelayTime && ev.elapsedTime >= maxDuration) {
|
806
|
+
done();
|
807
|
+
}
|
673
808
|
}
|
809
|
+
|
674
810
|
}
|
675
811
|
|
676
812
|
return {
|