| Index: Source/bindings/v8/ScriptPromiseResolverWithContext.h
|
| diff --git a/Source/bindings/v8/ScriptPromiseResolverWithContext.h b/Source/bindings/v8/ScriptPromiseResolverWithContext.h
|
| index f373fa9f3e1347a6ea148a86c18c3db1f09632ff..f409a8bc8091c4358cf314db6f56a29201e88e42 100644
|
| --- a/Source/bindings/v8/ScriptPromiseResolverWithContext.h
|
| +++ b/Source/bindings/v8/ScriptPromiseResolverWithContext.h
|
| @@ -41,25 +41,13 @@ public:
|
| template <typename T>
|
| void resolve(T value)
|
| {
|
| - if (m_state != Pending || !executionContext() || executionContext()->activeDOMObjectsAreStopped())
|
| - return;
|
| - m_state = Resolving;
|
| - NewScriptState::Scope scope(m_scriptState.get());
|
| - m_value.set(m_scriptState->isolate(), toV8(value));
|
| - if (!executionContext()->activeDOMObjectsAreSuspended())
|
| - resolveOrRejectImmediately(&m_timer);
|
| + resolveOrReject(value, Resolving);
|
| }
|
|
|
| template <typename T>
|
| void reject(T value)
|
| {
|
| - if (m_state != Pending || !executionContext() || executionContext()->activeDOMObjectsAreStopped())
|
| - return;
|
| - m_state = Rejecting;
|
| - NewScriptState::Scope scope(m_scriptState.get());
|
| - m_value.set(m_scriptState->isolate(), toV8(value));
|
| - if (!executionContext()->activeDOMObjectsAreSuspended())
|
| - resolveOrRejectImmediately(&m_timer);
|
| + resolveOrReject(value, Rejecting);
|
| }
|
|
|
| // Note that an empty ScriptPromise will be returned after resolve or
|
| @@ -99,12 +87,33 @@ private:
|
| ASSERT(m_scriptState);
|
| return v8ArrayNoInline(value, m_scriptState->isolate());
|
| }
|
| - v8::Handle<v8::Value> toV8(ScriptValue value)
|
| + v8::Handle<v8::Value> toV8(ScriptValue value) { return value.v8Value(); }
|
| + v8::Handle<v8::Value> toV8(v8::Handle<v8::Value> value) { return value; }
|
| +
|
| + template <typename T>
|
| + void resolveOrReject(T value, ResolutionState newState)
|
| {
|
| - return value.v8Value();
|
| + if (m_state != Pending || !executionContext() || executionContext()->activeDOMObjectsAreStopped())
|
| + return;
|
| + m_state = newState;
|
| + // Retain this object until it is actually resolved or rejected.
|
| + // deref will be called in resolveOrRejectImmediately.
|
| + ref();
|
| +
|
| + bool isInContext = m_scriptState->isolate()->InContext();
|
| + NewScriptState::Scope scope(m_scriptState.get());
|
| + m_value.set(m_scriptState->isolate(), toV8(value));
|
| + if (!executionContext()->activeDOMObjectsAreSuspended()) {
|
| + if (isInContext) {
|
| + resolveOrRejectImmediately();
|
| + } else {
|
| + m_timer.startOneShot(0, FROM_HERE);
|
| + }
|
| + }
|
| }
|
|
|
| - void resolveOrRejectImmediately(Timer<ScriptPromiseResolverWithContext>*);
|
| + void resolveOrRejectImmediately();
|
| + void onTimerFired(Timer<ScriptPromiseResolverWithContext>*);
|
| void clear();
|
|
|
| ResolutionState m_state;
|
|
|