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

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

Issue 783423003: Make ScriptPromiseResolver RefCountedWillBeRefCountedGarbageCollected. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: WIP: 1st trial 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
« no previous file with comments | « Source/modules/crypto/CryptoResultImpl.h ('k') | Source/modules/crypto/SubtleCrypto.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/modules/crypto/CryptoResultImpl.cpp
diff --git a/Source/modules/crypto/CryptoResultImpl.cpp b/Source/modules/crypto/CryptoResultImpl.cpp
index 18f45f92f91164f107de07d2b54f144feaee3bcf..25cb2fa31fd920f0d2c49cb27d88b0b722f0cfea 100644
--- a/Source/modules/crypto/CryptoResultImpl.cpp
+++ b/Source/modules/crypto/CryptoResultImpl.cpp
@@ -50,26 +50,32 @@ namespace blink {
class CryptoResultImpl::WeakResolver : public ScriptPromiseResolver {
public:
- static WeakPtr<ScriptPromiseResolver> create(ScriptState* scriptState, CryptoResultImpl* result)
+ static PassRefPtrWillBeRawPtr<ScriptPromiseResolver> create(ScriptState* scriptState, CryptoResultImpl* result)
{
- RefPtr<WeakResolver> p = adoptRef(new WeakResolver(scriptState, result));
+ RefPtrWillBeRawPtr<WeakResolver> p = adoptRefWillBeNoop(new WeakResolver(scriptState, result));
p->suspendIfNeeded();
p->keepAliveWhilePending();
- return p->m_weakPtrFactory.createWeakPtr();
+ return p.release();
}
- virtual ~WeakResolver()
+ virtual void stop() override
{
m_result->cancel();
+ m_result->clearResolver();
+ ScriptPromiseResolver::stop();
+ }
+
+
+ virtual void trace(Visitor* visitor)
+ {
+ ScriptPromiseResolver::trace(visitor);
}
private:
WeakResolver(ScriptState* scriptState, CryptoResultImpl* result)
: ScriptPromiseResolver(scriptState)
- , m_weakPtrFactory(this)
, m_result(result) { }
- WeakPtrFactory<ScriptPromiseResolver> m_weakPtrFactory;
- RefPtr<CryptoResultImpl> m_result;
+ RawPtr<CryptoResultImpl> m_result;
tasak 2014/12/09 10:38:28 Since CryptResultImpl has a persistent member: m_r
};
ExceptionCode webCryptoErrorToExceptionCode(WebCryptoErrorType errorType)
@@ -102,30 +108,53 @@ ExceptionCode webCryptoErrorToExceptionCode(WebCryptoErrorType errorType)
CryptoResultImpl::~CryptoResultImpl()
{
+#if ENABLE(OILPAN)
+ ASSERT(!m_resolver);
+#endif
+}
+
+void CryptoResultImpl::clearResolver()
+{
+#if ENABLE(OILPAN)
+ m_resolver.clear();
+#else
+ m_resolver = nullptr;
+#endif
+}
+
+ScriptPromiseResolver* CryptoResultImpl::resolver()
+{
+#if ENABLE(OILPAN)
+ return m_resolver ? m_resolver.get()->get() : nullptr;
+#else
+ return m_resolver.get();
+#endif
}
-PassRefPtr<CryptoResultImpl> CryptoResultImpl::create(ScriptState* scriptState)
+PassRefPtrWillBeRawPtr<CryptoResultImpl> CryptoResultImpl::create(ScriptState* scriptState)
{
- return adoptRef(new CryptoResultImpl(scriptState));
+ return adoptRefWillBeNoop(new CryptoResultImpl(scriptState));
}
void CryptoResultImpl::completeWithError(WebCryptoErrorType errorType, const WebString& errorDetails)
{
- if (m_resolver)
- m_resolver->reject(DOMException::create(webCryptoErrorToExceptionCode(errorType), errorDetails));
+ if (resolver())
+ resolver()->reject(DOMException::create(webCryptoErrorToExceptionCode(errorType), errorDetails));
+ clearResolver();
}
void CryptoResultImpl::completeWithBuffer(const void* bytes, unsigned bytesSize)
{
- if (m_resolver)
- m_resolver->resolve(DOMArrayBuffer::create(bytes, bytesSize));
+ if (resolver())
+ resolver()->resolve(DOMArrayBuffer::create(bytes, bytesSize));
+ clearResolver();
}
void CryptoResultImpl::completeWithJson(const char* utf8Data, unsigned length)
{
- if (m_resolver) {
- ScriptPromiseResolver* resolver = m_resolver.get();
- ScriptState* scriptState = resolver->scriptState();
+ if (resolver()) {
+ ScriptPromiseResolver* scriptPromiseResolver = resolver();
+ ScriptState* scriptState = scriptPromiseResolver->scriptState();
ScriptState::Scope scope(scriptState);
v8::Handle<v8::String> jsonString = v8::String::NewFromUtf8(scriptState->isolate(), utf8Data, v8::String::kInternalizedString, length);
@@ -134,29 +163,32 @@ void CryptoResultImpl::completeWithJson(const char* utf8Data, unsigned length)
v8::Handle<v8::Value> jsonDictionary = v8::JSON::Parse(jsonString);
if (exceptionCatcher.HasCaught() || jsonDictionary.IsEmpty()) {
ASSERT_NOT_REACHED();
- resolver->reject(DOMException::create(OperationError, "Failed inflating JWK JSON to object"));
+ scriptPromiseResolver->reject(DOMException::create(OperationError, "Failed inflating JWK JSON to object"));
} else {
- resolver->resolve(jsonDictionary);
+ scriptPromiseResolver->resolve(jsonDictionary);
}
}
+ clearResolver();
}
void CryptoResultImpl::completeWithBoolean(bool b)
{
- if (m_resolver)
- m_resolver->resolve(b);
+ if (resolver())
+ resolver()->resolve(b);
+ clearResolver();
}
void CryptoResultImpl::completeWithKey(const WebCryptoKey& key)
{
- if (m_resolver)
- m_resolver->resolve(CryptoKey::create(key));
+ if (resolver())
+ resolver()->resolve(CryptoKey::create(key));
+ clearResolver();
}
void CryptoResultImpl::completeWithKeyPair(const WebCryptoKey& publicKey, const WebCryptoKey& privateKey)
{
- if (m_resolver) {
- ScriptState* scriptState = m_resolver->scriptState();
+ if (resolver()) {
+ ScriptState* scriptState = resolver()->scriptState();
ScriptState::Scope scope(scriptState);
Dictionary keyPair = Dictionary::createEmpty(scriptState->isolate());
@@ -167,8 +199,9 @@ void CryptoResultImpl::completeWithKeyPair(const WebCryptoKey& publicKey, const
keyPair.set("publicKey", publicKeyValue);
keyPair.set("privateKey", privateKeyValue);
- m_resolver->resolve(keyPair.v8Value());
+ resolver()->resolve(keyPair.v8Value());
}
+ clearResolver();
}
bool CryptoResultImpl::cancelled() const
@@ -186,12 +219,20 @@ CryptoResultImpl::CryptoResultImpl(ScriptState* scriptState)
{
// 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);
+#if ENABLE(OILPAN)
+ if (!m_resolver)
+ m_resolver = adoptPtr(new Persistent<ScriptPromiseResolver>());
+ *m_resolver = Persistent<ScriptPromiseResolver>(WeakResolver::create(scriptState, this));
+#else
+ m_resolver = WeakResolver::create(scriptState, this).get();
+#endif
}
ScriptPromise CryptoResultImpl::promise()
{
- return m_resolver ? m_resolver->promise() : ScriptPromise();
+ if (ScriptPromiseResolver* scriptPromiseResolver = resolver())
+ return scriptPromiseResolver->promise();
+ return ScriptPromise();
}
} // namespace blink
« no previous file with comments | « Source/modules/crypto/CryptoResultImpl.h ('k') | Source/modules/crypto/SubtleCrypto.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698