Skip to content
This repository has been archived by the owner on Feb 26, 2024. It is now read-only.

Commit

Permalink
fix(error): fix #698, don not generate long stack trace when Error.st…
Browse files Browse the repository at this point in the history
…ackTraceLimit = 0, add null check
  • Loading branch information
JiaLiPassion committed Mar 30, 2017
1 parent 7535fca commit 7a5e2a2
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 15 deletions.
45 changes: 30 additions & 15 deletions lib/zone-spec/long-stack-trace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ function addErrorStack(lines: string[], error: Error): void {
}

function renderLongStackTrace(frames: LongStackTrace[], stack: string): string {
const longTrace: string[] = [stack.trim()];
const longTrace: string[] = [stack ? stack.trim() : ''];

if (frames) {
let timestamp = new Date().getTime();
Expand Down Expand Up @@ -97,26 +97,38 @@ function renderLongStackTrace(frames: LongStackTrace[], stack: string): string {

onScheduleTask: function(
parentZoneDelegate: ZoneDelegate, currentZone: Zone, targetZone: Zone, task: Task): any {
const currentTask = Zone.currentTask;
let trace = currentTask && currentTask.data && (currentTask.data as any)[creationTrace] || [];
trace = [new LongStackTrace()].concat(trace);
if (trace.length > this.longStackTraceLimit) {
trace.length = this.longStackTraceLimit;
if (Error.stackTraceLimit > 0) {
// if Error.stackTraceLimit is 0, means stack trace
// is disabled, so we don't need to generate long stack trace
// this will improve performance in some test(some test will
// set stackTraceLimit to 0, https://github.com/angular/zone.js/issues/698
const currentTask = Zone.currentTask;
let trace = currentTask && currentTask.data && (currentTask.data as any)[creationTrace] || [];
trace = [new LongStackTrace()].concat(trace);
if (trace.length > this.longStackTraceLimit) {
trace.length = this.longStackTraceLimit;
}
if (!task.data) task.data = {};
(task.data as any)[creationTrace] = trace;
}
if (!task.data) task.data = {};
(task.data as any)[creationTrace] = trace;
return parentZoneDelegate.scheduleTask(targetZone, task);
},

onHandleError: function(
parentZoneDelegate: ZoneDelegate, currentZone: Zone, targetZone: Zone, error: any): boolean {
const parentTask = Zone.currentTask || error.task;
if (error instanceof Error && parentTask) {
const longStack =
renderLongStackTrace(parentTask.data && parentTask.data[creationTrace], error.stack);
try {
error.stack = (error as any).longStack = longStack;
} catch (err) {
if (Error.stackTraceLimit > 0) {
// if Error.stackTraceLimit is 0, means stack trace
// is disabled, so we don't need to generate long stack trace
// this will improve performance in some test(some test will
// set stackTraceLimit to 0, https://github.com/angular/zone.js/issues/698
const parentTask = Zone.currentTask || error.task;
if (error instanceof Error && parentTask) {
const longStack =
renderLongStackTrace(parentTask.data && parentTask.data[creationTrace], error.stack);
try {
error.stack = (error as any).longStack = longStack;
} catch (err) {
}
}
}
return parentZoneDelegate.handleError(targetZone, error);
Expand All @@ -131,6 +143,9 @@ function captureStackTraces(stackTraces: string[][], count: number): void {
}

function computeIgnoreFrames() {
if (Error.stackTraceLimit <= 0) {
return;
}
const frames: string[][] = [];
captureStackTraces(frames, 2);
const frames1 = frames[0];
Expand Down
23 changes: 23 additions & 0 deletions test/zone-spec/long-stack-trace-zone.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,4 +120,27 @@ describe('longStackTraceZone', function() {
}, 0);
});
});

it('should not produce long stack traces if Error.stackTraceLimit = 0', function(done) {
const originalStackTraceLimit = Error.stackTraceLimit;
const detectError = new Error();
lstz.run(function() {
setTimeout(function() {
setTimeout(function() {
setTimeout(function() {
if (detectError.stack) {
expectElapsed(log[0].stack, 1);
Error.stackTraceLimit = originalStackTraceLimit;
} else {
// IE stack trace will be undefined
expect(log[0].stack).toBeFalsy();
}
done();
}, 0);
Error.stackTraceLimit = 0;
throw new Error('Hello');
}, 0);
}, 0);
});
});
});

0 comments on commit 7a5e2a2

Please sign in to comment.