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

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

Issue 2370643004: Port messages sent by WebIDBFactoryImpl to Mojo. (Closed)
Patch Set: Address last nits and fix leaks in unit tests. Created 4 years, 2 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/metrics/histogram_macros.h" 12 #include "base/metrics/histogram_macros.h"
13 #include "base/strings/utf_string_conversions.h" 13 #include "base/strings/utf_string_conversions.h"
14 #include "base/time/time.h" 14 #include "base/time/time.h"
15 #include "content/browser/child_process_security_policy_impl.h" 15 #include "content/browser/child_process_security_policy_impl.h"
16 #include "content/browser/fileapi/fileapi_message_filter.h" 16 #include "content/browser/fileapi/fileapi_message_filter.h"
17 #include "content/browser/indexed_db/indexed_db_blob_info.h" 17 #include "content/browser/indexed_db/indexed_db_blob_info.h"
18 #include "content/browser/indexed_db/indexed_db_connection.h" 18 #include "content/browser/indexed_db/indexed_db_connection.h"
19 #include "content/browser/indexed_db/indexed_db_context_impl.h" 19 #include "content/browser/indexed_db/indexed_db_context_impl.h"
20 #include "content/browser/indexed_db/indexed_db_cursor.h" 20 #include "content/browser/indexed_db/indexed_db_cursor.h"
21 #include "content/browser/indexed_db/indexed_db_database_callbacks.h"
22 #include "content/browser/indexed_db/indexed_db_database_error.h" 21 #include "content/browser/indexed_db/indexed_db_database_error.h"
23 #include "content/browser/indexed_db/indexed_db_metadata.h"
24 #include "content/browser/indexed_db/indexed_db_return_value.h" 22 #include "content/browser/indexed_db/indexed_db_return_value.h"
25 #include "content/browser/indexed_db/indexed_db_tracing.h" 23 #include "content/browser/indexed_db/indexed_db_tracing.h"
26 #include "content/browser/indexed_db/indexed_db_value.h" 24 #include "content/browser/indexed_db/indexed_db_value.h"
27 #include "content/common/indexed_db/indexed_db_constants.h" 25 #include "content/common/indexed_db/indexed_db_constants.h"
28 #include "content/common/indexed_db/indexed_db_messages.h" 26 #include "content/common/indexed_db/indexed_db_messages.h"
27 #include "content/common/indexed_db/indexed_db_metadata.h"
29 #include "storage/browser/blob/blob_storage_context.h" 28 #include "storage/browser/blob/blob_storage_context.h"
30 #include "storage/browser/blob/shareable_file_reference.h" 29 #include "storage/browser/blob/shareable_file_reference.h"
31 #include "storage/browser/quota/quota_manager.h" 30 #include "storage/browser/quota/quota_manager.h"
32 31
32 using indexed_db::mojom::CallbacksAssociatedPtrInfo;
33 using storage::ShareableFileReference; 33 using storage::ShareableFileReference;
34 34
35 namespace content { 35 namespace content {
36 36
37 namespace { 37 namespace {
38 const int32_t kNoCursor = -1; 38 const int32_t kNoCursor = -1;
39 const int32_t kNoDatabaseCallbacks = -1;
40 const int64_t kNoTransaction = -1; 39 const int64_t kNoTransaction = -1;
41 } 40 }
42 41
42 class IndexedDBCallbacks::IOThreadHelper {
43 public:
44 explicit IOThreadHelper(CallbacksAssociatedPtrInfo callbacks_info);
45 ~IOThreadHelper();
46
47 void SendError(const IndexedDBDatabaseError& error);
48 void SendSuccessStringList(const std::vector<base::string16>& value);
49 void SendBlocked(int64_t existing_version);
50 void SendUpgradeNeeded(int32_t database_id,
51 int64_t old_version,
52 blink::WebIDBDataLoss data_loss,
53 const std::string& data_loss_message,
54 const content::IndexedDBDatabaseMetadata& metadata);
55 void SendSuccessDatabase(int32_t database_id,
56 const content::IndexedDBDatabaseMetadata& metadata);
57 void SendSuccessInteger(int64_t value);
58
59 private:
60 ::indexed_db::mojom::CallbacksAssociatedPtr callbacks_;
61
62 DISALLOW_COPY_AND_ASSIGN(IOThreadHelper);
63 };
64
43 IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host, 65 IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host,
44 int32_t ipc_thread_id, 66 int32_t ipc_thread_id,
45 int32_t ipc_callbacks_id) 67 int32_t ipc_callbacks_id)
46 : dispatcher_host_(dispatcher_host), 68 : dispatcher_host_(dispatcher_host),
47 ipc_callbacks_id_(ipc_callbacks_id), 69 ipc_callbacks_id_(ipc_callbacks_id),
48 ipc_thread_id_(ipc_thread_id), 70 ipc_thread_id_(ipc_thread_id),
49 ipc_cursor_id_(kNoCursor), 71 ipc_cursor_id_(kNoCursor),
50 host_transaction_id_(kNoTransaction), 72 host_transaction_id_(kNoTransaction),
51 ipc_database_id_(kNoDatabase), 73 ipc_database_id_(kNoDatabase),
52 ipc_database_callbacks_id_(kNoDatabaseCallbacks),
53 data_loss_(blink::WebIDBDataLossNone), 74 data_loss_(blink::WebIDBDataLossNone),
54 sent_blocked_(false) {} 75 sent_blocked_(false),
76 io_helper_(nullptr) {}
55 77
56 IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host, 78 IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host,
57 int32_t ipc_thread_id, 79 int32_t ipc_thread_id,
58 int32_t ipc_callbacks_id, 80 int32_t ipc_callbacks_id,
59 int32_t ipc_cursor_id) 81 int32_t ipc_cursor_id)
60 : dispatcher_host_(dispatcher_host), 82 : dispatcher_host_(dispatcher_host),
61 ipc_callbacks_id_(ipc_callbacks_id), 83 ipc_callbacks_id_(ipc_callbacks_id),
62 ipc_thread_id_(ipc_thread_id), 84 ipc_thread_id_(ipc_thread_id),
63 ipc_cursor_id_(ipc_cursor_id), 85 ipc_cursor_id_(ipc_cursor_id),
64 host_transaction_id_(kNoTransaction), 86 host_transaction_id_(kNoTransaction),
65 ipc_database_id_(kNoDatabase), 87 ipc_database_id_(kNoDatabase),
66 ipc_database_callbacks_id_(kNoDatabaseCallbacks),
67 data_loss_(blink::WebIDBDataLossNone), 88 data_loss_(blink::WebIDBDataLossNone),
68 sent_blocked_(false) {} 89 sent_blocked_(false),
90 io_helper_(nullptr) {}
69 91
70 IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host, 92 IndexedDBCallbacks::IndexedDBCallbacks(
71 int32_t ipc_thread_id, 93 IndexedDBDispatcherHost* dispatcher_host,
72 int32_t ipc_callbacks_id, 94 const url::Origin& origin,
73 int32_t ipc_database_callbacks_id, 95 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info)
74 int64_t host_transaction_id,
75 const url::Origin& origin)
76 : dispatcher_host_(dispatcher_host), 96 : dispatcher_host_(dispatcher_host),
77 ipc_callbacks_id_(ipc_callbacks_id),
78 ipc_thread_id_(ipc_thread_id),
79 ipc_cursor_id_(kNoCursor), 97 ipc_cursor_id_(kNoCursor),
80 host_transaction_id_(host_transaction_id), 98 host_transaction_id_(kNoTransaction),
81 origin_(origin), 99 origin_(origin),
82 ipc_database_id_(kNoDatabase), 100 ipc_database_id_(kNoDatabase),
83 ipc_database_callbacks_id_(ipc_database_callbacks_id),
84 data_loss_(blink::WebIDBDataLossNone), 101 data_loss_(blink::WebIDBDataLossNone),
85 sent_blocked_(false) {} 102 sent_blocked_(false),
103 io_helper_(new IOThreadHelper(std::move(callbacks_info))) {}
86 104
87 IndexedDBCallbacks::~IndexedDBCallbacks() {} 105 IndexedDBCallbacks::~IndexedDBCallbacks() {}
88 106
89 void IndexedDBCallbacks::OnError(const IndexedDBDatabaseError& error) { 107 void IndexedDBCallbacks::OnError(const IndexedDBDatabaseError& error) {
90 DCHECK(dispatcher_host_.get()); 108 DCHECK(dispatcher_host_.get());
91 109
92 dispatcher_host_->Send(new IndexedDBMsg_CallbacksError( 110 if (io_helper_) {
93 ipc_thread_id_, ipc_callbacks_id_, error.code(), error.message())); 111 BrowserThread::PostTask(
94 dispatcher_host_ = NULL; 112 BrowserThread::IO, FROM_HERE,
113 base::Bind(&IOThreadHelper::SendError,
114 base::Unretained(io_helper_.get()), error));
115 } else {
116 dispatcher_host_->Send(new IndexedDBMsg_CallbacksError(
117 ipc_thread_id_, ipc_callbacks_id_, error.code(), error.message()));
118 }
119 dispatcher_host_ = nullptr;
95 120
96 if (!connection_open_start_time_.is_null()) { 121 if (!connection_open_start_time_.is_null()) {
97 UMA_HISTOGRAM_MEDIUM_TIMES( 122 UMA_HISTOGRAM_MEDIUM_TIMES(
98 "WebCore.IndexedDB.OpenTime.Error", 123 "WebCore.IndexedDB.OpenTime.Error",
99 base::TimeTicks::Now() - connection_open_start_time_); 124 base::TimeTicks::Now() - connection_open_start_time_);
100 connection_open_start_time_ = base::TimeTicks(); 125 connection_open_start_time_ = base::TimeTicks();
101 } 126 }
102 } 127 }
103 128
104 void IndexedDBCallbacks::OnSuccess(const std::vector<base::string16>& value) { 129 void IndexedDBCallbacks::OnSuccess(const std::vector<base::string16>& value) {
105 DCHECK(dispatcher_host_.get()); 130 DCHECK(dispatcher_host_.get());
106 131 DCHECK(io_helper_);
107 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 132 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
108 DCHECK_EQ(kNoTransaction, host_transaction_id_); 133 DCHECK_EQ(kNoTransaction, host_transaction_id_);
109 DCHECK_EQ(kNoDatabase, ipc_database_id_); 134 DCHECK_EQ(kNoDatabase, ipc_database_id_);
110 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
111 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
112 135
113 std::vector<base::string16> list; 136 BrowserThread::PostTask(
114 for (unsigned i = 0; i < value.size(); ++i) 137 BrowserThread::IO, FROM_HERE,
115 list.push_back(value[i]); 138 base::Bind(&IOThreadHelper::SendSuccessStringList,
116 139 base::Unretained(io_helper_.get()), value));
117 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessStringList( 140 dispatcher_host_ = nullptr;
118 ipc_thread_id_, ipc_callbacks_id_, list));
119 dispatcher_host_ = NULL;
120 } 141 }
121 142
122 void IndexedDBCallbacks::OnBlocked(int64_t existing_version) { 143 void IndexedDBCallbacks::OnBlocked(int64_t existing_version) {
123 DCHECK(dispatcher_host_.get()); 144 DCHECK(dispatcher_host_.get());
124 145 DCHECK(io_helper_);
125 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 146 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
126 // No transaction/db callbacks for DeleteDatabase.
127 DCHECK_EQ(kNoTransaction == host_transaction_id_,
128 kNoDatabaseCallbacks == ipc_database_callbacks_id_);
129 DCHECK_EQ(kNoDatabase, ipc_database_id_);
130 147
131 if (sent_blocked_) 148 if (sent_blocked_)
132 return; 149 return;
133 150
134 sent_blocked_ = true; 151 sent_blocked_ = true;
135 dispatcher_host_->Send(new IndexedDBMsg_CallbacksIntBlocked( 152
136 ipc_thread_id_, ipc_callbacks_id_, existing_version)); 153 BrowserThread::PostTask(
154 BrowserThread::IO, FROM_HERE,
155 base::Bind(&IOThreadHelper::SendBlocked,
156 base::Unretained(io_helper_.get()), existing_version));
137 157
138 if (!connection_open_start_time_.is_null()) { 158 if (!connection_open_start_time_.is_null()) {
139 UMA_HISTOGRAM_MEDIUM_TIMES( 159 UMA_HISTOGRAM_MEDIUM_TIMES(
140 "WebCore.IndexedDB.OpenTime.Blocked", 160 "WebCore.IndexedDB.OpenTime.Blocked",
141 base::TimeTicks::Now() - connection_open_start_time_); 161 base::TimeTicks::Now() - connection_open_start_time_);
142 connection_open_start_time_ = base::TimeTicks(); 162 connection_open_start_time_ = base::TimeTicks();
143 } 163 }
144 } 164 }
145 165
146 void IndexedDBCallbacks::OnUpgradeNeeded( 166 void IndexedDBCallbacks::OnUpgradeNeeded(
147 int64_t old_version, 167 int64_t old_version,
148 std::unique_ptr<IndexedDBConnection> connection, 168 std::unique_ptr<IndexedDBConnection> connection,
149 const IndexedDBDatabaseMetadata& metadata, 169 const IndexedDBDatabaseMetadata& metadata,
150 const IndexedDBDataLossInfo& data_loss_info) { 170 const IndexedDBDataLossInfo& data_loss_info) {
151 DCHECK(dispatcher_host_.get()); 171 DCHECK(dispatcher_host_.get());
152 172 DCHECK(io_helper_);
173 DCHECK_NE(kNoTransaction, host_transaction_id_);
153 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 174 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
154 DCHECK_NE(kNoTransaction, host_transaction_id_);
155 DCHECK_EQ(kNoDatabase, ipc_database_id_); 175 DCHECK_EQ(kNoDatabase, ipc_database_id_);
156 DCHECK_NE(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
157 176
158 data_loss_ = data_loss_info.status; 177 data_loss_ = data_loss_info.status;
159 dispatcher_host_->RegisterTransactionId(host_transaction_id_, origin_); 178 dispatcher_host_->RegisterTransactionId(host_transaction_id_, origin_);
160 int32_t ipc_database_id = 179 int32_t ipc_database_id =
161 dispatcher_host_->Add(connection.release(), ipc_thread_id_, origin_); 180 dispatcher_host_->Add(connection.release(), origin_);
162 if (ipc_database_id < 0) 181 if (ipc_database_id < 0)
163 return; 182 return;
183
164 ipc_database_id_ = ipc_database_id; 184 ipc_database_id_ = ipc_database_id;
165 IndexedDBMsg_CallbacksUpgradeNeeded_Params params; 185
166 params.ipc_thread_id = ipc_thread_id_; 186 BrowserThread::PostTask(
167 params.ipc_callbacks_id = ipc_callbacks_id_; 187 BrowserThread::IO, FROM_HERE,
168 params.ipc_database_id = ipc_database_id; 188 base::Bind(&IOThreadHelper::SendUpgradeNeeded,
169 params.ipc_database_callbacks_id = ipc_database_callbacks_id_; 189 base::Unretained(io_helper_.get()), ipc_database_id,
170 params.old_version = old_version; 190 old_version, data_loss_info.status, data_loss_info.message,
171 params.idb_metadata = IndexedDBDispatcherHost::ConvertMetadata(metadata); 191 metadata));
172 params.data_loss = data_loss_info.status;
173 params.data_loss_message = data_loss_info.message;
174 dispatcher_host_->Send(new IndexedDBMsg_CallbacksUpgradeNeeded(params));
175 192
176 if (!connection_open_start_time_.is_null()) { 193 if (!connection_open_start_time_.is_null()) {
177 UMA_HISTOGRAM_MEDIUM_TIMES( 194 UMA_HISTOGRAM_MEDIUM_TIMES(
178 "WebCore.IndexedDB.OpenTime.UpgradeNeeded", 195 "WebCore.IndexedDB.OpenTime.UpgradeNeeded",
179 base::TimeTicks::Now() - connection_open_start_time_); 196 base::TimeTicks::Now() - connection_open_start_time_);
180 connection_open_start_time_ = base::TimeTicks(); 197 connection_open_start_time_ = base::TimeTicks();
181 } 198 }
182 } 199 }
183 200
184 void IndexedDBCallbacks::OnSuccess( 201 void IndexedDBCallbacks::OnSuccess(
185 std::unique_ptr<IndexedDBConnection> connection, 202 std::unique_ptr<IndexedDBConnection> connection,
186 const IndexedDBDatabaseMetadata& metadata) { 203 const IndexedDBDatabaseMetadata& metadata) {
187 DCHECK(dispatcher_host_.get()); 204 DCHECK(dispatcher_host_.get());
188 205 DCHECK(io_helper_);
189 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 206 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
190 DCHECK_NE(kNoTransaction, host_transaction_id_); 207 DCHECK_NE(kNoTransaction, host_transaction_id_);
191 DCHECK_NE(ipc_database_id_ == kNoDatabase, !connection); 208 DCHECK_NE(ipc_database_id_ == kNoDatabase, !connection);
192 DCHECK_NE(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
193 209
194 scoped_refptr<IndexedDBCallbacks> self(this); 210 scoped_refptr<IndexedDBCallbacks> self(this);
195 211
196 int32_t ipc_object_id = kNoDatabase; 212 int32_t ipc_object_id = kNoDatabase;
197 // Only register if the connection was not previously sent in OnUpgradeNeeded. 213 // Only register if the connection was not previously sent in OnUpgradeNeeded.
198 if (ipc_database_id_ == kNoDatabase) { 214 if (ipc_database_id_ == kNoDatabase) {
199 ipc_object_id = 215 ipc_object_id = dispatcher_host_->Add(connection.release(), origin_);
200 dispatcher_host_->Add(connection.release(), ipc_thread_id_, origin_);
201 } 216 }
202 217
203 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessIDBDatabase( 218 BrowserThread::PostTask(
204 ipc_thread_id_, 219 BrowserThread::IO, FROM_HERE,
205 ipc_callbacks_id_, 220 base::Bind(&IOThreadHelper::SendSuccessDatabase,
206 ipc_database_callbacks_id_, 221 base::Unretained(io_helper_.get()), ipc_object_id, metadata));
207 ipc_object_id, 222 dispatcher_host_ = nullptr;
208 IndexedDBDispatcherHost::ConvertMetadata(metadata)));
209 dispatcher_host_ = NULL;
210 223
211 if (!connection_open_start_time_.is_null()) { 224 if (!connection_open_start_time_.is_null()) {
212 UMA_HISTOGRAM_MEDIUM_TIMES( 225 UMA_HISTOGRAM_MEDIUM_TIMES(
213 "WebCore.IndexedDB.OpenTime.Success", 226 "WebCore.IndexedDB.OpenTime.Success",
214 base::TimeTicks::Now() - connection_open_start_time_); 227 base::TimeTicks::Now() - connection_open_start_time_);
215 connection_open_start_time_ = base::TimeTicks(); 228 connection_open_start_time_ = base::TimeTicks();
216 } 229 }
217 } 230 }
218 231
219 static std::string CreateBlobData( 232 static std::string CreateBlobData(
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 iter.mark_used_callback().Run(); 341 iter.mark_used_callback().Run();
329 } 342 }
330 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); 343 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
331 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, callback); 344 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, callback);
332 } 345 }
333 346
334 void IndexedDBCallbacks::OnSuccess(scoped_refptr<IndexedDBCursor> cursor, 347 void IndexedDBCallbacks::OnSuccess(scoped_refptr<IndexedDBCursor> cursor,
335 const IndexedDBKey& key, 348 const IndexedDBKey& key,
336 const IndexedDBKey& primary_key, 349 const IndexedDBKey& primary_key,
337 IndexedDBValue* value) { 350 IndexedDBValue* value) {
351 DCHECK(!io_helper_);
338 DCHECK(dispatcher_host_.get()); 352 DCHECK(dispatcher_host_.get());
339 353
340 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 354 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
341 DCHECK_EQ(kNoTransaction, host_transaction_id_); 355 DCHECK_EQ(kNoTransaction, host_transaction_id_);
342 DCHECK_EQ(kNoDatabase, ipc_database_id_); 356 DCHECK_EQ(kNoDatabase, ipc_database_id_);
343 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
344 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 357 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
345 358
346 int32_t ipc_object_id = dispatcher_host_->Add(cursor.get()); 359 int32_t ipc_object_id = dispatcher_host_->Add(cursor.get());
347 std::unique_ptr<IndexedDBMsg_CallbacksSuccessIDBCursor_Params> params( 360 std::unique_ptr<IndexedDBMsg_CallbacksSuccessIDBCursor_Params> params(
348 new IndexedDBMsg_CallbacksSuccessIDBCursor_Params()); 361 new IndexedDBMsg_CallbacksSuccessIDBCursor_Params());
349 params->ipc_thread_id = ipc_thread_id_; 362 params->ipc_thread_id = ipc_thread_id_;
350 params->ipc_callbacks_id = ipc_callbacks_id_; 363 params->ipc_callbacks_id = ipc_callbacks_id_;
351 params->ipc_cursor_id = ipc_object_id; 364 params->ipc_cursor_id = ipc_object_id;
352 params->key = key; 365 params->key = key;
353 params->primary_key = primary_key; 366 params->primary_key = primary_key;
354 if (value && !value->empty()) 367 if (value && !value->empty())
355 std::swap(params->value.bits, value->bits); 368 std::swap(params->value.bits, value->bits);
356 // TODO(alecflett): Avoid a copy here: the whole params object is 369 // TODO(alecflett): Avoid a copy here: the whole params object is
357 // being copied into the message. 370 // being copied into the message.
358 if (!value || value->blob_info.empty()) { 371 if (!value || value->blob_info.empty()) {
359 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessIDBCursor(*params)); 372 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessIDBCursor(*params));
360 } else { 373 } else {
361 IndexedDBMsg_CallbacksSuccessIDBCursor_Params* p = params.get(); 374 IndexedDBMsg_CallbacksSuccessIDBCursor_Params* p = params.get();
362 FillInBlobData(value->blob_info, &p->value.blob_or_file_info); 375 FillInBlobData(value->blob_info, &p->value.blob_or_file_info);
363 RegisterBlobsAndSend( 376 RegisterBlobsAndSend(
364 value->blob_info, 377 value->blob_info,
365 base::Bind( 378 base::Bind(
366 CreateBlobsAndSend<IndexedDBMsg_CallbacksSuccessIDBCursor_Params, 379 CreateBlobsAndSend<IndexedDBMsg_CallbacksSuccessIDBCursor_Params,
367 IndexedDBMsg_CallbacksSuccessIDBCursor>, 380 IndexedDBMsg_CallbacksSuccessIDBCursor>,
368 base::Owned(params.release()), dispatcher_host_, value->blob_info, 381 base::Owned(params.release()), dispatcher_host_, value->blob_info,
369 base::Unretained(&p->value.blob_or_file_info))); 382 base::Unretained(&p->value.blob_or_file_info)));
370 } 383 }
371 dispatcher_host_ = NULL; 384 dispatcher_host_ = nullptr;
372 } 385 }
373 386
374 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key, 387 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key,
375 const IndexedDBKey& primary_key, 388 const IndexedDBKey& primary_key,
376 IndexedDBValue* value) { 389 IndexedDBValue* value) {
390 DCHECK(!io_helper_);
377 DCHECK(dispatcher_host_.get()); 391 DCHECK(dispatcher_host_.get());
378 392
379 DCHECK_NE(kNoCursor, ipc_cursor_id_); 393 DCHECK_NE(kNoCursor, ipc_cursor_id_);
380 DCHECK_EQ(kNoTransaction, host_transaction_id_); 394 DCHECK_EQ(kNoTransaction, host_transaction_id_);
381 DCHECK_EQ(kNoDatabase, ipc_database_id_); 395 DCHECK_EQ(kNoDatabase, ipc_database_id_);
382 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
383 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 396 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
384 397
385 IndexedDBCursor* idb_cursor = 398 IndexedDBCursor* idb_cursor =
386 dispatcher_host_->GetCursorFromId(ipc_cursor_id_); 399 dispatcher_host_->GetCursorFromId(ipc_cursor_id_);
387 400
388 DCHECK(idb_cursor); 401 DCHECK(idb_cursor);
389 if (!idb_cursor) 402 if (!idb_cursor)
390 return; 403 return;
391 404
392 std::unique_ptr<IndexedDBMsg_CallbacksSuccessCursorContinue_Params> params( 405 std::unique_ptr<IndexedDBMsg_CallbacksSuccessCursorContinue_Params> params(
(...skipping 15 matching lines...) Expand all
408 FillInBlobData(value->blob_info, &p->value.blob_or_file_info); 421 FillInBlobData(value->blob_info, &p->value.blob_or_file_info);
409 RegisterBlobsAndSend( 422 RegisterBlobsAndSend(
410 value->blob_info, 423 value->blob_info,
411 base::Bind(CreateBlobsAndSend< 424 base::Bind(CreateBlobsAndSend<
412 IndexedDBMsg_CallbacksSuccessCursorContinue_Params, 425 IndexedDBMsg_CallbacksSuccessCursorContinue_Params,
413 IndexedDBMsg_CallbacksSuccessCursorContinue>, 426 IndexedDBMsg_CallbacksSuccessCursorContinue>,
414 base::Owned(params.release()), dispatcher_host_, 427 base::Owned(params.release()), dispatcher_host_,
415 value->blob_info, 428 value->blob_info,
416 base::Unretained(&p->value.blob_or_file_info))); 429 base::Unretained(&p->value.blob_or_file_info)));
417 } 430 }
418 dispatcher_host_ = NULL; 431 dispatcher_host_ = nullptr;
419 } 432 }
420 433
421 void IndexedDBCallbacks::OnSuccessWithPrefetch( 434 void IndexedDBCallbacks::OnSuccessWithPrefetch(
422 const std::vector<IndexedDBKey>& keys, 435 const std::vector<IndexedDBKey>& keys,
423 const std::vector<IndexedDBKey>& primary_keys, 436 const std::vector<IndexedDBKey>& primary_keys,
424 std::vector<IndexedDBValue>* values) { 437 std::vector<IndexedDBValue>* values) {
438 DCHECK(!io_helper_);
425 DCHECK_EQ(keys.size(), primary_keys.size()); 439 DCHECK_EQ(keys.size(), primary_keys.size());
426 DCHECK_EQ(keys.size(), values->size()); 440 DCHECK_EQ(keys.size(), values->size());
427 441
428 DCHECK(dispatcher_host_.get()); 442 DCHECK(dispatcher_host_.get());
429 443
430 DCHECK_NE(kNoCursor, ipc_cursor_id_); 444 DCHECK_NE(kNoCursor, ipc_cursor_id_);
431 DCHECK_EQ(kNoTransaction, host_transaction_id_); 445 DCHECK_EQ(kNoTransaction, host_transaction_id_);
432 DCHECK_EQ(kNoDatabase, ipc_database_id_); 446 DCHECK_EQ(kNoDatabase, ipc_database_id_);
433 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
434 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 447 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
435 448
436 std::vector<IndexedDBKey> msg_keys; 449 std::vector<IndexedDBKey> msg_keys;
437 std::vector<IndexedDBKey> msg_primary_keys; 450 std::vector<IndexedDBKey> msg_primary_keys;
438 451
439 for (size_t i = 0; i < keys.size(); ++i) { 452 for (size_t i = 0; i < keys.size(); ++i) {
440 msg_keys.push_back(keys[i]); 453 msg_keys.push_back(keys[i]);
441 msg_primary_keys.push_back(primary_keys[i]); 454 msg_primary_keys.push_back(primary_keys[i]);
442 } 455 }
443 456
(...skipping 24 matching lines...) Expand all
468 BrowserThread::PostTask(BrowserThread::IO, 481 BrowserThread::PostTask(BrowserThread::IO,
469 FROM_HERE, 482 FROM_HERE,
470 base::Bind(BlobLookupForCursorPrefetch, 483 base::Bind(BlobLookupForCursorPrefetch,
471 base::Owned(params.release()), 484 base::Owned(params.release()),
472 dispatcher_host_, 485 dispatcher_host_,
473 *values)); 486 *values));
474 } else { 487 } else {
475 dispatcher_host_->Send( 488 dispatcher_host_->Send(
476 new IndexedDBMsg_CallbacksSuccessCursorPrefetch(*params.get())); 489 new IndexedDBMsg_CallbacksSuccessCursorPrefetch(*params.get()));
477 } 490 }
478 dispatcher_host_ = NULL; 491 dispatcher_host_ = nullptr;
479 } 492 }
480 493
481 void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) { 494 void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) {
495 DCHECK(!io_helper_);
482 DCHECK(dispatcher_host_.get()); 496 DCHECK(dispatcher_host_.get());
483 497
484 if (value && value->primary_key.IsValid()) { 498 if (value && value->primary_key.IsValid()) {
485 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 499 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
486 } else { 500 } else {
487 DCHECK(kNoCursor == ipc_cursor_id_ || value == NULL); 501 DCHECK(kNoCursor == ipc_cursor_id_ || value == NULL);
488 } 502 }
489 DCHECK_EQ(kNoTransaction, host_transaction_id_); 503 DCHECK_EQ(kNoTransaction, host_transaction_id_);
490 DCHECK_EQ(kNoDatabase, ipc_database_id_); 504 DCHECK_EQ(kNoDatabase, ipc_database_id_);
491 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
492 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 505 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
493 506
494 std::unique_ptr<IndexedDBMsg_CallbacksSuccessValue_Params> params( 507 std::unique_ptr<IndexedDBMsg_CallbacksSuccessValue_Params> params(
495 new IndexedDBMsg_CallbacksSuccessValue_Params()); 508 new IndexedDBMsg_CallbacksSuccessValue_Params());
496 params->ipc_thread_id = ipc_thread_id_; 509 params->ipc_thread_id = ipc_thread_id_;
497 params->ipc_callbacks_id = ipc_callbacks_id_; 510 params->ipc_callbacks_id = ipc_callbacks_id_;
498 if (value && value->primary_key.IsValid()) { 511 if (value && value->primary_key.IsValid()) {
499 params->value.primary_key = value->primary_key; 512 params->value.primary_key = value->primary_key;
500 params->value.key_path = value->key_path; 513 params->value.key_path = value->key_path;
501 } 514 }
502 if (value && !value->empty()) 515 if (value && !value->empty())
503 std::swap(params->value.bits, value->bits); 516 std::swap(params->value.bits, value->bits);
504 if (!value || value->blob_info.empty()) { 517 if (!value || value->blob_info.empty()) {
505 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessValue(*params)); 518 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessValue(*params));
506 } else { 519 } else {
507 IndexedDBMsg_CallbacksSuccessValue_Params* p = params.get(); 520 IndexedDBMsg_CallbacksSuccessValue_Params* p = params.get();
508 FillInBlobData(value->blob_info, &p->value.blob_or_file_info); 521 FillInBlobData(value->blob_info, &p->value.blob_or_file_info);
509 RegisterBlobsAndSend( 522 RegisterBlobsAndSend(
510 value->blob_info, 523 value->blob_info,
511 base::Bind(CreateBlobsAndSend<IndexedDBMsg_CallbacksSuccessValue_Params, 524 base::Bind(CreateBlobsAndSend<IndexedDBMsg_CallbacksSuccessValue_Params,
512 IndexedDBMsg_CallbacksSuccessValue>, 525 IndexedDBMsg_CallbacksSuccessValue>,
513 base::Owned(params.release()), dispatcher_host_, 526 base::Owned(params.release()), dispatcher_host_,
514 value->blob_info, 527 value->blob_info,
515 base::Unretained(&p->value.blob_or_file_info))); 528 base::Unretained(&p->value.blob_or_file_info)));
516 } 529 }
517 dispatcher_host_ = NULL; 530 dispatcher_host_ = nullptr;
518 } 531 }
519 532
520 void IndexedDBCallbacks::OnSuccessArray( 533 void IndexedDBCallbacks::OnSuccessArray(
521 std::vector<IndexedDBReturnValue>* values, 534 std::vector<IndexedDBReturnValue>* values,
522 const IndexedDBKeyPath& key_path) { 535 const IndexedDBKeyPath& key_path) {
536 DCHECK(!io_helper_);
523 DCHECK(dispatcher_host_.get()); 537 DCHECK(dispatcher_host_.get());
524 538
525 DCHECK_EQ(kNoTransaction, host_transaction_id_); 539 DCHECK_EQ(kNoTransaction, host_transaction_id_);
526 DCHECK_EQ(kNoDatabase, ipc_database_id_); 540 DCHECK_EQ(kNoDatabase, ipc_database_id_);
527 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
528 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 541 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
529 542
530 std::unique_ptr<IndexedDBMsg_CallbacksSuccessArray_Params> params( 543 std::unique_ptr<IndexedDBMsg_CallbacksSuccessArray_Params> params(
531 new IndexedDBMsg_CallbacksSuccessArray_Params()); 544 new IndexedDBMsg_CallbacksSuccessArray_Params());
532 params->ipc_thread_id = ipc_thread_id_; 545 params->ipc_thread_id = ipc_thread_id_;
533 params->ipc_callbacks_id = ipc_callbacks_id_; 546 params->ipc_callbacks_id = ipc_callbacks_id_;
534 params->values.resize(values->size()); 547 params->values.resize(values->size());
535 548
536 bool found_blob_info = false; 549 bool found_blob_info = false;
537 for (size_t i = 0; i < values->size(); ++i) { 550 for (size_t i = 0; i < values->size(); ++i) {
(...skipping 14 matching lines...) Expand all
552 565
553 if (found_blob_info) { 566 if (found_blob_info) {
554 BrowserThread::PostTask( 567 BrowserThread::PostTask(
555 BrowserThread::IO, FROM_HERE, 568 BrowserThread::IO, FROM_HERE,
556 base::Bind(BlobLookupForGetAll, base::Owned(params.release()), 569 base::Bind(BlobLookupForGetAll, base::Owned(params.release()),
557 dispatcher_host_, *values)); 570 dispatcher_host_, *values));
558 } else { 571 } else {
559 dispatcher_host_->Send( 572 dispatcher_host_->Send(
560 new IndexedDBMsg_CallbacksSuccessArray(*params.get())); 573 new IndexedDBMsg_CallbacksSuccessArray(*params.get()));
561 } 574 }
562 dispatcher_host_ = NULL; 575 dispatcher_host_ = nullptr;
563 } 576 }
564 577
565 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& value) { 578 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& value) {
579 DCHECK(!io_helper_);
566 DCHECK(dispatcher_host_.get()); 580 DCHECK(dispatcher_host_.get());
567 581
568 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 582 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
569 DCHECK_EQ(kNoTransaction, host_transaction_id_); 583 DCHECK_EQ(kNoTransaction, host_transaction_id_);
570 DCHECK_EQ(kNoDatabase, ipc_database_id_); 584 DCHECK_EQ(kNoDatabase, ipc_database_id_);
571 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
572 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 585 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
573 586
574 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessIndexedDBKey( 587 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessIndexedDBKey(
575 ipc_thread_id_, ipc_callbacks_id_, value)); 588 ipc_thread_id_, ipc_callbacks_id_, value));
576 dispatcher_host_ = NULL; 589 dispatcher_host_ = nullptr;
577 } 590 }
578 591
579 void IndexedDBCallbacks::OnSuccess(int64_t value) { 592 void IndexedDBCallbacks::OnSuccess(int64_t value) {
580 DCHECK(dispatcher_host_.get()); 593 DCHECK(dispatcher_host_.get());
594 if (io_helper_) {
595 BrowserThread::PostTask(
596 BrowserThread::IO, FROM_HERE,
597 base::Bind(&IOThreadHelper::SendSuccessInteger,
598 base::Unretained(io_helper_.get()), value));
599 } else {
600 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
601 DCHECK_EQ(kNoTransaction, host_transaction_id_);
602 DCHECK_EQ(kNoDatabase, ipc_database_id_);
603 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
604
605 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessInteger(
606 ipc_thread_id_, ipc_callbacks_id_, value));
607 }
608 dispatcher_host_ = nullptr;
609 }
610
611 void IndexedDBCallbacks::OnSuccess() {
612 DCHECK(!io_helper_);
613 DCHECK(dispatcher_host_.get());
581 614
582 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 615 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
583 DCHECK_EQ(kNoTransaction, host_transaction_id_); 616 DCHECK_EQ(kNoTransaction, host_transaction_id_);
584 DCHECK_EQ(kNoDatabase, ipc_database_id_); 617 DCHECK_EQ(kNoDatabase, ipc_database_id_);
585 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
586 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
587
588 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessInteger(
589 ipc_thread_id_, ipc_callbacks_id_, value));
590 dispatcher_host_ = NULL;
591 }
592
593 void IndexedDBCallbacks::OnSuccess() {
594 DCHECK(dispatcher_host_.get());
595
596 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
597 DCHECK_EQ(kNoTransaction, host_transaction_id_);
598 DCHECK_EQ(kNoDatabase, ipc_database_id_);
599 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
600 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 618 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
601 619
602 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessUndefined( 620 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessUndefined(
603 ipc_thread_id_, ipc_callbacks_id_)); 621 ipc_thread_id_, ipc_callbacks_id_));
604 dispatcher_host_ = NULL; 622 dispatcher_host_ = nullptr;
605 } 623 }
606 624
607 bool IndexedDBCallbacks::IsValid() const { 625 bool IndexedDBCallbacks::IsValid() const {
608 DCHECK(dispatcher_host_.get()); 626 DCHECK(dispatcher_host_.get());
609 627
610 return dispatcher_host_->IsOpen(); 628 return dispatcher_host_->IsOpen();
611 } 629 }
612 630
613 void IndexedDBCallbacks::SetConnectionOpenStartTime( 631 void IndexedDBCallbacks::SetConnectionOpenStartTime(
614 const base::TimeTicks& start_time) { 632 const base::TimeTicks& start_time) {
615 connection_open_start_time_ = start_time; 633 connection_open_start_time_ = start_time;
616 } 634 }
617 635
636 IndexedDBCallbacks::IOThreadHelper::IOThreadHelper(
637 CallbacksAssociatedPtrInfo callbacks_info) {
638 DCHECK_CURRENTLY_ON(BrowserThread::IO);
639 callbacks_.Bind(std::move(callbacks_info));
640 }
641
642 IndexedDBCallbacks::IOThreadHelper::~IOThreadHelper() {}
643
644 void IndexedDBCallbacks::IOThreadHelper::SendError(
645 const IndexedDBDatabaseError& error) {
646 callbacks_->Error(error.code(), error.message());
647 }
648
649 void IndexedDBCallbacks::IOThreadHelper::SendSuccessStringList(
650 const std::vector<base::string16>& value) {
651 callbacks_->SuccessStringList(value);
652 }
653
654 void IndexedDBCallbacks::IOThreadHelper::SendBlocked(int64_t existing_version) {
655 callbacks_->Blocked(existing_version);
656 }
657
658 void IndexedDBCallbacks::IOThreadHelper::SendUpgradeNeeded(
659 int32_t database_id,
660 int64_t old_version,
661 blink::WebIDBDataLoss data_loss,
662 const std::string& data_loss_message,
663 const content::IndexedDBDatabaseMetadata& metadata) {
664 callbacks_->UpgradeNeeded(database_id, old_version, data_loss,
665 data_loss_message, metadata);
666 }
667
668 void IndexedDBCallbacks::IOThreadHelper::SendSuccessDatabase(
669 int32_t database_id,
670 const content::IndexedDBDatabaseMetadata& metadata) {
671 callbacks_->SuccessDatabase(database_id, metadata);
672 }
673
674 void IndexedDBCallbacks::IOThreadHelper::SendSuccessInteger(int64_t value) {
675 callbacks_->SuccessInteger(value);
676 }
677
618 } // namespace content 678 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/indexed_db/indexed_db_callbacks.h ('k') | content/browser/indexed_db/indexed_db_database.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698