Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1848)

Unified Diff: Source/modules/crypto/CryptoResultImpl.cpp

Issue 780793002: Make CryptoResultImpl not to use WeakPtr. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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()
« Source/modules/crypto/CryptoResultImpl.h ('K') | « Source/modules/crypto/CryptoResultImpl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698