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

Side by Side Diff: Source/bindings/v8/custom/V8PromiseCustom.cpp

Issue 194713006: Throw empty error from V8PromiseCustom (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 9 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
46 #include "core/frame/UseCounter.h" 46 #include "core/frame/UseCounter.h"
47 #include "core/inspector/InspectorInstrumentation.h" 47 #include "core/inspector/InspectorInstrumentation.h"
48 #include "core/workers/WorkerGlobalScope.h" 48 #include "core/workers/WorkerGlobalScope.h"
49 #include "platform/Task.h" 49 #include "platform/Task.h"
50 #include "wtf/Deque.h" 50 #include "wtf/Deque.h"
51 #include "wtf/Functional.h" 51 #include "wtf/Functional.h"
52 #include "wtf/Noncopyable.h" 52 #include "wtf/Noncopyable.h"
53 #include "wtf/PassOwnPtr.h" 53 #include "wtf/PassOwnPtr.h"
54 #include <v8.h> 54 #include <v8.h>
55 55
56 #define V8TRYCATCH_VOID_EMPTY(type, var, value) \
57 type var; \
58 { \
59 v8::TryCatch block; \
60 var = (value); \
61 if (UNLIKELY(block.HasCaught())) { \
62 return; \
63 } \
64 }
65
56 namespace WebCore { 66 namespace WebCore {
57 67
58 namespace { 68 namespace {
59 69
60 v8::Local<v8::ObjectTemplate> cachedObjectTemplate(void* domTemplateKey, int int ernalFieldCount, v8::Isolate* isolate) 70 v8::Local<v8::ObjectTemplate> cachedObjectTemplate(void* domTemplateKey, int int ernalFieldCount, v8::Isolate* isolate)
61 { 71 {
62 V8PerIsolateData* data = V8PerIsolateData::from(isolate); 72 V8PerIsolateData* data = V8PerIsolateData::from(isolate);
63 WrapperWorldType currentWorldType = worldType(isolate); 73 WrapperWorldType currentWorldType = worldType(isolate);
64 v8::Handle<v8::FunctionTemplate> functionDescriptor = data->existingDOMTempl ate(currentWorldType, domTemplateKey); 74 v8::Handle<v8::FunctionTemplate> functionDescriptor = data->existingDOMTempl ate(currentWorldType, domTemplateKey);
65 if (!functionDescriptor.IsEmpty()) 75 if (!functionDescriptor.IsEmpty())
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 { 499 {
490 v8SetReturnValue(info, v8::Local<v8::Value>()); 500 v8SetReturnValue(info, v8::Local<v8::Value>());
491 v8::Isolate* isolate = info.GetIsolate(); 501 v8::Isolate* isolate = info.GetIsolate();
492 ExecutionContext* executionContext = callingExecutionContext(isolate); 502 ExecutionContext* executionContext = callingExecutionContext(isolate);
493 UseCounter::count(executionContext, UseCounter::PromiseConstructor); 503 UseCounter::count(executionContext, UseCounter::PromiseConstructor);
494 if (!info.Length() || !info[0]->IsFunction()) { 504 if (!info.Length() || !info[0]->IsFunction()) {
495 throwTypeError("Promise constructor takes a function argument", isolate) ; 505 throwTypeError("Promise constructor takes a function argument", isolate) ;
496 return; 506 return;
497 } 507 }
498 v8::Local<v8::Function> init = info[0].As<v8::Function>(); 508 v8::Local<v8::Function> init = info[0].As<v8::Function>();
499 V8TRYCATCH_VOID(v8::Local<v8::Object>, promise, V8PromiseCustom::createPromi se(info.Holder(), isolate)); 509 V8TRYCATCH_VOID_EMPTY(v8::Local<v8::Object>, promise, V8PromiseCustom::creat ePromise(info.Holder(), isolate));
500 V8TRYCATCH_VOID(v8::Handle<v8::Value>, resolve, createClosure(promiseResolve Callback, promise, isolate)); 510 V8TRYCATCH_VOID_EMPTY(v8::Handle<v8::Value>, resolve, createClosure(promiseR esolveCallback, promise, isolate));
501 V8TRYCATCH_VOID(v8::Handle<v8::Value>, reject, createClosure(promiseRejectCa llback, promise, isolate)); 511 V8TRYCATCH_VOID_EMPTY(v8::Handle<v8::Value>, reject, createClosure(promiseRe jectCallback, promise, isolate));
502 v8::Handle<v8::Value> argv[] = { resolve, reject }; 512 v8::Handle<v8::Value> argv[] = { resolve, reject };
503 v8::TryCatch trycatch; 513 v8::TryCatch trycatch;
504 if (V8ScriptRunner::callFunction(init, currentExecutionContext(isolate), v8: :Undefined(isolate), WTF_ARRAY_LENGTH(argv), argv, isolate).IsEmpty()) { 514 if (V8ScriptRunner::callFunction(init, currentExecutionContext(isolate), v8: :Undefined(isolate), WTF_ARRAY_LENGTH(argv), argv, isolate).IsEmpty()) {
505 // An exception is thrown. Reject the promise if its resolved flag is un set. 515 // An exception is thrown. Reject the promise if its resolved flag is un set.
506 V8PromiseCustom::reject(promise, trycatch.Exception(), isolate); 516 V8PromiseCustom::reject(promise, trycatch.Exception(), isolate);
507 } 517 }
508 v8SetReturnValue(info, promise); 518 v8SetReturnValue(info, promise);
509 return; 519 return;
510 } 520 }
511 521
512 void V8Promise::thenMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info ) 522 void V8Promise::thenMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info )
513 { 523 {
514 v8::Isolate* isolate = info.GetIsolate(); 524 v8::Isolate* isolate = info.GetIsolate();
515 v8::Local<v8::Function> onFulfilled, onRejected; 525 v8::Local<v8::Function> onFulfilled, onRejected;
516 if (info.Length() > 0 && info[0]->IsFunction()) 526 if (info.Length() > 0 && info[0]->IsFunction())
517 onFulfilled = info[0].As<v8::Function>(); 527 onFulfilled = info[0].As<v8::Function>();
518 if (info.Length() > 1 && info[1]->IsFunction()) 528 if (info.Length() > 1 && info[1]->IsFunction())
519 onRejected = info[1].As<v8::Function>(); 529 onRejected = info[1].As<v8::Function>();
520 V8TRYCATCH_VOID(v8::Local<v8::Value>, newPromise, V8PromiseCustom::then(info .Holder(), onFulfilled, onRejected, isolate)); 530 V8TRYCATCH_VOID_EMPTY(v8::Local<v8::Value>, newPromise, V8PromiseCustom::the n(info.Holder(), onFulfilled, onRejected, isolate));
521 v8SetReturnValue(info, newPromise); 531 v8SetReturnValue(info, newPromise);
522 } 532 }
523 533
524 void V8Promise::castMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info ) 534 void V8Promise::castMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info )
525 { 535 {
526 v8::Isolate* isolate = info.GetIsolate(); 536 v8::Isolate* isolate = info.GetIsolate();
527 ExecutionContext* executionContext = callingExecutionContext(isolate); 537 ExecutionContext* executionContext = callingExecutionContext(isolate);
528 UseCounter::count(executionContext, UseCounter::PromiseCast); 538 UseCounter::count(executionContext, UseCounter::PromiseCast);
529 v8::Local<v8::Value> result = v8::Undefined(isolate); 539 v8::Local<v8::Value> result = v8::Undefined(isolate);
530 if (info.Length() > 0) 540 if (info.Length() > 0)
531 result = info[0]; 541 result = info[0];
532 542
533 V8TRYCATCH_VOID(v8::Local<v8::Value>, cast, V8PromiseCustom::toPromise(resul t, isolate)); 543 V8TRYCATCH_VOID_EMPTY(v8::Local<v8::Value>, cast, V8PromiseCustom::toPromise (result, isolate));
534 v8SetReturnValue(info, cast); 544 v8SetReturnValue(info, cast);
535 } 545 }
536 546
537 void V8Promise::catchMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& inf o) 547 void V8Promise::catchMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& inf o)
538 { 548 {
539 v8::Isolate* isolate = info.GetIsolate(); 549 v8::Isolate* isolate = info.GetIsolate();
540 v8::Local<v8::Function> onFulfilled, onRejected; 550 v8::Local<v8::Function> onFulfilled, onRejected;
541 551
542 if (info.Length() > 0 && !info[0]->IsUndefined()) { 552 if (info.Length() > 0 && !info[0]->IsUndefined()) {
543 if (!info[0]->IsFunction()) { 553 if (!info[0]->IsFunction()) {
544 v8SetReturnValue(info, throwTypeError("onRejected must be a function or undefined", isolate)); 554 v8SetReturnValue(info, throwTypeError("onRejected must be a function or undefined", isolate));
545 return; 555 return;
546 } 556 }
547 onRejected = info[0].As<v8::Function>(); 557 onRejected = info[0].As<v8::Function>();
548 } 558 }
549 V8TRYCATCH_VOID(v8::Local<v8::Value>, newPromise, V8PromiseCustom::then(info .Holder(), onFulfilled, onRejected, isolate)); 559 V8TRYCATCH_VOID_EMPTY(v8::Local<v8::Value>, newPromise, V8PromiseCustom::the n(info.Holder(), onFulfilled, onRejected, isolate));
550 v8SetReturnValue(info, newPromise); 560 v8SetReturnValue(info, newPromise);
551 } 561 }
552 562
553 void V8Promise::resolveMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& i nfo) 563 void V8Promise::resolveMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& i nfo)
554 { 564 {
555 v8::Isolate* isolate = info.GetIsolate(); 565 v8::Isolate* isolate = info.GetIsolate();
556 ExecutionContext* executionContext = callingExecutionContext(isolate); 566 ExecutionContext* executionContext = callingExecutionContext(isolate);
557 UseCounter::count(executionContext, UseCounter::PromiseResolve); 567 UseCounter::count(executionContext, UseCounter::PromiseResolve);
558 v8::Local<v8::Value> result = v8::Undefined(isolate); 568 v8::Local<v8::Value> result = v8::Undefined(isolate);
559 if (info.Length() > 0) 569 if (info.Length() > 0)
560 result = info[0]; 570 result = info[0];
561 571
562 V8TRYCATCH_VOID(v8::Local<v8::Object>, promise, V8PromiseCustom::createPromi se(info.Holder(), isolate)); 572 V8TRYCATCH_VOID_EMPTY(v8::Local<v8::Object>, promise, V8PromiseCustom::creat ePromise(info.Holder(), isolate));
563 V8PromiseCustom::resolve(promise, result, isolate); 573 V8PromiseCustom::resolve(promise, result, isolate);
564 v8SetReturnValue(info, promise); 574 v8SetReturnValue(info, promise);
565 } 575 }
566 576
567 void V8Promise::rejectMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& in fo) 577 void V8Promise::rejectMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& in fo)
568 { 578 {
569 v8::Isolate* isolate = info.GetIsolate(); 579 v8::Isolate* isolate = info.GetIsolate();
570 ExecutionContext* executionContext = callingExecutionContext(isolate); 580 ExecutionContext* executionContext = callingExecutionContext(isolate);
571 UseCounter::count(executionContext, UseCounter::PromiseReject); 581 UseCounter::count(executionContext, UseCounter::PromiseReject);
572 v8::Local<v8::Value> result = v8::Undefined(isolate); 582 v8::Local<v8::Value> result = v8::Undefined(isolate);
573 if (info.Length() > 0) 583 if (info.Length() > 0)
574 result = info[0]; 584 result = info[0];
575 585
576 V8TRYCATCH_VOID(v8::Local<v8::Object>, promise, V8PromiseCustom::createPromi se(info.Holder(), isolate)); 586 V8TRYCATCH_VOID_EMPTY(v8::Local<v8::Object>, promise, V8PromiseCustom::creat ePromise(info.Holder(), isolate));
577 V8PromiseCustom::reject(promise, result, isolate); 587 V8PromiseCustom::reject(promise, result, isolate);
578 v8SetReturnValue(info, promise); 588 v8SetReturnValue(info, promise);
579 } 589 }
580 590
581 void V8Promise::raceMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info ) 591 void V8Promise::raceMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info )
582 { 592 {
583 v8::Isolate* isolate = info.GetIsolate(); 593 v8::Isolate* isolate = info.GetIsolate();
584 V8TRYCATCH_VOID(v8::Local<v8::Object>, promise, V8PromiseCustom::createPromi se(info.Holder(), isolate)); 594 V8TRYCATCH_VOID_EMPTY(v8::Local<v8::Object>, promise, V8PromiseCustom::creat ePromise(info.Holder(), isolate));
585 595
586 if (!info.Length() || !info[0]->IsArray()) { 596 if (!info.Length() || !info[0]->IsArray()) {
587 v8SetReturnValue(info, promise); 597 v8SetReturnValue(info, promise);
588 return; 598 return;
589 } 599 }
590 600
591 // FIXME: Now we limit the iterable type to the Array type. 601 // FIXME: Now we limit the iterable type to the Array type.
592 v8::Local<v8::Array> iterable = info[0].As<v8::Array>(); 602 v8::Local<v8::Array> iterable = info[0].As<v8::Array>();
593 V8TRYCATCH_VOID(v8::Local<v8::Function>, onFulfilled, createClosure(promiseR esolveCallback, promise, isolate)); 603 V8TRYCATCH_VOID_EMPTY(v8::Local<v8::Function>, onFulfilled, createClosure(pr omiseResolveCallback, promise, isolate));
594 V8TRYCATCH_VOID(v8::Local<v8::Function>, onRejected, createClosure(promiseRe jectCallback, promise, isolate)); 604 V8TRYCATCH_VOID_EMPTY(v8::Local<v8::Function>, onRejected, createClosure(pro miseRejectCallback, promise, isolate));
595 605
596 for (unsigned i = 0, length = iterable->Length(); i < length; ++i) { 606 for (unsigned i = 0, length = iterable->Length(); i < length; ++i) {
597 // Array-holes should not be skipped by for-of iteration semantics. 607 // Array-holes should not be skipped by for-of iteration semantics.
598 V8TRYCATCH_VOID(v8::Local<v8::Value>, nextValue, iterable->Get(i)); 608 V8TRYCATCH_VOID_EMPTY(v8::Local<v8::Value>, nextValue, iterable->Get(i)) ;
599 V8TRYCATCH_VOID(v8::Local<v8::Object>, nextPromise, V8PromiseCustom::toP romise(nextValue, isolate)); 609 V8TRYCATCH_VOID_EMPTY(v8::Local<v8::Object>, nextPromise, V8PromiseCusto m::toPromise(nextValue, isolate));
600 V8TRYCATCH_VOID(v8::Local<v8::Value>, unused, V8PromiseCustom::then(next Promise, onFulfilled, onRejected, isolate)); 610 V8TRYCATCH_VOID_EMPTY(v8::Local<v8::Value>, unused, V8PromiseCustom::the n(nextPromise, onFulfilled, onRejected, isolate));
601 } 611 }
602 v8SetReturnValue(info, promise); 612 v8SetReturnValue(info, promise);
603 } 613 }
604 614
605 void V8Promise::allMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info) 615 void V8Promise::allMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info)
606 { 616 {
607 v8::Isolate* isolate = info.GetIsolate(); 617 v8::Isolate* isolate = info.GetIsolate();
608 V8TRYCATCH_VOID(v8::Local<v8::Object>, promise, V8PromiseCustom::createPromi se(info.Holder(), isolate)); 618 V8TRYCATCH_VOID_EMPTY(v8::Local<v8::Object>, promise, V8PromiseCustom::creat ePromise(info.Holder(), isolate));
609 v8::Local<v8::Array> results = v8::Array::New(info.GetIsolate()); 619 v8::Local<v8::Array> results = v8::Array::New(info.GetIsolate());
610 620
611 if (!info.Length() || !info[0]->IsArray()) { 621 if (!info.Length() || !info[0]->IsArray()) {
612 V8PromiseCustom::resolve(promise, results, isolate); 622 V8PromiseCustom::resolve(promise, results, isolate);
613 v8SetReturnValue(info, promise); 623 v8SetReturnValue(info, promise);
614 return; 624 return;
615 } 625 }
616 626
617 // FIXME: Now we limit the iterable type to the Array type. 627 // FIXME: Now we limit the iterable type to the Array type.
618 v8::Local<v8::Array> iterable = info[0].As<v8::Array>(); 628 v8::Local<v8::Array> iterable = info[0].As<v8::Array>();
619 629
620 if (!iterable->Length()) { 630 if (!iterable->Length()) {
621 V8PromiseCustom::resolve(promise, results, isolate); 631 V8PromiseCustom::resolve(promise, results, isolate);
622 v8SetReturnValue(info, promise); 632 v8SetReturnValue(info, promise);
623 return; 633 return;
624 } 634 }
625 635
626 v8::Local<v8::ObjectTemplate> objectTemplate = primitiveWrapperObjectTemplat e(isolate); 636 v8::Local<v8::ObjectTemplate> objectTemplate = primitiveWrapperObjectTemplat e(isolate);
627 V8TRYCATCH_VOID(v8::Local<v8::Object>, countdownWrapper, objectTemplate->New Instance()); 637 V8TRYCATCH_VOID_EMPTY(v8::Local<v8::Object>, countdownWrapper, objectTemplat e->NewInstance());
628 countdownWrapper->SetInternalField(V8PromiseCustom::PrimitiveWrapperPrimitiv eIndex, v8::Integer::New(isolate, iterable->Length())); 638 countdownWrapper->SetInternalField(V8PromiseCustom::PrimitiveWrapperPrimitiv eIndex, v8::Integer::New(isolate, iterable->Length()));
629 639
630 V8TRYCATCH_VOID(v8::Local<v8::Function>, onRejected, createClosure(promiseRe jectCallback, promise, isolate)); 640 V8TRYCATCH_VOID_EMPTY(v8::Local<v8::Function>, onRejected, createClosure(pro miseRejectCallback, promise, isolate));
631 for (unsigned i = 0, length = iterable->Length(); i < length; ++i) { 641 for (unsigned i = 0, length = iterable->Length(); i < length; ++i) {
632 // Array-holes should not be skipped by for-of iteration semantics. 642 // Array-holes should not be skipped by for-of iteration semantics.
633 V8TRYCATCH_VOID(v8::Local<v8::Object>, environment, promiseAllEnvironmen t(promise, countdownWrapper, i, results, isolate)); 643 V8TRYCATCH_VOID_EMPTY(v8::Local<v8::Object>, environment, promiseAllEnvi ronment(promise, countdownWrapper, i, results, isolate));
634 V8TRYCATCH_VOID(v8::Local<v8::Function>, onFulfilled, createClosure(prom iseAllFulfillCallback, environment, isolate)); 644 V8TRYCATCH_VOID_EMPTY(v8::Local<v8::Function>, onFulfilled, createClosur e(promiseAllFulfillCallback, environment, isolate));
635 V8TRYCATCH_VOID(v8::Local<v8::Value>, nextValue, iterable->Get(i)); 645 V8TRYCATCH_VOID_EMPTY(v8::Local<v8::Value>, nextValue, iterable->Get(i)) ;
636 V8TRYCATCH_VOID(v8::Local<v8::Object>, nextPromise, V8PromiseCustom::toP romise(nextValue, isolate)); 646 V8TRYCATCH_VOID_EMPTY(v8::Local<v8::Object>, nextPromise, V8PromiseCusto m::toPromise(nextValue, isolate));
637 V8TRYCATCH_VOID(v8::Local<v8::Value>, unused, V8PromiseCustom::then(next Promise, onFulfilled, onRejected, isolate)); 647 V8TRYCATCH_VOID_EMPTY(v8::Local<v8::Value>, unused, V8PromiseCustom::the n(nextPromise, onFulfilled, onRejected, isolate));
638 } 648 }
639 v8SetReturnValue(info, promise); 649 v8SetReturnValue(info, promise);
640 } 650 }
641 651
642 // 652 //
643 // -- V8PromiseCustom -- 653 // -- V8PromiseCustom --
644 v8::Local<v8::Object> V8PromiseCustom::createPromise(v8::Handle<v8::Object> crea tionContext, v8::Isolate* isolate) 654 v8::Local<v8::Object> V8PromiseCustom::createPromise(v8::Handle<v8::Object> crea tionContext, v8::Isolate* isolate)
645 { 655 {
646 v8::Local<v8::ObjectTemplate> internalTemplate = internalObjectTemplate(isol ate); 656 v8::Local<v8::ObjectTemplate> internalTemplate = internalObjectTemplate(isol ate);
647 v8::Local<v8::Object> internal = internalTemplate->NewInstance(); 657 v8::Local<v8::Object> internal = internalTemplate->NewInstance();
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
832 842
833 void V8PromiseCustom::callHandler(v8::Handle<v8::Object> promise, v8::Handle<v8: :Function> handler, v8::Handle<v8::Value> argument, PromiseState originatorState , v8::Isolate* isolate) 843 void V8PromiseCustom::callHandler(v8::Handle<v8::Object> promise, v8::Handle<v8: :Function> handler, v8::Handle<v8::Value> argument, PromiseState originatorState , v8::Isolate* isolate)
834 { 844 {
835 ASSERT(originatorState == Fulfilled || originatorState == Rejected); 845 ASSERT(originatorState == Fulfilled || originatorState == Rejected);
836 ExecutionContext* executionContext = currentExecutionContext(isolate); 846 ExecutionContext* executionContext = currentExecutionContext(isolate);
837 ASSERT(executionContext && executionContext->isContextThread()); 847 ASSERT(executionContext && executionContext->isContextThread());
838 executionContext->postTask(adoptPtr(new CallHandlerTask(promise, handler, ar gument, originatorState, isolate, executionContext))); 848 executionContext->postTask(adoptPtr(new CallHandlerTask(promise, handler, ar gument, originatorState, isolate, executionContext)));
839 } 849 }
840 850
841 } // namespace WebCore 851 } // namespace WebCore
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698