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

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

Issue 177773002: Support Promises instrumentation on backend. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fix style 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 | Source/core/core.gyp » ('j') | Source/core/inspector/InspectorDebuggerAgent.h » ('J')
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 27 matching lines...) Expand all
38 #include "bindings/v8/ScriptFunctionCall.h" 38 #include "bindings/v8/ScriptFunctionCall.h"
39 #include "bindings/v8/ScriptState.h" 39 #include "bindings/v8/ScriptState.h"
40 #include "bindings/v8/V8Binding.h" 40 #include "bindings/v8/V8Binding.h"
41 #include "bindings/v8/V8PerIsolateData.h" 41 #include "bindings/v8/V8PerIsolateData.h"
42 #include "bindings/v8/V8ScriptRunner.h" 42 #include "bindings/v8/V8ScriptRunner.h"
43 #include "bindings/v8/WrapperTypeInfo.h" 43 #include "bindings/v8/WrapperTypeInfo.h"
44 #include "core/dom/Document.h" 44 #include "core/dom/Document.h"
45 #include "core/dom/ExecutionContextTask.h" 45 #include "core/dom/ExecutionContextTask.h"
46 #include "core/frame/DOMWindow.h" 46 #include "core/frame/DOMWindow.h"
47 #include "core/frame/UseCounter.h" 47 #include "core/frame/UseCounter.h"
48 #include "core/inspector/InspectorInstrumentation.h" 48 #include "core/inspector/InspectorPromiseInstrumentation.h"
49 #include "core/workers/WorkerGlobalScope.h" 49 #include "core/workers/WorkerGlobalScope.h"
50 #include "platform/Task.h" 50 #include "platform/Task.h"
51 #include "wtf/Deque.h" 51 #include "wtf/Deque.h"
52 #include "wtf/Functional.h" 52 #include "wtf/Functional.h"
53 #include "wtf/Noncopyable.h" 53 #include "wtf/Noncopyable.h"
54 #include "wtf/PassOwnPtr.h" 54 #include "wtf/PassOwnPtr.h"
55 55
56 namespace WebCore { 56 namespace WebCore {
57 57
58 namespace { 58 namespace {
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after
378 { 378 {
379 while (!m_derivedStack.isEmpty()) { 379 while (!m_derivedStack.isEmpty()) {
380 v8::HandleScope handleScope(isolate); 380 v8::HandleScope handleScope(isolate);
381 OwnPtr<Derived> derived = m_derivedStack.takeLast(); 381 OwnPtr<Derived> derived = m_derivedStack.takeLast();
382 updateDerived(derived->promise(isolate), derived->onFulfilled(isolate), derived->onRejected(isolate), derived->originator(isolate), isolate); 382 updateDerived(derived->promise(isolate), derived->onFulfilled(isolate), derived->onRejected(isolate), derived->originator(isolate), isolate);
383 } 383 }
384 } 384 }
385 385
386 void PromisePropagator::setValue(v8::Handle<v8::Object> promise, v8::Handle<v8:: Value> value, v8::Isolate* isolate) 386 void PromisePropagator::setValue(v8::Handle<v8::Object> promise, v8::Handle<v8:: Value> value, v8::Isolate* isolate)
387 { 387 {
388 v8::Local<v8::Object> internal = V8PromiseCustom::getInternal(promise); 388 v8::Local<v8::Object> internal = V8PromiseCustom::getInternal(promise);
aandrey 2014/02/28 16:08:13 move inside ASSERT: ASSERT(V8PromiseCustom::getSt
Alexandra Mikhaylova 2014/03/03 14:04:25 Done.
389 ASSERT(V8PromiseCustom::getState(internal) != V8PromiseCustom::Fulfilled && V8PromiseCustom::getState(internal) != V8PromiseCustom::Rejected); 389 ASSERT(V8PromiseCustom::getState(internal) != V8PromiseCustom::Fulfilled && V8PromiseCustom::getState(internal) != V8PromiseCustom::Rejected);
390 V8PromiseCustom::setState(internal, V8PromiseCustom::Fulfilled, value, isola te); 390 V8PromiseCustom::setState(promise, V8PromiseCustom::Fulfilled, value, isolat e);
391 propagateToDerived(promise, isolate); 391 propagateToDerived(promise, isolate);
392 } 392 }
393 393
394 void PromisePropagator::setReason(v8::Handle<v8::Object> promise, v8::Handle<v8: :Value> reason, v8::Isolate* isolate) 394 void PromisePropagator::setReason(v8::Handle<v8::Object> promise, v8::Handle<v8: :Value> reason, v8::Isolate* isolate)
395 { 395 {
396 v8::Local<v8::Object> internal = V8PromiseCustom::getInternal(promise); 396 v8::Local<v8::Object> internal = V8PromiseCustom::getInternal(promise);
aandrey 2014/02/28 16:08:13 ditto
Alexandra Mikhaylova 2014/03/03 14:04:25 Done.
397 ASSERT(V8PromiseCustom::getState(internal) != V8PromiseCustom::Fulfilled && V8PromiseCustom::getState(internal) != V8PromiseCustom::Rejected); 397 ASSERT(V8PromiseCustom::getState(internal) != V8PromiseCustom::Fulfilled && V8PromiseCustom::getState(internal) != V8PromiseCustom::Rejected);
398 V8PromiseCustom::setState(internal, V8PromiseCustom::Rejected, reason, isola te); 398 V8PromiseCustom::setState(promise, V8PromiseCustom::Rejected, reason, isolat e);
399 propagateToDerived(promise, isolate); 399 propagateToDerived(promise, isolate);
400 } 400 }
401 401
402 void PromisePropagator::propagateToDerived(v8::Handle<v8::Object> promise, v8::I solate* isolate) 402 void PromisePropagator::propagateToDerived(v8::Handle<v8::Object> promise, v8::I solate* isolate)
403 { 403 {
404 v8::Local<v8::Object> internal = V8PromiseCustom::getInternal(promise); 404 v8::Local<v8::Object> internal = V8PromiseCustom::getInternal(promise);
405 ASSERT(V8PromiseCustom::getState(internal) == V8PromiseCustom::Fulfilled || V8PromiseCustom::getState(internal) == V8PromiseCustom::Rejected); 405 ASSERT(V8PromiseCustom::getState(internal) == V8PromiseCustom::Fulfilled || V8PromiseCustom::getState(internal) == V8PromiseCustom::Rejected);
406 v8::Local<v8::Array> fulfillCallbacks = internal->GetInternalField(V8Promise Custom::InternalFulfillCallbackIndex).As<v8::Array>(); 406 v8::Local<v8::Array> fulfillCallbacks = internal->GetInternalField(V8Promise Custom::InternalFulfillCallbackIndex).As<v8::Array>();
407 v8::Local<v8::Array> rejectCallbacks = internal->GetInternalField(V8PromiseC ustom::InternalRejectCallbackIndex).As<v8::Array>(); 407 v8::Local<v8::Array> rejectCallbacks = internal->GetInternalField(V8PromiseC ustom::InternalRejectCallbackIndex).As<v8::Array>();
408 v8::Local<v8::Array> derivedPromises = internal->GetInternalField(V8PromiseC ustom::InternalDerivedPromiseIndex).As<v8::Array>(); 408 v8::Local<v8::Array> derivedPromises = internal->GetInternalField(V8PromiseC ustom::InternalDerivedPromiseIndex).As<v8::Array>();
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 } else { 462 } else {
463 updateDerivedFromValue(derivedPromise, onFulfilled, originatorValue, isolate); 463 updateDerivedFromValue(derivedPromise, onFulfilled, originatorValue, isolate);
464 } 464 }
465 } else { 465 } else {
466 updateDerivedFromReason(derivedPromise, onRejected, originatorValue, iso late); 466 updateDerivedFromReason(derivedPromise, onRejected, originatorValue, iso late);
467 } 467 }
468 } 468 }
469 469
470 void PromisePropagator::updateDerivedFromPromise(v8::Handle<v8::Object> derivedP romise, v8::Handle<v8::Function> onFulfilled, v8::Handle<v8::Function> onRejecte d, v8::Handle<v8::Object> promise, v8::Isolate* isolate) 470 void PromisePropagator::updateDerivedFromPromise(v8::Handle<v8::Object> derivedP romise, v8::Handle<v8::Function> onFulfilled, v8::Handle<v8::Function> onRejecte d, v8::Handle<v8::Object> promise, v8::Isolate* isolate)
471 { 471 {
472 InspectorInstrumentation::didUpdatePromiseParent(currentExecutionContext(iso late), derivedPromise, promise);
aandrey 2014/02/28 16:08:13 move to the end of this func
Alexandra Mikhaylova 2014/03/03 14:04:25 Done.
472 v8::Local<v8::Object> internal = V8PromiseCustom::getInternal(promise); 473 v8::Local<v8::Object> internal = V8PromiseCustom::getInternal(promise);
473 V8PromiseCustom::PromiseState state = V8PromiseCustom::getState(internal); 474 V8PromiseCustom::PromiseState state = V8PromiseCustom::getState(internal);
474 if (state == V8PromiseCustom::Fulfilled || state == V8PromiseCustom::Rejecte d) { 475 if (state == V8PromiseCustom::Fulfilled || state == V8PromiseCustom::Rejecte d) {
475 updateDerived(derivedPromise, onFulfilled, onRejected, promise, isolate) ; 476 updateDerived(derivedPromise, onFulfilled, onRejected, promise, isolate) ;
476 } else { 477 } else {
477 addToDerived(internal, derivedPromise, onFulfilled, onRejected, isolate) ; 478 addToDerived(internal, derivedPromise, onFulfilled, onRejected, isolate) ;
478 } 479 }
479 } 480 }
480 481
481 } // namespace 482 } // namespace
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
634 635
635 // 636 //
636 // -- V8PromiseCustom -- 637 // -- V8PromiseCustom --
637 v8::Local<v8::Object> V8PromiseCustom::createPromise(v8::Handle<v8::Object> crea tionContext, v8::Isolate* isolate) 638 v8::Local<v8::Object> V8PromiseCustom::createPromise(v8::Handle<v8::Object> crea tionContext, v8::Isolate* isolate)
638 { 639 {
639 v8::Local<v8::ObjectTemplate> internalTemplate = internalObjectTemplate(isol ate); 640 v8::Local<v8::ObjectTemplate> internalTemplate = internalObjectTemplate(isol ate);
640 v8::Local<v8::Object> internal = internalTemplate->NewInstance(); 641 v8::Local<v8::Object> internal = internalTemplate->NewInstance();
641 v8::Local<v8::Object> promise = V8DOMWrapper::createWrapper(creationContext, &V8Promise::wrapperTypeInfo, 0, isolate); 642 v8::Local<v8::Object> promise = V8DOMWrapper::createWrapper(creationContext, &V8Promise::wrapperTypeInfo, 0, isolate);
642 643
643 clearDerived(internal, isolate); 644 clearDerived(internal, isolate);
644 setState(internal, Pending, v8::Undefined(isolate), isolate); 645 promise->SetInternalField(v8DOMWrapperObjectIndex, internal);
645 646
646 promise->SetInternalField(v8DOMWrapperObjectIndex, internal); 647 InspectorInstrumentation::didCreatePromise(currentExecutionContext(isolate), promise, v8::Handle<v8::Object>());
aandrey 2014/02/28 16:08:13 remove dummy v8::Handle<v8::Object>() argument
Alexandra Mikhaylova 2014/03/03 14:04:25 Removed promise parent argument in didCreatePromis
648
649 setState(promise, Pending, v8::Undefined(isolate), isolate);
647 return promise; 650 return promise;
648 } 651 }
649 652
650 v8::Local<v8::Object> V8PromiseCustom::getInternal(v8::Handle<v8::Object> promis e) 653 v8::Local<v8::Object> V8PromiseCustom::getInternal(v8::Handle<v8::Object> promis e)
651 { 654 {
652 v8::Local<v8::Value> value = promise->GetInternalField(v8DOMWrapperObjectInd ex); 655 v8::Local<v8::Value> value = promise->GetInternalField(v8DOMWrapperObjectInd ex);
653 return value.As<v8::Object>(); 656 return value.As<v8::Object>();
654 } 657 }
655 658
656 V8PromiseCustom::PromiseState V8PromiseCustom::getState(v8::Handle<v8::Object> i nternal) 659 V8PromiseCustom::PromiseState V8PromiseCustom::getState(v8::Handle<v8::Object> i nternal)
657 { 660 {
658 v8::Handle<v8::Value> value = internal->GetInternalField(V8PromiseCustom::In ternalStateIndex); 661 v8::Handle<v8::Value> value = internal->GetInternalField(V8PromiseCustom::In ternalStateIndex);
659 uint32_t number = toInt32(value); 662 uint32_t number = toInt32(value);
660 ASSERT(number == Pending || number == Fulfilled || number == Rejected || num ber == Following); 663 ASSERT(number == Pending || number == Fulfilled || number == Rejected || num ber == Following);
661 return static_cast<PromiseState>(number); 664 return static_cast<PromiseState>(number);
662 } 665 }
663 666
664 void V8PromiseCustom::setState(v8::Handle<v8::Object> internal, PromiseState sta te, v8::Handle<v8::Value> value, v8::Isolate* isolate) 667 void V8PromiseCustom::setState(v8::Handle<v8::Object> promise, PromiseState stat e, v8::Handle<v8::Value> value, v8::Isolate* isolate)
665 { 668 {
666 ASSERT(!value.IsEmpty()); 669 ASSERT(!value.IsEmpty());
667 ASSERT(state == Pending || state == Fulfilled || state == Rejected || state == Following); 670 ASSERT(state == Pending || state == Fulfilled || state == Rejected || state == Following);
671 v8::Local<v8::Object> internal = getInternal(promise);
668 internal->SetInternalField(InternalStateIndex, v8::Integer::New(isolate, sta te)); 672 internal->SetInternalField(InternalStateIndex, v8::Integer::New(isolate, sta te));
669 internal->SetInternalField(InternalResultIndex, value); 673 internal->SetInternalField(InternalResultIndex, value);
674 InspectorInstrumentation::didUpdatePromiseState(currentExecutionContext(isol ate), promise, state, value);
670 } 675 }
671 676
672 bool V8PromiseCustom::isPromise(v8::Handle<v8::Value> maybePromise, v8::Isolate* isolate) 677 bool V8PromiseCustom::isPromise(v8::Handle<v8::Value> maybePromise, v8::Isolate* isolate)
673 { 678 {
674 WrapperWorldType currentWorldType = worldType(isolate); 679 WrapperWorldType currentWorldType = worldType(isolate);
675 return V8Promise::domTemplate(isolate, currentWorldType)->HasInstance(maybeP romise); 680 return V8Promise::domTemplate(isolate, currentWorldType)->HasInstance(maybeP romise);
676 } 681 }
677 682
678 v8::Local<v8::Object> V8PromiseCustom::toPromise(v8::Handle<v8::Value> maybeProm ise, v8::Isolate* isolate) 683 v8::Local<v8::Object> V8PromiseCustom::toPromise(v8::Handle<v8::Value> maybeProm ise, v8::Isolate* isolate)
679 { 684 {
(...skipping 18 matching lines...) Expand all
698 703
699 if (isPromise(result, isolate)) { 704 if (isPromise(result, isolate)) {
700 v8::Local<v8::Object> valuePromise = result.As<v8::Object>(); 705 v8::Local<v8::Object> valuePromise = result.As<v8::Object>();
701 v8::Local<v8::Object> valueInternal = getInternal(valuePromise); 706 v8::Local<v8::Object> valueInternal = getInternal(valuePromise);
702 PromiseState valueState = getState(valueInternal); 707 PromiseState valueState = getState(valueInternal);
703 if (promise->SameValue(valuePromise)) { 708 if (promise->SameValue(valuePromise)) {
704 v8::Local<v8::Value> reason = V8ThrowException::createTypeError("Res olve a promise with itself", isolate); 709 v8::Local<v8::Value> reason = V8ThrowException::createTypeError("Res olve a promise with itself", isolate);
705 setReason(promise, reason, isolate); 710 setReason(promise, reason, isolate);
706 } else if (valueState == Following) { 711 } else if (valueState == Following) {
707 v8::Local<v8::Object> valuePromiseFollowing = valueInternal->GetInte rnalField(InternalResultIndex).As<v8::Object>(); 712 v8::Local<v8::Object> valuePromiseFollowing = valueInternal->GetInte rnalField(InternalResultIndex).As<v8::Object>();
708 setState(internal, Following, valuePromiseFollowing, isolate); 713 setState(promise, Following, valuePromiseFollowing, isolate);
709 addToDerived(getInternal(valuePromiseFollowing), promise, v8::Handle <v8::Function>(), v8::Handle<v8::Function>(), isolate); 714 addToDerived(getInternal(valuePromiseFollowing), promise, v8::Handle <v8::Function>(), v8::Handle<v8::Function>(), isolate);
710 } else if (valueState == Fulfilled) { 715 } else if (valueState == Fulfilled) {
711 setValue(promise, valueInternal->GetInternalField(InternalResultInde x), isolate); 716 setValue(promise, valueInternal->GetInternalField(InternalResultInde x), isolate);
712 } else if (valueState == Rejected) { 717 } else if (valueState == Rejected) {
713 setReason(promise, valueInternal->GetInternalField(InternalResultInd ex), isolate); 718 setReason(promise, valueInternal->GetInternalField(InternalResultInd ex), isolate);
714 } else { 719 } else {
715 ASSERT(valueState == Pending); 720 ASSERT(valueState == Pending);
716 setState(internal, Following, valuePromise, isolate); 721 setState(promise, Following, valuePromise, isolate);
717 addToDerived(valueInternal, promise, v8::Handle<v8::Function>(), v8: :Handle<v8::Function>(), isolate); 722 addToDerived(valueInternal, promise, v8::Handle<v8::Function>(), v8: :Handle<v8::Function>(), isolate);
718 } 723 }
719 } else { 724 } else {
720 setValue(promise, result, isolate); 725 setValue(promise, result, isolate);
721 } 726 }
722 } 727 }
723 728
724 void V8PromiseCustom::reject(v8::Handle<v8::Object> promise, v8::Handle<v8::Valu e> reason, v8::Isolate* isolate) 729 void V8PromiseCustom::reject(v8::Handle<v8::Object> promise, v8::Handle<v8::Valu e> reason, v8::Isolate* isolate)
725 { 730 {
726 v8::Local<v8::Object> internal = getInternal(promise); 731 v8::Local<v8::Object> internal = getInternal(promise);
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
813 818
814 void V8PromiseCustom::callHandler(v8::Handle<v8::Object> promise, v8::Handle<v8: :Function> handler, v8::Handle<v8::Value> argument, PromiseState originatorState , v8::Isolate* isolate) 819 void V8PromiseCustom::callHandler(v8::Handle<v8::Object> promise, v8::Handle<v8: :Function> handler, v8::Handle<v8::Value> argument, PromiseState originatorState , v8::Isolate* isolate)
815 { 820 {
816 ASSERT(originatorState == Fulfilled || originatorState == Rejected); 821 ASSERT(originatorState == Fulfilled || originatorState == Rejected);
817 ExecutionContext* executionContext = currentExecutionContext(isolate); 822 ExecutionContext* executionContext = currentExecutionContext(isolate);
818 ASSERT(executionContext && executionContext->isContextThread()); 823 ASSERT(executionContext && executionContext->isContextThread());
819 executionContext->postTask(adoptPtr(new CallHandlerTask(promise, handler, ar gument, originatorState, isolate, executionContext))); 824 executionContext->postTask(adoptPtr(new CallHandlerTask(promise, handler, ar gument, originatorState, isolate, executionContext)));
820 } 825 }
821 826
822 } // namespace WebCore 827 } // namespace WebCore
OLDNEW
« no previous file with comments | « no previous file | Source/core/core.gyp » ('j') | Source/core/inspector/InspectorDebuggerAgent.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698