@@ -5,13 +5,36 @@ var NG_ANIMATE_PIN_DATA = '$ngAnimatePin';
5
5
var $$AnimateQueueProvider = [ '$animateProvider' , function ( $animateProvider ) {
6
6
var PRE_DIGEST_STATE = 1 ;
7
7
var RUNNING_STATE = 2 ;
8
+ var ONE_SPACE = ' ' ;
8
9
9
10
var rules = this . rules = {
10
11
skip : [ ] ,
11
12
cancel : [ ] ,
12
13
join : [ ]
13
14
} ;
14
15
16
+ function makeTruthyCssClassMap ( classString ) {
17
+ if ( ! classString ) {
18
+ return null ;
19
+ }
20
+
21
+ var keys = classString . split ( ONE_SPACE ) ;
22
+ var map = Object . create ( null ) ;
23
+
24
+ forEach ( keys , function ( key ) {
25
+ map [ key ] = true ;
26
+ } ) ;
27
+ return map ;
28
+ }
29
+
30
+ function hasMatchingClasses ( classString , classMap ) {
31
+ if ( classString && classMap ) {
32
+ return classString . split ( ONE_SPACE ) . some ( function ( className ) {
33
+ return classMap [ className ] ;
34
+ } ) ;
35
+ }
36
+ }
37
+
15
38
function isAllowed ( ruleType , element , currentAnimation , previousAnimation ) {
16
39
return rules [ ruleType ] . some ( function ( fn ) {
17
40
return fn ( element , currentAnimation , previousAnimation ) ;
@@ -59,11 +82,24 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
59
82
} ) ;
60
83
61
84
rules . cancel . push ( function ( element , newAnimation , currentAnimation ) {
62
- var nO = newAnimation . options ;
63
- var cO = currentAnimation . options ;
64
85
65
- // if the exact same CSS class is added/removed then it's safe to cancel it
66
- return ( nO . addClass && nO . addClass === cO . removeClass ) || ( nO . removeClass && nO . removeClass === cO . addClass ) ;
86
+
87
+ var nA = newAnimation . options . addClass ;
88
+ var nR = newAnimation . options . removeClass ;
89
+ var cA = currentAnimation . options . addClass ;
90
+ var cR = currentAnimation . options . removeClass ;
91
+
92
+ // early detection to save the global CPU shortage :)
93
+ if ( ( ! isDefined ( nA ) && ! isDefined ( nR ) ) || ( ! isDefined ( cA ) && ! isDefined ( cR ) ) ) {
94
+ return false ;
95
+ }
96
+
97
+ var cancelSomething = false ;
98
+
99
+ cA = makeTruthyCssClassMap ( cA ) ;
100
+ cR = makeTruthyCssClassMap ( cR ) ;
101
+
102
+ return ( hasMatchingClasses ( nA , cR ) ) || ( hasMatchingClasses ( nR , cA ) ) ;
67
103
} ) ;
68
104
69
105
this . $get = [ '$$rAF' , '$rootScope' , '$rootElement' , '$document' , '$$HashMap' ,
0 commit comments