]> source.dussan.org Git - jquery.git/commitdiff
Fix #12447: Ensure starting-point calc takes finite time. Close gh-922.
authorRichard Gibson <richard.gibson@gmail.com>
Sat, 15 Sep 2012 15:57:01 +0000 (11:57 -0400)
committerDave Methvin <dave.methvin@gmail.com>
Sat, 15 Sep 2012 17:10:37 +0000 (13:10 -0400)
src/effects.js

index 8752838fbf1ba4b61ab54ee06ea0c44b7e87fcf0..3118da40707543d2cb4c4adb8795dc7b3ba6d6cc 100644 (file)
@@ -5,12 +5,13 @@ var fxNow, timerId,
        animationPrefilters = [ defaultPrefilter ],
        tweeners = {
                "*": [function( prop, value ) {
-                       var end, unit, prevScale,
+                       var end, unit,
                                tween = this.createTween( prop, value ),
                                parts = rfxnum.exec( value ),
                                target = tween.cur(),
                                start = +target || 0,
-                               scale = 1;
+                               scale = 1,
+                               maxIterations = 20;
 
                        if ( parts ) {
                                end = +parts[2];
@@ -26,17 +27,15 @@ var fxNow, timerId,
                                        do {
                                                // If previous iteration zeroed out, double until we get *something*
                                                // Use a string for doubling factor so we don't accidentally see scale as unchanged below
-                                               prevScale = scale = scale || ".5";
+                                               scale = scale || ".5";
 
                                                // Adjust and apply
                                                start = start / scale;
                                                jQuery.style( tween.elem, prop, start + unit );
 
-                                               // Update scale, tolerating zeroes from tween.cur()
-                                               scale = tween.cur() / target;
-
-                                       // Stop looping if we've hit the mark or scale is unchanged
-                                       } while ( scale !== 1 && scale !== prevScale );
+                                       // Update scale, tolerating zero or NaN from tween.cur()
+                                       // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+                                       } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
                                }
 
                                tween.unit = unit;