1414 * limitations under the License.
1515 */
1616
17+ import { randomTraceId } from '@opencensus/web-core' ;
18+
1719// Allows us to monkey patch Zone prototype without TS compiler errors.
1820declare const Zone : ZoneType & { prototype : Zone } ;
1921
@@ -26,42 +28,89 @@ export type AsyncTask = Task & {
2628 data : AsyncTaskData ;
2729 eventName : string ;
2830 target : HTMLElement ;
31+ // Allows access to the private `_zone` property of a Zone.js Task.
32+ _zone : Zone ;
2933} ;
3034
3135export class InteractionTracker {
3236 constructor ( ) {
37+
3338 const runTask = Zone . prototype . runTask ;
3439 Zone . prototype . runTask = function (
3540 task : AsyncTask ,
3641 applyThis : unknown ,
3742 applyArgs : unknown
3843 ) {
39- if ( task . eventName && task . eventName . toString ( ) . indexOf ( 'click' ) !== - 1 ) {
40- console . log ( 'Running task' ) ;
44+ const time = Date . now ( ) ;
45+
46+ console . warn ( 'Running task' ) ;
47+ console . log ( task . zone ) ;
48+
49+ let taskZone = this ;
50+ if ( isTrackedElement ( task ) ) {
4151 console . log ( 'Click detected' ) ;
52+
53+ const traceId = randomTraceId ( ) ;
54+ const tracingZone = Zone . root . fork ( {
55+ name : traceId ,
56+ properties : {
57+ isTracingZone : true ,
58+ traceId,
59+ } ,
60+ } ) ;
61+
62+ // Change the zone task.
63+ task . _zone = tracingZone ;
64+ taskZone = tracingZone ;
65+ console . log ( 'New zone:' ) ;
66+ console . log ( taskZone ) ;
67+ } else {
68+ // If we already are in a tracing zone, just run the task in our tracing zone.
69+ if ( task . zone && task . zone . get ( 'isTracingZone' ) ) {
70+ taskZone = task . zone ;
71+ }
4272 }
4373 try {
44- return runTask . call ( this as { } , task , applyThis , applyArgs ) ;
74+ return runTask . call ( taskZone as { } , task , applyThis , applyArgs ) ;
4575 } finally {
76+ console . log ( 'Run task finished.' ) ;
77+ console . log ( 'Time to complete: ' + ( Date . now ( ) - time ) ) ;
4678 }
4779 } ;
4880
4981 const scheduleTask = Zone . prototype . scheduleTask ;
5082 Zone . prototype . scheduleTask = function < T extends Task > ( task : T ) : T {
51- console . log ( 'Scheduling task' ) ;
83+ console . warn ( 'Scheduling task' ) ;
84+ console . log ( task ) ;
85+
86+ let taskZone : Zone = this ;
87+ if ( task . zone && task . zone && task . zone . get ( 'isTracingZone' ) ) {
88+ taskZone = task . zone ;
89+ }
5290 try {
53- return scheduleTask . call ( this as { } , task ) as T ;
91+ return scheduleTask . call ( taskZone as { } , task ) as T ;
5492 } finally {
5593 }
5694 } ;
5795
5896 const cancelTask = Zone . prototype . cancelTask ;
5997 Zone . prototype . cancelTask = function ( task : AsyncTask ) {
60- console . log ( 'cancel task' ) ;
98+ console . warn ( 'Cancel task' ) ;
99+ console . log ( task ) ;
100+
101+ let taskZone : Zone = this ;
102+ if ( task . zone && task . zone . get ( 'isTracingZone' ) ) {
103+ taskZone = task . zone ;
104+ }
105+
61106 try {
62- return cancelTask . call ( this as { } , task ) ;
107+ return cancelTask . call ( taskZone as { } , task ) ;
63108 } finally {
64109 }
65110 } ;
66111 }
67112}
113+
114+ function isTrackedElement ( task : AsyncTask ) : boolean {
115+ return ! ! ( task . eventName && task . eventName === 'click' ) ;
116+ }
0 commit comments