Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 26 matching lines...) Expand all Loading... | |
| 37 #include "bindings/v8/ScopedPersistent.h" | 37 #include "bindings/v8/ScopedPersistent.h" |
| 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/inspector/InspectorInstrumentation.h" | 47 #include "core/inspector/InspectorInstrumentation.h" |
|
aandrey
2014/02/26 16:11:30
remove
Alexandra Mikhaylova
2014/02/28 13:52:05
Done.
| |
| 48 #include "core/inspector/InspectorPromiseInstrumentation.h" | |
| 48 #include "core/workers/WorkerGlobalScope.h" | 49 #include "core/workers/WorkerGlobalScope.h" |
| 49 #include "platform/Task.h" | 50 #include "platform/Task.h" |
| 50 #include "wtf/Deque.h" | 51 #include "wtf/Deque.h" |
| 51 #include "wtf/Functional.h" | 52 #include "wtf/Functional.h" |
| 52 #include "wtf/Noncopyable.h" | 53 #include "wtf/Noncopyable.h" |
| 53 #include "wtf/PassOwnPtr.h" | 54 #include "wtf/PassOwnPtr.h" |
| 54 | 55 |
| 55 namespace WebCore { | 56 namespace WebCore { |
| 56 | 57 |
| 57 namespace { | 58 namespace { |
| (...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 383 OwnPtr<Derived> derived = m_derivedStack.takeLast(); | 384 OwnPtr<Derived> derived = m_derivedStack.takeLast(); |
| 384 updateDerived(derived->promise(isolate), derived->onFulfilled(isolate), derived->onRejected(isolate), derived->originator(isolate), isolate); | 385 updateDerived(derived->promise(isolate), derived->onFulfilled(isolate), derived->onRejected(isolate), derived->originator(isolate), isolate); |
| 385 } | 386 } |
| 386 } | 387 } |
| 387 | 388 |
| 388 void PromisePropagator::setValue(v8::Handle<v8::Object> promise, v8::Handle<v8:: Value> value, v8::Isolate* isolate) | 389 void PromisePropagator::setValue(v8::Handle<v8::Object> promise, v8::Handle<v8:: Value> value, v8::Isolate* isolate) |
| 389 { | 390 { |
| 390 v8::Local<v8::Object> internal = V8PromiseCustom::getInternal(promise); | 391 v8::Local<v8::Object> internal = V8PromiseCustom::getInternal(promise); |
| 391 ASSERT(V8PromiseCustom::getState(internal) != V8PromiseCustom::Fulfilled && V8PromiseCustom::getState(internal) != V8PromiseCustom::Rejected); | 392 ASSERT(V8PromiseCustom::getState(internal) != V8PromiseCustom::Fulfilled && V8PromiseCustom::getState(internal) != V8PromiseCustom::Rejected); |
| 392 V8PromiseCustom::setState(internal, V8PromiseCustom::Fulfilled, value, isola te); | 393 V8PromiseCustom::setState(internal, V8PromiseCustom::Fulfilled, value, isola te); |
| 394 InspectorInstrumentation::setPromiseStateAndResult(currentExecutionContext(i solate), promise, value, V8PromiseCustom::Fulfilled); | |
|
aandrey
2014/02/26 16:11:30
move inside setState
Alexandra Mikhaylova
2014/02/28 13:52:05
Done.
| |
| 393 propagateToDerived(promise, isolate); | 395 propagateToDerived(promise, isolate); |
| 394 } | 396 } |
| 395 | 397 |
| 396 void PromisePropagator::setReason(v8::Handle<v8::Object> promise, v8::Handle<v8: :Value> reason, v8::Isolate* isolate) | 398 void PromisePropagator::setReason(v8::Handle<v8::Object> promise, v8::Handle<v8: :Value> reason, v8::Isolate* isolate) |
| 397 { | 399 { |
| 398 v8::Local<v8::Object> internal = V8PromiseCustom::getInternal(promise); | 400 v8::Local<v8::Object> internal = V8PromiseCustom::getInternal(promise); |
| 399 ASSERT(V8PromiseCustom::getState(internal) != V8PromiseCustom::Fulfilled && V8PromiseCustom::getState(internal) != V8PromiseCustom::Rejected); | 401 ASSERT(V8PromiseCustom::getState(internal) != V8PromiseCustom::Fulfilled && V8PromiseCustom::getState(internal) != V8PromiseCustom::Rejected); |
| 400 V8PromiseCustom::setState(internal, V8PromiseCustom::Rejected, reason, isola te); | 402 V8PromiseCustom::setState(internal, V8PromiseCustom::Rejected, reason, isola te); |
| 403 InspectorInstrumentation::setPromiseStateAndResult(currentExecutionContext(i solate), promise, reason, V8PromiseCustom::Rejected); | |
|
aandrey
2014/02/26 16:11:30
ditto
Alexandra Mikhaylova
2014/02/28 13:52:05
Done.
| |
| 401 propagateToDerived(promise, isolate); | 404 propagateToDerived(promise, isolate); |
| 402 } | 405 } |
| 403 | 406 |
| 404 void PromisePropagator::propagateToDerived(v8::Handle<v8::Object> promise, v8::I solate* isolate) | 407 void PromisePropagator::propagateToDerived(v8::Handle<v8::Object> promise, v8::I solate* isolate) |
| 405 { | 408 { |
| 406 v8::Local<v8::Object> internal = V8PromiseCustom::getInternal(promise); | 409 v8::Local<v8::Object> internal = V8PromiseCustom::getInternal(promise); |
| 407 ASSERT(V8PromiseCustom::getState(internal) == V8PromiseCustom::Fulfilled || V8PromiseCustom::getState(internal) == V8PromiseCustom::Rejected); | 410 ASSERT(V8PromiseCustom::getState(internal) == V8PromiseCustom::Fulfilled || V8PromiseCustom::getState(internal) == V8PromiseCustom::Rejected); |
| 408 v8::Local<v8::Array> fulfillCallbacks = internal->GetInternalField(V8Promise Custom::InternalFulfillCallbackIndex).As<v8::Array>(); | 411 v8::Local<v8::Array> fulfillCallbacks = internal->GetInternalField(V8Promise Custom::InternalFulfillCallbackIndex).As<v8::Array>(); |
| 409 v8::Local<v8::Array> rejectCallbacks = internal->GetInternalField(V8PromiseC ustom::InternalRejectCallbackIndex).As<v8::Array>(); | 412 v8::Local<v8::Array> rejectCallbacks = internal->GetInternalField(V8PromiseC ustom::InternalRejectCallbackIndex).As<v8::Array>(); |
| 410 v8::Local<v8::Array> derivedPromises = internal->GetInternalField(V8PromiseC ustom::InternalDerivedPromiseIndex).As<v8::Array>(); | 413 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 Loading... | |
| 464 } else { | 467 } else { |
| 465 updateDerivedFromValue(derivedPromise, onFulfilled, originatorValue, isolate); | 468 updateDerivedFromValue(derivedPromise, onFulfilled, originatorValue, isolate); |
| 466 } | 469 } |
| 467 } else { | 470 } else { |
| 468 updateDerivedFromReason(derivedPromise, onRejected, originatorValue, iso late); | 471 updateDerivedFromReason(derivedPromise, onRejected, originatorValue, iso late); |
| 469 } | 472 } |
| 470 } | 473 } |
| 471 | 474 |
| 472 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) | 475 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) |
| 473 { | 476 { |
| 477 InspectorInstrumentation::setPromiseParent(currentExecutionContext(isolate), derivedPromise, promise); | |
| 474 v8::Local<v8::Object> internal = V8PromiseCustom::getInternal(promise); | 478 v8::Local<v8::Object> internal = V8PromiseCustom::getInternal(promise); |
| 475 V8PromiseCustom::PromiseState state = V8PromiseCustom::getState(internal); | 479 V8PromiseCustom::PromiseState state = V8PromiseCustom::getState(internal); |
| 476 if (state == V8PromiseCustom::Fulfilled || state == V8PromiseCustom::Rejecte d) { | 480 if (state == V8PromiseCustom::Fulfilled || state == V8PromiseCustom::Rejecte d) { |
| 477 updateDerived(derivedPromise, onFulfilled, onRejected, promise, isolate) ; | 481 updateDerived(derivedPromise, onFulfilled, onRejected, promise, isolate) ; |
| 478 } else { | 482 } else { |
| 479 addToDerived(internal, derivedPromise, onFulfilled, onRejected, isolate) ; | 483 addToDerived(internal, derivedPromise, onFulfilled, onRejected, isolate) ; |
| 480 } | 484 } |
| 481 } | 485 } |
| 482 | 486 |
| 483 } // namespace | 487 } // namespace |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 628 | 632 |
| 629 // | 633 // |
| 630 // -- V8PromiseCustom -- | 634 // -- V8PromiseCustom -- |
| 631 v8::Local<v8::Object> V8PromiseCustom::createPromise(v8::Handle<v8::Object> crea tionContext, v8::Isolate* isolate) | 635 v8::Local<v8::Object> V8PromiseCustom::createPromise(v8::Handle<v8::Object> crea tionContext, v8::Isolate* isolate) |
| 632 { | 636 { |
| 633 v8::Local<v8::ObjectTemplate> internalTemplate = internalObjectTemplate(isol ate); | 637 v8::Local<v8::ObjectTemplate> internalTemplate = internalObjectTemplate(isol ate); |
| 634 v8::Local<v8::Object> internal = internalTemplate->NewInstance(); | 638 v8::Local<v8::Object> internal = internalTemplate->NewInstance(); |
| 635 v8::Local<v8::Object> promise = V8DOMWrapper::createWrapper(creationContext, &V8Promise::wrapperTypeInfo, 0, isolate); | 639 v8::Local<v8::Object> promise = V8DOMWrapper::createWrapper(creationContext, &V8Promise::wrapperTypeInfo, 0, isolate); |
| 636 | 640 |
| 637 clearDerived(internal, isolate); | 641 clearDerived(internal, isolate); |
| 642 | |
| 643 InspectorInstrumentation::addPromise(currentExecutionContext(isolate), promi se, v8::Handle<v8::Object>()); | |
| 644 | |
| 638 setState(internal, Pending, v8::Undefined(isolate), isolate); | 645 setState(internal, Pending, v8::Undefined(isolate), isolate); |
| 646 InspectorInstrumentation::setPromiseStateAndResult(currentExecutionContext(i solate), promise, v8::Undefined(isolate), Pending); | |
|
aandrey
2014/02/26 16:11:30
remove
Alexandra Mikhaylova
2014/02/28 13:52:05
Done.
| |
| 639 | 647 |
| 640 promise->SetInternalField(v8DOMWrapperObjectIndex, internal); | 648 promise->SetInternalField(v8DOMWrapperObjectIndex, internal); |
| 649 | |
|
aandrey
2014/02/26 16:11:30
revert
Alexandra Mikhaylova
2014/02/28 13:52:05
Done.
| |
| 641 return promise; | 650 return promise; |
| 642 } | 651 } |
| 643 | 652 |
| 644 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) |
| 645 { | 654 { |
| 646 v8::Local<v8::Value> value = promise->GetInternalField(v8DOMWrapperObjectInd ex); | 655 v8::Local<v8::Value> value = promise->GetInternalField(v8DOMWrapperObjectInd ex); |
| 647 return value.As<v8::Object>(); | 656 return value.As<v8::Object>(); |
| 648 } | 657 } |
| 649 | 658 |
| 650 V8PromiseCustom::PromiseState V8PromiseCustom::getState(v8::Handle<v8::Object> i nternal) | 659 V8PromiseCustom::PromiseState V8PromiseCustom::getState(v8::Handle<v8::Object> i nternal) |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 693 if (isPromise(result, isolate)) { | 702 if (isPromise(result, isolate)) { |
| 694 v8::Local<v8::Object> valuePromise = result.As<v8::Object>(); | 703 v8::Local<v8::Object> valuePromise = result.As<v8::Object>(); |
| 695 v8::Local<v8::Object> valueInternal = getInternal(valuePromise); | 704 v8::Local<v8::Object> valueInternal = getInternal(valuePromise); |
| 696 PromiseState valueState = getState(valueInternal); | 705 PromiseState valueState = getState(valueInternal); |
| 697 if (promise->SameValue(valuePromise)) { | 706 if (promise->SameValue(valuePromise)) { |
| 698 v8::Local<v8::Value> reason = V8ThrowException::createTypeError("Res olve a promise with itself", isolate); | 707 v8::Local<v8::Value> reason = V8ThrowException::createTypeError("Res olve a promise with itself", isolate); |
| 699 setReason(promise, reason, isolate); | 708 setReason(promise, reason, isolate); |
| 700 } else if (valueState == Following) { | 709 } else if (valueState == Following) { |
| 701 v8::Local<v8::Object> valuePromiseFollowing = valueInternal->GetInte rnalField(InternalResultIndex).As<v8::Object>(); | 710 v8::Local<v8::Object> valuePromiseFollowing = valueInternal->GetInte rnalField(InternalResultIndex).As<v8::Object>(); |
| 702 setState(internal, Following, valuePromiseFollowing, isolate); | 711 setState(internal, Following, valuePromiseFollowing, isolate); |
| 712 InspectorInstrumentation::setPromiseStateAndResult(currentExecutionC ontext(isolate), promise, valuePromiseFollowing, Following); | |
|
aandrey
2014/02/26 16:11:30
move inside setState
Alexandra Mikhaylova
2014/02/28 13:52:05
Done.
| |
| 703 addToDerived(getInternal(valuePromiseFollowing), promise, v8::Handle <v8::Function>(), v8::Handle<v8::Function>(), isolate); | 713 addToDerived(getInternal(valuePromiseFollowing), promise, v8::Handle <v8::Function>(), v8::Handle<v8::Function>(), isolate); |
| 704 } else if (valueState == Fulfilled) { | 714 } else if (valueState == Fulfilled) { |
| 705 setValue(promise, valueInternal->GetInternalField(InternalResultInde x), isolate); | 715 setValue(promise, valueInternal->GetInternalField(InternalResultInde x), isolate); |
| 706 } else if (valueState == Rejected) { | 716 } else if (valueState == Rejected) { |
| 707 setReason(promise, valueInternal->GetInternalField(InternalResultInd ex), isolate); | 717 setReason(promise, valueInternal->GetInternalField(InternalResultInd ex), isolate); |
| 708 } else { | 718 } else { |
| 709 ASSERT(valueState == Pending); | 719 ASSERT(valueState == Pending); |
| 710 setState(internal, Following, valuePromise, isolate); | 720 setState(internal, Following, valuePromise, isolate); |
| 721 InspectorInstrumentation::setPromiseStateAndResult(currentExecutionC ontext(isolate), promise, valuePromise, Following); | |
|
aandrey
2014/02/26 16:11:30
move inside setState
Alexandra Mikhaylova
2014/02/28 13:52:05
Done.
| |
| 711 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); |
| 712 } | 723 } |
| 713 } else { | 724 } else { |
| 714 setValue(promise, result, isolate); | 725 setValue(promise, result, isolate); |
| 715 } | 726 } |
| 716 } | 727 } |
| 717 | 728 |
| 718 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) |
| 719 { | 730 { |
| 720 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 Loading... | |
| 807 | 818 |
| 808 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) |
| 809 { | 820 { |
| 810 ASSERT(originatorState == Fulfilled || originatorState == Rejected); | 821 ASSERT(originatorState == Fulfilled || originatorState == Rejected); |
| 811 ExecutionContext* executionContext = currentExecutionContext(isolate); | 822 ExecutionContext* executionContext = currentExecutionContext(isolate); |
| 812 ASSERT(executionContext && executionContext->isContextThread()); | 823 ASSERT(executionContext && executionContext->isContextThread()); |
| 813 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))); |
| 814 } | 825 } |
| 815 | 826 |
| 816 } // namespace WebCore | 827 } // namespace WebCore |
| OLD | NEW |