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 13Debug = debug.Debug; 14 15var expected_events = 2; 16var log = []; 17 18var p = new Promise(function(resolve, reject) { 19 log.push("resolve"); 20 resolve(); 21}); 22 23function 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 33MyPromise.prototype = new Promise(function() {}); 34p.constructor = MyPromise; 35 36var q = p.chain( 37 function() { 38 log.push("throw caught"); 39 throw new Error("caught"); // event 40 }); 41 42function 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 64Debug.setBreakOnUncaughtException(); 65Debug.setListener(listener); 66 67log.push("end main"); 68 69function 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 87testDone(0); 88