@@ -17625,6 +17625,8 @@ TEST(RethrowBogusErrorStackTrace) {
17625
17625
v8::PromiseRejectEvent reject_event = v8::kPromiseRejectWithNoHandler;
17626
17626
int promise_reject_counter = 0;
17627
17627
int promise_revoke_counter = 0;
17628
+ int promise_reject_after_resolved_counter = 0;
17629
+ int promise_resolve_after_resolved_counter = 0;
17628
17630
int promise_reject_msg_line_number = -1;
17629
17631
int promise_reject_msg_column_number = -1;
17630
17632
int promise_reject_line_number = -1;
@@ -17634,40 +17636,56 @@ int promise_reject_frame_count = -1;
17634
17636
void PromiseRejectCallback(v8::PromiseRejectMessage reject_message) {
17635
17637
v8::Local<v8::Object> global = CcTest::global();
17636
17638
v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext();
17637
- CHECK_EQ (v8::Promise::PromiseState::kRejected ,
17639
+ CHECK_NE (v8::Promise::PromiseState::kPending ,
17638
17640
reject_message.GetPromise()->State());
17639
- if (reject_message.GetEvent() == v8::kPromiseRejectWithNoHandler) {
17640
- promise_reject_counter++;
17641
- global->Set(context, v8_str("rejected"), reject_message.GetPromise())
17642
- .FromJust();
17643
- global->Set(context, v8_str("value"), reject_message.GetValue()).FromJust();
17644
- v8::Local<v8::Message> message = v8::Exception::CreateMessage(
17645
- CcTest::isolate(), reject_message.GetValue());
17646
- v8::Local<v8::StackTrace> stack_trace = message->GetStackTrace();
17647
-
17648
- promise_reject_msg_line_number = message->GetLineNumber(context).FromJust();
17649
- promise_reject_msg_column_number =
17650
- message->GetStartColumn(context).FromJust() + 1;
17651
-
17652
- if (!stack_trace.IsEmpty()) {
17653
- promise_reject_frame_count = stack_trace->GetFrameCount();
17654
- if (promise_reject_frame_count > 0) {
17655
- CHECK(stack_trace->GetFrame(0)
17656
- ->GetScriptName()
17657
- ->Equals(context, v8_str("pro"))
17658
- .FromJust());
17659
- promise_reject_line_number = stack_trace->GetFrame(0)->GetLineNumber();
17660
- promise_reject_column_number = stack_trace->GetFrame(0)->GetColumn();
17661
- } else {
17662
- promise_reject_line_number = -1;
17663
- promise_reject_column_number = -1;
17641
+ switch (reject_message.GetEvent()) {
17642
+ case v8::kPromiseRejectWithNoHandler: {
17643
+ promise_reject_counter++;
17644
+ global->Set(context, v8_str("rejected"), reject_message.GetPromise())
17645
+ .FromJust();
17646
+ global->Set(context, v8_str("value"), reject_message.GetValue())
17647
+ .FromJust();
17648
+ v8::Local<v8::Message> message = v8::Exception::CreateMessage(
17649
+ CcTest::isolate(), reject_message.GetValue());
17650
+ v8::Local<v8::StackTrace> stack_trace = message->GetStackTrace();
17651
+
17652
+ promise_reject_msg_line_number =
17653
+ message->GetLineNumber(context).FromJust();
17654
+ promise_reject_msg_column_number =
17655
+ message->GetStartColumn(context).FromJust() + 1;
17656
+
17657
+ if (!stack_trace.IsEmpty()) {
17658
+ promise_reject_frame_count = stack_trace->GetFrameCount();
17659
+ if (promise_reject_frame_count > 0) {
17660
+ CHECK(stack_trace->GetFrame(0)
17661
+ ->GetScriptName()
17662
+ ->Equals(context, v8_str("pro"))
17663
+ .FromJust());
17664
+ promise_reject_line_number =
17665
+ stack_trace->GetFrame(0)->GetLineNumber();
17666
+ promise_reject_column_number = stack_trace->GetFrame(0)->GetColumn();
17667
+ } else {
17668
+ promise_reject_line_number = -1;
17669
+ promise_reject_column_number = -1;
17670
+ }
17664
17671
}
17672
+ break;
17673
+ }
17674
+ case v8::kPromiseHandlerAddedAfterReject: {
17675
+ promise_revoke_counter++;
17676
+ global->Set(context, v8_str("revoked"), reject_message.GetPromise())
17677
+ .FromJust();
17678
+ CHECK(reject_message.GetValue().IsEmpty());
17679
+ break;
17680
+ }
17681
+ case v8::kPromiseRejectAfterResolved: {
17682
+ promise_reject_after_resolved_counter++;
17683
+ break;
17684
+ }
17685
+ case v8::kPromiseResolveAfterResolved: {
17686
+ promise_resolve_after_resolved_counter++;
17687
+ break;
17665
17688
}
17666
- } else {
17667
- promise_revoke_counter++;
17668
- global->Set(context, v8_str("revoked"), reject_message.GetPromise())
17669
- .FromJust();
17670
- CHECK(reject_message.GetValue().IsEmpty());
17671
17689
}
17672
17690
}
17673
17691
@@ -17690,6 +17708,8 @@ v8::Local<v8::Value> RejectValue() {
17690
17708
void ResetPromiseStates() {
17691
17709
promise_reject_counter = 0;
17692
17710
promise_revoke_counter = 0;
17711
+ promise_reject_after_resolved_counter = 0;
17712
+ promise_resolve_after_resolved_counter = 0;
17693
17713
promise_reject_msg_line_number = -1;
17694
17714
promise_reject_msg_column_number = -1;
17695
17715
promise_reject_line_number = -1;
@@ -17915,6 +17935,40 @@ TEST(PromiseRejectCallback) {
17915
17935
CHECK_EQ(0, promise_revoke_counter);
17916
17936
CHECK(RejectValue()->Equals(env.local(), v8_str("sss")).FromJust());
17917
17937
17938
+ ResetPromiseStates();
17939
+
17940
+ // Swallowed exceptions in the Promise constructor.
17941
+ CompileRun(
17942
+ "var v0 = new Promise(\n"
17943
+ " function(res, rej) {\n"
17944
+ " res(1);\n"
17945
+ " throw new Error();\n"
17946
+ " }\n"
17947
+ ");\n");
17948
+ CHECK(!GetPromise("v0")->HasHandler());
17949
+ CHECK_EQ(0, promise_reject_counter);
17950
+ CHECK_EQ(0, promise_revoke_counter);
17951
+ CHECK_EQ(1, promise_reject_after_resolved_counter);
17952
+ CHECK_EQ(0, promise_resolve_after_resolved_counter);
17953
+
17954
+ ResetPromiseStates();
17955
+
17956
+ // Duplication resolve.
17957
+ CompileRun(
17958
+ "var r;\n"
17959
+ "var y0 = new Promise(\n"
17960
+ " function(res, rej) {\n"
17961
+ " r = res;\n"
17962
+ " throw new Error();\n"
17963
+ " }\n"
17964
+ ");\n"
17965
+ "r(1);\n");
17966
+ CHECK(!GetPromise("y0")->HasHandler());
17967
+ CHECK_EQ(1, promise_reject_counter);
17968
+ CHECK_EQ(0, promise_revoke_counter);
17969
+ CHECK_EQ(0, promise_reject_after_resolved_counter);
17970
+ CHECK_EQ(1, promise_resolve_after_resolved_counter);
17971
+
17918
17972
// Test stack frames.
17919
17973
env->GetIsolate()->SetCaptureStackTraceForUncaughtExceptions(true);
17920
17974
0 commit comments