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