text: // Copyright 2014 the V8 project authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  // Flags: --ignore-unhandled-promises
  
  // Test debug events when we listen to all exceptions and
  // there is a catch handler for the to-be-rejected Promise.
  // We expect an Exception debug event with a promise to be triggered.
  
  Debug = debug.Debug;
  
  var expected_events = 1;
  var log = [];
  
  var p = new Promise(function(resolve, reject) {
    log.push("resolve");
    resolve();
  });
  
  var q = p.then(
    function() {
      log.push("reject");
      return Promise.reject(new Error("uncaught reject"));
    });
  
  function listener(event, exec_state, event_data, data) {
    try {
      if (event == Debug.DebugEvent.Exception) {
        expected_events--;
        assertTrue(expected_events >= 0);
        assertEquals("uncaught reject", event_data.exception().message);
        assertTrue(event_data.uncaught());
        // The frame comes from the Promise.reject call
        assertNotNull(/Promise\.reject/.exec(event_data.sourceLineText()));
      }
    } catch (e) {
      %AbortJS(e + "\n" + e.stack);
    }
  }
  
  Debug.setBreakOnException();
  Debug.setListener(listener);
  
  log.push("end main");
  
  function testDone(iteration) {
    function checkResult() {
      try {
        assertTrue(iteration < 10);
        if (expected_events === 0) {
          assertEquals(["resolve", "end main", "reject"], log);
        } else {
          testDone(iteration + 1);
        }
      } catch (e) {
        %AbortJS(e + "\n" + e.stack);
      }
    }
  
    %EnqueueMicrotask(checkResult);
  }
  
  testDone(0);
  