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 6 7// Test debug events when a Promise is rejected, which is caught by a custom 8// promise, which has undefined for reject closure. We expect an Exception 9// debug even calling the (undefined) custom rejected 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 = undefined; 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("caught", 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 // Run testDone through the Object.observe processing loop. 70 var dummy = {}; 71 Object.observe(dummy, checkResult); 72 dummy.dummy = dummy; 73} 74 75testDone(0); 76 77log.push("end main"); 78