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 a Promise is rejected, which is caught by a custom 8 // promise, which has a number for reject closure. We expect an Exception debug 9 // events trying to call the invalid reject closure. 10 11 Debug = debug.Debug; 12 13 var expected_events = 1; 14 var log = []; 15 16 var p = new Promise(function(resolve, reject) { 17 log.push("resolve"); 18 resolve(); 19 }); 20 21 function MyPromise(resolver) { 22 var reject = 1; 23 var resolve = function() { }; 24 log.push("construct"); 25 resolver(resolve, reject); 26 }; 27 28 MyPromise.prototype = new Promise(function() {}); 29 p.constructor = MyPromise; 30 31 var q = p.chain( 32 function() { 33 log.push("reject caught"); 34 return Promise.reject(new Error("caught")); 35 }); 36 37 function listener(event, exec_state, event_data, data) { 38 try { 39 if (event == Debug.DebugEvent.Exception) { 40 expected_events--; 41 assertTrue(expected_events >= 0); 42 assertEquals("number is not a function", event_data.exception().message); 43 // All of the frames on the stack are from native Javascript. 44 assertEquals(0, exec_state.frameCount()); 45 } 46 } catch (e) { 47 %AbortJS(e + "\n" + e.stack); 48 } 49 } 50 51 Debug.setBreakOnUncaughtException(); 52 Debug.setListener(listener); 53 54 function testDone(iteration) { 55 function checkResult() { 56 try { 57 assertTrue(iteration < 10); 58 if (expected_events === 0) { 59 assertEquals(["resolve", "construct", "end main", "reject caught"], 60 log); 61 } else { 62 testDone(iteration + 1); 63 } 64 } catch (e) { 65 %AbortJS(e + "\n" + e.stack); 66 } 67 } 68 69 %EnqueueMicrotask(checkResult); 70 } 71 72 testDone(0); 73 74 log.push("end main"); 75