Chromium Code Reviews| Index: Source/modules/crypto/CryptoResultImpl.cpp |
| diff --git a/Source/modules/crypto/CryptoResultImpl.cpp b/Source/modules/crypto/CryptoResultImpl.cpp |
| index 13ba840dea5239b1379282550fc7492c5ce111ca..ef38706bf2199217048fb8c5f7092535c17e5ad0 100644 |
| --- a/Source/modules/crypto/CryptoResultImpl.cpp |
| +++ b/Source/modules/crypto/CryptoResultImpl.cpp |
| @@ -88,10 +88,10 @@ ExceptionCode toExceptionCode(blink::WebCryptoErrorType errorType) |
| // |
| // This is achieved by making CryptoResultImpl hold a WeakPtr to the PromiseState. |
| // The PromiseState deletes itself after being notified of completion. |
| -// Additionally the PromiseState deletes itself when the ExecutionContext is |
| +// Additionally the PromiseState is deleted when the ExecutionContext is |
| // destroyed (necessary to avoid leaks when dealing with WebWorker threads, |
| // which may die before the operation is completed). |
| -class CryptoResultImpl::PromiseState FINAL : public ContextLifecycleObserver { |
| +class CryptoResultImpl::PromiseState FINAL { |
| public: |
| static WeakPtr<PromiseState> create(ExecutionContext* context) |
| { |
| @@ -99,10 +99,8 @@ public: |
| return promiseState->m_weakFactory.createWeakPtr(); |
| } |
| - // Override from ContextLifecycleObserver |
| - virtual void contextDestroyed() OVERRIDE |
| + void contextDestroyed() |
| { |
| - ContextLifecycleObserver::contextDestroyed(); |
| delete this; |
| } |
| @@ -142,15 +140,41 @@ public: |
| } |
| private: |
| + // This subclass of ScriptPromiseResolverWithContext is to be notified |
| + // when the context was destroyed. |
| + class PromiseResolver FINAL : public ScriptPromiseResolverWithContext { |
| + public: |
| + static PassRefPtr<PromiseResolver> create(ScriptState* scriptState, PromiseState* promiseState) |
| + { |
| + RefPtr<PromiseResolver> resolver = adoptRef(new PromiseResolver(scriptState, promiseState)); |
| + resolver->suspendIfNeeded(); |
| + return resolver.release(); |
| + } |
| + |
| + virtual void contextDestroyed() OVERRIDE |
|
haraken
2014/05/06 01:44:02
How about adding the functionality to ScriptPromis
eroman
2014/05/06 22:59:22
Sure what do you have in mind? Perhaps pass in a d
|
| + { |
| + ScriptPromiseResolverWithContext::contextDestroyed(); |
| + m_promiseState->contextDestroyed(); |
| + } |
| + |
| + private: |
| + explicit PromiseResolver(ScriptState* scriptState, PromiseState* promiseState) |
| + : ScriptPromiseResolverWithContext(scriptState) |
| + , m_promiseState(promiseState) |
| + { |
| + } |
| + |
| + PromiseState* m_promiseState; |
| + }; |
| + |
| explicit PromiseState(ExecutionContext* context) |
| - : ContextLifecycleObserver(context) |
| - , m_weakFactory(this) |
| - , m_promiseResolver(ScriptPromiseResolverWithContext::create(ScriptState::current(toIsolate(context)))) |
| + : m_weakFactory(this) |
| + , m_promiseResolver(PromiseResolver::create(ScriptState::current(toIsolate(context)), this)) |
| { |
| } |
| WeakPtrFactory<PromiseState> m_weakFactory; |
| - RefPtr<ScriptPromiseResolverWithContext> m_promiseResolver; |
| + RefPtr<PromiseResolver> m_promiseResolver; |
| }; |
| CryptoResultImpl::~CryptoResultImpl() |