@@ -598,4 +598,166 @@ describe('Observable.ajax', () => {
598
598
} ) ;
599
599
600
600
} ) ;
601
+
602
+ it ( 'should work fine when XMLHttpRequest onreadystatechange property is monkey patched' , function ( ) {
603
+ Object . defineProperty ( root . XMLHttpRequest . prototype , 'onreadystatechange' , {
604
+ set : function ( fn : ( e : ProgressEvent ) => any ) {
605
+ const wrapFn = ( ev : ProgressEvent ) => {
606
+ const result = fn . call ( this , ev ) ;
607
+ if ( result === false ) {
608
+ ev . preventDefault ( ) ;
609
+ }
610
+ } ;
611
+ this [ '_onreadystatechange' ] = wrapFn ;
612
+ } ,
613
+ get ( ) {
614
+ return this [ '_onreadystatechange' ] ;
615
+ } ,
616
+ configurable : true
617
+ } ) ;
618
+
619
+ Rx . Observable . ajax ( {
620
+ url : '/flibbertyJibbet'
621
+ } )
622
+ . subscribe ( ) ;
623
+
624
+ const request = MockXMLHttpRequest . mostRecent ;
625
+ expect ( ( ) => {
626
+ request . onreadystatechange ( ( < any > 'onreadystatechange' ) ) ;
627
+ } ) . not . throw ( ) ;
628
+
629
+ delete root . XMLHttpRequest . prototype . onreadystatechange ;
630
+ } ) ;
631
+
632
+ it ( 'should work fine when XMLHttpRequest ontimeout property is monkey patched' , function ( ) {
633
+ Object . defineProperty ( root . XMLHttpRequest . prototype , 'ontimeout' , {
634
+ set : function ( fn : ( e : ProgressEvent ) => any ) {
635
+ const wrapFn = ( ev : ProgressEvent ) => {
636
+ const result = fn . call ( this , ev ) ;
637
+ if ( result === false ) {
638
+ ev . preventDefault ( ) ;
639
+ }
640
+ } ;
641
+ this [ '_ontimeout' ] = wrapFn ;
642
+ } ,
643
+ get ( ) {
644
+ return this [ '_ontimeout' ] ;
645
+ } ,
646
+ configurable : true
647
+ } ) ;
648
+
649
+ const ajaxRequest = {
650
+ url : '/flibbertyJibbet'
651
+ } ;
652
+
653
+ Rx . Observable . ajax ( ajaxRequest )
654
+ . subscribe ( ) ;
655
+
656
+ const request = MockXMLHttpRequest . mostRecent ;
657
+ try {
658
+ request . ontimeout ( ( < any > 'ontimeout' ) ) ;
659
+ } catch ( e ) {
660
+ expect ( e . message ) . to . equal ( new Rx . AjaxTimeoutError ( ( < any > request ) , ajaxRequest ) . message ) ;
661
+ }
662
+ delete root . XMLHttpRequest . prototype . ontimeout ;
663
+ } ) ;
664
+
665
+ it ( 'should work fine when XMLHttpRequest onprogress property is monkey patched' , function ( ) {
666
+ Object . defineProperty ( root . XMLHttpRequest . prototype , 'onprogress' , {
667
+ set : function ( fn : ( e : ProgressEvent ) => any ) {
668
+ const wrapFn = ( ev : ProgressEvent ) => {
669
+ const result = fn . call ( this , ev ) ;
670
+ if ( result === false ) {
671
+ ev . preventDefault ( ) ;
672
+ }
673
+ } ;
674
+ this [ '_onprogress' ] = wrapFn ;
675
+ } ,
676
+ get ( ) {
677
+ return this [ '_onprogress' ] ;
678
+ } ,
679
+ configurable : true
680
+ } ) ;
681
+
682
+ Object . defineProperty ( root . XMLHttpRequest . prototype , 'upload' , {
683
+ get ( ) {
684
+ return true ;
685
+ } ,
686
+ configurable : true
687
+ } ) ;
688
+
689
+ // mock for onprogress
690
+ root . XDomainRequest = true ;
691
+
692
+ Rx . Observable . ajax ( {
693
+ url : '/flibbertyJibbet' ,
694
+ progressSubscriber : ( < any > {
695
+ next : ( ) => {
696
+ // noop
697
+ } ,
698
+ error : ( ) => {
699
+ // noop
700
+ } ,
701
+ complete : ( ) => {
702
+ // noop
703
+ }
704
+ } )
705
+ } )
706
+ . subscribe ( ) ;
707
+
708
+ const request = MockXMLHttpRequest . mostRecent ;
709
+
710
+ expect ( ( ) => {
711
+ request . onprogress ( ( < any > 'onprogress' ) ) ;
712
+ } ) . not . throw ( ) ;
713
+
714
+ delete root . XMLHttpRequest . prototype . onprogress ;
715
+ delete root . XMLHttpRequest . prototype . upload ;
716
+ delete root . XDomainRequest ;
717
+ } ) ;
718
+
719
+ it ( 'should work fine when XMLHttpRequest onerror property is monkey patched' , function ( ) {
720
+ Object . defineProperty ( root . XMLHttpRequest . prototype , 'onerror' , {
721
+ set : function ( fn : ( e : ProgressEvent ) => any ) {
722
+ const wrapFn = ( ev : ProgressEvent ) => {
723
+ const result = fn . call ( this , ev ) ;
724
+ if ( result === false ) {
725
+ ev . preventDefault ( ) ;
726
+ }
727
+ } ;
728
+ this [ '_onerror' ] = wrapFn ;
729
+ } ,
730
+ get ( ) {
731
+ return this [ '_onerror' ] ;
732
+ } ,
733
+ configurable : true
734
+ } ) ;
735
+
736
+ Object . defineProperty ( root . XMLHttpRequest . prototype , 'upload' , {
737
+ get ( ) {
738
+ return true ;
739
+ } ,
740
+ configurable : true
741
+ } ) ;
742
+
743
+ // mock for onprogress
744
+ root . XDomainRequest = true ;
745
+
746
+ Rx . Observable . ajax ( {
747
+ url : '/flibbertyJibbet'
748
+ } )
749
+ . subscribe ( ) ;
750
+
751
+ const request = MockXMLHttpRequest . mostRecent ;
752
+
753
+ try {
754
+ request . onerror ( ( < any > 'onerror' ) ) ;
755
+ } catch ( e ) {
756
+ expect ( e . message ) . to . equal ( 'ajax error' ) ;
757
+ }
758
+
759
+ delete root . XMLHttpRequest . prototype . onerror ;
760
+ delete root . XMLHttpRequest . prototype . upload ;
761
+ delete root . XDomainRequest ;
762
+ } ) ;
601
763
} ) ;
0 commit comments