| <!DOCTYPE html> |
| <html> |
| <head> |
| <script src="../../http/tests/inspector/resources/inspector-test.js"></script> |
| <script src="resources/log-console-stack-trace.js"></script> |
| <script> |
| TestPage.allowUncaughtExceptions = true; |
| TestPage.needToSanitizeUncaughtExceptionURLs = true; |
| |
| function triggerConsoleTrace() { |
| (function() { |
| console.trace(); |
| })(); |
| } |
| |
| function triggerConsoleError() { |
| (function() { |
| console.error("error message"); |
| })(); |
| } |
| |
| function triggerUncaughtException() { |
| (function() { |
| [].x.x; |
| })(); |
| } |
| |
| function triggerUnhandledRejectionPromiseReject() { |
| window.promise1 = Promise.reject("rejection-1"); |
| } |
| |
| function triggerUnhandledRejectionExplicit() { |
| window.promise2 = new Promise((resolve, reject) => { |
| reject("rejection-2"); |
| }); |
| } |
| |
| function triggerUnhandledRejectionImplicitWithException() { |
| window.promise3 = Promise.resolve().then(() => { |
| [].x.x; |
| }); |
| } |
| |
| |
| function test() |
| { |
| let suite = InspectorTest.createAsyncSuite("Console.StackTrace"); |
| |
| let messageChecker; |
| let untilPromiseResolver; |
| |
| function untilMessageMatches(checker) { |
| messageChecker = checker; |
| return new Promise((resolve, reject) => { |
| untilPromiseResolver = resolve; |
| }); |
| } |
| |
| WI.consoleManager.addEventListener(WI.ConsoleManager.Event.MessageAdded, (event) => { |
| let message = event.data.message; |
| InspectorTest.assert(message instanceof WI.ConsoleMessage); |
| if (messageChecker && messageChecker(message)) { |
| messageChecker = null; |
| untilPromiseResolver(message); |
| } |
| }); |
| |
| function addTestCase({name, description, expression, condition}) { |
| suite.addTestCase({ |
| name, description, |
| test(resolve, reject) { |
| InspectorTest.evaluateInPage(expression); |
| untilMessageMatches(condition).then((message) => { |
| logConsoleMessageStackTrace(message); |
| }).then(resolve, reject); |
| } |
| }); |
| } |
| |
| // ---- |
| |
| addTestCase({ |
| name: "Console.StackTrace.ConsoleTrace", |
| description: "StackTrace from console.trace().", |
| expression: `setTimeout(triggerConsoleTrace)`, |
| condition(message) { return message.type === WI.ConsoleMessage.MessageType.Trace; }, |
| }); |
| |
| addTestCase({ |
| name: "Console.StackTrace.ConsoleError", |
| description: "StackTrace from console.error().", |
| expression: `setTimeout(triggerConsoleError)`, |
| condition(message) { return message.level === WI.ConsoleMessage.MessageLevel.Error; }, |
| }); |
| |
| addTestCase({ |
| name: "Console.StackTrace.UncaughtException", |
| description: "StackTrace from an uncaught exception.", |
| expression: `setTimeout(triggerUncaughtException)`, |
| condition(message) { return message.level === WI.ConsoleMessage.MessageLevel.Error; }, |
| }); |
| |
| addTestCase({ |
| name: "Console.StackTrace.UnhandledPromiseRejection.PromiseReject", |
| description: "StackTrace from an unhandled promise rejection via Promise.reject(...).", |
| expression: `setTimeout(triggerUnhandledRejectionPromiseReject)`, |
| condition(message) { return message.level === WI.ConsoleMessage.MessageLevel.Error; }, |
| }); |
| |
| addTestCase({ |
| name: "Console.StackTrace.UnhandledPromiseRejection.ExplicitReject", |
| description: "StackTrace from an unhandled promise rejection via reject(...).", |
| expression: `setTimeout(triggerUnhandledRejectionExplicit)`, |
| condition(message) { return message.level === WI.ConsoleMessage.MessageLevel.Error; }, |
| }); |
| |
| addTestCase({ |
| name: "Console.StackTrace.UnhandledPromiseRejection.ImplicitReject", |
| description: "StackTrace from an unhandled promise rejection due to an uncaught exception in a promise reaction.", |
| expression: `setTimeout(triggerUnhandledRejectionImplicitWithException)`, |
| condition(message) { return message.level === WI.ConsoleMessage.MessageLevel.Error; }, |
| }); |
| |
| suite.runTestCasesAndFinish(); |
| } |
| </script> |
| </head> |
| <body onload="runTest()"> |
| <p>Test for the Console.stackTrace in different cases.</p> |
| </body> |
| </html> |