19d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved. 29d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 39d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org// found in the LICENSE file. 49d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 59d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org// Flags: --expose-debug-as debug --allow-natives-syntax 69d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 79d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org// Test debug events when we listen to all exceptions and 89d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org// there is a catch handler for the to-be-rejected Promise. 99d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org// We expect an Exception debug event with a promise to be triggered. 109d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 119d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgDebug = debug.Debug; 129d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 139d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgvar expected_events = 1; 149d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgvar log = []; 159d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 169d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgvar p = new Promise(function(resolve, reject) { 179d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org log.push("resolve"); 189d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org resolve(); 199d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org}); 209d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 219d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgvar q = p.chain( 229d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org function() { 239d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org log.push("reject"); 249d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org return Promise.reject(new Error("uncaught reject")); 259d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org }); 269d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 279d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgfunction listener(event, exec_state, event_data, data) { 289d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org try { 299d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org if (event == Debug.DebugEvent.Exception) { 309d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org expected_events--; 319d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org assertTrue(expected_events >= 0); 329d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org assertEquals("uncaught reject", event_data.exception().message); 339d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org assertTrue(event_data.promise() instanceof Promise); 348640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org assertSame(q, event_data.promise()); 359d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org assertTrue(event_data.uncaught()); 369d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org // All of the frames on the stack are from native Javascript. 379d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org assertEquals(0, exec_state.frameCount()); 389d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org } 399d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org } catch (e) { 409d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org %AbortJS(e + "\n" + e.stack); 419d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org } 429d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org} 439d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 449d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgDebug.setBreakOnException(); 459d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgDebug.setListener(listener); 469d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 479d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orglog.push("end main"); 489d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 499d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgfunction testDone(iteration) { 509d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org function checkResult() { 519d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org try { 529d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org assertTrue(iteration < 10); 539d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org if (expected_events === 0) { 549d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org assertEquals(["resolve", "end main", "reject"], log); 559d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org } else { 569d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org testDone(iteration + 1); 579d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org } 589d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org } catch (e) { 599d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org %AbortJS(e + "\n" + e.stack); 609d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org } 619d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org } 629d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 639d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org // Run testDone through the Object.observe processing loop. 649d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org var dummy = {}; 659d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org Object.observe(dummy, checkResult); 669d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org dummy.dummy = dummy; 679d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org} 689d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org 699d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgtestDone(0); 70