1a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved.
2a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
3a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// found in the LICENSE file.
4a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
54b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org// Flags: --expose-debug-as debug
6a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
7a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// Test debug events when we only listen to uncaught exceptions and
89d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org// an exception is thrown in the Promise constructor.
9a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// We expect an Exception debug event with a promise to be triggered.
10a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
11a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgDebug = debug.Debug;
12a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
13a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgvar step = 0;
14a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgvar exception = null;
15a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
16a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgfunction listener(event, exec_state, event_data, data) {
17a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  try {
18a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    if (event == Debug.DebugEvent.Exception) {
19a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      assertEquals(0, step);
20a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      assertEquals("uncaught", event_data.exception().message);
21a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      assertTrue(event_data.promise() instanceof Promise);
22a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      assertTrue(event_data.uncaught());
23a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      // Assert that the debug event is triggered at the throw site.
24a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      assertTrue(exec_state.frame(0).sourceLineText().indexOf("// event") > 0);
25a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      step++;
26a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    }
27a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  } catch (e) {
28a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    exception = e;
29a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  }
30a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org}
31a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
32a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgDebug.setBreakOnUncaughtException();
33a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgDebug.setListener(listener);
34a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
35a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgvar p = new Promise(function(resolve, reject) {
36a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  throw new Error("uncaught");  // event
37a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org});
38a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
39a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgassertEquals(1, step);
40a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgassertNull(exception);
41