Chromium Code Reviews| Index: test/cctest/test-api.cc |
| diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc |
| index fc0281a0bdf6f3375db2d1627d4fb4a661ac548a..799b278658dd5eef0effe989f77a1b9b110e40dd 100644 |
| --- a/test/cctest/test-api.cc |
| +++ b/test/cctest/test-api.cc |
| @@ -17631,18 +17631,31 @@ TEST(RethrowBogusErrorStackTrace) { |
| v8::PromiseRejectEvent reject_event = v8::kPromiseRejectWithNoHandler; |
| int promise_reject_counter = 0; |
| int promise_revoke_counter = 0; |
| +int promise_reject_line_number = -1; |
| +int promise_reject_frame_count = -1; |
| void PromiseRejectCallback(v8::Handle<v8::Promise> promise, |
| + v8::PromiseRejectEvent event, |
| v8::Handle<v8::Value> value, |
| - v8::PromiseRejectEvent event) { |
| + v8::Handle<v8::StackTrace> stack_trace) { |
| if (event == v8::kPromiseRejectWithNoHandler) { |
| promise_reject_counter++; |
| CcTest::global()->Set(v8_str("rejected"), promise); |
| CcTest::global()->Set(v8_str("value"), value); |
| + if (!stack_trace.IsEmpty()) { |
| + promise_reject_frame_count = stack_trace->GetFrameCount(); |
| + if (promise_reject_frame_count > 0) { |
| + CHECK(stack_trace->GetFrame(0)->GetScriptName()->Equals(v8_str("pro"))); |
| + promise_reject_line_number = stack_trace->GetFrame(0)->GetLineNumber(); |
| + } else { |
| + promise_reject_line_number = -1; |
| + } |
| + } |
| } else { |
| promise_revoke_counter++; |
| CcTest::global()->Set(v8_str("revoked"), promise); |
| CHECK(value.IsEmpty()); |
| + CHECK(stack_trace.IsEmpty()); |
| } |
| } |
| @@ -17660,6 +17673,8 @@ v8::Handle<v8::Value> RejectValue() { |
| void ResetPromiseStates() { |
| promise_reject_counter = 0; |
| promise_revoke_counter = 0; |
| + promise_reject_line_number = -1; |
| + promise_reject_frame_count = -1; |
| CcTest::global()->Set(v8_str("rejected"), v8_str("")); |
| CcTest::global()->Set(v8_str("value"), v8_str("")); |
| CcTest::global()->Set(v8_str("revoked"), v8_str("")); |
| @@ -17678,7 +17693,7 @@ TEST(PromiseRejectCallback) { |
| // Create promise p0. |
| CompileRun( |
| "var reject; \n" |
| - "var p0 = new Promise( \n" |
| + "var p0 = new Promise( \n" |
| " function(res, rej) { \n" |
| " reject = rej; \n" |
| " } \n" |
| @@ -17726,7 +17741,7 @@ TEST(PromiseRejectCallback) { |
| // Create promise q0. |
| CompileRun( |
| - "var q0 = new Promise( \n" |
| + "var q0 = new Promise( \n" |
| " function(res, rej) { \n" |
| " reject = rej; \n" |
| " } \n" |
| @@ -17772,7 +17787,7 @@ TEST(PromiseRejectCallback) { |
| // Add a reject handler to the resolved q1, which rejects by throwing. |
| CompileRun( |
| - "var q3 = q1.then( \n" |
| + "var q3 = q1.then( \n" |
| " function() { \n" |
| " throw 'qqqq'; \n" |
| " } \n" |
| @@ -17868,6 +17883,86 @@ TEST(PromiseRejectCallback) { |
| CHECK_EQ(3, promise_reject_counter); |
| CHECK_EQ(0, promise_revoke_counter); |
| CHECK(RejectValue()->Equals(v8_str("sss"))); |
| + |
| + // Test stack frames. |
| + V8::SetCaptureStackTraceForUncaughtExceptions(true); |
| + |
| + ResetPromiseStates(); |
| + |
| + // Create promise t0, which is rejected in the constructor with an error. |
| + CompileRunWithOrigin( |
| + "var t0 = new Promise( \n" |
| + " function(res, rej) { \n" |
| + " reference_error; \n" |
| + " } \n" |
| + "); \n", |
| + "pro", 0, 0); |
| + CHECK(!GetPromise("t0")->HasHandler()); |
| + CHECK_EQ(1, promise_reject_counter); |
| + CHECK_EQ(0, promise_revoke_counter); |
| + CHECK_EQ(2, promise_reject_frame_count); |
| + CHECK_EQ(3, promise_reject_line_number); |
| + |
| + ResetPromiseStates(); |
| + |
| + // Create promise u0 and chain u1 to it, which is rejected via throw. |
| + CompileRunWithOrigin( |
| + "var u0 = Promise.resolve(); \n" |
| + "var u1 = u0.then( \n" |
| + " function() { \n" |
| + " (function() { \n" |
| + " throw new Error(); \n" |
| + " })(); \n" |
| + " } \n" |
| + " ); \n", |
| + "pro", 0, 0); |
| + CHECK(GetPromise("u0")->HasHandler()); |
| + CHECK(!GetPromise("u1")->HasHandler()); |
| + CHECK_EQ(1, promise_reject_counter); |
| + CHECK_EQ(0, promise_revoke_counter); |
| + CHECK_EQ(2, promise_reject_frame_count); |
| + CHECK_EQ(5, promise_reject_line_number); |
| + |
| + // Throw in u3, which handles u1's rejection. |
| + CompileRunWithOrigin( |
| + "function f() { \n" |
| + " return (function() { \n" |
| + " return new Error(); \n" |
| + " })(); \n" |
| + "} \n" |
| + "var u2 = Promise.reject(f()); \n" |
| + "var u3 = u1.catch( \n" |
| + " function() { \n" |
| + " return u2; \n" |
| + " } \n" |
| + " ); \n", |
| + "pro", 0, 0); |
| + CHECK(GetPromise("u0")->HasHandler()); |
| + CHECK(GetPromise("u1")->HasHandler()); |
| + CHECK(GetPromise("u2")->HasHandler()); |
| + CHECK(!GetPromise("u3")->HasHandler()); |
| + CHECK_EQ(3, promise_reject_counter); |
| + CHECK_EQ(2, promise_revoke_counter); |
| + CHECK_EQ(3, promise_reject_frame_count); |
| + CHECK_EQ(3, promise_reject_line_number); |
| + |
| + ResetPromiseStates(); |
| + |
| + // Create promise rejected promise v0, which is incorrectly handled by v1 |
| + // via chaining cycle. |
| + CompileRunWithOrigin( |
| + "var v0 = Promise.reject(); \n" |
| + "var v1 = v0.catch( \n" |
| + " function() { \n" |
| + " return v1; \n" |
| + " } \n" |
| + " ); \n", |
| + "pro", 0, 0); |
| + CHECK(GetPromise("v0")->HasHandler()); |
| + CHECK(!GetPromise("v1")->HasHandler()); |
| + CHECK_EQ(2, promise_reject_counter); |
| + CHECK_EQ(1, promise_revoke_counter); |
| + CHECK_EQ(0, promise_reject_frame_count); |
|
aandrey
2014/10/07 10:49:05
CHECK_EQ(-1, promise_reject_line_number);
|
| } |