1 // Copyright 2014 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Flags: --expose-debug-as debug --allow-natives-syntax --promise-extra 6 7 // Test debug events when an exception is thrown inside a Promise, which is 8 // caught by a custom promise, which throws a new exception in its reject 9 // handler. We expect two Exception debug events: 10 // 1) when the exception is thrown in the promise q. 11 // 2) when the custom reject closure in MyPromise throws an exception. 12 13 Debug = debug.Debug; 14 15 var expected_events = 2; 16 var log = []; 17 18 var p = new Promise(function(resolve, reject) { 19 log.push("resolve"); 20 resolve(); 21 }); 22 23 function MyPromise(resolver) { 24 var reject = function() { 25 log.push("throw in reject"); 26 throw new Error("reject"); // event 27 }; 28 var resolve = function() { }; 29 log.push("construct"); 30 resolver(resolve, reject); 31 }; 32 33 MyPromise.prototype = new Promise(function() {}); 34 p.constructor = MyPromise; 35 36 var q = p.chain( 37 function() { 38 log.push("throw caught"); 39 throw new Error("caught"); // event 40 }); 41 42 function listener(event, exec_state, event_data, data) { 43 try { 44 if (event == Debug.DebugEvent.Exception) { 45 expected_events--; 46 assertTrue(expected_events >= 0); 47 if (expected_events == 1) { 48 assertEquals(["resolve", "construct", "end main", 49 "throw caught"], log); 50 assertEquals("caught", event_data.exception().message); 51 } else if (expected_events == 0) { 52 assertEquals("reject", event_data.exception().message); 53 } else { 54 assertUnreachable(); 55 } 56 assertSame(q, event_data.promise()); 57 assertTrue(exec_state.frame(0).sourceLineText().indexOf('// event') > 0); 58 } 59 } catch (e) { 60 %AbortJS(e + "\n" + e.stack); 61 } 62 } 63 64 Debug.setBreakOnUncaughtException(); 65 Debug.setListener(listener); 66 67 log.push("end main"); 68 69 function testDone(iteration) { 70 function checkResult() { 71 try { 72 assertTrue(iteration < 10); 73 if (expected_events === 0) { 74 assertEquals(["resolve", "construct", "end main", 75 "throw caught", "throw in reject"], log); 76 } else { 77 testDone(iteration + 1); 78 } 79 } catch (e) { 80 %AbortJS(e + "\n" + e.stack); 81 } 82 } 83 84 %EnqueueMicrotask(checkResult); 85 } 86 87 testDone(0); 88