@@ -534,105 +534,90 @@ describe('Zone', function() {
534534 } ) ;
535535 } ) ;
536536
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+ } ) ;
610538
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 ;
619554 }
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+ } ) ) ;
620569
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 ( ) ) {
625572 return ;
626573 }
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+ } ) ;
630593 } ) ;
594+ } ) ) ;
631595
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+ } ) ) ;
636621 } ) ;
637622 } ) ;
638623} ) ;
0 commit comments