Chromium Code Reviews| Index: Source/modules/crypto/CryptoResultImpl.cpp |
| diff --git a/Source/modules/crypto/CryptoResultImpl.cpp b/Source/modules/crypto/CryptoResultImpl.cpp |
| index 609116233697875198e6fe1dc7e9f6cd60211fa2..449860dcd37c18910fb924de045fe88b7cad8654 100644 |
| --- a/Source/modules/crypto/CryptoResultImpl.cpp |
| +++ b/Source/modules/crypto/CryptoResultImpl.cpp |
| @@ -60,28 +60,36 @@ static void rejectWithTypeError(const String& errorDetails, ScriptPromiseResolve |
| resolver->reject(v8::Exception::TypeError(v8String(isolate, errorDetails))); |
| } |
| -class CryptoResultImpl::WeakResolver : public ScriptPromiseResolver { |
| +class CryptoResultImpl::Resolver final : public ScriptPromiseResolver { |
| public: |
| - static WeakPtr<ScriptPromiseResolver> create(ScriptState* scriptState, CryptoResultImpl* result) |
| + static PassRefPtr<ScriptPromiseResolver> create(ScriptState* scriptState, CryptoResultImpl* result) |
| { |
| - RefPtr<WeakResolver> p = adoptRef(new WeakResolver(scriptState, result)); |
| - p->suspendIfNeeded(); |
| - p->keepAliveWhilePending(); |
| - return p->m_weakPtrFactory.createWeakPtr(); |
| + RefPtr<Resolver> resolver = adoptRef(new Resolver(scriptState, result)); |
| + resolver->suspendIfNeeded(); |
| + resolver->keepAliveWhilePending(); |
| + return resolver.release(); |
| } |
| - virtual ~WeakResolver() |
| + virtual void stop() override |
| { |
| - m_result->cancel(); |
| + if (m_result) { |
| + m_result->cancel(); |
| + m_result->clearResolver(); |
| + m_result = nullptr; |
| + } |
| + ScriptPromiseResolver::stop(); |
| + } |
| + |
| + void clearCryptoResult() |
| + { |
| + m_result = nullptr; |
| } |
| private: |
| - WeakResolver(ScriptState* scriptState, CryptoResultImpl* result) |
| + Resolver(ScriptState* scriptState, CryptoResultImpl* result) |
| : ScriptPromiseResolver(scriptState) |
| - , m_weakPtrFactory(this) |
| , m_result(result) { } |
| - WeakPtrFactory<ScriptPromiseResolver> m_weakPtrFactory; |
| - RefPtr<CryptoResultImpl> m_result; |
| + CryptoResultImpl* m_result; |
| }; |
| ExceptionCode webCryptoErrorToExceptionCode(WebCryptoErrorType errorType) |
| @@ -113,6 +121,13 @@ CryptoResultImpl::~CryptoResultImpl() |
| { |
|
haraken
2014/12/12 08:49:31
Add ASSERT(!m_resolver) to verify that m_resolver
tasak
2014/12/15 05:26:46
Done.
|
| } |
| +void CryptoResultImpl::clearResolver() |
| +{ |
| + if (m_resolver) |
| + static_cast<CryptoResultImpl::Resolver*>(m_resolver)->clearCryptoResult(); |
|
haraken
2014/12/15 01:36:51
I don't think this is needed once you make CryptoR
tasak
2014/12/15 05:26:46
Done.
|
| + m_resolver = nullptr; |
| +} |
| + |
| PassRefPtr<CryptoResultImpl> CryptoResultImpl::create(ScriptState* scriptState) |
| { |
| return adoptRef(new CryptoResultImpl(scriptState)); |
| @@ -126,22 +141,24 @@ void CryptoResultImpl::completeWithError(WebCryptoErrorType errorType, const Web |
| // Handle TypeError separately, as it cannot be created using |
| // DOMException. |
| if (ec == V8TypeError) |
| - rejectWithTypeError(errorDetails, m_resolver.get()); |
| + rejectWithTypeError(errorDetails, m_resolver); |
| else |
| m_resolver->reject(DOMException::create(ec, errorDetails)); |
| } |
| + clearResolver(); |
| } |
| void CryptoResultImpl::completeWithBuffer(const void* bytes, unsigned bytesSize) |
| { |
| if (m_resolver) |
| m_resolver->resolve(DOMArrayBuffer::create(bytes, bytesSize)); |
| + clearResolver(); |
| } |
| void CryptoResultImpl::completeWithJson(const char* utf8Data, unsigned length) |
| { |
| if (m_resolver) { |
| - ScriptPromiseResolver* resolver = m_resolver.get(); |
| + ScriptPromiseResolver* resolver = m_resolver; |
| ScriptState* scriptState = resolver->scriptState(); |
| ScriptState::Scope scope(scriptState); |
| @@ -156,18 +173,21 @@ void CryptoResultImpl::completeWithJson(const char* utf8Data, unsigned length) |
| resolver->resolve(jsonDictionary); |
| } |
| } |
| + clearResolver(); |
| } |
| void CryptoResultImpl::completeWithBoolean(bool b) |
| { |
| if (m_resolver) |
| m_resolver->resolve(b); |
| + clearResolver(); |
| } |
| void CryptoResultImpl::completeWithKey(const WebCryptoKey& key) |
| { |
| if (m_resolver) |
| m_resolver->resolve(CryptoKey::create(key)); |
| + clearResolver(); |
| } |
| void CryptoResultImpl::completeWithKeyPair(const WebCryptoKey& publicKey, const WebCryptoKey& privateKey) |
| @@ -186,6 +206,7 @@ void CryptoResultImpl::completeWithKeyPair(const WebCryptoKey& publicKey, const |
| m_resolver->resolve(keyPair.v8Value()); |
| } |
| + clearResolver(); |
| } |
| bool CryptoResultImpl::cancelled() const |
| @@ -201,9 +222,14 @@ void CryptoResultImpl::cancel() |
| CryptoResultImpl::CryptoResultImpl(ScriptState* scriptState) |
| : m_cancelled(0) |
| { |
| - // Creating the WeakResolver may return nullptr if active dom objects have |
| - // been stopped. And in the process set m_cancelled to 1. |
| - m_resolver = WeakResolver::create(scriptState, this); |
| + ASSERT(scriptState); |
|
haraken
2014/12/12 08:49:31
ASSERT(scriptState) => ASSERT(scriptState->context
tasak
2014/12/15 05:26:46
Done.
|
| + if (scriptState->executionContext()->activeDOMObjectsAreStopped()) { |
| + // If active dom objects have been stopped, avoid creating |
| + // CryptoResultResolver. |
| + m_resolver = nullptr; |
| + } else { |
| + m_resolver = Resolver::create(scriptState, this).get(); |
| + } |
| } |
| ScriptPromise CryptoResultImpl::promise() |