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

Side by Side Diff: content/browser/indexed_db/indexed_db_callbacks.cc

Issue 2727733004: [IndexedDB] Closing mojo connections when renderer quits (Closed)
Patch Set: No more raw pointers where we're not guarenteed lifetime Created 3 years, 9 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/indexed_db/indexed_db_callbacks.h" 5 #include "content/browser/indexed_db/indexed_db_callbacks.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <utility> 10 #include <utility>
11 11
12 #include "base/memory/ptr_util.h" 12 #include "base/memory/ptr_util.h"
13 #include "base/metrics/histogram_macros.h" 13 #include "base/metrics/histogram_macros.h"
14 #include "base/sequenced_task_runner.h"
14 #include "base/strings/utf_string_conversions.h" 15 #include "base/strings/utf_string_conversions.h"
15 #include "base/time/time.h" 16 #include "base/time/time.h"
16 #include "content/browser/child_process_security_policy_impl.h" 17 #include "content/browser/child_process_security_policy_impl.h"
17 #include "content/browser/fileapi/fileapi_message_filter.h" 18 #include "content/browser/fileapi/fileapi_message_filter.h"
18 #include "content/browser/indexed_db/cursor_impl.h" 19 #include "content/browser/indexed_db/cursor_impl.h"
19 #include "content/browser/indexed_db/database_impl.h" 20 #include "content/browser/indexed_db/database_impl.h"
20 #include "content/browser/indexed_db/indexed_db_connection.h" 21 #include "content/browser/indexed_db/indexed_db_connection.h"
21 #include "content/browser/indexed_db/indexed_db_context_impl.h" 22 #include "content/browser/indexed_db/indexed_db_context_impl.h"
22 #include "content/browser/indexed_db/indexed_db_cursor.h" 23 #include "content/browser/indexed_db/indexed_db_cursor.h"
23 #include "content/browser/indexed_db/indexed_db_database_error.h" 24 #include "content/browser/indexed_db/indexed_db_database_error.h"
24 #include "content/browser/indexed_db/indexed_db_return_value.h" 25 #include "content/browser/indexed_db/indexed_db_return_value.h"
25 #include "content/browser/indexed_db/indexed_db_tracing.h" 26 #include "content/browser/indexed_db/indexed_db_tracing.h"
26 #include "content/browser/indexed_db/indexed_db_transaction.h" 27 #include "content/browser/indexed_db/indexed_db_transaction.h"
27 #include "content/browser/indexed_db/indexed_db_value.h" 28 #include "content/browser/indexed_db/indexed_db_value.h"
28 #include "content/common/indexed_db/indexed_db_constants.h" 29 #include "content/common/indexed_db/indexed_db_constants.h"
29 #include "content/common/indexed_db/indexed_db_metadata.h" 30 #include "content/common/indexed_db/indexed_db_metadata.h"
31 #include "content/public/browser/browser_thread.h"
30 #include "mojo/public/cpp/bindings/strong_associated_binding.h" 32 #include "mojo/public/cpp/bindings/strong_associated_binding.h"
31 #include "storage/browser/blob/blob_storage_context.h" 33 #include "storage/browser/blob/blob_storage_context.h"
32 #include "storage/browser/blob/shareable_file_reference.h" 34 #include "storage/browser/blob/shareable_file_reference.h"
33 #include "storage/browser/quota/quota_manager.h" 35 #include "storage/browser/quota/quota_manager.h"
34 36
35 using indexed_db::mojom::CallbacksAssociatedPtrInfo; 37 using indexed_db::mojom::CallbacksAssociatedPtrInfo;
36 using std::swap; 38 using std::swap;
37 using storage::ShareableFileReference; 39 using storage::ShareableFileReference;
38 40
39 namespace content { 41 namespace content {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 swap(mojo_value->value->bits, value->bits); 76 swap(mojo_value->value->bits, value->bits);
75 ConvertBlobInfo(value->blob_info, &mojo_value->value->blob_or_file_info); 77 ConvertBlobInfo(value->blob_info, &mojo_value->value->blob_or_file_info);
76 return mojo_value; 78 return mojo_value;
77 } 79 }
78 80
79 } // namespace 81 } // namespace
80 82
81 class IndexedDBCallbacks::IOThreadHelper { 83 class IndexedDBCallbacks::IOThreadHelper {
82 public: 84 public:
83 IOThreadHelper(CallbacksAssociatedPtrInfo callbacks_info, 85 IOThreadHelper(CallbacksAssociatedPtrInfo callbacks_info,
84 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host); 86 base::WeakPtr<IndexedDBDispatcherHost> dispatcher_host,
87 url::Origin origin,
88 scoped_refptr<base::SequencedTaskRunner> idb_runner);
85 ~IOThreadHelper(); 89 ~IOThreadHelper();
86 90
87 void SendError(const IndexedDBDatabaseError& error); 91 void SendError(const IndexedDBDatabaseError& error);
88 void SendSuccessStringList(const std::vector<base::string16>& value); 92 void SendSuccessStringList(const std::vector<base::string16>& value);
89 void SendBlocked(int64_t existing_version); 93 void SendBlocked(int64_t existing_version);
90 void SendUpgradeNeeded(std::unique_ptr<DatabaseImpl> database, 94 void SendUpgradeNeeded(std::unique_ptr<IndexedDBConnection> connection,
91 int64_t old_version, 95 int64_t old_version,
92 blink::WebIDBDataLoss data_loss, 96 blink::WebIDBDataLoss data_loss,
93 const std::string& data_loss_message, 97 const std::string& data_loss_message,
94 const content::IndexedDBDatabaseMetadata& metadata); 98 const content::IndexedDBDatabaseMetadata& metadata);
95 void SendSuccessDatabase(std::unique_ptr<DatabaseImpl> database, 99 void SendSuccessDatabase(std::unique_ptr<IndexedDBConnection> connection,
96 const content::IndexedDBDatabaseMetadata& metadata); 100 const content::IndexedDBDatabaseMetadata& metadata);
97 void SendSuccessCursor(std::unique_ptr<CursorImpl> cursor, 101 void SendSuccessCursor(std::unique_ptr<IndexedDBCursor> cursor,
98 const IndexedDBKey& key, 102 const IndexedDBKey& key,
99 const IndexedDBKey& primary_key, 103 const IndexedDBKey& primary_key,
100 ::indexed_db::mojom::ValuePtr value, 104 ::indexed_db::mojom::ValuePtr value,
101 const std::vector<IndexedDBBlobInfo>& blob_info); 105 const std::vector<IndexedDBBlobInfo>& blob_info);
102 void SendSuccessValue(::indexed_db::mojom::ReturnValuePtr value, 106 void SendSuccessValue(::indexed_db::mojom::ReturnValuePtr value,
103 const std::vector<IndexedDBBlobInfo>& blob_info); 107 const std::vector<IndexedDBBlobInfo>& blob_info);
104 void SendSuccessCursorContinue( 108 void SendSuccessCursorContinue(
105 const IndexedDBKey& key, 109 const IndexedDBKey& key,
106 const IndexedDBKey& primary_key, 110 const IndexedDBKey& primary_key,
107 ::indexed_db::mojom::ValuePtr value, 111 ::indexed_db::mojom::ValuePtr value,
(...skipping 10 matching lines...) Expand all
118 void SendSuccessInteger(int64_t value); 122 void SendSuccessInteger(int64_t value);
119 void SendSuccess(); 123 void SendSuccess();
120 124
121 std::string CreateBlobData(const IndexedDBBlobInfo& blob_info); 125 std::string CreateBlobData(const IndexedDBBlobInfo& blob_info);
122 bool CreateAllBlobs( 126 bool CreateAllBlobs(
123 const std::vector<IndexedDBBlobInfo>& blob_info, 127 const std::vector<IndexedDBBlobInfo>& blob_info,
124 std::vector<::indexed_db::mojom::BlobInfoPtr>* blob_or_file_info); 128 std::vector<::indexed_db::mojom::BlobInfoPtr>* blob_or_file_info);
125 void OnConnectionError(); 129 void OnConnectionError();
126 130
127 private: 131 private:
128 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host_; 132 base::WeakPtr<IndexedDBDispatcherHost> dispatcher_host_;
129 ::indexed_db::mojom::CallbacksAssociatedPtr callbacks_; 133 ::indexed_db::mojom::CallbacksAssociatedPtr callbacks_;
134 url::Origin origin_;
135 scoped_refptr<base::SequencedTaskRunner> idb_runner_;
130 136
131 DISALLOW_COPY_AND_ASSIGN(IOThreadHelper); 137 DISALLOW_COPY_AND_ASSIGN(IOThreadHelper);
132 }; 138 };
133 139
134 // static 140 // static
135 ::indexed_db::mojom::ValuePtr IndexedDBCallbacks::ConvertAndEraseValue( 141 ::indexed_db::mojom::ValuePtr IndexedDBCallbacks::ConvertAndEraseValue(
136 IndexedDBValue* value) { 142 IndexedDBValue* value) {
137 auto mojo_value = ::indexed_db::mojom::Value::New(); 143 auto mojo_value = ::indexed_db::mojom::Value::New();
138 if (!value->empty()) 144 if (!value->empty())
139 swap(mojo_value->bits, value->bits); 145 swap(mojo_value->bits, value->bits);
140 ConvertBlobInfo(value->blob_info, &mojo_value->blob_or_file_info); 146 ConvertBlobInfo(value->blob_info, &mojo_value->blob_or_file_info);
141 return mojo_value; 147 return mojo_value;
142 } 148 }
143 149
144 IndexedDBCallbacks::IndexedDBCallbacks( 150 IndexedDBCallbacks::IndexedDBCallbacks(
145 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host, 151 base::WeakPtr<IndexedDBDispatcherHost> dispatcher_host,
146 const url::Origin& origin, 152 const url::Origin& origin,
147 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) 153 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info,
148 : dispatcher_host_(std::move(dispatcher_host)), 154 scoped_refptr<base::SequencedTaskRunner> idb_runner)
149 origin_(origin), 155 : data_loss_(blink::WebIDBDataLossNone),
150 data_loss_(blink::WebIDBDataLossNone), 156 io_helper_(new IOThreadHelper(std::move(callbacks_info),
151 sent_blocked_(false), 157 std::move(dispatcher_host),
152 io_helper_( 158 origin,
153 new IOThreadHelper(std::move(callbacks_info), dispatcher_host_)) { 159 std::move(idb_runner))) {
154 DCHECK_CURRENTLY_ON(BrowserThread::IO); 160 DCHECK_CURRENTLY_ON(BrowserThread::IO);
155 thread_checker_.DetachFromThread(); 161 thread_checker_.DetachFromThread();
156 } 162 }
157 163
158 IndexedDBCallbacks::~IndexedDBCallbacks() { 164 IndexedDBCallbacks::~IndexedDBCallbacks() {
159 DCHECK(thread_checker_.CalledOnValidThread()); 165 DCHECK(thread_checker_.CalledOnValidThread());
160 } 166 }
161 167
162 void IndexedDBCallbacks::OnError(const IndexedDBDatabaseError& error) { 168 void IndexedDBCallbacks::OnError(const IndexedDBDatabaseError& error) {
163 DCHECK(thread_checker_.CalledOnValidThread()); 169 DCHECK(thread_checker_.CalledOnValidThread());
164 DCHECK(dispatcher_host_); 170 DCHECK(!closed_);
165 171
166 BrowserThread::PostTask( 172 BrowserThread::PostTask(
167 BrowserThread::IO, FROM_HERE, 173 BrowserThread::IO, FROM_HERE,
168 base::Bind(&IOThreadHelper::SendError, base::Unretained(io_helper_.get()), 174 base::Bind(&IOThreadHelper::SendError, base::Unretained(io_helper_.get()),
169 error)); 175 error));
170 dispatcher_host_ = nullptr; 176 closed_ = true;
171 177
172 if (!connection_open_start_time_.is_null()) { 178 if (!connection_open_start_time_.is_null()) {
173 UMA_HISTOGRAM_MEDIUM_TIMES( 179 UMA_HISTOGRAM_MEDIUM_TIMES(
174 "WebCore.IndexedDB.OpenTime.Error", 180 "WebCore.IndexedDB.OpenTime.Error",
175 base::TimeTicks::Now() - connection_open_start_time_); 181 base::TimeTicks::Now() - connection_open_start_time_);
176 connection_open_start_time_ = base::TimeTicks(); 182 connection_open_start_time_ = base::TimeTicks();
177 } 183 }
178 } 184 }
179 185
180 void IndexedDBCallbacks::OnSuccess(const std::vector<base::string16>& value) { 186 void IndexedDBCallbacks::OnSuccess(const std::vector<base::string16>& value) {
181 DCHECK(thread_checker_.CalledOnValidThread()); 187 DCHECK(thread_checker_.CalledOnValidThread());
182 DCHECK(dispatcher_host_); 188 DCHECK(!closed_);
183 DCHECK(io_helper_); 189 DCHECK(io_helper_);
184 190
185 BrowserThread::PostTask( 191 BrowserThread::PostTask(
186 BrowserThread::IO, FROM_HERE, 192 BrowserThread::IO, FROM_HERE,
187 base::Bind(&IOThreadHelper::SendSuccessStringList, 193 base::Bind(&IOThreadHelper::SendSuccessStringList,
188 base::Unretained(io_helper_.get()), value)); 194 base::Unretained(io_helper_.get()), value));
189 dispatcher_host_ = nullptr; 195 closed_ = true;
190 } 196 }
191 197
192 void IndexedDBCallbacks::OnBlocked(int64_t existing_version) { 198 void IndexedDBCallbacks::OnBlocked(int64_t existing_version) {
193 DCHECK(thread_checker_.CalledOnValidThread()); 199 DCHECK(thread_checker_.CalledOnValidThread());
194 DCHECK(dispatcher_host_); 200 DCHECK(!closed_);
195 DCHECK(io_helper_); 201 DCHECK(io_helper_);
196 202
197 if (sent_blocked_) 203 if (sent_blocked_)
198 return; 204 return;
199 205
200 sent_blocked_ = true; 206 sent_blocked_ = true;
201 207
202 BrowserThread::PostTask( 208 BrowserThread::PostTask(
203 BrowserThread::IO, FROM_HERE, 209 BrowserThread::IO, FROM_HERE,
204 base::Bind(&IOThreadHelper::SendBlocked, 210 base::Bind(&IOThreadHelper::SendBlocked,
205 base::Unretained(io_helper_.get()), existing_version)); 211 base::Unretained(io_helper_.get()), existing_version));
206 212
207 if (!connection_open_start_time_.is_null()) { 213 if (!connection_open_start_time_.is_null()) {
208 UMA_HISTOGRAM_MEDIUM_TIMES( 214 UMA_HISTOGRAM_MEDIUM_TIMES(
209 "WebCore.IndexedDB.OpenTime.Blocked", 215 "WebCore.IndexedDB.OpenTime.Blocked",
210 base::TimeTicks::Now() - connection_open_start_time_); 216 base::TimeTicks::Now() - connection_open_start_time_);
211 connection_open_start_time_ = base::TimeTicks(); 217 connection_open_start_time_ = base::TimeTicks();
212 } 218 }
213 } 219 }
214 220
215 void IndexedDBCallbacks::OnUpgradeNeeded( 221 void IndexedDBCallbacks::OnUpgradeNeeded(
216 int64_t old_version, 222 int64_t old_version,
217 std::unique_ptr<IndexedDBConnection> connection, 223 std::unique_ptr<IndexedDBConnection> connection,
218 const IndexedDBDatabaseMetadata& metadata, 224 const IndexedDBDatabaseMetadata& metadata,
219 const IndexedDBDataLossInfo& data_loss_info) { 225 const IndexedDBDataLossInfo& data_loss_info) {
220 DCHECK(thread_checker_.CalledOnValidThread()); 226 DCHECK(thread_checker_.CalledOnValidThread());
221 DCHECK(dispatcher_host_); 227 DCHECK(!closed_);
222 DCHECK(io_helper_); 228 DCHECK(io_helper_);
223 229
224 DCHECK(!database_sent_); 230 DCHECK(!database_created_);
225 231
226 data_loss_ = data_loss_info.status; 232 data_loss_ = data_loss_info.status;
227 database_sent_ = true; 233 database_created_ = true;
228 auto database = base::MakeUnique<DatabaseImpl>(std::move(connection), origin_,
229 dispatcher_host_);
230 234
231 BrowserThread::PostTask( 235 BrowserThread::PostTask(
232 BrowserThread::IO, FROM_HERE, 236 BrowserThread::IO, FROM_HERE,
233 base::Bind(&IOThreadHelper::SendUpgradeNeeded, 237 base::Bind(&IOThreadHelper::SendUpgradeNeeded,
234 base::Unretained(io_helper_.get()), base::Passed(&database), 238 base::Unretained(io_helper_.get()), base::Passed(&connection),
235 old_version, data_loss_info.status, data_loss_info.message, 239 old_version, data_loss_info.status, data_loss_info.message,
236 metadata)); 240 metadata));
237 241
238 if (!connection_open_start_time_.is_null()) { 242 if (!connection_open_start_time_.is_null()) {
239 UMA_HISTOGRAM_MEDIUM_TIMES( 243 UMA_HISTOGRAM_MEDIUM_TIMES(
240 "WebCore.IndexedDB.OpenTime.UpgradeNeeded", 244 "WebCore.IndexedDB.OpenTime.UpgradeNeeded",
241 base::TimeTicks::Now() - connection_open_start_time_); 245 base::TimeTicks::Now() - connection_open_start_time_);
242 connection_open_start_time_ = base::TimeTicks(); 246 connection_open_start_time_ = base::TimeTicks();
243 } 247 }
244 } 248 }
245 249
246 void IndexedDBCallbacks::OnSuccess( 250 void IndexedDBCallbacks::OnSuccess(
247 std::unique_ptr<IndexedDBConnection> connection, 251 std::unique_ptr<IndexedDBConnection> connection,
248 const IndexedDBDatabaseMetadata& metadata) { 252 const IndexedDBDatabaseMetadata& metadata) {
249 DCHECK(thread_checker_.CalledOnValidThread()); 253 DCHECK(thread_checker_.CalledOnValidThread());
250 DCHECK(dispatcher_host_); 254 DCHECK(!closed_);
251 DCHECK(io_helper_); 255 DCHECK(io_helper_);
252 256
253 DCHECK_EQ(database_sent_, !connection); 257 DCHECK_EQ(database_created_, !connection);
254 258
255 scoped_refptr<IndexedDBCallbacks> self(this); 259 scoped_refptr<IndexedDBCallbacks> self(this);
256 260
257 // Only send a new Database if the connection was not previously sent in 261 // Only create a new Database if the connection was not previously sent in
258 // OnUpgradeNeeded. 262 // OnUpgradeNeeded.
259 std::unique_ptr<DatabaseImpl> database; 263 std::unique_ptr<IndexedDBConnection> database_connection;
260 if (!database_sent_) { 264 if (!database_created_) {
261 database.reset( 265 database_connection = std::move(connection);
262 new DatabaseImpl(std::move(connection), origin_, dispatcher_host_));
263 } 266 }
Reilly Grant (use Gerrit) 2017/03/11 00:31:40 nit: No braces around single-line ifs.
dmurph 2017/03/29 18:40:24 Done.
264 267
265 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 268 BrowserThread::PostTask(
266 base::Bind(&IOThreadHelper::SendSuccessDatabase, 269 BrowserThread::IO, FROM_HERE,
267 base::Unretained(io_helper_.get()), 270 base::Bind(&IOThreadHelper::SendSuccessDatabase,
268 base::Passed(&database), metadata)); 271 base::Unretained(io_helper_.get()),
269 dispatcher_host_ = nullptr; 272 base::Passed(&database_connection), metadata));
273 closed_ = true;
270 274
271 if (!connection_open_start_time_.is_null()) { 275 if (!connection_open_start_time_.is_null()) {
272 UMA_HISTOGRAM_MEDIUM_TIMES( 276 UMA_HISTOGRAM_MEDIUM_TIMES(
273 "WebCore.IndexedDB.OpenTime.Success", 277 "WebCore.IndexedDB.OpenTime.Success",
274 base::TimeTicks::Now() - connection_open_start_time_); 278 base::TimeTicks::Now() - connection_open_start_time_);
275 connection_open_start_time_ = base::TimeTicks(); 279 connection_open_start_time_ = base::TimeTicks();
276 } 280 }
277 } 281 }
278 282
279 void IndexedDBCallbacks::OnSuccess(std::unique_ptr<IndexedDBCursor> cursor, 283 void IndexedDBCallbacks::OnSuccess(std::unique_ptr<IndexedDBCursor> cursor,
280 const IndexedDBKey& key, 284 const IndexedDBKey& key,
281 const IndexedDBKey& primary_key, 285 const IndexedDBKey& primary_key,
282 IndexedDBValue* value) { 286 IndexedDBValue* value) {
283 DCHECK(thread_checker_.CalledOnValidThread()); 287 DCHECK(thread_checker_.CalledOnValidThread());
284 DCHECK(dispatcher_host_); 288 DCHECK(!closed_);
285 DCHECK(io_helper_); 289 DCHECK(io_helper_);
286 290
287 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 291 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
288 292
289 auto cursor_impl = base::MakeUnique<CursorImpl>(std::move(cursor), origin_,
290 dispatcher_host_);
291
292 ::indexed_db::mojom::ValuePtr mojo_value; 293 ::indexed_db::mojom::ValuePtr mojo_value;
293 std::vector<IndexedDBBlobInfo> blob_info; 294 std::vector<IndexedDBBlobInfo> blob_info;
294 if (value) { 295 if (value) {
295 mojo_value = ConvertAndEraseValue(value); 296 mojo_value = ConvertAndEraseValue(value);
296 blob_info.swap(value->blob_info); 297 blob_info.swap(value->blob_info);
297 } 298 }
298 299
299 BrowserThread::PostTask( 300 BrowserThread::PostTask(
300 BrowserThread::IO, FROM_HERE, 301 BrowserThread::IO, FROM_HERE,
301 base::Bind(&IOThreadHelper::SendSuccessCursor, 302 base::Bind(&IOThreadHelper::SendSuccessCursor,
302 base::Unretained(io_helper_.get()), base::Passed(&cursor_impl), 303 base::Unretained(io_helper_.get()), base::Passed(&cursor), key,
303 key, primary_key, base::Passed(&mojo_value), 304 primary_key, base::Passed(&mojo_value),
304 base::Passed(&blob_info))); 305 base::Passed(&blob_info)));
305 dispatcher_host_ = nullptr; 306 closed_ = true;
306 } 307 }
307 308
308 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key, 309 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key,
309 const IndexedDBKey& primary_key, 310 const IndexedDBKey& primary_key,
310 IndexedDBValue* value) { 311 IndexedDBValue* value) {
311 DCHECK(thread_checker_.CalledOnValidThread()); 312 DCHECK(thread_checker_.CalledOnValidThread());
312 DCHECK(dispatcher_host_); 313 DCHECK(!closed_);
313 DCHECK(io_helper_); 314 DCHECK(io_helper_);
314 315
315 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 316 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
316 317
317 ::indexed_db::mojom::ValuePtr mojo_value; 318 ::indexed_db::mojom::ValuePtr mojo_value;
318 std::vector<IndexedDBBlobInfo> blob_info; 319 std::vector<IndexedDBBlobInfo> blob_info;
319 if (value) { 320 if (value) {
320 mojo_value = ConvertAndEraseValue(value); 321 mojo_value = ConvertAndEraseValue(value);
321 blob_info.swap(value->blob_info); 322 blob_info.swap(value->blob_info);
322 } 323 }
323 324
324 BrowserThread::PostTask( 325 BrowserThread::PostTask(
325 BrowserThread::IO, FROM_HERE, 326 BrowserThread::IO, FROM_HERE,
326 base::Bind(&IOThreadHelper::SendSuccessCursorContinue, 327 base::Bind(&IOThreadHelper::SendSuccessCursorContinue,
327 base::Unretained(io_helper_.get()), key, primary_key, 328 base::Unretained(io_helper_.get()), key, primary_key,
328 base::Passed(&mojo_value), base::Passed(&blob_info))); 329 base::Passed(&mojo_value), base::Passed(&blob_info)));
329 dispatcher_host_ = nullptr; 330 closed_ = true;
330 } 331 }
331 332
332 void IndexedDBCallbacks::OnSuccessWithPrefetch( 333 void IndexedDBCallbacks::OnSuccessWithPrefetch(
333 const std::vector<IndexedDBKey>& keys, 334 const std::vector<IndexedDBKey>& keys,
334 const std::vector<IndexedDBKey>& primary_keys, 335 const std::vector<IndexedDBKey>& primary_keys,
335 std::vector<IndexedDBValue>* values) { 336 std::vector<IndexedDBValue>* values) {
336 DCHECK(thread_checker_.CalledOnValidThread()); 337 DCHECK(thread_checker_.CalledOnValidThread());
337 DCHECK(dispatcher_host_); 338 DCHECK(!closed_);
338 DCHECK(io_helper_); 339 DCHECK(io_helper_);
339 DCHECK_EQ(keys.size(), primary_keys.size()); 340 DCHECK_EQ(keys.size(), primary_keys.size());
340 DCHECK_EQ(keys.size(), values->size()); 341 DCHECK_EQ(keys.size(), values->size());
341 342
342 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 343 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
343 344
344 std::vector<::indexed_db::mojom::ValuePtr> mojo_values; 345 std::vector<::indexed_db::mojom::ValuePtr> mojo_values;
345 mojo_values.reserve(values->size()); 346 mojo_values.reserve(values->size());
346 for (size_t i = 0; i < values->size(); ++i) 347 for (size_t i = 0; i < values->size(); ++i)
347 mojo_values.push_back(ConvertAndEraseValue(&(*values)[i])); 348 mojo_values.push_back(ConvertAndEraseValue(&(*values)[i]));
348 349
349 BrowserThread::PostTask( 350 BrowserThread::PostTask(
350 BrowserThread::IO, FROM_HERE, 351 BrowserThread::IO, FROM_HERE,
351 base::Bind(&IOThreadHelper::SendSuccessCursorPrefetch, 352 base::Bind(&IOThreadHelper::SendSuccessCursorPrefetch,
352 base::Unretained(io_helper_.get()), keys, primary_keys, 353 base::Unretained(io_helper_.get()), keys, primary_keys,
353 base::Passed(&mojo_values), *values)); 354 base::Passed(&mojo_values), *values));
354 dispatcher_host_ = nullptr; 355 closed_ = true;
355 } 356 }
356 357
357 void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) { 358 void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) {
358 DCHECK(thread_checker_.CalledOnValidThread()); 359 DCHECK(thread_checker_.CalledOnValidThread());
359 DCHECK(dispatcher_host_); 360 DCHECK(!closed_);
360 361
361 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 362 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
362 363
363 ::indexed_db::mojom::ReturnValuePtr mojo_value; 364 ::indexed_db::mojom::ReturnValuePtr mojo_value;
364 std::vector<IndexedDBBlobInfo> blob_info; 365 std::vector<IndexedDBBlobInfo> blob_info;
365 if (value) { 366 if (value) {
366 mojo_value = ConvertReturnValue(value); 367 mojo_value = ConvertReturnValue(value);
367 blob_info = value->blob_info; 368 blob_info = value->blob_info;
368 } 369 }
369 370
370 BrowserThread::PostTask( 371 BrowserThread::PostTask(
371 BrowserThread::IO, FROM_HERE, 372 BrowserThread::IO, FROM_HERE,
372 base::Bind(&IOThreadHelper::SendSuccessValue, 373 base::Bind(&IOThreadHelper::SendSuccessValue,
373 base::Unretained(io_helper_.get()), base::Passed(&mojo_value), 374 base::Unretained(io_helper_.get()), base::Passed(&mojo_value),
374 base::Passed(&blob_info))); 375 base::Passed(&blob_info)));
375 dispatcher_host_ = nullptr; 376 closed_ = true;
376 } 377 }
377 378
378 void IndexedDBCallbacks::OnSuccessArray( 379 void IndexedDBCallbacks::OnSuccessArray(
379 std::vector<IndexedDBReturnValue>* values) { 380 std::vector<IndexedDBReturnValue>* values) {
380 DCHECK(thread_checker_.CalledOnValidThread()); 381 DCHECK(thread_checker_.CalledOnValidThread());
381 DCHECK(dispatcher_host_); 382 DCHECK(!closed_);
382 DCHECK(io_helper_); 383 DCHECK(io_helper_);
383 384
384 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 385 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
385 386
386 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values; 387 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values;
387 mojo_values.reserve(values->size()); 388 mojo_values.reserve(values->size());
388 for (size_t i = 0; i < values->size(); ++i) 389 for (size_t i = 0; i < values->size(); ++i)
389 mojo_values.push_back(ConvertReturnValue(&(*values)[i])); 390 mojo_values.push_back(ConvertReturnValue(&(*values)[i]));
390 391
391 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 392 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
392 base::Bind(&IOThreadHelper::SendSuccessArray, 393 base::Bind(&IOThreadHelper::SendSuccessArray,
393 base::Unretained(io_helper_.get()), 394 base::Unretained(io_helper_.get()),
394 base::Passed(&mojo_values), *values)); 395 base::Passed(&mojo_values), *values));
395 dispatcher_host_ = nullptr; 396 closed_ = true;
396 } 397 }
397 398
398 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& value) { 399 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& value) {
399 DCHECK(thread_checker_.CalledOnValidThread()); 400 DCHECK(thread_checker_.CalledOnValidThread());
400 DCHECK(dispatcher_host_); 401 DCHECK(!closed_);
401 DCHECK(io_helper_); 402 DCHECK(io_helper_);
402 403
403 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 404 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
404 405
405 BrowserThread::PostTask( 406 BrowserThread::PostTask(
406 BrowserThread::IO, FROM_HERE, 407 BrowserThread::IO, FROM_HERE,
407 base::Bind(&IOThreadHelper::SendSuccessKey, 408 base::Bind(&IOThreadHelper::SendSuccessKey,
408 base::Unretained(io_helper_.get()), value)); 409 base::Unretained(io_helper_.get()), value));
409 dispatcher_host_ = nullptr; 410 closed_ = true;
410 } 411 }
411 412
412 void IndexedDBCallbacks::OnSuccess(int64_t value) { 413 void IndexedDBCallbacks::OnSuccess(int64_t value) {
413 DCHECK(thread_checker_.CalledOnValidThread()); 414 DCHECK(thread_checker_.CalledOnValidThread());
414 DCHECK(dispatcher_host_); 415 DCHECK(!closed_);
415 416
416 BrowserThread::PostTask( 417 BrowserThread::PostTask(
417 BrowserThread::IO, FROM_HERE, 418 BrowserThread::IO, FROM_HERE,
418 base::Bind(&IOThreadHelper::SendSuccessInteger, 419 base::Bind(&IOThreadHelper::SendSuccessInteger,
419 base::Unretained(io_helper_.get()), value)); 420 base::Unretained(io_helper_.get()), value));
420 dispatcher_host_ = nullptr; 421 closed_ = true;
421 } 422 }
422 423
423 void IndexedDBCallbacks::OnSuccess() { 424 void IndexedDBCallbacks::OnSuccess() {
424 DCHECK(thread_checker_.CalledOnValidThread()); 425 DCHECK(thread_checker_.CalledOnValidThread());
425 DCHECK(dispatcher_host_); 426 DCHECK(!closed_);
426 DCHECK(io_helper_); 427 DCHECK(io_helper_);
427 428
428 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 429 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
429 430
430 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 431 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
431 base::Bind(&IOThreadHelper::SendSuccess, 432 base::Bind(&IOThreadHelper::SendSuccess,
432 base::Unretained(io_helper_.get()))); 433 base::Unretained(io_helper_.get())));
433 dispatcher_host_ = nullptr; 434 closed_ = true;
434 } 435 }
435 436
436 void IndexedDBCallbacks::SetConnectionOpenStartTime( 437 void IndexedDBCallbacks::SetConnectionOpenStartTime(
437 const base::TimeTicks& start_time) { 438 const base::TimeTicks& start_time) {
438 connection_open_start_time_ = start_time; 439 connection_open_start_time_ = start_time;
439 } 440 }
440 441
441 IndexedDBCallbacks::IOThreadHelper::IOThreadHelper( 442 IndexedDBCallbacks::IOThreadHelper::IOThreadHelper(
442 CallbacksAssociatedPtrInfo callbacks_info, 443 CallbacksAssociatedPtrInfo callbacks_info,
443 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host) 444 base::WeakPtr<IndexedDBDispatcherHost> dispatcher_host,
444 : dispatcher_host_(std::move(dispatcher_host)) { 445 url::Origin origin,
446 scoped_refptr<base::SequencedTaskRunner> idb_runner)
447 : dispatcher_host_(std::move(dispatcher_host)),
448 origin_(origin),
449 idb_runner_(idb_runner) {
445 DCHECK_CURRENTLY_ON(BrowserThread::IO); 450 DCHECK_CURRENTLY_ON(BrowserThread::IO);
446 if (callbacks_info.is_valid()) { 451 if (callbacks_info.is_valid()) {
447 callbacks_.Bind(std::move(callbacks_info)); 452 callbacks_.Bind(std::move(callbacks_info));
448 callbacks_.set_connection_error_handler( 453 callbacks_.set_connection_error_handler(
449 base::Bind(&IOThreadHelper::OnConnectionError, base::Unretained(this))); 454 base::Bind(&IOThreadHelper::OnConnectionError, base::Unretained(this)));
450 } 455 }
451 } 456 }
452 457
453 IndexedDBCallbacks::IOThreadHelper::~IOThreadHelper() {} 458 IndexedDBCallbacks::IOThreadHelper::~IOThreadHelper() {}
454 459
455 void IndexedDBCallbacks::IOThreadHelper::SendError( 460 void IndexedDBCallbacks::IOThreadHelper::SendError(
456 const IndexedDBDatabaseError& error) { 461 const IndexedDBDatabaseError& error) {
457 if (callbacks_) 462 if (!callbacks_)
458 callbacks_->Error(error.code(), error.message()); 463 return;
464 if (!dispatcher_host_) {
465 OnConnectionError();
466 return;
467 }
468 callbacks_->Error(error.code(), error.message());
459 } 469 }
460 470
461 void IndexedDBCallbacks::IOThreadHelper::SendSuccessStringList( 471 void IndexedDBCallbacks::IOThreadHelper::SendSuccessStringList(
462 const std::vector<base::string16>& value) { 472 const std::vector<base::string16>& value) {
463 if (callbacks_) 473 if (!callbacks_)
464 callbacks_->SuccessStringList(value); 474 return;
475 if (!dispatcher_host_) {
476 OnConnectionError();
477 return;
478 }
479 callbacks_->SuccessStringList(value);
465 } 480 }
466 481
467 void IndexedDBCallbacks::IOThreadHelper::SendBlocked(int64_t existing_version) { 482 void IndexedDBCallbacks::IOThreadHelper::SendBlocked(int64_t existing_version) {
483 if (!dispatcher_host_) {
484 OnConnectionError();
485 return;
486 }
468 if (callbacks_) 487 if (callbacks_)
469 callbacks_->Blocked(existing_version); 488 callbacks_->Blocked(existing_version);
470 } 489 }
471 490
472 void IndexedDBCallbacks::IOThreadHelper::SendUpgradeNeeded( 491 void IndexedDBCallbacks::IOThreadHelper::SendUpgradeNeeded(
473 std::unique_ptr<DatabaseImpl> database, 492 std::unique_ptr<IndexedDBConnection> connection,
474 int64_t old_version, 493 int64_t old_version,
475 blink::WebIDBDataLoss data_loss, 494 blink::WebIDBDataLoss data_loss,
476 const std::string& data_loss_message, 495 const std::string& data_loss_message,
477 const content::IndexedDBDatabaseMetadata& metadata) { 496 const content::IndexedDBDatabaseMetadata& metadata) {
478 if (!callbacks_) 497 if (!callbacks_)
479 return; 498 return;
499 if (!dispatcher_host_) {
500 OnConnectionError();
501 return;
502 }
503
504 auto database = base::MakeUnique<DatabaseImpl>(
505 std::move(connection), origin_, dispatcher_host_.get(), idb_runner_);
480 506
481 ::indexed_db::mojom::DatabaseAssociatedPtrInfo ptr_info; 507 ::indexed_db::mojom::DatabaseAssociatedPtrInfo ptr_info;
482 auto request = mojo::MakeRequest(&ptr_info); 508 auto request = mojo::MakeRequest(&ptr_info);
483 mojo::MakeStrongAssociatedBinding(std::move(database), std::move(request)); 509
510 dispatcher_host_->AddDatabaseBinding(std::move(database), std::move(request));
484 callbacks_->UpgradeNeeded(std::move(ptr_info), old_version, data_loss, 511 callbacks_->UpgradeNeeded(std::move(ptr_info), old_version, data_loss,
485 data_loss_message, metadata); 512 data_loss_message, metadata);
486 } 513 }
487 514
488 void IndexedDBCallbacks::IOThreadHelper::SendSuccessDatabase( 515 void IndexedDBCallbacks::IOThreadHelper::SendSuccessDatabase(
489 std::unique_ptr<DatabaseImpl> database, 516 std::unique_ptr<IndexedDBConnection> connection,
490 const content::IndexedDBDatabaseMetadata& metadata) { 517 const content::IndexedDBDatabaseMetadata& metadata) {
491 if (!callbacks_) 518 if (!callbacks_)
492 return; 519 return;
520 if (!dispatcher_host_) {
521 OnConnectionError();
522 return;
523 }
524 ::indexed_db::mojom::DatabaseAssociatedPtrInfo ptr_info;
525 if (connection) {
526 auto database = base::MakeUnique<DatabaseImpl>(
527 std::move(connection), origin_, dispatcher_host_.get(), idb_runner_);
493 528
494 ::indexed_db::mojom::DatabaseAssociatedPtrInfo ptr_info; 529 if (database) {
Reilly Grant (use Gerrit) 2017/03/11 00:31:40 |database| will always be non-null.
dmurph 2017/03/29 18:40:24 Done.
495 if (database) { 530 auto request = mojo::MakeRequest(&ptr_info);
496 auto request = mojo::MakeRequest(&ptr_info); 531 dispatcher_host_->AddDatabaseBinding(std::move(database),
497 mojo::MakeStrongAssociatedBinding(std::move(database), std::move(request)); 532 std::move(request));
533 }
498 } 534 }
499 callbacks_->SuccessDatabase(std::move(ptr_info), metadata); 535 callbacks_->SuccessDatabase(std::move(ptr_info), metadata);
500 } 536 }
501 537
502 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursor( 538 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursor(
503 std::unique_ptr<CursorImpl> cursor, 539 std::unique_ptr<IndexedDBCursor> cursor,
504 const IndexedDBKey& key, 540 const IndexedDBKey& key,
505 const IndexedDBKey& primary_key, 541 const IndexedDBKey& primary_key,
506 ::indexed_db::mojom::ValuePtr value, 542 ::indexed_db::mojom::ValuePtr value,
507 const std::vector<IndexedDBBlobInfo>& blob_info) { 543 const std::vector<IndexedDBBlobInfo>& blob_info) {
508 if (!callbacks_) 544 if (!callbacks_)
509 return; 545 return;
546 if (!dispatcher_host_) {
547 OnConnectionError();
548 return;
549 }
550 auto cursor_impl = base::MakeUnique<CursorImpl>(
551 std::move(cursor), origin_, dispatcher_host_.get(), idb_runner_);
510 552
511 if (value && !CreateAllBlobs(blob_info, &value->blob_or_file_info)) 553 if (value && !CreateAllBlobs(blob_info, &value->blob_or_file_info))
512 return; 554 return;
513 555
514 ::indexed_db::mojom::CursorAssociatedPtrInfo ptr_info; 556 ::indexed_db::mojom::CursorAssociatedPtrInfo ptr_info;
515 auto request = mojo::MakeRequest(&ptr_info); 557 auto request = mojo::MakeRequest(&ptr_info);
516 mojo::MakeStrongAssociatedBinding(std::move(cursor), std::move(request)); 558 dispatcher_host_->AddCursorBinding(std::move(cursor_impl),
559 std::move(request));
517 callbacks_->SuccessCursor(std::move(ptr_info), key, primary_key, 560 callbacks_->SuccessCursor(std::move(ptr_info), key, primary_key,
518 std::move(value)); 561 std::move(value));
519 } 562 }
520 563
521 void IndexedDBCallbacks::IOThreadHelper::SendSuccessValue( 564 void IndexedDBCallbacks::IOThreadHelper::SendSuccessValue(
522 ::indexed_db::mojom::ReturnValuePtr value, 565 ::indexed_db::mojom::ReturnValuePtr value,
523 const std::vector<IndexedDBBlobInfo>& blob_info) { 566 const std::vector<IndexedDBBlobInfo>& blob_info) {
524 if (!callbacks_) 567 if (!callbacks_)
525 return; 568 return;
569 if (!dispatcher_host_) {
570 OnConnectionError();
571 return;
572 }
526 573
527 if (!value || CreateAllBlobs(blob_info, &value->value->blob_or_file_info)) 574 if (!value || CreateAllBlobs(blob_info, &value->value->blob_or_file_info))
528 callbacks_->SuccessValue(std::move(value)); 575 callbacks_->SuccessValue(std::move(value));
529 } 576 }
530 577
531 void IndexedDBCallbacks::IOThreadHelper::SendSuccessArray( 578 void IndexedDBCallbacks::IOThreadHelper::SendSuccessArray(
532 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values, 579 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values,
533 const std::vector<IndexedDBReturnValue>& values) { 580 const std::vector<IndexedDBReturnValue>& values) {
534 DCHECK_EQ(mojo_values.size(), values.size()); 581 DCHECK_EQ(mojo_values.size(), values.size());
535 582
536 if (!callbacks_) 583 if (!callbacks_)
537 return; 584 return;
585 if (!dispatcher_host_) {
586 OnConnectionError();
587 return;
588 }
538 589
539 for (size_t i = 0; i < mojo_values.size(); ++i) { 590 for (size_t i = 0; i < mojo_values.size(); ++i) {
540 if (!CreateAllBlobs(values[i].blob_info, 591 if (!CreateAllBlobs(values[i].blob_info,
541 &mojo_values[i]->value->blob_or_file_info)) 592 &mojo_values[i]->value->blob_or_file_info))
542 return; 593 return;
543 } 594 }
544 callbacks_->SuccessArray(std::move(mojo_values)); 595 callbacks_->SuccessArray(std::move(mojo_values));
545 } 596 }
546 597
547 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursorContinue( 598 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursorContinue(
548 const IndexedDBKey& key, 599 const IndexedDBKey& key,
549 const IndexedDBKey& primary_key, 600 const IndexedDBKey& primary_key,
550 ::indexed_db::mojom::ValuePtr value, 601 ::indexed_db::mojom::ValuePtr value,
551 const std::vector<IndexedDBBlobInfo>& blob_info) { 602 const std::vector<IndexedDBBlobInfo>& blob_info) {
552 if (!callbacks_) 603 if (!callbacks_)
553 return; 604 return;
605 if (!dispatcher_host_) {
606 OnConnectionError();
607 return;
608 }
554 609
555 if (!value || CreateAllBlobs(blob_info, &value->blob_or_file_info)) 610 if (!value || CreateAllBlobs(blob_info, &value->blob_or_file_info))
556 callbacks_->SuccessCursorContinue(key, primary_key, std::move(value)); 611 callbacks_->SuccessCursorContinue(key, primary_key, std::move(value));
557 } 612 }
558 613
559 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursorPrefetch( 614 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursorPrefetch(
560 const std::vector<IndexedDBKey>& keys, 615 const std::vector<IndexedDBKey>& keys,
561 const std::vector<IndexedDBKey>& primary_keys, 616 const std::vector<IndexedDBKey>& primary_keys,
562 std::vector<::indexed_db::mojom::ValuePtr> mojo_values, 617 std::vector<::indexed_db::mojom::ValuePtr> mojo_values,
563 const std::vector<IndexedDBValue>& values) { 618 const std::vector<IndexedDBValue>& values) {
564 DCHECK_EQ(mojo_values.size(), values.size()); 619 DCHECK_EQ(mojo_values.size(), values.size());
565 620
566 if (!callbacks_) 621 if (!callbacks_)
567 return; 622 return;
623 if (!dispatcher_host_) {
624 OnConnectionError();
625 return;
626 }
568 627
569 for (size_t i = 0; i < mojo_values.size(); ++i) { 628 for (size_t i = 0; i < mojo_values.size(); ++i) {
570 if (!CreateAllBlobs(values[i].blob_info, 629 if (!CreateAllBlobs(values[i].blob_info,
571 &mojo_values[i]->blob_or_file_info)) { 630 &mojo_values[i]->blob_or_file_info)) {
572 return; 631 return;
573 } 632 }
574 } 633 }
575 634
576 callbacks_->SuccessCursorPrefetch(keys, primary_keys, std::move(mojo_values)); 635 callbacks_->SuccessCursorPrefetch(keys, primary_keys, std::move(mojo_values));
577 } 636 }
578 637
579 void IndexedDBCallbacks::IOThreadHelper::SendSuccessKey( 638 void IndexedDBCallbacks::IOThreadHelper::SendSuccessKey(
580 const IndexedDBKey& value) { 639 const IndexedDBKey& value) {
581 if (callbacks_) 640 if (!callbacks_)
582 callbacks_->SuccessKey(value); 641 return;
642 if (!dispatcher_host_) {
643 OnConnectionError();
644 return;
645 }
646 callbacks_->SuccessKey(value);
583 } 647 }
584 648
585 void IndexedDBCallbacks::IOThreadHelper::SendSuccessInteger(int64_t value) { 649 void IndexedDBCallbacks::IOThreadHelper::SendSuccessInteger(int64_t value) {
586 if (callbacks_) 650 if (!callbacks_)
587 callbacks_->SuccessInteger(value); 651 return;
652 if (!dispatcher_host_) {
653 OnConnectionError();
654 return;
655 }
656 callbacks_->SuccessInteger(value);
588 } 657 }
589 658
590 void IndexedDBCallbacks::IOThreadHelper::SendSuccess() { 659 void IndexedDBCallbacks::IOThreadHelper::SendSuccess() {
591 if (callbacks_) 660 if (!callbacks_)
592 callbacks_->Success(); 661 return;
662 if (!dispatcher_host_) {
663 OnConnectionError();
664 return;
665 }
666 callbacks_->Success();
593 } 667 }
594 668
595 std::string IndexedDBCallbacks::IOThreadHelper::CreateBlobData( 669 std::string IndexedDBCallbacks::IOThreadHelper::CreateBlobData(
596 const IndexedDBBlobInfo& blob_info) { 670 const IndexedDBBlobInfo& blob_info) {
597 if (!blob_info.uuid().empty()) { 671 if (!blob_info.uuid().empty()) {
598 // We're sending back a live blob, not a reference into our backing store. 672 // We're sending back a live blob, not a reference into our backing store.
599 return dispatcher_host_->HoldBlobData(blob_info); 673 return dispatcher_host_->HoldBlobData(blob_info);
600 } 674 }
601 scoped_refptr<ShareableFileReference> shareable_file = 675 scoped_refptr<ShareableFileReference> shareable_file =
602 ShareableFileReference::Get(blob_info.file_path()); 676 ShareableFileReference::Get(blob_info.file_path());
603 if (!shareable_file) { 677 if (!shareable_file) {
604 shareable_file = ShareableFileReference::GetOrCreate( 678 shareable_file = ShareableFileReference::GetOrCreate(
605 blob_info.file_path(), 679 blob_info.file_path(),
606 ShareableFileReference::DONT_DELETE_ON_FINAL_RELEASE, 680 ShareableFileReference::DONT_DELETE_ON_FINAL_RELEASE,
607 dispatcher_host_->context()->TaskRunner()); 681 dispatcher_host_->context()->TaskRunner());
608 if (!blob_info.release_callback().is_null()) 682 if (!blob_info.release_callback().is_null())
609 shareable_file->AddFinalReleaseCallback(blob_info.release_callback()); 683 shareable_file->AddFinalReleaseCallback(blob_info.release_callback());
610 } 684 }
611 return dispatcher_host_->HoldBlobData(blob_info); 685 return dispatcher_host_->HoldBlobData(blob_info);
612 } 686 }
613 687
614 bool IndexedDBCallbacks::IOThreadHelper::CreateAllBlobs( 688 bool IndexedDBCallbacks::IOThreadHelper::CreateAllBlobs(
615 const std::vector<IndexedDBBlobInfo>& blob_info, 689 const std::vector<IndexedDBBlobInfo>& blob_info,
616 std::vector<::indexed_db::mojom::BlobInfoPtr>* blob_or_file_info) { 690 std::vector<::indexed_db::mojom::BlobInfoPtr>* blob_or_file_info) {
691 if (!dispatcher_host_) {
692 OnConnectionError();
693 return false;
694 }
617 IDB_TRACE("IndexedDBCallbacks::CreateAllBlobs"); 695 IDB_TRACE("IndexedDBCallbacks::CreateAllBlobs");
618 DCHECK_EQ(blob_info.size(), blob_or_file_info->size()); 696 DCHECK_EQ(blob_info.size(), blob_or_file_info->size());
619 if (!dispatcher_host_->blob_storage_context()) 697 if (!dispatcher_host_->blob_storage_context())
620 return false; 698 return false;
621 for (size_t i = 0; i < blob_info.size(); ++i) 699 for (size_t i = 0; i < blob_info.size(); ++i)
622 (*blob_or_file_info)[i]->uuid = CreateBlobData(blob_info[i]); 700 (*blob_or_file_info)[i]->uuid = CreateBlobData(blob_info[i]);
623 return true; 701 return true;
624 } 702 }
625 703
626 void IndexedDBCallbacks::IOThreadHelper::OnConnectionError() { 704 void IndexedDBCallbacks::IOThreadHelper::OnConnectionError() {
627 callbacks_.reset(); 705 callbacks_.reset();
628 dispatcher_host_ = nullptr; 706 dispatcher_host_ = nullptr;
629 } 707 }
630 708
631 } // namespace content 709 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698