@@ -534,105 +534,90 @@ describe('Zone', function() {
534
534
} ) ;
535
535
} ) ;
536
536
537
- it ( 'should support window.addEventListener(unhandledrejection)' , function ( done ) {
538
- if ( ! promiseUnhandleRejectionSupport ( ) ) {
539
- done ( ) ;
540
- return ;
541
- }
542
- ( Zone as any ) [ zoneSymbol ( 'ignoreConsoleErrorUncaughtError' ) ] = true ;
543
- rootZone . fork ( { name : 'promise' } ) . run ( function ( ) {
544
- const listener = ( evt : any ) => {
545
- expect ( evt . type ) . toEqual ( 'unhandledrejection' ) ;
546
- expect ( evt . promise . constructor . name ) . toEqual ( 'Promise' ) ;
547
- expect ( evt . reason . message ) . toBe ( 'promise error' ) ;
548
- window . removeEventListener ( 'unhandledrejection' , listener ) ;
549
- done ( ) ;
550
- } ;
551
- window . addEventListener ( 'unhandledrejection' , listener ) ;
552
- new Promise ( ( resolve , reject ) => {
553
- throw new Error ( 'promise error' ) ;
554
- } ) ;
555
- } ) ;
556
- } ) ;
557
-
558
- it ( 'should support window.addEventListener(rejectionhandled)' , function ( done ) {
559
- if ( ! promiseUnhandleRejectionSupport ( ) ) {
560
- done ( ) ;
561
- return ;
562
- }
563
- ( Zone as any ) [ zoneSymbol ( 'ignoreConsoleErrorUncaughtError' ) ] = true ;
564
- rootZone . fork ( { name : 'promise' } ) . run ( function ( ) {
565
- const listener = ( evt : any ) => {
566
- window . removeEventListener ( 'unhandledrejection' , listener ) ;
567
- p . catch ( reason => { } ) ;
568
- } ;
569
- window . addEventListener ( 'unhandledrejection' , listener ) ;
570
-
571
- window . addEventListener ( 'rejectionhandled' , ( evt : any ) => {
572
- expect ( evt . type ) . toEqual ( 'rejectionhandled' ) ;
573
- expect ( evt . promise . constructor . name ) . toEqual ( 'Promise' ) ;
574
- expect ( evt . reason . message ) . toBe ( 'promise error' ) ;
575
- done ( ) ;
576
- } ) ;
577
- const p = new Promise ( ( resolve , reject ) => {
578
- throw new Error ( 'promise error' ) ;
579
- } ) ;
580
- } ) ;
581
- } ) ;
582
-
583
- it ( 'should support multiple window.addEventListener(unhandledrejection)' , function ( done ) {
584
- if ( ! promiseUnhandleRejectionSupport ( ) ) {
585
- done ( ) ;
586
- return ;
587
- }
588
- ( Zone as any ) [ zoneSymbol ( 'ignoreConsoleErrorUncaughtError' ) ] = true ;
589
- rootZone . fork ( { name : 'promise' } ) . run ( function ( ) {
590
- const listener1 = ( evt : any ) => {
591
- expect ( evt . type ) . toEqual ( 'unhandledrejection' ) ;
592
- expect ( evt . promise . constructor . name ) . toEqual ( 'Promise' ) ;
593
- expect ( evt . reason . message ) . toBe ( 'promise error' ) ;
594
- window . removeEventListener ( 'unhandledrejection' , listener1 ) ;
595
- } ;
596
- const listener2 = ( evt : any ) => {
597
- expect ( evt . type ) . toEqual ( 'unhandledrejection' ) ;
598
- expect ( evt . promise . constructor . name ) . toEqual ( 'Promise' ) ;
599
- expect ( evt . reason . message ) . toBe ( 'promise error' ) ;
600
- window . removeEventListener ( 'unhandledrejection' , listener2 ) ;
601
- done ( ) ;
602
- } ;
603
- window . addEventListener ( 'unhandledrejection' , listener1 ) ;
604
- window . addEventListener ( 'unhandledrejection' , listener2 ) ;
605
- new Promise ( ( resolve , reject ) => {
606
- throw new Error ( 'promise error' ) ;
607
- } ) ;
608
- } ) ;
609
- } ) ;
537
+ } ) ;
610
538
611
- it ( 'should be able to covert element with event listener to json without cyclic error' ,
612
- function ( ) {
613
- const eventListenerSpy = jasmine . createSpy ( 'eventListener' ) ;
614
- let elemThrowErrorWhenToJson = false ;
615
- try {
616
- JSON . stringify ( button ) ;
617
- } catch ( err ) {
618
- elemThrowErrorWhenToJson = true ;
539
+ describe ( 'unhandle promise rejection' , ( ) => {
540
+ const AsyncTestZoneSpec = ( Zone as any ) [ 'AsyncTestZoneSpec' ] ;
541
+ const asyncTest = function ( testFn : Function ) {
542
+ return ( done : Function ) => {
543
+ let asyncTestZone : Zone =
544
+ Zone . current . fork ( new AsyncTestZoneSpec ( done , ( error : Error ) => {
545
+ fail ( error ) ;
546
+ } , 'asyncTest' ) ) ;
547
+ asyncTestZone . run ( testFn ) ;
548
+ } ;
549
+ } ;
550
+
551
+ it ( 'should support window.addEventListener(unhandledrejection)' , asyncTest ( ( ) => {
552
+ if ( ! promiseUnhandleRejectionSupport ( ) ) {
553
+ return ;
619
554
}
555
+ ( Zone as any ) [ zoneSymbol ( 'ignoreConsoleErrorUncaughtError' ) ] = true ;
556
+ rootZone . fork ( { name : 'promise' } ) . run ( function ( ) {
557
+ const listener = ( evt : any ) => {
558
+ window . removeEventListener ( 'unhandledrejection' , listener ) ;
559
+ expect ( evt . type ) . toEqual ( 'unhandledrejection' ) ;
560
+ expect ( evt . promise . constructor . name ) . toEqual ( 'Promise' ) ;
561
+ expect ( evt . reason . message ) . toBe ( 'promise error' ) ;
562
+ } ;
563
+ window . addEventListener ( 'unhandledrejection' , listener ) ;
564
+ new Promise ( ( resolve , reject ) => {
565
+ throw new Error ( 'promise error' ) ;
566
+ } ) ;
567
+ } ) ;
568
+ } ) ) ;
620
569
621
- // in chrome mobile, dom element will throw
622
- // cyclic error when call JSON.stringify,
623
- // so we just ignore it.
624
- if ( elemThrowErrorWhenToJson ) {
570
+ it ( 'should support window.addEventListener(rejectionhandled)' , asyncTest ( ( ) => {
571
+ if ( ! promiseUnhandleRejectionSupport ( ) ) {
625
572
return ;
626
573
}
627
-
628
- Zone . current . run ( function ( ) {
629
- button . addEventListener ( 'click' , eventListenerSpy ) ;
574
+ ( Zone as any ) [ zoneSymbol ( 'ignoreConsoleErrorUncaughtError' ) ] = true ;
575
+ rootZone . fork ( { name : 'promise' } ) . run ( function ( ) {
576
+ const listener = ( evt : any ) => {
577
+ window . removeEventListener ( 'unhandledrejection' , listener ) ;
578
+ p . catch ( reason => { } ) ;
579
+ } ;
580
+ window . addEventListener ( 'unhandledrejection' , listener ) ;
581
+
582
+ const handledListener = ( evt : any ) => {
583
+ window . removeEventListener ( 'rejectionhandled' , handledListener ) ;
584
+ expect ( evt . type ) . toEqual ( 'rejectionhandled' ) ;
585
+ expect ( evt . promise . constructor . name ) . toEqual ( 'Promise' ) ;
586
+ expect ( evt . reason . message ) . toBe ( 'promise error' ) ;
587
+ } ;
588
+
589
+ window . addEventListener ( 'rejectionhandled' , handledListener ) ;
590
+ const p = new Promise ( ( resolve , reject ) => {
591
+ throw new Error ( 'promise error' ) ;
592
+ } ) ;
630
593
} ) ;
594
+ } ) ) ;
631
595
632
- expect ( function ( ) {
633
- JSON . stringify ( button ) ;
634
- } ) . not . toThrow ( ) ;
635
- } ) ;
596
+ it ( 'should support multiple window.addEventListener(unhandledrejection)' , asyncTest ( ( ) => {
597
+ if ( ! promiseUnhandleRejectionSupport ( ) ) {
598
+ return ;
599
+ }
600
+ ( Zone as any ) [ zoneSymbol ( 'ignoreConsoleErrorUncaughtError' ) ] = true ;
601
+ rootZone . fork ( { name : 'promise' } ) . run ( function ( ) {
602
+ const listener1 = ( evt : any ) => {
603
+ window . removeEventListener ( 'unhandledrejection' , listener1 ) ;
604
+ expect ( evt . type ) . toEqual ( 'unhandledrejection' ) ;
605
+ expect ( evt . promise . constructor . name ) . toEqual ( 'Promise' ) ;
606
+ expect ( evt . reason . message ) . toBe ( 'promise error' ) ;
607
+ } ;
608
+ const listener2 = ( evt : any ) => {
609
+ window . removeEventListener ( 'unhandledrejection' , listener2 ) ;
610
+ expect ( evt . type ) . toEqual ( 'unhandledrejection' ) ;
611
+ expect ( evt . promise . constructor . name ) . toEqual ( 'Promise' ) ;
612
+ expect ( evt . reason . message ) . toBe ( 'promise error' ) ;
613
+ } ;
614
+ window . addEventListener ( 'unhandledrejection' , listener1 ) ;
615
+ window . addEventListener ( 'unhandledrejection' , listener2 ) ;
616
+ new Promise ( ( resolve , reject ) => {
617
+ throw new Error ( 'promise error' ) ;
618
+ } ) ;
619
+ } ) ;
620
+ } ) ) ;
636
621
} ) ;
637
622
} ) ;
638
623
} ) ;
0 commit comments