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

Side by Side Diff: Source/modules/crypto/CryptoResultImpl.cpp

Issue 263163006: Fix crash when ExecutionContext is torn down before a crypto operation has completed. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: fix comment typo Created 6 years, 7 months 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/bindings/v8/ScriptPromiseResolverWithContext.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 81
82 } // namespace 82 } // namespace
83 83
84 // The PromiseState class contains all the state which is tied to an 84 // The PromiseState class contains all the state which is tied to an
85 // ExecutionContext. Whereas CryptoResultImpl can be deleted from any thread, 85 // ExecutionContext. Whereas CryptoResultImpl can be deleted from any thread,
86 // PromiseState is not thread safe and must only be accessed and deleted from 86 // PromiseState is not thread safe and must only be accessed and deleted from
87 // the blink thread. 87 // the blink thread.
88 // 88 //
89 // This is achieved by making CryptoResultImpl hold a WeakPtr to the PromiseStat e. 89 // This is achieved by making CryptoResultImpl hold a WeakPtr to the PromiseStat e.
90 // The PromiseState deletes itself after being notified of completion. 90 // The PromiseState deletes itself after being notified of completion.
91 // Additionally the PromiseState deletes itself when the ExecutionContext is 91 // Additionally the PromiseState is deleted when the ExecutionContext is
92 // destroyed (necessary to avoid leaks when dealing with WebWorker threads, 92 // destroyed (necessary to avoid leaks when dealing with WebWorker threads,
93 // which may die before the operation is completed). 93 // which may die before the operation is completed).
94 class CryptoResultImpl::PromiseState FINAL : public ContextLifecycleObserver { 94 class CryptoResultImpl::PromiseState FINAL {
95 public: 95 public:
96 static WeakPtr<PromiseState> create(ExecutionContext* context) 96 static WeakPtr<PromiseState> create(ExecutionContext* context)
97 { 97 {
98 PromiseState* promiseState = new PromiseState(context); 98 PromiseState* promiseState = new PromiseState(context);
99 return promiseState->m_weakFactory.createWeakPtr(); 99 return promiseState->m_weakFactory.createWeakPtr();
100 } 100 }
101 101
102 // Override from ContextLifecycleObserver 102 void contextDestroyed()
103 virtual void contextDestroyed() OVERRIDE
104 { 103 {
105 ContextLifecycleObserver::contextDestroyed();
106 delete this; 104 delete this;
107 } 105 }
108 106
109 ScriptPromise promise() 107 ScriptPromise promise()
110 { 108 {
111 return m_promiseResolver->promise(); 109 return m_promiseResolver->promise();
112 } 110 }
113 111
114 void completeWithError(blink::WebCryptoErrorType errorType, const blink::Web String& errorDetails) 112 void completeWithError(blink::WebCryptoErrorType errorType, const blink::Web String& errorDetails)
115 { 113 {
(...skipping 19 matching lines...) Expand all
135 delete this; 133 delete this;
136 } 134 }
137 135
138 void completeWithKeyPair(const blink::WebCryptoKey& publicKey, const blink:: WebCryptoKey& privateKey) 136 void completeWithKeyPair(const blink::WebCryptoKey& publicKey, const blink:: WebCryptoKey& privateKey)
139 { 137 {
140 m_promiseResolver->resolve(KeyPair::create(publicKey, privateKey)); 138 m_promiseResolver->resolve(KeyPair::create(publicKey, privateKey));
141 delete this; 139 delete this;
142 } 140 }
143 141
144 private: 142 private:
143 // This subclass of ScriptPromiseResolverWithContext is to be notified
144 // when the context was destroyed.
145 class PromiseResolver FINAL : public ScriptPromiseResolverWithContext {
146 public:
147 static PassRefPtr<PromiseResolver> create(ScriptState* scriptState, Prom iseState* promiseState)
148 {
149 RefPtr<PromiseResolver> resolver = adoptRef(new PromiseResolver(scri ptState, promiseState));
150 resolver->suspendIfNeeded();
151 return resolver.release();
152 }
153
154 virtual void contextDestroyed() OVERRIDE
155 {
156 ScriptPromiseResolverWithContext::contextDestroyed();
157 m_promiseState->contextDestroyed();
158 }
159
160 private:
161 explicit PromiseResolver(ScriptState* scriptState, PromiseState* promise State)
162 : ScriptPromiseResolverWithContext(scriptState)
163 , m_promiseState(promiseState)
164 {
165 }
166
167 PromiseState* m_promiseState;
168 };
169
145 explicit PromiseState(ExecutionContext* context) 170 explicit PromiseState(ExecutionContext* context)
146 : ContextLifecycleObserver(context) 171 : m_weakFactory(this)
147 , m_weakFactory(this) 172 , m_promiseResolver(PromiseResolver::create(ScriptState::current(toIsola te(context)), this))
148 , m_promiseResolver(ScriptPromiseResolverWithContext::create(ScriptState ::current(toIsolate(context))))
149 { 173 {
150 } 174 }
151 175
152 WeakPtrFactory<PromiseState> m_weakFactory; 176 WeakPtrFactory<PromiseState> m_weakFactory;
153 RefPtr<ScriptPromiseResolverWithContext> m_promiseResolver; 177 RefPtr<PromiseResolver> m_promiseResolver;
154 }; 178 };
155 179
156 CryptoResultImpl::~CryptoResultImpl() 180 CryptoResultImpl::~CryptoResultImpl()
157 { 181 {
158 } 182 }
159 183
160 PassRefPtr<CryptoResultImpl> CryptoResultImpl::create() 184 PassRefPtr<CryptoResultImpl> CryptoResultImpl::create()
161 { 185 {
162 return adoptRef(new CryptoResultImpl(callingExecutionContext(v8::Isolate::Ge tCurrent()))); 186 return adoptRef(new CryptoResultImpl(callingExecutionContext(v8::Isolate::Ge tCurrent())));
163 } 187 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 : m_promiseState(PromiseState::create(context)) 220 : m_promiseState(PromiseState::create(context))
197 { 221 {
198 } 222 }
199 223
200 ScriptPromise CryptoResultImpl::promise() 224 ScriptPromise CryptoResultImpl::promise()
201 { 225 {
202 return m_promiseState->promise(); 226 return m_promiseState->promise();
203 } 227 }
204 228
205 } // namespace WebCore 229 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/bindings/v8/ScriptPromiseResolverWithContext.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698