1865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved. 2865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 3865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org// found in the LICENSE file. 4865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 5865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org// Flags: --harmony-promises --expose-debug-as debug 6865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 7865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org// Test debug events when an exception is thrown inside a Promise, which is 8865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org// caught by a custom promise, which has no reject handler. 9a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// We expect an Exception event with a promise to be triggered. 10865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 11865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgDebug = debug.Debug; 12865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 13865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgvar log = []; 14865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgvar step = 0; 15865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 16865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgvar p = new Promise(function(resolve, reject) { 17865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org log.push("resolve"); 18865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org resolve(); 19865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}); 20865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 21865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgfunction MyPromise(resolver) { 22865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org var reject = undefined; 23865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org var resolve = function() { }; 24865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org log.push("construct"); 25865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org resolver(resolve, reject); 26865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}; 27865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 28865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgMyPromise.prototype = p; 29865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgp.constructor = MyPromise; 30865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 31865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgvar q = p.chain( 32865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org function() { 33865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org log.push("throw caught"); 34a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org throw new Error("caught"); // event 35865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org }); 36865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 37865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgfunction listener(event, exec_state, event_data, data) { 38865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org try { 39a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org if (event == Debug.DebugEvent.Exception) { 40865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org assertEquals(["resolve", "construct", "end main", "throw caught"], log); 41a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org assertEquals("undefined is not a function", 42a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org event_data.exception().message); 43a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org assertEquals(q, event_data.promise()); 44865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org } 45865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org } catch (e) { 46865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org // Signal a failure with exit code 1. This is necessary since the 47865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org // debugger swallows exceptions and we expect the chained function 48865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org // and this listener to be executed after the main script is finished. 49865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org print("Unexpected exception: " + e + "\n" + e.stack); 50865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org quit(1); 51865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org } 52865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org} 53865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 54865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgDebug.setBreakOnUncaughtException(); 55865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgDebug.setListener(listener); 56865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 57865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orglog.push("end main"); 58