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 11Debug = debug.Debug; 12 13var expected_events = 1; 14var log = []; 15 16var p = new Promise(function(resolve, reject) { 17 log.push("resolve"); 18 resolve(); 19}); 20 21function MyPromise(resolver) { 22 var reject = 1; 23 var resolve = function() { }; 24 log.push("construct"); 25 resolver(resolve, reject); 26}; 27 28MyPromise.prototype = new Promise(function() {}); 29p.constructor = MyPromise; 30 31var q = p.chain( 32 function() { 33 log.push("reject caught"); 34 return Promise.reject(new Error("caught")); 35 }); 36 37function 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 51Debug.setBreakOnUncaughtException(); 52Debug.setListener(listener); 53 54function 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 72testDone(0); 73 74log.push("end main"); 75