@@ -18,6 +18,7 @@ var QUnit = {
18
18
stats : { all : 0 , bad : 0 } ,
19
19
moduleStats : { all : 0 , bad : 0 } ,
20
20
started : + new Date ,
21
+ updateRate : 1000 ,
21
22
blocking : false ,
22
23
autorun : false ,
23
24
assertions : [ ] ,
@@ -590,8 +591,16 @@ function synchronize( callback ) {
590
591
}
591
592
592
593
function process ( ) {
594
+ var start = ( new Date ( ) ) . getTime ( ) ;
595
+
593
596
while ( config . queue . length && ! config . blocking ) {
594
- config . queue . shift ( ) ( ) ;
597
+ if ( config . updateRate <= 0 || ( ( ( new Date ( ) ) . getTime ( ) - start ) < config . updateRate ) ) {
598
+ config . queue . shift ( ) ( ) ;
599
+
600
+ } else {
601
+ setTimeout ( process , 13 ) ;
602
+ break ;
603
+ }
595
604
}
596
605
}
597
606
@@ -679,6 +688,7 @@ QUnit.equiv = function () {
679
688
680
689
var innerEquiv ; // the real equiv function
681
690
var callers = [ ] ; // stack to decide between skip/abort functions
691
+ var parents = [ ] ; // stack to avoiding loops from circular referencing
682
692
683
693
684
694
// Determine what is o.
@@ -788,28 +798,39 @@ QUnit.equiv = function () {
788
798
} ,
789
799
790
800
"array" : function ( b , a ) {
791
- var i ;
801
+ var i , j , loop ;
792
802
var len ;
793
803
794
804
// b could be an object literal here
795
805
if ( ! ( hoozit ( b ) === "array" ) ) {
796
806
return false ;
797
- }
798
-
807
+ }
808
+
799
809
len = a . length ;
800
810
if ( len !== b . length ) { // safe and faster
801
811
return false ;
802
812
}
813
+
814
+ //track reference to avoid circular references
815
+ parents . push ( a ) ;
803
816
for ( i = 0 ; i < len ; i ++ ) {
804
- if ( ! innerEquiv ( a [ i ] , b [ i ] ) ) {
817
+ loop = false ;
818
+ for ( j = 0 ; j < parents . length ; j ++ ) {
819
+ if ( parents [ j ] === a [ i ] ) {
820
+ loop = true ; //dont rewalk array
821
+ }
822
+ }
823
+ if ( ! loop && ! innerEquiv ( a [ i ] , b [ i ] ) ) {
824
+ parents . pop ( ) ;
805
825
return false ;
806
826
}
807
827
}
828
+ parents . pop ( ) ;
808
829
return true ;
809
830
} ,
810
831
811
832
"object" : function ( b , a ) {
812
- var i ;
833
+ var i , j , loop ;
813
834
var eq = true ; // unless we can proove it
814
835
var aProperties = [ ] , bProperties = [ ] ; // collection of strings
815
836
@@ -820,18 +841,25 @@ QUnit.equiv = function () {
820
841
821
842
// stack constructor before traversing properties
822
843
callers . push ( a . constructor ) ;
823
-
844
+ //track reference to avoid circular references
845
+ parents . push ( a ) ;
846
+
824
847
for ( i in a ) { // be strict: don't ensures hasOwnProperty and go deep
825
-
848
+ loop = false ;
849
+ for ( j = 0 ; j < parents . length ; j ++ ) {
850
+ if ( parents [ j ] === a [ i ] )
851
+ loop = true ; //don't go down the same path twice
852
+ }
826
853
aProperties . push ( i ) ; // collect a's properties
827
854
828
- if ( ! innerEquiv ( a [ i ] , b [ i ] ) ) {
855
+ if ( ! loop && ! innerEquiv ( a [ i ] , b [ i ] ) ) {
829
856
eq = false ;
830
857
break ;
831
858
}
832
859
}
833
860
834
861
callers . pop ( ) ; // unstack, we are done
862
+ parents . pop ( ) ;
835
863
836
864
for ( i in b ) {
837
865
bProperties . push ( i ) ; // collect b's properties
0 commit comments