Index: test/cctest/test-debug.cc |
diff --git a/test/cctest/test-debug.cc b/test/cctest/test-debug.cc |
index 2f0674a34d98b94c6183ad10ed7ed4347c4c02ff..adf9ba99b2db880d32d7104c081ca580dbc35abd 100644 |
--- a/test/cctest/test-debug.cc |
+++ b/test/cctest/test-debug.cc |
@@ -7518,3 +7518,75 @@ TEST(DebugBreakOffThreadTerminate) { |
CompileRun("while (true);"); |
CHECK(try_catch.HasTerminated()); |
} |
+ |
+ |
+static void DebugEventExpectNoException( |
+ const v8::Debug::EventDetails& event_details) { |
+ v8::DebugEvent event = event_details.GetEvent(); |
+ CHECK_NE(v8::Exception, event); |
+} |
+ |
+ |
+static void TryCatchWrappedThrowCallback( |
+ const v8::FunctionCallbackInfo<v8::Value>& args) { |
+ v8::TryCatch try_catch; |
+ CompileRun("throw 'rejection';"); |
+ CHECK(try_catch.HasCaught()); |
+} |
+ |
+ |
+TEST(DebugPromiseInterceptedByTryCatch) { |
+ DebugLocalContext env; |
+ v8::Isolate* isolate = env->GetIsolate(); |
+ v8::HandleScope scope(isolate); |
+ v8::Debug::SetDebugEventListener(&DebugEventExpectNoException); |
+ ChangeBreakOnException(false, true); |
+ |
+ v8::Handle<v8::FunctionTemplate> fun = |
+ v8::FunctionTemplate::New(isolate, TryCatchWrappedThrowCallback); |
+ env->Global()->Set(v8_str("fun"), fun->GetFunction()); |
+ |
+ CompileRun("var p = new Promise(function(res, rej) { fun(); res(); });"); |
+ CompileRun( |
+ "var r;" |
+ "p.chain(function() { r = 'resolved'; }," |
+ " function() { r = 'rejected'; });"); |
+ CHECK(CompileRun("r")->Equals(v8_str("resolved"))); |
+} |
+ |
+ |
+static int exception_event_counter = 0; |
+ |
+ |
+static void DebugEventCountException( |
+ const v8::Debug::EventDetails& event_details) { |
+ v8::DebugEvent event = event_details.GetEvent(); |
+ if (event == v8::Exception) exception_event_counter++; |
+} |
+ |
+ |
+static void ThrowCallback(const v8::FunctionCallbackInfo<v8::Value>& args) { |
+ CompileRun("throw 'rejection';"); |
+} |
+ |
+ |
+TEST(DebugPromiseRejectedByCallback) { |
+ DebugLocalContext env; |
+ v8::Isolate* isolate = env->GetIsolate(); |
+ v8::HandleScope scope(isolate); |
+ v8::Debug::SetDebugEventListener(&DebugEventCountException); |
+ ChangeBreakOnException(false, true); |
+ exception_event_counter = 0; |
+ |
+ v8::Handle<v8::FunctionTemplate> fun = |
+ v8::FunctionTemplate::New(isolate, ThrowCallback); |
+ env->Global()->Set(v8_str("fun"), fun->GetFunction()); |
+ |
+ CompileRun("var p = new Promise(function(res, rej) { fun(); res(); });"); |
+ CompileRun( |
+ "var r;" |
+ "p.chain(function() { r = 'resolved'; }," |
+ " function(e) { r = 'rejected' + e; });"); |
+ CHECK(CompileRun("r")->Equals(v8_str("rejectedrejection"))); |
+ CHECK_EQ(1, exception_event_counter); |
+} |