Support IE and Safari stack traces. R=rnystrom@google.com BUG=12380 Review URL: https://codereview.chromium.org//23068019 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/stack_trace@26464 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/pkgs/stack_trace/lib/src/frame.dart b/pkgs/stack_trace/lib/src/frame.dart index 3db4ab5..b222737 100644 --- a/pkgs/stack_trace/lib/src/frame.dart +++ b/pkgs/stack_trace/lib/src/frame.dart
@@ -134,6 +134,12 @@ } } + /// Parses a string representation of an IE stack frame. + /// + /// IE10+ frames look just like V8 frames. Prior to IE10, stack traces can't + /// be retrieved. + factory Frame.parseIE(String frame) => new Frame.parseV8(frame); + /// Parses a string representation of a Firefox stack frame. factory Frame.parseFirefox(String frame) { var match = _firefoxFrame.firstMatch(frame); @@ -155,6 +161,12 @@ return new Frame(uri, int.parse(match[4]), null, member); } + /// Parses a string representation of a Safari stack frame. + /// + /// Safari 6+ frames look just like Firefox frames. Prior to Safari 6, stack + /// traces can't be retrieved. + factory Frame.parseSafari(String frame) => new Frame.parseFirefox(frame); + /// Parses this package's string representation of a stack frame. factory Frame.parseFriendly(String frame) { var match = _friendlyFrame.firstMatch(frame);
diff --git a/pkgs/stack_trace/lib/src/trace.dart b/pkgs/stack_trace/lib/src/trace.dart index 4aea960..46baada 100644 --- a/pkgs/stack_trace/lib/src/trace.dart +++ b/pkgs/stack_trace/lib/src/trace.dart
@@ -82,7 +82,8 @@ factory Trace.parse(String trace) { try { if (trace.isEmpty) return new Trace(<Frame>[]); - if (trace.contains(_v8Trace)) return new Trace.parseV8(trace); + if (trace.startsWith("Error\n")) return new Trace.parseV8(trace); + // Valid Safari traces are a superset of valid Firefox traces. if (trace.contains(_firefoxTrace)) return new Trace.parseFirefox(trace); if (trace.contains(_friendlyTrace)) return new Trace.parseFriendly(trace); @@ -108,11 +109,29 @@ .skipWhile((line) => !line.startsWith(" at ")) .map((line) => new Frame.parseV8(line))); + /// Parses a string representation of an Internet Explorer stack trace. + /// + /// IE10+ traces look just like V8 traces. Prior to IE10, stack traces can't + /// be retrieved. + Trace.parseIE(String trace) + : this.parseV8(trace); + /// Parses a string representation of a Firefox stack trace. Trace.parseFirefox(String trace) : this(trace.trim().split("\n") .map((line) => new Frame.parseFirefox(line))); + /// Parses a string representation of a Safari stack trace. + /// + /// Safari 6+ stack traces look just like Firefox traces, except that they + /// sometimes (e.g. in isolates) have a "[native code]" frame. We just ignore + /// this frame to make the stack format more consistent between browsers. + /// Prior to Safari 6, stack traces can't be retrieved. + Trace.parseSafari(String trace) + : this(trace.trim().split("\n") + .where((line) => line != '[native code]') + .map((line) => new Frame.parseFirefox(line))); + /// Parses this package's a string representation of a stack trace. Trace.parseFriendly(String trace) : this(trace.trim().split("\n")
diff --git a/pkgs/stack_trace/test/trace_test.dart b/pkgs/stack_trace/test/trace_test.dart index f185d79..c3ce039 100644 --- a/pkgs/stack_trace/test/trace_test.dart +++ b/pkgs/stack_trace/test/trace_test.dart
@@ -130,6 +130,22 @@ equals(Uri.parse("http://pub.dartlang.org/stuff.js"))); }); + test('.parseSafari', () { + var trace = new Trace.parse( + 'Foo._bar@http://pub.dartlang.org/stuff.js:42\n' + 'zip/<@http://pub.dartlang.org/stuff.js:0\n' + 'zip.zap(12, "@)()/<")@http://pub.dartlang.org/thing.js:1\n' + '[native code]'); + + expect(trace.frames[0].uri, + equals(Uri.parse("http://pub.dartlang.org/stuff.js"))); + expect(trace.frames[1].uri, + equals(Uri.parse("http://pub.dartlang.org/stuff.js"))); + expect(trace.frames[2].uri, + equals(Uri.parse("http://pub.dartlang.org/thing.js"))); + expect(trace.frames.length, equals(3)); + }); + test('parses a package:stack_trace stack trace correctly', () { var trace = new Trace.parse( 'http://dartlang.org/foo/bar.dart 10:11 Foo.<fn>.bar\n'