15e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved. 25e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 35e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// found in the LICENSE file. 45e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 55e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// Flags: --expose-debug-as debug --allow-natives-syntax 65e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 75e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// Test debug events when we only listen to uncaught exceptions and 85e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// there is only a default reject handler for the to-be-rejected Promise. 95e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// We expect two Exception debug events: 105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// - when the first Promise is rejected and only has default reject handlers. 115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// - when the default reject handler passes the rejection on. 125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgDebug = debug.Debug; 145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgvar expected_events = 2; 165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgvar log = []; 175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgvar resolve, reject; 195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgvar p0 = new Promise(function(res, rej) { resolve = res; reject = rej; }); 205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgvar p1 = p0.then(function() { 215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org log.push("p0.then"); 225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org throw new Error("123"); // event 235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}); 245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgvar p2 = p1.then(function() { 255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org log.push("p1.then"); 265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}); 275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgvar q = new Promise(function(res, rej) { 295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org log.push("resolve q"); 305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org res(); 315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}); 325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgq.then(function() { 345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org log.push("resolve p"); 355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org resolve(); 365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}) 375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 385e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 395e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgfunction listener(event, exec_state, event_data, data) { 405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org try { 415e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org if (event == Debug.DebugEvent.Exception) { 425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org expected_events--; 435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org assertTrue(expected_events >= 0); 445e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org assertTrue(event_data.uncaught()); 455e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org assertTrue(event_data.promise() instanceof Promise); 465e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org if (expected_events == 1) { 475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org // p1 is rejected, uncaught except for its default reject handler. 485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org assertTrue( 495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org exec_state.frame(0).sourceLineText().indexOf("// event") > 0); 505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org assertSame(p1, event_data.promise()); 515e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org } else { 525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org // p2 is rejected by p1's default reject handler. 535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org assertEquals(0, exec_state.frameCount()); 545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org assertSame(p2, event_data.promise()); 555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org } 565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org } 575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org } catch (e) { 585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org %AbortJS(e + "\n" + e.stack); 595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org } 605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org} 615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgDebug.setBreakOnUncaughtException(); 635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgDebug.setListener(listener); 645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orglog.push("end main"); 665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgfunction testDone(iteration) { 685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org function checkResult() { 695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org try { 705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org assertTrue(iteration < 10); 715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org if (expected_events === 0) { 725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org assertEquals(["resolve q", "end main", "resolve p", "p0.then"], log); 735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org } else { 745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org testDone(iteration + 1); 755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org } 765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org } catch (e) { 775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org %AbortJS(e + "\n" + e.stack); 785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org } 795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org } 805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org // Run testDone through the Object.observe processing loop. 825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org var dummy = {}; 835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org Object.observe(dummy, checkResult); 845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org dummy.dummy = dummy; 855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org} 865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgtestDone(0); 88