@@ -609,7 +609,19 @@ type AmbientZoneDelegate = ZoneDelegate;
609
609
610
610
const Zone : ZoneType = ( function ( global : any ) {
611
611
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 ) ;
613
625
}
614
626
615
627
const NO_ZONE = { name : 'NO ZONE' } ;
@@ -624,12 +636,17 @@ const Zone: ZoneType = (function(global: any) {
624
636
625
637
static assertZonePatched ( ) {
626
638
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 : '' ;
627
644
throw new Error (
628
645
'Zone.js has detected that ZoneAwarePromise `(window|global).Promise` ' +
629
646
'has been overwritten.\n' +
630
647
'Most likely cause is that a Promise polyfill has been loaded ' +
631
648
'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 ) ;
633
650
}
634
651
}
635
652
@@ -1792,11 +1809,24 @@ const Zone: ZoneType = (function(global: any) {
1792
1809
// Chrome: at Zone.run (http://localhost:9876/base/build/lib/zone.js:100:24)
1793
1810
// FireFox: Zone.prototype.run@http ://localhost:9876/base/build/lib/zone.js:101:24
1794
1811
// 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 ] ;
1796
1816
let frameType = FrameType . transition ;
1797
1817
if ( fnName . indexOf ( 'ZoneAwareError' ) !== - 1 ) {
1798
1818
zoneAwareFrame1 = frame ;
1799
1819
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
+
1800
1830
blackListedStackFrames [ zoneAwareFrame2 ] = FrameType . blackList ;
1801
1831
}
1802
1832
if ( fnName . indexOf ( 'runGuarded' ) !== - 1 ) {
0 commit comments