Chromium Code Reviews| Index: Source/bindings/core/v8/ScriptPromiseResolver.h |
| diff --git a/Source/bindings/core/v8/ScriptPromiseResolver.h b/Source/bindings/core/v8/ScriptPromiseResolver.h |
| index 62975ad0bc1763beb0fd12fff9eb1824089fb65a..3951db7b68e9b42deb9e030f448f66bdb057b2bb 100644 |
| --- a/Source/bindings/core/v8/ScriptPromiseResolver.h |
| +++ b/Source/bindings/core/v8/ScriptPromiseResolver.h |
| @@ -26,15 +26,15 @@ namespace blink { |
| // ExecutionContext state. When the ExecutionContext is suspended, |
| // resolve or reject will be delayed. When it is stopped, resolve or reject |
| // will be ignored. |
| -class CORE_EXPORT ScriptPromiseResolver : public RefCountedWillBeRefCountedGarbageCollected<ScriptPromiseResolver>, public ActiveDOMObject { |
| +class CORE_EXPORT ScriptPromiseResolver : public GarbageCollectedFinalized<ScriptPromiseResolver>, public ActiveDOMObject { |
| WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(ScriptPromiseResolver); |
| WTF_MAKE_NONCOPYABLE(ScriptPromiseResolver); |
| public: |
| - static PassRefPtrWillBeRawPtr<ScriptPromiseResolver> create(ScriptState* scriptState) |
| + static ScriptPromiseResolver* create(ScriptState* scriptState) |
| { |
| - RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = adoptRefWillBeNoop(new ScriptPromiseResolver(scriptState)); |
| + ScriptPromiseResolver* resolver = new ScriptPromiseResolver(scriptState); |
| resolver->suspendIfNeeded(); |
| - return resolver.release(); |
| + return resolver; |
| } |
| #if ENABLE(ASSERT) |
| @@ -107,10 +107,6 @@ private: |
| Rejecting, |
| ResolvedOrRejected, |
| }; |
| - enum LifetimeMode { |
| - Default, |
| - KeepAliveWhilePending, |
| - }; |
| template<typename T> |
| void resolveOrReject(T value, ResolutionState newState) |
| @@ -119,16 +115,18 @@ private: |
| return; |
| ASSERT(newState == Resolving || newState == Rejecting); |
| m_state = newState; |
| - // Retain this object until it is actually resolved or rejected. |
| - // |deref| will be called in |clear|. |
| - ref(); |
| ScriptState::Scope scope(m_scriptState.get()); |
| m_value.set( |
| m_scriptState->isolate(), |
| toV8(value, m_scriptState->context()->Global(), m_scriptState->isolate())); |
| - if (!executionContext()->activeDOMObjectsAreSuspended()) |
| - resolveOrRejectImmediately(); |
| + |
| + if (executionContext()->activeDOMObjectsAreSuspended()) { |
| + // Retain this object until it is actually resolved or rejected. |
| + keepAliveWhilePending(); |
| + return; |
| + } |
| + resolveOrRejectImmediately(); |
| } |
| void resolveOrRejectImmediately(); |
| @@ -137,7 +135,6 @@ private: |
| ResolutionState m_state; |
| const RefPtr<ScriptState> m_scriptState; |
| - LifetimeMode m_mode; |
| Timer<ScriptPromiseResolver> m_timer; |
| Resolver m_resolver; |
| ScopedPersistent<v8::Value> m_value; |
| @@ -145,6 +142,11 @@ private: |
| // True if promise() is called. |
| bool m_isPromiseCalled; |
| #endif |
| + |
| + // To support keepAliveWhilePending(), a self-referential |
| + // Persistent<> is needed. |
|
haraken
2015/07/17 01:40:35
Can we use RefCountedGarbageCollected instead of m
sof
2015/07/17 05:34:30
I don't agree with that suggestion. Two reasons:
haraken
2015/07/17 06:52:52
That is something we need to fix. I'm ok with eith
sof
2015/07/17 07:02:04
What/where are they? (I don't know of any, off-han
|
| + GC_PLUGIN_IGNORE("") |
| + Persistent<ScriptPromiseResolver> m_keepAlive; |
| }; |
| } // namespace blink |