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

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")->HasRejectHandler());
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")->HasRejectHandler());
17683 CHECK(!GetPromise("p1")->HasRejectHandler());
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")->HasRejectHandler());
17690 CHECK(!GetPromise("p1")->HasRejectHandler());
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")->HasRejectHandler());
17700 CHECK(!GetPromise("p1")->HasRejectHandler());
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")->HasRejectHandler());
17707 CHECK(GetPromise("p1")->HasRejectHandler());
17708 CHECK(!GetPromise("p2")->HasRejectHandler());
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")->HasRejectHandler());
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")->HasRejectHandler());
17731 CHECK(!GetPromise("q1")->HasRejectHandler());
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")->HasRejectHandler());
17738 CHECK(!GetPromise("q1")->HasRejectHandler());
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 CompileRun(
17744 "var q2 = q0.catch( \n"
17745 " function() { \n"
17746 " return Promise.reject('qqq'); \n"
17747 " } \n"
17748 "); \n");
17749 CHECK(GetPromise("q0")->HasRejectHandler());
17750 CHECK(!GetPromise("q1")->HasRejectHandler());
17751 CHECK(!GetPromise("q2")->HasRejectHandler());
17752 CHECK_EQ(1, promise_reject_counter);
17753 CHECK_EQ(0, promise_revoke_counter);
17754 CHECK(GetPromise("rejected")->Equals(GetPromise("q2")));
17755 CHECK(RejectValue()->Equals(v8_str("qqq")));
17756
17757 // Add a reject handler to the resolved q1, which rejects by throwing.
17758 CompileRun(
17759 "var q3 = q1.then( \n"
17760 " function() { \n"
17761 " throw 'qqqq'; \n"
17762 " } \n"
17763 "); \n");
17764 CHECK(GetPromise("q0")->HasRejectHandler());
17765 CHECK(GetPromise("q1")->HasRejectHandler());
17766 CHECK(!GetPromise("q2")->HasRejectHandler());
17767 CHECK(!GetPromise("q3")->HasRejectHandler());
17768 CHECK_EQ(2, promise_reject_counter);
17769 CHECK_EQ(0, promise_revoke_counter);
17770 CHECK(GetPromise("rejected")->Equals(GetPromise("q3")));
17771 CHECK(RejectValue()->Equals(v8_str("qqqq")));
17772
17773 ResetPromiseStates();
17774
17775 // Create promise r0, which has three handlers, two of which handle rejects.
17776 CompileRun(
17777 "var r0 = new Promise( \n"
17778 " function(res, rej) { \n"
17779 " reject = rej; \n"
17780 " } \n"
17781 "); \n"
17782 "var r1 = r0.catch(function() {}); \n"
17783 "var r2 = r0.then(function() {}); \n"
17784 "var r3 = r0.then(function() {}, \n"
17785 " function() {}); \n");
17786 CHECK(GetPromise("r0")->HasRejectHandler());
17787 CHECK(!GetPromise("r1")->HasRejectHandler());
17788 CHECK(!GetPromise("r2")->HasRejectHandler());
17789 CHECK(!GetPromise("r3")->HasRejectHandler());
17790 CHECK_EQ(0, promise_reject_counter);
17791 CHECK_EQ(0, promise_revoke_counter);
17792
17793 // Reject r0.
17794 CompileRun("reject('rrr')");
17795 CHECK(GetPromise("r0")->HasRejectHandler());
17796 CHECK(!GetPromise("r1")->HasRejectHandler());
17797 CHECK(!GetPromise("r2")->HasRejectHandler());
17798 CHECK(!GetPromise("r3")->HasRejectHandler());
17799 CHECK_EQ(1, promise_reject_counter);
17800 CHECK_EQ(0, promise_revoke_counter);
17801 CHECK(GetPromise("rejected")->Equals(GetPromise("r2")));
17802 CHECK(RejectValue()->Equals(v8_str("rrr")));
17803
17804 // Add reject handler to r2.
17805 CompileRun("var r4 = r2.catch(function() {});");
17806 CHECK(GetPromise("r0")->HasRejectHandler());
17807 CHECK(!GetPromise("r1")->HasRejectHandler());
17808 CHECK(GetPromise("r2")->HasRejectHandler());
17809 CHECK(!GetPromise("r3")->HasRejectHandler());
17810 CHECK(!GetPromise("r4")->HasRejectHandler());
17811 CHECK_EQ(1, promise_reject_counter);
17812 CHECK_EQ(1, promise_revoke_counter);
17813 CHECK(GetPromise("revoked")->Equals(GetPromise("r2")));
17814 CHECK(RejectValue()->Equals(v8_str("rrr")));
17815
17816 // Add reject handlers to r4.
17817 CompileRun("var r5 = r4.then(function() {}, function() {});");
17818 CHECK(GetPromise("r0")->HasRejectHandler());
17819 CHECK(!GetPromise("r1")->HasRejectHandler());
17820 CHECK(GetPromise("r2")->HasRejectHandler());
17821 CHECK(!GetPromise("r3")->HasRejectHandler());
17822 CHECK(GetPromise("r4")->HasRejectHandler());
17823 CHECK(!GetPromise("r5")->HasRejectHandler());
17824 CHECK_EQ(1, promise_reject_counter);
17825 CHECK_EQ(1, promise_revoke_counter);
17826
17827 ResetPromiseStates();
17828
17829 // Create promise s0, which has three handlers, none of which handle rejects.
17830 CompileRun(
17831 "var s0 = new Promise( \n"
17832 " function(res, rej) { \n"
17833 " reject = rej; \n"
17834 " } \n"
17835 "); \n"
17836 "var s1 = s0.then(function() {}); \n"
17837 "var s2 = s0.then(function() {}); \n"
17838 "var s3 = s0.then(function() {}); \n");
17839 CHECK(GetPromise("s0")->HasRejectHandler());
17840 CHECK(!GetPromise("s1")->HasRejectHandler());
17841 CHECK(!GetPromise("s2")->HasRejectHandler());
17842 CHECK(!GetPromise("s3")->HasRejectHandler());
17843 CHECK_EQ(0, promise_reject_counter);
17844 CHECK_EQ(0, promise_revoke_counter);
17845
17846 // Reject s0.
17847 CompileRun("reject('sss')");
17848 CHECK(GetPromise("s0")->HasRejectHandler());
17849 CHECK(!GetPromise("s1")->HasRejectHandler());
17850 CHECK(!GetPromise("s2")->HasRejectHandler());
17851 CHECK(!GetPromise("s3")->HasRejectHandler());
17852 CHECK_EQ(3, promise_reject_counter);
17853 CHECK_EQ(0, promise_revoke_counter);
17854 CHECK(RejectValue()->Equals(v8_str("sss")));
17855 }
17856
17857
17621 void AnalyzeStackOfEvalWithSourceURL( 17858 void AnalyzeStackOfEvalWithSourceURL(
17622 const v8::FunctionCallbackInfo<v8::Value>& args) { 17859 const v8::FunctionCallbackInfo<v8::Value>& args) {
17623 v8::HandleScope scope(args.GetIsolate()); 17860 v8::HandleScope scope(args.GetIsolate());
17624 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( 17861 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(
17625 args.GetIsolate(), 10, v8::StackTrace::kDetailed); 17862 args.GetIsolate(), 10, v8::StackTrace::kDetailed);
17626 CHECK_EQ(5, stackTrace->GetFrameCount()); 17863 CHECK_EQ(5, stackTrace->GetFrameCount());
17627 v8::Handle<v8::String> url = v8_str("eval_url"); 17864 v8::Handle<v8::String> url = v8_str("eval_url");
17628 for (int i = 0; i < 3; i++) { 17865 for (int i = 0; i < 3; i++) {
17629 v8::Handle<v8::String> name = 17866 v8::Handle<v8::String> name =
17630 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); 17867 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! 23683 " var foobXXXXX"; // Too many bytes which look like incomplete chars!
23447 char chunk2[] = 23684 char chunk2[] =
23448 "r = 13;\n" 23685 "r = 13;\n"
23449 " return foob\xeb\x91\x80\x80\x80r;\n" 23686 " return foob\xeb\x91\x80\x80\x80r;\n"
23450 "}\n"; 23687 "}\n";
23451 for (int i = 0; i < 5; ++i) chunk1[strlen(chunk1) - 5 + i] = reference[i]; 23688 for (int i = 0; i < 5; ++i) chunk1[strlen(chunk1) - 5 + i] = reference[i];
23452 23689
23453 const char* chunks[] = {chunk1, chunk2, "foo();", NULL}; 23690 const char* chunks[] = {chunk1, chunk2, "foo();", NULL};
23454 RunStreamingTest(chunks, v8::ScriptCompiler::StreamedSource::UTF8, false); 23691 RunStreamingTest(chunks, v8::ScriptCompiler::StreamedSource::UTF8, false);
23455 } 23692 }
OLDNEW
« src/promise.js ('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