@@ -609,7 +609,19 @@ type AmbientZoneDelegate = ZoneDelegate;
609609
610610const Zone : ZoneType = ( function ( global : any ) {
611611 if ( global [ 'Zone' ] ) {
612- throw new Error ( 'Zone already loaded.' ) ;
612+ let zoneAlreadyLoadedMessage : string = 'Zone already loaded.' ;
613+ // try to findout the already loaded zone.js script file
614+ // require the loaded zone.js version to be newer than 0.8.6
615+ try {
616+ const LoadedZone : any = global [ 'Zone' ] ;
617+ const scriptFileName : string = LoadedZone [ '__zone_symbol__scriptFileName' ] ;
618+ if ( scriptFileName ) {
619+ zoneAlreadyLoadedMessage =
620+ 'Zone already loaded. The loaded Zone.js script file seems to be ' + scriptFileName ;
621+ }
622+ } catch ( error ) {
623+ }
624+ throw new Error ( zoneAlreadyLoadedMessage ) ;
613625 }
614626
615627 const NO_ZONE = { name : 'NO ZONE' } ;
@@ -624,12 +636,17 @@ const Zone: ZoneType = (function(global: any) {
624636
625637 static assertZonePatched ( ) {
626638 if ( global . Promise !== ZoneAwarePromise ) {
639+ // try to findout the already loaded zone.js script file
640+ // require the loaded zone.js version to be newer than 0.8.6
641+ const scriptFileName : string = ( Zone as any ) [ __symbol__ ( 'scriptFileName' ) ] ;
642+ const scriptFileErrorMessage : string =
643+ scriptFileName ? 'the loaded Zone.js script file seems to be ' + scriptFileName : '' ;
627644 throw new Error (
628645 'Zone.js has detected that ZoneAwarePromise `(window|global).Promise` ' +
629646 'has been overwritten.\n' +
630647 'Most likely cause is that a Promise polyfill has been loaded ' +
631648 'after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. ' +
632- 'If you must load one, do so before loading zone.js.)' ) ;
649+ 'If you must load one, do so before loading zone.js.)' + scriptFileErrorMessage ) ;
633650 }
634651 }
635652
@@ -1792,11 +1809,24 @@ const Zone: ZoneType = (function(global: any) {
17921809 // Chrome: at Zone.run (http://localhost:9876/base/build/lib/zone.js:100:24)
17931810 // FireFox: Zone.prototype.run@http ://localhost:9876/base/build/lib/zone.js:101:24
17941811 // Safari: run@http ://localhost:9876/base/build/lib/zone.js:101:24
1795- let fnName : string = frame . split ( '(' ) [ 0 ] . split ( '@' ) [ 0 ] ;
1812+ let frameParts : string [ ] = frame . split ( '(' ) ;
1813+ let fnNamePart : string = frameParts [ 0 ] ;
1814+
1815+ let fnName : string = fnNamePart . split ( '@' ) [ 0 ] ;
17961816 let frameType = FrameType . transition ;
17971817 if ( fnName . indexOf ( 'ZoneAwareError' ) !== - 1 ) {
17981818 zoneAwareFrame1 = frame ;
17991819 zoneAwareFrame2 = frame . replace ( 'Error.' , '' ) ;
1820+
1821+ // try to find the filename where zone.js live with
1822+ let fileNamePart1 : string = frameParts . length > 1 ? frameParts [ 1 ] : fnNamePart ;
1823+ let fileNameParts : string [ ] = fileNamePart1 . split ( '@' ) ;
1824+ let fileNamePart2 : string =
1825+ fileNameParts . length > 1 ? fileNameParts [ 1 ] : fileNameParts [ 0 ] ;
1826+ // Keep a script file name in Zone, so when zone.js report 'already loaded'
1827+ // error, it can report which file include the loaded zone.js
1828+ ( Zone as any ) [ __symbol__ ( 'scriptFileName' ) ] = fileNamePart2 ;
1829+
18001830 blackListedStackFrames [ zoneAwareFrame2 ] = FrameType . blackList ;
18011831 }
18021832 if ( fnName . indexOf ( 'runGuarded' ) !== - 1 ) {
0 commit comments