OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 17600 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17611 "var e = {__proto__: new Error()} \n" | 17611 "var e = {__proto__: new Error()} \n" |
17612 "throw e; \n"; | 17612 "throw e; \n"; |
17613 v8::V8::AddMessageListener(RethrowBogusErrorStackTraceHandler); | 17613 v8::V8::AddMessageListener(RethrowBogusErrorStackTraceHandler); |
17614 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); | 17614 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); |
17615 CompileRun(source); | 17615 CompileRun(source); |
17616 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); | 17616 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); |
17617 v8::V8::RemoveMessageListeners(RethrowBogusErrorStackTraceHandler); | 17617 v8::V8::RemoveMessageListeners(RethrowBogusErrorStackTraceHandler); |
17618 } | 17618 } |
17619 | 17619 |
17620 | 17620 |
| 17621 v8::PromiseRejectEvent reject_event = v8::kPromiseRejectWithNoHandler; |
| 17622 int promise_reject_counter = 0; |
| 17623 int promise_revoke_counter = 0; |
| 17624 |
| 17625 void PromiseRejectCallback(v8::Handle<v8::Promise> promise, |
| 17626 v8::Handle<v8::Value> value, |
| 17627 v8::PromiseRejectEvent event) { |
| 17628 if (event == v8::kPromiseRejectWithNoHandler) { |
| 17629 promise_reject_counter++; |
| 17630 CcTest::global()->Set(v8_str("rejected"), promise); |
| 17631 CcTest::global()->Set(v8_str("value"), value); |
| 17632 } else { |
| 17633 promise_revoke_counter++; |
| 17634 CcTest::global()->Set(v8_str("revoked"), promise); |
| 17635 CHECK(value.IsEmpty()); |
| 17636 } |
| 17637 } |
| 17638 |
| 17639 |
| 17640 v8::Handle<v8::Promise> GetPromise(const char* name) { |
| 17641 return v8::Handle<v8::Promise>::Cast(CcTest::global()->Get(v8_str(name))); |
| 17642 } |
| 17643 |
| 17644 |
| 17645 v8::Handle<v8::Value> RejectValue() { |
| 17646 return CcTest::global()->Get(v8_str("value")); |
| 17647 } |
| 17648 |
| 17649 |
| 17650 void ResetPromiseStates() { |
| 17651 promise_reject_counter = 0; |
| 17652 promise_revoke_counter = 0; |
| 17653 CcTest::global()->Set(v8_str("rejected"), v8_str("")); |
| 17654 CcTest::global()->Set(v8_str("value"), v8_str("")); |
| 17655 CcTest::global()->Set(v8_str("revoked"), v8_str("")); |
| 17656 } |
| 17657 |
| 17658 |
| 17659 TEST(PromiseRejectCallback) { |
| 17660 LocalContext env; |
| 17661 v8::Isolate* isolate = env->GetIsolate(); |
| 17662 v8::HandleScope scope(isolate); |
| 17663 |
| 17664 isolate->SetPromiseRejectCallback(PromiseRejectCallback); |
| 17665 |
| 17666 ResetPromiseStates(); |
| 17667 |
| 17668 // Create promise p0. |
| 17669 CompileRun( |
| 17670 "var reject; \n" |
| 17671 "var p0 = new Promise( \n" |
| 17672 " function(res, rej) { \n" |
| 17673 " reject = rej; \n" |
| 17674 " } \n" |
| 17675 "); \n"); |
| 17676 CHECK(!GetPromise("p0")->HasHandler()); |
| 17677 CHECK_EQ(0, promise_reject_counter); |
| 17678 CHECK_EQ(0, promise_revoke_counter); |
| 17679 |
| 17680 // Add resolve handler (and default reject handler) to p0. |
| 17681 CompileRun("var p1 = p0.then(function(){});"); |
| 17682 CHECK(GetPromise("p0")->HasHandler()); |
| 17683 CHECK(!GetPromise("p1")->HasHandler()); |
| 17684 CHECK_EQ(0, promise_reject_counter); |
| 17685 CHECK_EQ(0, promise_revoke_counter); |
| 17686 |
| 17687 // Reject p0. |
| 17688 CompileRun("reject('ppp');"); |
| 17689 CHECK(GetPromise("p0")->HasHandler()); |
| 17690 CHECK(!GetPromise("p1")->HasHandler()); |
| 17691 CHECK_EQ(1, promise_reject_counter); |
| 17692 CHECK_EQ(0, promise_revoke_counter); |
| 17693 CHECK_EQ(v8::kPromiseRejectWithNoHandler, reject_event); |
| 17694 CHECK(GetPromise("rejected")->Equals(GetPromise("p1"))); |
| 17695 CHECK(RejectValue()->Equals(v8_str("ppp"))); |
| 17696 |
| 17697 // Reject p0 again. Callback is not triggered again. |
| 17698 CompileRun("reject();"); |
| 17699 CHECK(GetPromise("p0")->HasHandler()); |
| 17700 CHECK(!GetPromise("p1")->HasHandler()); |
| 17701 CHECK_EQ(1, promise_reject_counter); |
| 17702 CHECK_EQ(0, promise_revoke_counter); |
| 17703 |
| 17704 // Add resolve handler to p1. |
| 17705 CompileRun("var p2 = p1.then(function(){});"); |
| 17706 CHECK(GetPromise("p0")->HasHandler()); |
| 17707 CHECK(GetPromise("p1")->HasHandler()); |
| 17708 CHECK(!GetPromise("p2")->HasHandler()); |
| 17709 CHECK_EQ(2, promise_reject_counter); |
| 17710 CHECK_EQ(1, promise_revoke_counter); |
| 17711 CHECK(GetPromise("rejected")->Equals(GetPromise("p2"))); |
| 17712 CHECK(RejectValue()->Equals(v8_str("ppp"))); |
| 17713 CHECK(GetPromise("revoked")->Equals(GetPromise("p1"))); |
| 17714 |
| 17715 ResetPromiseStates(); |
| 17716 |
| 17717 // Create promise q0. |
| 17718 CompileRun( |
| 17719 "var q0 = new Promise( \n" |
| 17720 " function(res, rej) { \n" |
| 17721 " reject = rej; \n" |
| 17722 " } \n" |
| 17723 "); \n"); |
| 17724 CHECK(!GetPromise("q0")->HasHandler()); |
| 17725 CHECK_EQ(0, promise_reject_counter); |
| 17726 CHECK_EQ(0, promise_revoke_counter); |
| 17727 |
| 17728 // Add reject handler to q0. |
| 17729 CompileRun("var q1 = q0.catch(function() {});"); |
| 17730 CHECK(GetPromise("q0")->HasHandler()); |
| 17731 CHECK(!GetPromise("q1")->HasHandler()); |
| 17732 CHECK_EQ(0, promise_reject_counter); |
| 17733 CHECK_EQ(0, promise_revoke_counter); |
| 17734 |
| 17735 // Reject q0. |
| 17736 CompileRun("reject('qq')"); |
| 17737 CHECK(GetPromise("q0")->HasHandler()); |
| 17738 CHECK(!GetPromise("q1")->HasHandler()); |
| 17739 CHECK_EQ(0, promise_reject_counter); |
| 17740 CHECK_EQ(0, promise_revoke_counter); |
| 17741 |
| 17742 // Add a new reject handler, which rejects by returning Promise.reject(). |
| 17743 // The returned promise q_ triggers a reject callback at first, only to |
| 17744 // revoke it when returning it causes q2 to be rejected. |
| 17745 CompileRun( |
| 17746 "var q_;" |
| 17747 "var q2 = q0.catch( \n" |
| 17748 " function() { \n" |
| 17749 " q_ = Promise.reject('qqq'); \n" |
| 17750 " return q_; \n" |
| 17751 " } \n" |
| 17752 "); \n"); |
| 17753 CHECK(GetPromise("q0")->HasHandler()); |
| 17754 CHECK(!GetPromise("q1")->HasHandler()); |
| 17755 CHECK(!GetPromise("q2")->HasHandler()); |
| 17756 CHECK(GetPromise("q_")->HasHandler()); |
| 17757 CHECK_EQ(2, promise_reject_counter); |
| 17758 CHECK_EQ(1, promise_revoke_counter); |
| 17759 CHECK(GetPromise("rejected")->Equals(GetPromise("q2"))); |
| 17760 CHECK(GetPromise("revoked")->Equals(GetPromise("q_"))); |
| 17761 CHECK(RejectValue()->Equals(v8_str("qqq"))); |
| 17762 |
| 17763 // Add a reject handler to the resolved q1, which rejects by throwing. |
| 17764 CompileRun( |
| 17765 "var q3 = q1.then( \n" |
| 17766 " function() { \n" |
| 17767 " throw 'qqqq'; \n" |
| 17768 " } \n" |
| 17769 "); \n"); |
| 17770 CHECK(GetPromise("q0")->HasHandler()); |
| 17771 CHECK(GetPromise("q1")->HasHandler()); |
| 17772 CHECK(!GetPromise("q2")->HasHandler()); |
| 17773 CHECK(!GetPromise("q3")->HasHandler()); |
| 17774 CHECK_EQ(3, promise_reject_counter); |
| 17775 CHECK_EQ(1, promise_revoke_counter); |
| 17776 CHECK(GetPromise("rejected")->Equals(GetPromise("q3"))); |
| 17777 CHECK(RejectValue()->Equals(v8_str("qqqq"))); |
| 17778 |
| 17779 ResetPromiseStates(); |
| 17780 |
| 17781 // Create promise r0, which has three handlers, two of which handle rejects. |
| 17782 CompileRun( |
| 17783 "var r0 = new Promise( \n" |
| 17784 " function(res, rej) { \n" |
| 17785 " reject = rej; \n" |
| 17786 " } \n" |
| 17787 "); \n" |
| 17788 "var r1 = r0.catch(function() {}); \n" |
| 17789 "var r2 = r0.then(function() {}); \n" |
| 17790 "var r3 = r0.then(function() {}, \n" |
| 17791 " function() {}); \n"); |
| 17792 CHECK(GetPromise("r0")->HasHandler()); |
| 17793 CHECK(!GetPromise("r1")->HasHandler()); |
| 17794 CHECK(!GetPromise("r2")->HasHandler()); |
| 17795 CHECK(!GetPromise("r3")->HasHandler()); |
| 17796 CHECK_EQ(0, promise_reject_counter); |
| 17797 CHECK_EQ(0, promise_revoke_counter); |
| 17798 |
| 17799 // Reject r0. |
| 17800 CompileRun("reject('rrr')"); |
| 17801 CHECK(GetPromise("r0")->HasHandler()); |
| 17802 CHECK(!GetPromise("r1")->HasHandler()); |
| 17803 CHECK(!GetPromise("r2")->HasHandler()); |
| 17804 CHECK(!GetPromise("r3")->HasHandler()); |
| 17805 CHECK_EQ(1, promise_reject_counter); |
| 17806 CHECK_EQ(0, promise_revoke_counter); |
| 17807 CHECK(GetPromise("rejected")->Equals(GetPromise("r2"))); |
| 17808 CHECK(RejectValue()->Equals(v8_str("rrr"))); |
| 17809 |
| 17810 // Add reject handler to r2. |
| 17811 CompileRun("var r4 = r2.catch(function() {});"); |
| 17812 CHECK(GetPromise("r0")->HasHandler()); |
| 17813 CHECK(!GetPromise("r1")->HasHandler()); |
| 17814 CHECK(GetPromise("r2")->HasHandler()); |
| 17815 CHECK(!GetPromise("r3")->HasHandler()); |
| 17816 CHECK(!GetPromise("r4")->HasHandler()); |
| 17817 CHECK_EQ(1, promise_reject_counter); |
| 17818 CHECK_EQ(1, promise_revoke_counter); |
| 17819 CHECK(GetPromise("revoked")->Equals(GetPromise("r2"))); |
| 17820 CHECK(RejectValue()->Equals(v8_str("rrr"))); |
| 17821 |
| 17822 // Add reject handlers to r4. |
| 17823 CompileRun("var r5 = r4.then(function() {}, function() {});"); |
| 17824 CHECK(GetPromise("r0")->HasHandler()); |
| 17825 CHECK(!GetPromise("r1")->HasHandler()); |
| 17826 CHECK(GetPromise("r2")->HasHandler()); |
| 17827 CHECK(!GetPromise("r3")->HasHandler()); |
| 17828 CHECK(GetPromise("r4")->HasHandler()); |
| 17829 CHECK(!GetPromise("r5")->HasHandler()); |
| 17830 CHECK_EQ(1, promise_reject_counter); |
| 17831 CHECK_EQ(1, promise_revoke_counter); |
| 17832 |
| 17833 ResetPromiseStates(); |
| 17834 |
| 17835 // Create promise s0, which has three handlers, none of which handle rejects. |
| 17836 CompileRun( |
| 17837 "var s0 = new Promise( \n" |
| 17838 " function(res, rej) { \n" |
| 17839 " reject = rej; \n" |
| 17840 " } \n" |
| 17841 "); \n" |
| 17842 "var s1 = s0.then(function() {}); \n" |
| 17843 "var s2 = s0.then(function() {}); \n" |
| 17844 "var s3 = s0.then(function() {}); \n"); |
| 17845 CHECK(GetPromise("s0")->HasHandler()); |
| 17846 CHECK(!GetPromise("s1")->HasHandler()); |
| 17847 CHECK(!GetPromise("s2")->HasHandler()); |
| 17848 CHECK(!GetPromise("s3")->HasHandler()); |
| 17849 CHECK_EQ(0, promise_reject_counter); |
| 17850 CHECK_EQ(0, promise_revoke_counter); |
| 17851 |
| 17852 // Reject s0. |
| 17853 CompileRun("reject('sss')"); |
| 17854 CHECK(GetPromise("s0")->HasHandler()); |
| 17855 CHECK(!GetPromise("s1")->HasHandler()); |
| 17856 CHECK(!GetPromise("s2")->HasHandler()); |
| 17857 CHECK(!GetPromise("s3")->HasHandler()); |
| 17858 CHECK_EQ(3, promise_reject_counter); |
| 17859 CHECK_EQ(0, promise_revoke_counter); |
| 17860 CHECK(RejectValue()->Equals(v8_str("sss"))); |
| 17861 } |
| 17862 |
| 17863 |
17621 void AnalyzeStackOfEvalWithSourceURL( | 17864 void AnalyzeStackOfEvalWithSourceURL( |
17622 const v8::FunctionCallbackInfo<v8::Value>& args) { | 17865 const v8::FunctionCallbackInfo<v8::Value>& args) { |
17623 v8::HandleScope scope(args.GetIsolate()); | 17866 v8::HandleScope scope(args.GetIsolate()); |
17624 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( | 17867 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( |
17625 args.GetIsolate(), 10, v8::StackTrace::kDetailed); | 17868 args.GetIsolate(), 10, v8::StackTrace::kDetailed); |
17626 CHECK_EQ(5, stackTrace->GetFrameCount()); | 17869 CHECK_EQ(5, stackTrace->GetFrameCount()); |
17627 v8::Handle<v8::String> url = v8_str("eval_url"); | 17870 v8::Handle<v8::String> url = v8_str("eval_url"); |
17628 for (int i = 0; i < 3; i++) { | 17871 for (int i = 0; i < 3; i++) { |
17629 v8::Handle<v8::String> name = | 17872 v8::Handle<v8::String> name = |
17630 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); | 17873 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); |
(...skipping 5815 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
23446 " var foobXXXXX"; // Too many bytes which look like incomplete chars! | 23689 " var foobXXXXX"; // Too many bytes which look like incomplete chars! |
23447 char chunk2[] = | 23690 char chunk2[] = |
23448 "r = 13;\n" | 23691 "r = 13;\n" |
23449 " return foob\xeb\x91\x80\x80\x80r;\n" | 23692 " return foob\xeb\x91\x80\x80\x80r;\n" |
23450 "}\n"; | 23693 "}\n"; |
23451 for (int i = 0; i < 5; ++i) chunk1[strlen(chunk1) - 5 + i] = reference[i]; | 23694 for (int i = 0; i < 5; ++i) chunk1[strlen(chunk1) - 5 + i] = reference[i]; |
23452 | 23695 |
23453 const char* chunks[] = {chunk1, chunk2, "foo();", NULL}; | 23696 const char* chunks[] = {chunk1, chunk2, "foo();", NULL}; |
23454 RunStreamingTest(chunks, v8::ScriptCompiler::StreamedSource::UTF8, false); | 23697 RunStreamingTest(chunks, v8::ScriptCompiler::StreamedSource::UTF8, false); |
23455 } | 23698 } |
OLD | NEW |