Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(20)

Side by Side Diff: test/cctest/test-api.cc

Issue 600723005: Introduce PromiseRejectCallback. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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 }
OLDNEW
« include/v8.h ('K') | « src/runtime/runtime.cc ('k') | test/cctest/test-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698