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
59d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org// Flags: --expose-debug-as debug --allow-natives-syntax
6865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
7865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org// Test debug events when we listen to all exceptions and
8865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org// there is a catch handler for the exception thrown in a Promise.
9a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// We expect a normal Exception debug event to be triggered.
10865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
11865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgDebug = debug.Debug;
12865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
139d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgvar expected_events = 1;
14865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgvar log = [];
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.orgvar q = p.chain(
22865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  function() {
23865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    log.push("throw");
24865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    throw new Error("caught");
25865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  });
26865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
27865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgq.catch(
28865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  function(e) {
29865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    assertEquals("caught", e.message);
30865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  });
31865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
32865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgfunction listener(event, exec_state, event_data, data) {
33865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  try {
34865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    if (event == Debug.DebugEvent.Exception) {
359d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org      expected_events--;
369d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org      assertTrue(expected_events >= 0);
37865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      assertEquals("caught", event_data.exception().message);
388640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org      assertSame(q, event_data.promise());
39a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      assertFalse(event_data.uncaught());
40865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    }
41865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  } catch (e) {
429d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org    %AbortJS(e + "\n" + e.stack);
43865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  }
44865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
45865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
46865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgDebug.setBreakOnException();
47865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgDebug.setListener(listener);
48865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
49865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orglog.push("end main");
509d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org
519d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgfunction testDone(iteration) {
529d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org  function checkResult() {
539d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org    try {
549d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org      assertTrue(iteration < 10);
559d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org      if (expected_events === 0) {
569d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org        assertEquals(["resolve", "end main", "throw"], log);
579d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org      } else {
589d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org        testDone(iteration + 1);
599d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org      }
609d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org    } catch (e) {
619d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org      %AbortJS(e + "\n" + e.stack);
629d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org    }
639d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org  }
649d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org
659d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org  // Run testDone through the Object.observe processing loop.
669d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org  var dummy = {};
679d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org  Object.observe(dummy, checkResult);
689d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org  dummy.dummy = dummy;
699d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org}
709d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org
719d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.orgtestDone(0);
72