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(); |
yhirano
2014/04/15 08:45:06
I don't like the manual ref counting, but I couldn
|
+ |
+ 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; |