From 9bd34440b84abf27174cf324078e5b7361e251bc Mon Sep 17 00:00:00 2001 From: thomabr Date: Fri, 16 Dec 2016 11:29:34 -0800 Subject: [PATCH] Enable support for Edge for the CrashCauser test app. Additionally update the EndToEnd unit tests to reflect the changes made to the crashcauser js files. --- .../closurecrashcauser.js | 5 +- .../crashcauser.js | 5 +- ...tackTraceDeminifierClosureEndToEndTests.cs | 52 ++++++++++----- .../StackTraceDeminifierEndToEndTests.cs | 63 +++++++++++++------ 4 files changed, 87 insertions(+), 38 deletions(-) diff --git a/src/SourcemapToolkit.CallstackTestApp/closurecrashcauser.js b/src/SourcemapToolkit.CallstackTestApp/closurecrashcauser.js index 67fe514..d108de8 100644 --- a/src/SourcemapToolkit.CallstackTestApp/closurecrashcauser.js +++ b/src/SourcemapToolkit.CallstackTestApp/closurecrashcauser.js @@ -13,7 +13,10 @@ window["foo"]["bar2"] = mynamespace.objectWithMethods.propertyMethodLevel2; window["bar"] = GlobalFunction; window.onerror = function (message, source, lineno, colno, error) { - document.getElementById("callstackdisplay").innerText = error.stack; + if (error) + document.getElementById("callstackdisplay").innerText = error.stack; + else if (window.event.error) + document.getElementById("callstackdisplay").innerText = window.event.error.stack; } window.onload = function (event) { diff --git a/src/SourcemapToolkit.CallstackTestApp/crashcauser.js b/src/SourcemapToolkit.CallstackTestApp/crashcauser.js index 81f0074..2468b20 100644 --- a/src/SourcemapToolkit.CallstackTestApp/crashcauser.js +++ b/src/SourcemapToolkit.CallstackTestApp/crashcauser.js @@ -19,7 +19,10 @@ } window.onerror = function (message, source, lineno, colno, error) { - document.getElementById("callstackdisplay").innerText = error.stack; + if (error) + document.getElementById("callstackdisplay").innerText = error.stack; + else if (window.event.error) + document.getElementById("callstackdisplay").innerText = window.event.error.stack; } level1(); diff --git a/tests/SourcemapToolkit.CallstackDeminifier.UnitTests/StackTraceDeminifierClosureEndToEndTests.cs b/tests/SourcemapToolkit.CallstackDeminifier.UnitTests/StackTraceDeminifierClosureEndToEndTests.cs index 1370124..b2098db 100644 --- a/tests/SourcemapToolkit.CallstackDeminifier.UnitTests/StackTraceDeminifierClosureEndToEndTests.cs +++ b/tests/SourcemapToolkit.CallstackDeminifier.UnitTests/StackTraceDeminifierClosureEndToEndTests.cs @@ -8,17 +8,17 @@ namespace SourcemapToolkit.CallstackDeminifier.UnitTests [TestClass] public class StackTraceDeminifierClosureEndToEndTests { - private const string GeneratedCodeString = "function a(){}window.foo=a;a.prototype={b:function(){return a.a(void 0)}};a.a=function(b){return b.length};function c(){return(new a).b()}window.foo.bar=a.b;window.foo.bar2=a.a;window.bar=c;window.onerror=function(b,e,f,g,d){document.getElementById(\"callstackdisplay\").innerText=d.stack};window.onload=function(){document.getElementById(\"crashbutton\").addEventListener(\"click\",function(){console.log(c())})};"; - private const string SourceMapString = "{\r\n\"version\":3,\r\n\"file\":\"crashcauser.min.js\",\r\n\"lineCount\":1,\r\n\"mappings\":\"AAEgCA,QAAA,EAAS,EAAG,EAC5CC,MAAA,IAAA,CAAgBD,CAChBA,EAAAE,UAAA,CAA0C,CAAEC,EAAuBA,QAAQ,EAAG,CAAS,MAAOC,EAAAC,EAAA,CAAVC,IAAAA,EAAU,CAAhB,CAApC,CAE1CF,EAAAC,EAAA,CAAqDD,QAAS,CAACG,CAAD,CAAI,CAAE,MAAOA,EAAAC,OAAT,CAElEC,SAASA,EAAc,EAAG,CAAgD,MAAON,CAA7CG,IAAIN,CAAyCG,GAAA,EAAvD,CAE1BF,MAAA,IAAA,IAAA,CAAuBS,CAAAP,EACvBF,OAAA,IAAA,KAAA,CAAwBG,CAAAC,EACxBJ,OAAA,IAAA,CAAgBQ,CAEhBR,OAAAU,QAAA,CAAiBC,QAAS,CAACC,CAAD,CAAUC,CAAV,CAAkBC,CAAlB,CAA0BC,CAA1B,CAAiCC,CAAjC,CAAwC,CAC1DC,QAAAC,eAAA,CAAwB,kBAAxB,CAAAC,UAAA,CAAwDH,CAAAI,MADE,CAIlEpB,OAAAqB,OAAA,CAAgBC,QAAS,EAAQ,CAC7BL,QAAAC,eAAA,CAAwB,aAAxB,CAAAK,iBAAA,CAAwD,OAAxD,CAAiE,QAAS,EAAG,CAC1EC,OAAAC,IAAA,CAAYjB,CAAA,EAAZ,CAD0E,CAA7E,CAD6B;\",\r\n\"sources\":[\"crashcauser.js\"],\r\n\"names\":[\"mynamespace.objectWithMethods\",\"window\",\"prototype\",\"prototypeMethodLevel1\",\"mynamespace.objectWithMethods.propertyMethodLevel2\",\"propertyMethodLevel2\",\"x\",\"e\",\"length\",\"GlobalFunction\",\"mynamespace.objectWithMethods.prototypeMethodLevel1\",\"onerror\",\"window.onerror\",\"message\",\"source\",\"lineno\",\"colno\",\"error\",\"document\",\"getElementById\",\"innerText\",\"stack\",\"onload\",\"window.onload\",\"addEventListener\",\"console\",\"log\"]\r\n}\r\n"; + private const string GeneratedCodeString = "function a(){}window.foo=a;a.prototype={b:function(){return a.a(void 0)}};a.a=function(b){return b.length};function c(){return(new a).b()}window.foo.bar=a.b;window.foo.bar2=a.a;window.bar=c;window.onerror=function(b,e,f,g,d){d?document.getElementById(\"callstackdisplay\").innerText=d.stack:window.event.error&&(document.getElementById(\"callstackdisplay\").innerText=window.event.error.stack)};window.onload=function(){document.getElementById(\"crashbutton\").addEventListener(\"click\",function(){console.log(c())})};"; + private const string SourceMapString = "{\r\n\"version\":3,\r\n\"file\":\"\",\r\n\"lineCount\":1,\r\n\"mappings\":\"AAEgCA,QAAA,EAAS,EAAG,EAC5CC,MAAA,IAAA,CAAgBD,CAChBA,EAAAE,UAAA,CAA0C,CAAEC,EAAuBA,QAAS,EAAG,CAAS,MAAOC,EAAAC,EAAA,CAAVC,IAAAA,EAAU,CAAhB,CAArC,CAE1CF,EAAAC,EAAA,CAAqDD,QAAS,CAACG,CAAD,CAAI,CAAE,MAAOA,EAAAC,OAAT,CAElEC,SAASA,EAAc,EAAG,CAA+C,MAAON,CAA5CG,IAAIN,CAAwCG,GAAA,EAAtD,CAE1BF,MAAA,IAAA,IAAA,CAAuBS,CAAAP,EACvBF,OAAA,IAAA,KAAA,CAAwBG,CAAAC,EACxBJ,OAAA,IAAA,CAAgBQ,CAEhBR,OAAAU,QAAA,CAAiBC,QAAS,CAACC,CAAD,CAAUC,CAAV,CAAkBC,CAAlB,CAA0BC,CAA1B,CAAiCC,CAAjC,CAAwC,CAC1DA,CAAJ,CACIC,QAAAC,eAAA,CAAwB,kBAAxB,CAAAC,UADJ,CAC4DH,CAAAI,MAD5D,CAESpB,MAAAqB,MAAAL,MAFT,GAGIC,QAAAC,eAAA,CAAwB,kBAAxB,CAAAC,UAHJ,CAG4DnB,MAAAqB,MAAAL,MAAAI,MAH5D,CAD8D,CAOlEpB,OAAAsB,OAAA,CAAgBC,QAAS,EAAQ,CAC7BN,QAAAC,eAAA,CAAwB,aAAxB,CAAAM,iBAAA,CAAwD,OAAxD,CAAiE,QAAS,EAAG,CACzEC,OAAAC,IAAA,CAAYlB,CAAA,EAAZ,CADyE,CAA7E,CAD6B;\",\r\n\"sources\":[\"//officefile/public/thomabr/closurecrashcauser.js\"],\r\n\"names\":[\"mynamespace.objectWithMethods\",\"window\",\"prototype\",\"prototypeMethodLevel1\",\"mynamespace.objectWithMethods.propertyMethodLevel2\",\"propertyMethodLevel2\",\"x\",\"e\",\"length\",\"GlobalFunction\",\"mynamespace.objectWithMethods.prototypeMethodLevel1\",\"onerror\",\"window.onerror\",\"message\",\"source\",\"lineno\",\"colno\",\"error\",\"document\",\"getElementById\",\"innerText\",\"stack\",\"event\",\"onload\",\"window.onload\",\"addEventListener\",\"console\",\"log\"]\r\n}\r\n"; private StackTraceDeminifier GetStackTraceDeminifierWithDependencies() { ISourceMapProvider sourceMapProvider = MockRepository.GenerateStrictMock(); - sourceMapProvider.Stub(x => x.GetSourceMapContentsForCallstackUrl("http://localhost:11323/crashcauser.js")).Return(UnitTestUtils.StreamReaderFromString(SourceMapString)); + sourceMapProvider.Stub(x => x.GetSourceMapContentsForCallstackUrl("http://localhost:11323/closurecrashcauser.min.js")).Return(UnitTestUtils.StreamReaderFromString(SourceMapString)); ISourceCodeProvider sourceCodeProvider = MockRepository.GenerateStrictMock(); - sourceCodeProvider.Stub(x => x.GetSourceCode("http://localhost:11323/crashcauser.js")).Return(UnitTestUtils.StreamReaderFromString(GeneratedCodeString)); + sourceCodeProvider.Stub(x => x.GetSourceCode("http://localhost:11323/closurecrashcauser.min.js")).Return(UnitTestUtils.StreamReaderFromString(GeneratedCodeString)); return StackTraceDeminfierFactory.GetStackTraceDeminfier(sourceMapProvider, sourceCodeProvider); } @@ -39,10 +39,10 @@ namespace SourcemapToolkit.CallstackDeminifier.UnitTests // Arrange StackTraceDeminifier stackTraceDeminifier = GetStackTraceDeminifierWithDependencies(); string callstack = @"TypeError: Cannot read property 'length' of undefined - at Function.a.a (http://localhost:11323/crashcauser.js:1:99) - at Object.b (http://localhost:11323/crashcauser.js:1:63) - at c (http://localhost:11323/crashcauser.js:1:135) - at HTMLButtonElement. (http://localhost:11323/crashcauser.js:1:401)"; + at Function.a.a (http://localhost:11323/closurecrashcauser.min.js:1:99) + at a.b (http://localhost:11323/closurecrashcauser.min.js:1:63) + at c (http://localhost:11323/closurecrashcauser.min.js:1:135) + at HTMLButtonElement. (http://localhost:11323/closurecrashcauser.min.js:1:504)"; // Act DeminifyStackTraceResult results = stackTraceDeminifier.DeminifyStackTrace(callstack); @@ -56,10 +56,10 @@ namespace SourcemapToolkit.CallstackDeminifier.UnitTests { // Arrange StackTraceDeminifier stackTraceDeminifier = GetStackTraceDeminifierWithDependencies(); - string callstack = @"a.a@http://localhost:11323/crashcauser.js:1:91 -a.prototype.b@http://localhost:11323/crashcauser.js:1:61 -c@http://localhost:11323/crashcauser.js:1:128 -window.onload/<@http://localhost:11323/crashcauser.js:1:401"; + string callstack = @"a.a@http://localhost:11323/closurecrashcauser.min.js:1:91 +a.prototype.b@http://localhost:11323/closurecrashcauser.min.js:1:61 +c@http://localhost:11323/closurecrashcauser.min.js:1:128 +window.onload/<@http://localhost:11323/closurecrashcauser.min.js:1:504"; // Act DeminifyStackTraceResult results = stackTraceDeminifier.DeminifyStackTrace(callstack); @@ -74,10 +74,10 @@ window.onload/<@http://localhost:11323/crashcauser.js:1:401"; // Arrange StackTraceDeminifier stackTraceDeminifier = GetStackTraceDeminifierWithDependencies(); string callstack = @"TypeError: Unable to get property 'length' of undefined or null reference - at a.a (http://localhost:11323/crashcauser.js:1:91) - at a.prototype.b (http://localhost:11323/crashcauser.js:1:54) - at c (http://localhost:11323/crashcauser.js:1:121) - at Anonymous function (http://localhost:11323/crashcauser.js:1:389)"; +   at a.a (http://localhost:11323/closurecrashcauser.min.js:1:91) +   at a.prototype.b (http://localhost:11323/closurecrashcauser.min.js:1:54) +   at c (http://localhost:11323/closurecrashcauser.min.js:1:121) +   at Anonymous function (http://localhost:11323/closurecrashcauser.min.js:1:492)"; // Act DeminifyStackTraceResult results = stackTraceDeminifier.DeminifyStackTrace(callstack); @@ -85,5 +85,23 @@ window.onload/<@http://localhost:11323/crashcauser.js:1:401"; // Assert ValidateDeminifyStackTraceResults(results); } - } + + [TestMethod] + public void DeminifyClosureStackTrace_EdgeStackTraceString_CorrectDeminificationWhenPossible() + { + // Arrange + StackTraceDeminifier stackTraceDeminifier = GetStackTraceDeminifierWithDependencies(); + string callstack = @"TypeError: Unable to get property 'length' of undefined or null reference +   at a.a (http://localhost:11323/closurecrashcauser.min.js:1:91) +   at a.prototype.b (http://localhost:11323/closurecrashcauser.min.js:1:54) +   at c (http://localhost:11323/closurecrashcauser.min.js:1:121) +   at Anonymous function (http://localhost:11323/closurecrashcauser.min.js:1:492)"; + + // Act + DeminifyStackTraceResult results = stackTraceDeminifier.DeminifyStackTrace(callstack); + + // Assert + ValidateDeminifyStackTraceResults(results); + } + } } diff --git a/tests/SourcemapToolkit.CallstackDeminifier.UnitTests/StackTraceDeminifierEndToEndTests.cs b/tests/SourcemapToolkit.CallstackDeminifier.UnitTests/StackTraceDeminifierEndToEndTests.cs index 33d8768..0126a8d 100644 --- a/tests/SourcemapToolkit.CallstackDeminifier.UnitTests/StackTraceDeminifierEndToEndTests.cs +++ b/tests/SourcemapToolkit.CallstackDeminifier.UnitTests/StackTraceDeminifierEndToEndTests.cs @@ -7,10 +7,11 @@ namespace SourcemapToolkit.CallstackDeminifier.UnitTests [TestClass] public class StackTraceDeminifierEndToEndTests { - private const string GeneratedCodeString = "function causeCrash(){function n(){var n=16;n+=2;t(n)}function t(n){n=n+2;i(n)}function i(n){var t;console.log(t.length+n)}window.onerror=function(n,t,i,r,u){document.getElementById(\"callstackdisplay\").innerText=u.stack};n()}window.onload=function(){document.getElementById(\"crashbutton\").addEventListener(\"click\",function(){causeCrash()})};"; - private const string SourceMapString = "{\r\n\"version\":3,\r\n\"file\":\"crashcauser.min.js\",\r\n\"lineCount\":1,\r\n\"mappings\":\"AAAAA,SAASA,UAAU,CAAA,CACnB,CACIC,SAASA,CAAM,CAAA,CAAG,CACd,IAAIC,EAAwB,EAAE,CAC9BA,CAAsB,EAAG,CAAC,CAC1BC,CAAM,CAACD,CAAD,CAHQ,CAMlBC,SAASA,CAAM,CAACC,CAAD,CAAQ,CACnBA,CAAM,CAAEA,CAAM,CAAE,CAAC,CACjBC,CAAM,CAACD,CAAD,CAFa,CAKvBC,SAASA,CAAM,CAACD,CAAD,CAAQ,CACnB,IAAIE,CAAC,CACLC,OAAOC,IAAI,CAACF,CAACG,OAAQ,CAAEL,CAAZ,CAFQ,CAKvBM,MAAMC,QAAS,CAAEC,QAAS,CAACC,CAAO,CAAEC,CAAM,CAAEC,CAAM,CAAEC,CAAK,CAAEC,CAAjC,CAAwC,CAC9DC,QAAQC,eAAe,CAAC,kBAAD,CAAoBC,UAAW,CAAEH,CAAKI,MADC,C,CAIlEpB,CAAM,CAAA,CArBV,CAwBAS,MAAMY,OAAQ,CAAEC,QAAS,CAAA,CAAQ,CAC7BL,QAAQC,eAAe,CAAC,aAAD,CAAeK,iBAAiB,CAAC,OAAO,CAAE,QAAS,CAAA,CAAG,CACzExB,UAAU,CAAA,CAD+D,CAAtB,CAD1B,C\",\r\n\"sources\":[\"crashcauser.js\"],\r\n\"names\":[\"causeCrash\",\"level1\",\"longLocalVariableName\",\"level2\",\"input\",\"level3\",\"x\",\"console\",\"log\",\"length\",\"window\",\"onerror\",\"window.onerror\",\"message\",\"source\",\"lineno\",\"colno\",\"error\",\"document\",\"getElementById\",\"innerText\",\"stack\",\"onload\",\"window.onload\",\"addEventListener\"]\r\n}\r\n"; + private const string GeneratedCodeString = "function causeCrash(){function n(){var n=16;n+=2;t(n)}function t(n){n=n+2;i(n)}function i(n){(function(){var t;console.log(t.length+n)})()}window.onerror=function(n,t,i,r,u){u?document.getElementById(\"callstackdisplay\").innerText=u.stack:window.event.error&&(document.getElementById(\"callstackdisplay\").innerText=window.event.error.stack)};n()}window.onload=function(){document.getElementById(\"crashbutton\").addEventListener(\"click\",function(){causeCrash()})};"; + private const string SourceMapString = "{\r\n\"version\":3,\r\n\"file\":\"crashcauser.min.js\",\r\n\"lineCount\":1,\r\n\"mappings\":\"AAAAA,SAASA,UAAU,CAAA,CACnB,CACIC,SAASA,CAAM,CAAA,CAAG,CACd,IAAIC,EAAwB,EAAE,CAC9BA,CAAsB,EAAG,CAAC,CAC1BC,CAAM,CAACD,CAAD,CAHQ,CAMlBC,SAASA,CAAM,CAACC,CAAD,CAAQ,CACnBA,CAAM,CAAEA,CAAM,CAAE,CAAC,CACjBC,CAAM,CAACD,CAAD,CAFa,CAKvBC,SAASA,CAAM,CAACD,CAAD,CAAQ,EAClB,QAAQ,CAAA,CAAG,CACR,IAAIE,CAAC,CACLC,OAAOC,IAAI,CAACF,CAACG,OAAQ,CAAEL,CAAZ,CAFH,EAGX,CAAA,CAJkB,CAOvBM,MAAMC,QAAS,CAAEC,QAAS,CAACC,CAAO,CAAEC,CAAM,CAAEC,CAAM,CAAEC,CAAK,CAAEC,CAAjC,CAAwC,CAC1DA,CAAJ,CACIC,QAAQC,eAAe,CAAC,kBAAD,CAAoBC,UAAW,CAAEH,CAAKI,MADjE,CAESX,MAAMY,MAAML,M,GACjBC,QAAQC,eAAe,CAAC,kBAAD,CAAoBC,UAAW,CAAEV,MAAMY,MAAML,MAAMI,OAJhB,C,CAOlEpB,CAAM,CAAA,CA1BV,CA6BAS,MAAMa,OAAQ,CAAEC,QAAS,CAAA,CAAQ,CAC7BN,QAAQC,eAAe,CAAC,aAAD,CAAeM,iBAAiB,CAAC,OAAO,CAAE,QAAS,CAAA,CAAG,CACzEzB,UAAU,CAAA,CAD+D,CAAtB,CAD1B,C\",\r\n\"sources\":[\"crashcauser.js\"],\r\n\"names\":[\"causeCrash\",\"level1\",\"longLocalVariableName\",\"level2\",\"input\",\"level3\",\"x\",\"console\",\"log\",\"length\",\"window\",\"onerror\",\"window.onerror\",\"message\",\"source\",\"lineno\",\"colno\",\"error\",\"document\",\"getElementById\",\"innerText\",\"stack\",\"event\",\"onload\",\"window.onload\",\"addEventListener\"]\r\n}"; - private StackTraceDeminifier GetStackTraceDeminifierWithDependencies() + + private StackTraceDeminifier GetStackTraceDeminifierWithDependencies() { ISourceMapProvider sourceMapProvider = MockRepository.GenerateStrictMock(); sourceMapProvider.Stub(x => x.GetSourceMapContentsForCallstackUrl("http://localhost:11323/crashcauser.min.js")).Return(UnitTestUtils.StreamReaderFromString(SourceMapString)); @@ -23,13 +24,14 @@ namespace SourcemapToolkit.CallstackDeminifier.UnitTests private static void ValidateDeminifyStackTraceResults(DeminifyStackTraceResult results) { - Assert.AreEqual(5, results.DeminifiedStackFrameResults.Count); + Assert.AreEqual(6, results.DeminifiedStackFrameResults.Count); Assert.AreEqual(DeminificationError.None, results.DeminifiedStackFrameResults[0].DeminificationError); - Assert.AreEqual("level3", results.DeminifiedStackFrameResults[0].DeminifiedStackFrame.MethodName); - Assert.AreEqual("level2", results.DeminifiedStackFrameResults[1].DeminifiedStackFrame.MethodName); - Assert.AreEqual("level1", results.DeminifiedStackFrameResults[2].DeminifiedStackFrame.MethodName); - Assert.AreEqual("causeCrash", results.DeminifiedStackFrameResults[3].DeminifiedStackFrame.MethodName); - Assert.AreEqual("window", results.DeminifiedStackFrameResults[4].DeminifiedStackFrame.MethodName); + Assert.AreEqual("level3", results.DeminifiedStackFrameResults[0].DeminifiedStackFrame.MethodName); + Assert.AreEqual("level3", results.DeminifiedStackFrameResults[1].DeminifiedStackFrame.MethodName); + Assert.AreEqual("level2", results.DeminifiedStackFrameResults[2].DeminifiedStackFrame.MethodName); + Assert.AreEqual("level1", results.DeminifiedStackFrameResults[3].DeminifiedStackFrame.MethodName); + Assert.AreEqual("causeCrash", results.DeminifiedStackFrameResults[4].DeminifiedStackFrame.MethodName); + Assert.AreEqual("window", results.DeminifiedStackFrameResults[5].DeminifiedStackFrame.MethodName); } [TestMethod] @@ -38,11 +40,12 @@ namespace SourcemapToolkit.CallstackDeminifier.UnitTests // Arrange StackTraceDeminifier stackTraceDeminifier = GetStackTraceDeminifierWithDependencies(); string chromeStackTrace = @"TypeError: Cannot read property 'length' of undefined - at i (http://localhost:11323/crashcauser.min.js:1:113) + at http://localhost:11323/crashcauser.min.js:1:125 + at i (http://localhost:11323/crashcauser.min.js:1:137) at t (http://localhost:11323/crashcauser.min.js:1:75) at n (http://localhost:11323/crashcauser.min.js:1:50) - at causeCrash (http://localhost:11323/crashcauser.min.js:1:222) - at HTMLButtonElement. (http://localhost:11323/crashcauser.min.js:1:326)"; + at causeCrash (http://localhost:11323/crashcauser.min.js:1:341) + at HTMLButtonElement. (http://localhost:11323/crashcauser.min.js:1:445)"; // Act DeminifyStackTraceResult results = stackTraceDeminifier.DeminifyStackTrace(chromeStackTrace); @@ -56,11 +59,12 @@ namespace SourcemapToolkit.CallstackDeminifier.UnitTests { // Arrange StackTraceDeminifier stackTraceDeminifier = GetStackTraceDeminifierWithDependencies(); - string fireFoxStackTrace = @"i @http://localhost:11323/crashcauser.min.js:1:100 + string fireFoxStackTrace = @"i/<@http://localhost:11323/crashcauser.min.js:1:112 +i@http://localhost:11323/crashcauser.min.js:1:95 t@http://localhost:11323/crashcauser.min.js:1:75 n@http://localhost:11323/crashcauser.min.js:1:50 -causeCrash@http://localhost:11323/crashcauser.min.js:1:222 -window.onload/<@http://localhost:11323/crashcauser.min.js:1:326"; +causeCrash@http://localhost:11323/crashcauser.min.js:1:341 +window.onload/<@http://localhost:11323/crashcauser.min.js:1:445"; // Act DeminifyStackTraceResult results = stackTraceDeminifier.DeminifyStackTrace(fireFoxStackTrace); @@ -75,11 +79,12 @@ window.onload/<@http://localhost:11323/crashcauser.min.js:1:326"; // Arrange StackTraceDeminifier stackTraceDeminifier = GetStackTraceDeminifierWithDependencies(); string ieStackTrace = @"TypeError: Unable to get property 'length' of undefined or null reference - at i (http://localhost:11323/crashcauser.min.js:1:100) + at Anonymous function (http://localhost:11323/crashcauser.min.js:1:112) + at i (http://localhost:11323/crashcauser.min.js:1:95) at t (http://localhost:11323/crashcauser.min.js:1:75) at n (http://localhost:11323/crashcauser.min.js:1:50) - at causeCrash (http://localhost:11323/crashcauser.min.js:1:222) - at Anonymous function (http://localhost:11323/crashcauser.min.js:1:326)"; + at causeCrash (http://localhost:11323/crashcauser.min.js:1:341) + at Anonymous function (http://localhost:11323/crashcauser.min.js:1:445)"; // Act DeminifyStackTraceResult results = stackTraceDeminifier.DeminifyStackTrace(ieStackTrace); @@ -87,5 +92,25 @@ window.onload/<@http://localhost:11323/crashcauser.min.js:1:326"; // Assert ValidateDeminifyStackTraceResults(results); } - } + + [TestMethod] + public void DeminifyStackTrace_EdgeStackTraceString_CorrectDeminificationWhenPossible() + { + // Arrange + StackTraceDeminifier stackTraceDeminifier = GetStackTraceDeminifierWithDependencies(); + string dgeStackTrace = @"TypeError: Unable to get property 'length' of undefined or null reference +   at Anonymous function (http://localhost:11323/crashcauser.min.js:1:112) +   at i (http://localhost:11323/crashcauser.min.js:1:95) +   at t (http://localhost:11323/crashcauser.min.js:1:75) +   at n (http://localhost:11323/crashcauser.min.js:1:50) +   at causeCrash (http://localhost:11323/crashcauser.min.js:1:341) +   at Anonymous function (http://localhost:11323/crashcauser.min.js:1:445)"; + + // Act + DeminifyStackTraceResult results = stackTraceDeminifier.DeminifyStackTrace(dgeStackTrace); + + // Assert + ValidateDeminifyStackTraceResults(results); + } + } } \ No newline at end of file