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

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

Issue 2727733004: [IndexedDB] Closing mojo connections when renderer quits (Closed)
Patch Set: tests running 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
pwnall 2017/03/27 21:55:12 Is "Database" still accurate here?
dmurph 2017/03/29 18:40:24 Done.
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 }
264 266
265 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 267 BrowserThread::PostTask(
266 base::Bind(&IOThreadHelper::SendSuccessDatabase, 268 BrowserThread::IO, FROM_HERE,
267 base::Unretained(io_helper_.get()), 269 base::Bind(&IOThreadHelper::SendSuccessDatabase,
268 base::Passed(&database), metadata)); 270 base::Unretained(io_helper_.get()),
269 dispatcher_host_ = nullptr; 271 base::Passed(&database_connection), metadata));
272 closed_ = true;
270 273
271 if (!connection_open_start_time_.is_null()) { 274 if (!connection_open_start_time_.is_null()) {
272 UMA_HISTOGRAM_MEDIUM_TIMES( 275 UMA_HISTOGRAM_MEDIUM_TIMES(
273 "WebCore.IndexedDB.OpenTime.Success", 276 "WebCore.IndexedDB.OpenTime.Success",
274 base::TimeTicks::Now() - connection_open_start_time_); 277 base::TimeTicks::Now() - connection_open_start_time_);
275 connection_open_start_time_ = base::TimeTicks(); 278 connection_open_start_time_ = base::TimeTicks();
276 } 279 }
277 } 280 }
278 281
279 void IndexedDBCallbacks::OnSuccess(std::unique_ptr<IndexedDBCursor> cursor, 282 void IndexedDBCallbacks::OnSuccess(std::unique_ptr<IndexedDBCursor> cursor,
280 const IndexedDBKey& key, 283 const IndexedDBKey& key,
281 const IndexedDBKey& primary_key, 284 const IndexedDBKey& primary_key,
282 IndexedDBValue* value) { 285 IndexedDBValue* value) {
283 DCHECK(thread_checker_.CalledOnValidThread()); 286 DCHECK(thread_checker_.CalledOnValidThread());
284 DCHECK(dispatcher_host_); 287 DCHECK(!closed_);
285 DCHECK(io_helper_); 288 DCHECK(io_helper_);
286 289
287 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 290 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
288 291
289 auto cursor_impl = base::MakeUnique<CursorImpl>(std::move(cursor), origin_,
290 dispatcher_host_);
291
292 ::indexed_db::mojom::ValuePtr mojo_value; 292 ::indexed_db::mojom::ValuePtr mojo_value;
293 std::vector<IndexedDBBlobInfo> blob_info; 293 std::vector<IndexedDBBlobInfo> blob_info;
294 if (value) { 294 if (value) {
295 mojo_value = ConvertAndEraseValue(value); 295 mojo_value = ConvertAndEraseValue(value);
296 blob_info.swap(value->blob_info); 296 blob_info.swap(value->blob_info);
297 } 297 }
298 298
299 BrowserThread::PostTask( 299 BrowserThread::PostTask(
300 BrowserThread::IO, FROM_HERE, 300 BrowserThread::IO, FROM_HERE,
301 base::Bind(&IOThreadHelper::SendSuccessCursor, 301 base::Bind(&IOThreadHelper::SendSuccessCursor,
302 base::Unretained(io_helper_.get()), base::Passed(&cursor_impl), 302 base::Unretained(io_helper_.get()), base::Passed(&cursor), key,
303 key, primary_key, base::Passed(&mojo_value), 303 primary_key, base::Passed(&mojo_value),
304 base::Passed(&blob_info))); 304 base::Passed(&blob_info)));
305 dispatcher_host_ = nullptr; 305 closed_ = true;
306 } 306 }
307 307
308 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key, 308 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key,
309 const IndexedDBKey& primary_key, 309 const IndexedDBKey& primary_key,
310 IndexedDBValue* value) { 310 IndexedDBValue* value) {
311 DCHECK(thread_checker_.CalledOnValidThread()); 311 DCHECK(thread_checker_.CalledOnValidThread());
312 DCHECK(dispatcher_host_); 312 DCHECK(!closed_);
313 DCHECK(io_helper_); 313 DCHECK(io_helper_);
314 314
315 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 315 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
316 316
317 ::indexed_db::mojom::ValuePtr mojo_value; 317 ::indexed_db::mojom::ValuePtr mojo_value;
318 std::vector<IndexedDBBlobInfo> blob_info; 318 std::vector<IndexedDBBlobInfo> blob_info;
319 if (value) { 319 if (value) {
320 mojo_value = ConvertAndEraseValue(value); 320 mojo_value = ConvertAndEraseValue(value);
321 blob_info.swap(value->blob_info); 321 blob_info.swap(value->blob_info);
322 } 322 }
323 323
324 BrowserThread::PostTask( 324 BrowserThread::PostTask(
325 BrowserThread::IO, FROM_HERE, 325 BrowserThread::IO, FROM_HERE,
326 base::Bind(&IOThreadHelper::SendSuccessCursorContinue, 326 base::Bind(&IOThreadHelper::SendSuccessCursorContinue,
327 base::Unretained(io_helper_.get()), key, primary_key, 327 base::Unretained(io_helper_.get()), key, primary_key,
328 base::Passed(&mojo_value), base::Passed(&blob_info))); 328 base::Passed(&mojo_value), base::Passed(&blob_info)));
329 dispatcher_host_ = nullptr; 329 closed_ = true;
330 } 330 }
331 331
332 void IndexedDBCallbacks::OnSuccessWithPrefetch( 332 void IndexedDBCallbacks::OnSuccessWithPrefetch(
333 const std::vector<IndexedDBKey>& keys, 333 const std::vector<IndexedDBKey>& keys,
334 const std::vector<IndexedDBKey>& primary_keys, 334 const std::vector<IndexedDBKey>& primary_keys,
335 std::vector<IndexedDBValue>* values) { 335 std::vector<IndexedDBValue>* values) {
336 DCHECK(thread_checker_.CalledOnValidThread()); 336 DCHECK(thread_checker_.CalledOnValidThread());
337 DCHECK(dispatcher_host_); 337 DCHECK(!closed_);
338 DCHECK(io_helper_); 338 DCHECK(io_helper_);
339 DCHECK_EQ(keys.size(), primary_keys.size()); 339 DCHECK_EQ(keys.size(), primary_keys.size());
340 DCHECK_EQ(keys.size(), values->size()); 340 DCHECK_EQ(keys.size(), values->size());
341 341
342 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 342 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
343 343
344 std::vector<::indexed_db::mojom::ValuePtr> mojo_values; 344 std::vector<::indexed_db::mojom::ValuePtr> mojo_values;
345 mojo_values.reserve(values->size()); 345 mojo_values.reserve(values->size());
346 for (size_t i = 0; i < values->size(); ++i) 346 for (size_t i = 0; i < values->size(); ++i)
347 mojo_values.push_back(ConvertAndEraseValue(&(*values)[i])); 347 mojo_values.push_back(ConvertAndEraseValue(&(*values)[i]));
348 348
349 BrowserThread::PostTask( 349 BrowserThread::PostTask(
350 BrowserThread::IO, FROM_HERE, 350 BrowserThread::IO, FROM_HERE,
351 base::Bind(&IOThreadHelper::SendSuccessCursorPrefetch, 351 base::Bind(&IOThreadHelper::SendSuccessCursorPrefetch,
352 base::Unretained(io_helper_.get()), keys, primary_keys, 352 base::Unretained(io_helper_.get()), keys, primary_keys,
353 base::Passed(&mojo_values), *values)); 353 base::Passed(&mojo_values), *values));
354 dispatcher_host_ = nullptr; 354 closed_ = true;
355 } 355 }
356 356
357 void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) { 357 void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) {
358 DCHECK(thread_checker_.CalledOnValidThread()); 358 DCHECK(thread_checker_.CalledOnValidThread());
359 DCHECK(dispatcher_host_); 359 DCHECK(!closed_);
360 360
361 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 361 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
362 362
363 ::indexed_db::mojom::ReturnValuePtr mojo_value; 363 ::indexed_db::mojom::ReturnValuePtr mojo_value;
364 std::vector<IndexedDBBlobInfo> blob_info; 364 std::vector<IndexedDBBlobInfo> blob_info;
365 if (value) { 365 if (value) {
366 mojo_value = ConvertReturnValue(value); 366 mojo_value = ConvertReturnValue(value);
367 blob_info = value->blob_info; 367 blob_info = value->blob_info;
368 } 368 }
369 369
370 BrowserThread::PostTask( 370 BrowserThread::PostTask(
371 BrowserThread::IO, FROM_HERE, 371 BrowserThread::IO, FROM_HERE,
372 base::Bind(&IOThreadHelper::SendSuccessValue, 372 base::Bind(&IOThreadHelper::SendSuccessValue,
373 base::Unretained(io_helper_.get()), base::Passed(&mojo_value), 373 base::Unretained(io_helper_.get()), base::Passed(&mojo_value),
374 base::Passed(&blob_info))); 374 base::Passed(&blob_info)));
375 dispatcher_host_ = nullptr; 375 closed_ = true;
376 } 376 }
377 377
378 void IndexedDBCallbacks::OnSuccessArray( 378 void IndexedDBCallbacks::OnSuccessArray(
379 std::vector<IndexedDBReturnValue>* values) { 379 std::vector<IndexedDBReturnValue>* values) {
380 DCHECK(thread_checker_.CalledOnValidThread()); 380 DCHECK(thread_checker_.CalledOnValidThread());
381 DCHECK(dispatcher_host_); 381 DCHECK(!closed_);
382 DCHECK(io_helper_); 382 DCHECK(io_helper_);
383 383
384 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 384 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
385 385
386 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values; 386 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values;
387 mojo_values.reserve(values->size()); 387 mojo_values.reserve(values->size());
388 for (size_t i = 0; i < values->size(); ++i) 388 for (size_t i = 0; i < values->size(); ++i)
389 mojo_values.push_back(ConvertReturnValue(&(*values)[i])); 389 mojo_values.push_back(ConvertReturnValue(&(*values)[i]));
390 390
391 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 391 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
392 base::Bind(&IOThreadHelper::SendSuccessArray, 392 base::Bind(&IOThreadHelper::SendSuccessArray,
393 base::Unretained(io_helper_.get()), 393 base::Unretained(io_helper_.get()),
394 base::Passed(&mojo_values), *values)); 394 base::Passed(&mojo_values), *values));
395 dispatcher_host_ = nullptr; 395 closed_ = true;
396 } 396 }
397 397
398 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& value) { 398 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& value) {
399 DCHECK(thread_checker_.CalledOnValidThread()); 399 DCHECK(thread_checker_.CalledOnValidThread());
400 DCHECK(dispatcher_host_); 400 DCHECK(!closed_);
401 DCHECK(io_helper_); 401 DCHECK(io_helper_);
402 402
403 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 403 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
404 404
405 BrowserThread::PostTask( 405 BrowserThread::PostTask(
406 BrowserThread::IO, FROM_HERE, 406 BrowserThread::IO, FROM_HERE,
407 base::Bind(&IOThreadHelper::SendSuccessKey, 407 base::Bind(&IOThreadHelper::SendSuccessKey,
408 base::Unretained(io_helper_.get()), value)); 408 base::Unretained(io_helper_.get()), value));
409 dispatcher_host_ = nullptr; 409 closed_ = true;
410 } 410 }
411 411
412 void IndexedDBCallbacks::OnSuccess(int64_t value) { 412 void IndexedDBCallbacks::OnSuccess(int64_t value) {
413 DCHECK(thread_checker_.CalledOnValidThread()); 413 DCHECK(thread_checker_.CalledOnValidThread());
414 DCHECK(dispatcher_host_); 414 DCHECK(!closed_);
415 415
416 BrowserThread::PostTask( 416 BrowserThread::PostTask(
417 BrowserThread::IO, FROM_HERE, 417 BrowserThread::IO, FROM_HERE,
418 base::Bind(&IOThreadHelper::SendSuccessInteger, 418 base::Bind(&IOThreadHelper::SendSuccessInteger,
419 base::Unretained(io_helper_.get()), value)); 419 base::Unretained(io_helper_.get()), value));
420 dispatcher_host_ = nullptr; 420 closed_ = true;
421 } 421 }
422 422
423 void IndexedDBCallbacks::OnSuccess() { 423 void IndexedDBCallbacks::OnSuccess() {
424 DCHECK(thread_checker_.CalledOnValidThread()); 424 DCHECK(thread_checker_.CalledOnValidThread());
425 DCHECK(dispatcher_host_); 425 DCHECK(!closed_);
426 DCHECK(io_helper_); 426 DCHECK(io_helper_);
427 427
428 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 428 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
429 429
430 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 430 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
431 base::Bind(&IOThreadHelper::SendSuccess, 431 base::Bind(&IOThreadHelper::SendSuccess,
432 base::Unretained(io_helper_.get()))); 432 base::Unretained(io_helper_.get())));
433 dispatcher_host_ = nullptr; 433 closed_ = true;
434 } 434 }
435 435
436 void IndexedDBCallbacks::SetConnectionOpenStartTime( 436 void IndexedDBCallbacks::SetConnectionOpenStartTime(
437 const base::TimeTicks& start_time) { 437 const base::TimeTicks& start_time) {
438 connection_open_start_time_ = start_time; 438 connection_open_start_time_ = start_time;
439 } 439 }
440 440
441 IndexedDBCallbacks::IOThreadHelper::IOThreadHelper( 441 IndexedDBCallbacks::IOThreadHelper::IOThreadHelper(
442 CallbacksAssociatedPtrInfo callbacks_info, 442 CallbacksAssociatedPtrInfo callbacks_info,
443 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host) 443 base::WeakPtr<IndexedDBDispatcherHost> dispatcher_host,
444 : dispatcher_host_(std::move(dispatcher_host)) { 444 url::Origin origin,
445 scoped_refptr<base::SequencedTaskRunner> idb_runner)
446 : dispatcher_host_(std::move(dispatcher_host)),
447 origin_(origin),
448 idb_runner_(idb_runner) {
445 DCHECK_CURRENTLY_ON(BrowserThread::IO); 449 DCHECK_CURRENTLY_ON(BrowserThread::IO);
446 if (callbacks_info.is_valid()) { 450 if (callbacks_info.is_valid()) {
447 callbacks_.Bind(std::move(callbacks_info)); 451 callbacks_.Bind(std::move(callbacks_info));
448 callbacks_.set_connection_error_handler( 452 callbacks_.set_connection_error_handler(
449 base::Bind(&IOThreadHelper::OnConnectionError, base::Unretained(this))); 453 base::Bind(&IOThreadHelper::OnConnectionError, base::Unretained(this)));
450 } 454 }
451 } 455 }
452 456
453 IndexedDBCallbacks::IOThreadHelper::~IOThreadHelper() {} 457 IndexedDBCallbacks::IOThreadHelper::~IOThreadHelper() {}
454 458
455 void IndexedDBCallbacks::IOThreadHelper::SendError( 459 void IndexedDBCallbacks::IOThreadHelper::SendError(
456 const IndexedDBDatabaseError& error) { 460 const IndexedDBDatabaseError& error) {
457 if (callbacks_) 461 if (!callbacks_)
458 callbacks_->Error(error.code(), error.message()); 462 return;
463 if (!dispatcher_host_) {
464 OnConnectionError();
465 return;
466 }
467 callbacks_->Error(error.code(), error.message());
459 } 468 }
460 469
461 void IndexedDBCallbacks::IOThreadHelper::SendSuccessStringList( 470 void IndexedDBCallbacks::IOThreadHelper::SendSuccessStringList(
462 const std::vector<base::string16>& value) { 471 const std::vector<base::string16>& value) {
463 if (callbacks_) 472 if (!callbacks_)
464 callbacks_->SuccessStringList(value); 473 return;
474 if (!dispatcher_host_) {
475 OnConnectionError();
476 return;
477 }
478 callbacks_->SuccessStringList(value);
465 } 479 }
466 480
467 void IndexedDBCallbacks::IOThreadHelper::SendBlocked(int64_t existing_version) { 481 void IndexedDBCallbacks::IOThreadHelper::SendBlocked(int64_t existing_version) {
482 if (!dispatcher_host_) {
483 OnConnectionError();
484 return;
485 }
468 if (callbacks_) 486 if (callbacks_)
469 callbacks_->Blocked(existing_version); 487 callbacks_->Blocked(existing_version);
470 } 488 }
471 489
472 void IndexedDBCallbacks::IOThreadHelper::SendUpgradeNeeded( 490 void IndexedDBCallbacks::IOThreadHelper::SendUpgradeNeeded(
473 std::unique_ptr<DatabaseImpl> database, 491 std::unique_ptr<IndexedDBConnection> connection,
474 int64_t old_version, 492 int64_t old_version,
475 blink::WebIDBDataLoss data_loss, 493 blink::WebIDBDataLoss data_loss,
476 const std::string& data_loss_message, 494 const std::string& data_loss_message,
477 const content::IndexedDBDatabaseMetadata& metadata) { 495 const content::IndexedDBDatabaseMetadata& metadata) {
478 if (!callbacks_) 496 if (!callbacks_)
479 return; 497 return;
498 if (!dispatcher_host_) {
499 OnConnectionError();
500 return;
501 }
502
503 auto database = base::MakeUnique<DatabaseImpl>(
504 std::move(connection), origin_, dispatcher_host_.get(), idb_runner_);
480 505
481 ::indexed_db::mojom::DatabaseAssociatedPtrInfo ptr_info; 506 ::indexed_db::mojom::DatabaseAssociatedPtrInfo ptr_info;
482 auto request = mojo::MakeRequest(&ptr_info); 507 auto request = mojo::MakeRequest(&ptr_info);
483 mojo::MakeStrongAssociatedBinding(std::move(database), std::move(request)); 508
509 dispatcher_host_->AddDatabaseBinding(std::move(database), std::move(request));
484 callbacks_->UpgradeNeeded(std::move(ptr_info), old_version, data_loss, 510 callbacks_->UpgradeNeeded(std::move(ptr_info), old_version, data_loss,
485 data_loss_message, metadata); 511 data_loss_message, metadata);
486 } 512 }
487 513
488 void IndexedDBCallbacks::IOThreadHelper::SendSuccessDatabase( 514 void IndexedDBCallbacks::IOThreadHelper::SendSuccessDatabase(
489 std::unique_ptr<DatabaseImpl> database, 515 std::unique_ptr<IndexedDBConnection> connection,
490 const content::IndexedDBDatabaseMetadata& metadata) { 516 const content::IndexedDBDatabaseMetadata& metadata) {
491 if (!callbacks_) 517 if (!callbacks_)
492 return; 518 return;
519 if (!dispatcher_host_) {
520 OnConnectionError();
521 return;
522 }
523 ::indexed_db::mojom::DatabaseAssociatedPtrInfo ptr_info;
524 if (connection) {
525 auto database = base::MakeUnique<DatabaseImpl>(
526 std::move(connection), origin_, dispatcher_host_.get(), idb_runner_);
493 527
494 ::indexed_db::mojom::DatabaseAssociatedPtrInfo ptr_info;
495 if (database) {
496 auto request = mojo::MakeRequest(&ptr_info); 528 auto request = mojo::MakeRequest(&ptr_info);
497 mojo::MakeStrongAssociatedBinding(std::move(database), std::move(request)); 529 dispatcher_host_->AddDatabaseBinding(std::move(database),
530 std::move(request));
498 } 531 }
499 callbacks_->SuccessDatabase(std::move(ptr_info), metadata); 532 callbacks_->SuccessDatabase(std::move(ptr_info), metadata);
500 } 533 }
501 534
502 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursor( 535 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursor(
503 std::unique_ptr<CursorImpl> cursor, 536 std::unique_ptr<IndexedDBCursor> cursor,
504 const IndexedDBKey& key, 537 const IndexedDBKey& key,
505 const IndexedDBKey& primary_key, 538 const IndexedDBKey& primary_key,
506 ::indexed_db::mojom::ValuePtr value, 539 ::indexed_db::mojom::ValuePtr value,
507 const std::vector<IndexedDBBlobInfo>& blob_info) { 540 const std::vector<IndexedDBBlobInfo>& blob_info) {
508 if (!callbacks_) 541 if (!callbacks_)
509 return; 542 return;
543 if (!dispatcher_host_) {
544 OnConnectionError();
545 return;
546 }
547 auto cursor_impl = base::MakeUnique<CursorImpl>(
548 std::move(cursor), origin_, dispatcher_host_.get(), idb_runner_);
510 549
511 if (value && !CreateAllBlobs(blob_info, &value->blob_or_file_info)) 550 if (value && !CreateAllBlobs(blob_info, &value->blob_or_file_info))
512 return; 551 return;
513 552
514 ::indexed_db::mojom::CursorAssociatedPtrInfo ptr_info; 553 ::indexed_db::mojom::CursorAssociatedPtrInfo ptr_info;
515 auto request = mojo::MakeRequest(&ptr_info); 554 auto request = mojo::MakeRequest(&ptr_info);
516 mojo::MakeStrongAssociatedBinding(std::move(cursor), std::move(request)); 555 dispatcher_host_->AddCursorBinding(std::move(cursor_impl),
556 std::move(request));
517 callbacks_->SuccessCursor(std::move(ptr_info), key, primary_key, 557 callbacks_->SuccessCursor(std::move(ptr_info), key, primary_key,
518 std::move(value)); 558 std::move(value));
519 } 559 }
520 560
521 void IndexedDBCallbacks::IOThreadHelper::SendSuccessValue( 561 void IndexedDBCallbacks::IOThreadHelper::SendSuccessValue(
522 ::indexed_db::mojom::ReturnValuePtr value, 562 ::indexed_db::mojom::ReturnValuePtr value,
523 const std::vector<IndexedDBBlobInfo>& blob_info) { 563 const std::vector<IndexedDBBlobInfo>& blob_info) {
524 if (!callbacks_) 564 if (!callbacks_)
525 return; 565 return;
566 if (!dispatcher_host_) {
567 OnConnectionError();
568 return;
569 }
526 570
527 if (!value || CreateAllBlobs(blob_info, &value->value->blob_or_file_info)) 571 if (!value || CreateAllBlobs(blob_info, &value->value->blob_or_file_info))
528 callbacks_->SuccessValue(std::move(value)); 572 callbacks_->SuccessValue(std::move(value));
529 } 573 }
530 574
531 void IndexedDBCallbacks::IOThreadHelper::SendSuccessArray( 575 void IndexedDBCallbacks::IOThreadHelper::SendSuccessArray(
532 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values, 576 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values,
533 const std::vector<IndexedDBReturnValue>& values) { 577 const std::vector<IndexedDBReturnValue>& values) {
534 DCHECK_EQ(mojo_values.size(), values.size()); 578 DCHECK_EQ(mojo_values.size(), values.size());
535 579
536 if (!callbacks_) 580 if (!callbacks_)
537 return; 581 return;
582 if (!dispatcher_host_) {
583 OnConnectionError();
584 return;
585 }
538 586
539 for (size_t i = 0; i < mojo_values.size(); ++i) { 587 for (size_t i = 0; i < mojo_values.size(); ++i) {
540 if (!CreateAllBlobs(values[i].blob_info, 588 if (!CreateAllBlobs(values[i].blob_info,
541 &mojo_values[i]->value->blob_or_file_info)) 589 &mojo_values[i]->value->blob_or_file_info))
542 return; 590 return;
543 } 591 }
544 callbacks_->SuccessArray(std::move(mojo_values)); 592 callbacks_->SuccessArray(std::move(mojo_values));
545 } 593 }
546 594
547 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursorContinue( 595 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursorContinue(
548 const IndexedDBKey& key, 596 const IndexedDBKey& key,
549 const IndexedDBKey& primary_key, 597 const IndexedDBKey& primary_key,
550 ::indexed_db::mojom::ValuePtr value, 598 ::indexed_db::mojom::ValuePtr value,
551 const std::vector<IndexedDBBlobInfo>& blob_info) { 599 const std::vector<IndexedDBBlobInfo>& blob_info) {
552 if (!callbacks_) 600 if (!callbacks_)
553 return; 601 return;
602 if (!dispatcher_host_) {
603 OnConnectionError();
604 return;
605 }
554 606
555 if (!value || CreateAllBlobs(blob_info, &value->blob_or_file_info)) 607 if (!value || CreateAllBlobs(blob_info, &value->blob_or_file_info))
556 callbacks_->SuccessCursorContinue(key, primary_key, std::move(value)); 608 callbacks_->SuccessCursorContinue(key, primary_key, std::move(value));
557 } 609 }
558 610
559 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursorPrefetch( 611 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursorPrefetch(
560 const std::vector<IndexedDBKey>& keys, 612 const std::vector<IndexedDBKey>& keys,
561 const std::vector<IndexedDBKey>& primary_keys, 613 const std::vector<IndexedDBKey>& primary_keys,
562 std::vector<::indexed_db::mojom::ValuePtr> mojo_values, 614 std::vector<::indexed_db::mojom::ValuePtr> mojo_values,
563 const std::vector<IndexedDBValue>& values) { 615 const std::vector<IndexedDBValue>& values) {
564 DCHECK_EQ(mojo_values.size(), values.size()); 616 DCHECK_EQ(mojo_values.size(), values.size());
565 617
566 if (!callbacks_) 618 if (!callbacks_)
567 return; 619 return;
620 if (!dispatcher_host_) {
621 OnConnectionError();
622 return;
623 }
568 624
569 for (size_t i = 0; i < mojo_values.size(); ++i) { 625 for (size_t i = 0; i < mojo_values.size(); ++i) {
570 if (!CreateAllBlobs(values[i].blob_info, 626 if (!CreateAllBlobs(values[i].blob_info,
571 &mojo_values[i]->blob_or_file_info)) { 627 &mojo_values[i]->blob_or_file_info)) {
572 return; 628 return;
573 } 629 }
574 } 630 }
575 631
576 callbacks_->SuccessCursorPrefetch(keys, primary_keys, std::move(mojo_values)); 632 callbacks_->SuccessCursorPrefetch(keys, primary_keys, std::move(mojo_values));
577 } 633 }
578 634
579 void IndexedDBCallbacks::IOThreadHelper::SendSuccessKey( 635 void IndexedDBCallbacks::IOThreadHelper::SendSuccessKey(
580 const IndexedDBKey& value) { 636 const IndexedDBKey& value) {
581 if (callbacks_) 637 if (!callbacks_)
582 callbacks_->SuccessKey(value); 638 return;
639 if (!dispatcher_host_) {
640 OnConnectionError();
641 return;
642 }
643 callbacks_->SuccessKey(value);
583 } 644 }
584 645
585 void IndexedDBCallbacks::IOThreadHelper::SendSuccessInteger(int64_t value) { 646 void IndexedDBCallbacks::IOThreadHelper::SendSuccessInteger(int64_t value) {
586 if (callbacks_) 647 if (!callbacks_)
587 callbacks_->SuccessInteger(value); 648 return;
649 if (!dispatcher_host_) {
650 OnConnectionError();
651 return;
652 }
653 callbacks_->SuccessInteger(value);
588 } 654 }
589 655
590 void IndexedDBCallbacks::IOThreadHelper::SendSuccess() { 656 void IndexedDBCallbacks::IOThreadHelper::SendSuccess() {
591 if (callbacks_) 657 if (!callbacks_)
592 callbacks_->Success(); 658 return;
659 if (!dispatcher_host_) {
660 OnConnectionError();
661 return;
662 }
663 callbacks_->Success();
593 } 664 }
594 665
595 std::string IndexedDBCallbacks::IOThreadHelper::CreateBlobData( 666 std::string IndexedDBCallbacks::IOThreadHelper::CreateBlobData(
596 const IndexedDBBlobInfo& blob_info) { 667 const IndexedDBBlobInfo& blob_info) {
597 if (!blob_info.uuid().empty()) { 668 if (!blob_info.uuid().empty()) {
598 // We're sending back a live blob, not a reference into our backing store. 669 // We're sending back a live blob, not a reference into our backing store.
599 return dispatcher_host_->HoldBlobData(blob_info); 670 return dispatcher_host_->HoldBlobData(blob_info);
600 } 671 }
601 scoped_refptr<ShareableFileReference> shareable_file = 672 scoped_refptr<ShareableFileReference> shareable_file =
602 ShareableFileReference::Get(blob_info.file_path()); 673 ShareableFileReference::Get(blob_info.file_path());
603 if (!shareable_file) { 674 if (!shareable_file) {
604 shareable_file = ShareableFileReference::GetOrCreate( 675 shareable_file = ShareableFileReference::GetOrCreate(
605 blob_info.file_path(), 676 blob_info.file_path(),
606 ShareableFileReference::DONT_DELETE_ON_FINAL_RELEASE, 677 ShareableFileReference::DONT_DELETE_ON_FINAL_RELEASE,
607 dispatcher_host_->context()->TaskRunner()); 678 dispatcher_host_->context()->TaskRunner());
608 if (!blob_info.release_callback().is_null()) 679 if (!blob_info.release_callback().is_null())
609 shareable_file->AddFinalReleaseCallback(blob_info.release_callback()); 680 shareable_file->AddFinalReleaseCallback(blob_info.release_callback());
610 } 681 }
611 return dispatcher_host_->HoldBlobData(blob_info); 682 return dispatcher_host_->HoldBlobData(blob_info);
612 } 683 }
613 684
614 bool IndexedDBCallbacks::IOThreadHelper::CreateAllBlobs( 685 bool IndexedDBCallbacks::IOThreadHelper::CreateAllBlobs(
615 const std::vector<IndexedDBBlobInfo>& blob_info, 686 const std::vector<IndexedDBBlobInfo>& blob_info,
616 std::vector<::indexed_db::mojom::BlobInfoPtr>* blob_or_file_info) { 687 std::vector<::indexed_db::mojom::BlobInfoPtr>* blob_or_file_info) {
688 if (!dispatcher_host_) {
689 OnConnectionError();
690 return false;
691 }
617 IDB_TRACE("IndexedDBCallbacks::CreateAllBlobs"); 692 IDB_TRACE("IndexedDBCallbacks::CreateAllBlobs");
618 DCHECK_EQ(blob_info.size(), blob_or_file_info->size()); 693 DCHECK_EQ(blob_info.size(), blob_or_file_info->size());
619 if (!dispatcher_host_->blob_storage_context()) 694 if (!dispatcher_host_->blob_storage_context())
620 return false; 695 return false;
621 for (size_t i = 0; i < blob_info.size(); ++i) 696 for (size_t i = 0; i < blob_info.size(); ++i)
622 (*blob_or_file_info)[i]->uuid = CreateBlobData(blob_info[i]); 697 (*blob_or_file_info)[i]->uuid = CreateBlobData(blob_info[i]);
623 return true; 698 return true;
624 } 699 }
625 700
626 void IndexedDBCallbacks::IOThreadHelper::OnConnectionError() { 701 void IndexedDBCallbacks::IOThreadHelper::OnConnectionError() {
627 callbacks_.reset(); 702 callbacks_.reset();
628 dispatcher_host_ = nullptr; 703 dispatcher_host_ = nullptr;
629 } 704 }
630 705
631 } // namespace content 706 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698