Chromium Code Reviews| Index: Source/modules/crypto/CryptoResultImpl.cpp |
| diff --git a/Source/modules/crypto/CryptoResultImpl.cpp b/Source/modules/crypto/CryptoResultImpl.cpp |
| index 3870fa7f9f5ac5597718894e163be1e004990d13..ec1574b406aeb6455853686a78bece63c217af68 100644 |
| --- a/Source/modules/crypto/CryptoResultImpl.cpp |
| +++ b/Source/modules/crypto/CryptoResultImpl.cpp |
| @@ -47,6 +47,25 @@ |
| namespace WebCore { |
| +namespace { |
| + |
| +class WeakResolver : public ScriptPromiseResolverWithContext { |
| +public: |
| + static WeakPtr<ScriptPromiseResolverWithContext> create(ScriptState* scriptState) |
|
eroman
2014/06/16 20:57:08
This additionally needs to call suspendIfNeeded()
yhirano
2014/06/17 01:45:44
Done.
|
| + { |
| + RefPtr<WeakResolver> p = adoptRef(new WeakResolver(scriptState)); |
| + return p->m_weakPtrFactory.createWeakPtr(); |
| + } |
| + |
| +private: |
| + explicit WeakResolver(ScriptState* scriptState) |
| + : ScriptPromiseResolverWithContext(scriptState, ScriptPromiseResolverWithContext::KeepAliveWhilePending) |
| + , m_weakPtrFactory(this) { } |
| + WeakPtrFactory<ScriptPromiseResolverWithContext> m_weakPtrFactory; |
| +}; |
| + |
| +} // namespace |
| + |
| ExceptionCode webCryptoErrorToExceptionCode(blink::WebCryptoErrorType errorType) |
| { |
| switch (errorType) { |
| @@ -75,102 +94,6 @@ ExceptionCode webCryptoErrorToExceptionCode(blink::WebCryptoErrorType errorType) |
| return 0; |
| } |
| -// The PromiseState class contains all the state which is tied to an |
| -// ExecutionContext. Whereas CryptoResultImpl can be deleted from any thread, |
| -// PromiseState is not thread safe and must only be accessed and deleted from |
| -// the blink thread. |
| -// |
| -// This is achieved by making CryptoResultImpl hold a WeakPtr to the PromiseState. |
| -// The PromiseState deletes itself after being notified of completion. |
| -// 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: |
| - static WeakPtr<PromiseState> create(ScriptState* scriptState) |
| - { |
| - PromiseState* promiseState = new PromiseState(scriptState); |
| - return promiseState->m_weakFactory.createWeakPtr(); |
| - } |
| - |
| - void contextDestroyed() |
| - { |
| - delete this; |
| - } |
| - |
| - ScriptPromise promise() |
| - { |
| - return m_promiseResolver->promise(); |
| - } |
| - |
| - void completeWithError(blink::WebCryptoErrorType errorType, const blink::WebString& errorDetails) |
| - { |
| - m_promiseResolver->reject(DOMException::create(webCryptoErrorToExceptionCode(errorType), errorDetails)); |
| - delete this; |
| - } |
| - |
| - void completeWithBuffer(const blink::WebArrayBuffer& buffer) |
| - { |
| - m_promiseResolver->resolve(PassRefPtr<ArrayBuffer>(buffer)); |
| - delete this; |
| - } |
| - |
| - void completeWithBoolean(bool b) |
| - { |
| - m_promiseResolver->resolve(b); |
| - delete this; |
| - } |
| - |
| - void completeWithKey(const blink::WebCryptoKey& key) |
| - { |
| - m_promiseResolver->resolve(Key::create(key)); |
| - delete this; |
| - } |
| - |
| - void completeWithKeyPair(const blink::WebCryptoKey& publicKey, const blink::WebCryptoKey& privateKey) |
| - { |
| - m_promiseResolver->resolve(KeyPair::create(publicKey, privateKey)); |
| - delete this; |
| - } |
| - |
| -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 |
| - { |
| - ScriptPromiseResolverWithContext::contextDestroyed(); |
| - m_promiseState->contextDestroyed(); |
| - } |
| - |
| - private: |
| - explicit PromiseResolver(ScriptState* scriptState, PromiseState* promiseState) |
| - : ScriptPromiseResolverWithContext(scriptState) |
| - , m_promiseState(promiseState) |
| - { |
| - } |
| - |
| - PromiseState* m_promiseState; |
| - }; |
| - |
| - explicit PromiseState(ScriptState* scriptState) |
| - : m_weakFactory(this) |
| - , m_promiseResolver(PromiseResolver::create(scriptState, this)) |
| - { |
| - } |
| - |
| - WeakPtrFactory<PromiseState> m_weakFactory; |
| - RefPtr<PromiseResolver> m_promiseResolver; |
| -}; |
| - |
| CryptoResultImpl::~CryptoResultImpl() |
| { |
| } |
| @@ -182,42 +105,42 @@ PassRefPtr<CryptoResultImpl> CryptoResultImpl::create(ScriptState* scriptState) |
| void CryptoResultImpl::completeWithError(blink::WebCryptoErrorType errorType, const blink::WebString& errorDetails) |
| { |
| - if (m_promiseState) |
| - m_promiseState->completeWithError(errorType, errorDetails); |
| + if (m_resolver) |
| + m_resolver->reject(DOMException::create(webCryptoErrorToExceptionCode(errorType), errorDetails)); |
| } |
| void CryptoResultImpl::completeWithBuffer(const blink::WebArrayBuffer& buffer) |
| { |
| - if (m_promiseState) |
| - m_promiseState->completeWithBuffer(buffer); |
| + if (m_resolver) |
| + m_resolver->resolve(PassRefPtr<ArrayBuffer>(buffer)); |
| } |
| void CryptoResultImpl::completeWithBoolean(bool b) |
| { |
| - if (m_promiseState) |
| - m_promiseState->completeWithBoolean(b); |
| + if (m_resolver) |
| + m_resolver->resolve(b); |
| } |
| void CryptoResultImpl::completeWithKey(const blink::WebCryptoKey& key) |
| { |
| - if (m_promiseState) |
| - m_promiseState->completeWithKey(key); |
| + if (m_resolver) |
| + m_resolver->resolve(Key::create(key)); |
| } |
| void CryptoResultImpl::completeWithKeyPair(const blink::WebCryptoKey& publicKey, const blink::WebCryptoKey& privateKey) |
| { |
| - if (m_promiseState) |
| - m_promiseState->completeWithKeyPair(publicKey, privateKey); |
| + if (m_resolver) |
| + m_resolver->resolve(KeyPair::create(publicKey, privateKey)); |
| } |
| CryptoResultImpl::CryptoResultImpl(ScriptState* scriptState) |
| - : m_promiseState(PromiseState::create(scriptState)) |
| + : m_resolver(WeakResolver::create(scriptState)) |
| { |
| } |
| ScriptPromise CryptoResultImpl::promise() |
| { |
| - return m_promiseState->promise(); |
| + return m_resolver->promise(); |
| } |
| } // namespace WebCore |