OLD | NEW |
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_dispatcher_host.h" | 5 #include "content/browser/indexed_db/indexed_db_dispatcher_host.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
10 #include "base/process/process.h" | 10 #include "base/process/process.h" |
11 #include "base/strings/utf_string_conversions.h" | 11 #include "base/strings/utf_string_conversions.h" |
12 #include "content/browser/indexed_db/indexed_db_callbacks.h" | 12 #include "content/browser/indexed_db/indexed_db_callbacks.h" |
13 #include "content/browser/indexed_db/indexed_db_connection.h" | 13 #include "content/browser/indexed_db/indexed_db_connection.h" |
14 #include "content/browser/indexed_db/indexed_db_context_impl.h" | 14 #include "content/browser/indexed_db/indexed_db_context_impl.h" |
15 #include "content/browser/indexed_db/indexed_db_cursor.h" | 15 #include "content/browser/indexed_db/indexed_db_cursor.h" |
16 #include "content/browser/indexed_db/indexed_db_database_callbacks.h" | 16 #include "content/browser/indexed_db/indexed_db_database_callbacks.h" |
17 #include "content/browser/indexed_db/indexed_db_metadata.h" | 17 #include "content/browser/indexed_db/indexed_db_metadata.h" |
| 18 #include "content/browser/indexed_db/indexed_db_value.h" |
18 #include "content/browser/renderer_host/render_message_filter.h" | 19 #include "content/browser/renderer_host/render_message_filter.h" |
19 #include "content/common/indexed_db/indexed_db_messages.h" | 20 #include "content/common/indexed_db/indexed_db_messages.h" |
20 #include "content/public/browser/browser_thread.h" | 21 #include "content/public/browser/browser_thread.h" |
21 #include "content/public/browser/user_metrics.h" | 22 #include "content/public/browser/user_metrics.h" |
22 #include "content/public/common/content_switches.h" | 23 #include "content/public/common/content_switches.h" |
23 #include "content/public/common/result_codes.h" | 24 #include "content/public/common/result_codes.h" |
24 #include "third_party/WebKit/public/platform/WebIDBDatabaseException.h" | 25 #include "third_party/WebKit/public/platform/WebIDBDatabaseException.h" |
25 #include "url/gurl.h" | 26 #include "url/gurl.h" |
26 #include "webkit/browser/database/database_util.h" | 27 #include "webkit/browser/database/database_util.h" |
27 #include "webkit/common/database/database_identifier.h" | 28 #include "webkit/common/database/database_identifier.h" |
28 | 29 |
29 using webkit_database::DatabaseUtil; | 30 using webkit_database::DatabaseUtil; |
30 using WebKit::WebIDBKey; | 31 using WebKit::WebIDBKey; |
31 | 32 |
32 namespace content { | 33 namespace content { |
33 | 34 |
34 IndexedDBDispatcherHost::IndexedDBDispatcherHost( | 35 IndexedDBDispatcherHost::IndexedDBDispatcherHost( |
35 int ipc_process_id, | 36 int ipc_process_id, |
36 IndexedDBContextImpl* indexed_db_context) | 37 net::URLRequestContextGetter* request_context_getter, |
37 : indexed_db_context_(indexed_db_context), | 38 IndexedDBContextImpl* indexed_db_context, |
| 39 FileAPIMessageFilter* file_api_message_filter) |
| 40 : request_context_getter_(request_context_getter), |
| 41 request_context_(NULL), |
| 42 indexed_db_context_(indexed_db_context), |
| 43 file_api_message_filter_(file_api_message_filter), |
38 database_dispatcher_host_(new DatabaseDispatcherHost(this)), | 44 database_dispatcher_host_(new DatabaseDispatcherHost(this)), |
39 cursor_dispatcher_host_(new CursorDispatcherHost(this)), | 45 cursor_dispatcher_host_(new CursorDispatcherHost(this)), |
40 ipc_process_id_(ipc_process_id) { | 46 ipc_process_id_(ipc_process_id) { |
| 47 DCHECK(indexed_db_context_); |
| 48 } |
| 49 |
| 50 IndexedDBDispatcherHost::IndexedDBDispatcherHost( |
| 51 int ipc_process_id, |
| 52 net::URLRequestContext* request_context, |
| 53 IndexedDBContextImpl* indexed_db_context, |
| 54 FileAPIMessageFilter* file_api_message_filter) |
| 55 : request_context_(request_context), |
| 56 indexed_db_context_(indexed_db_context), |
| 57 file_api_message_filter_(file_api_message_filter), |
| 58 database_dispatcher_host_(new DatabaseDispatcherHost(this)), |
| 59 cursor_dispatcher_host_(new CursorDispatcherHost(this)), |
| 60 ipc_process_id_(ipc_process_id) { |
41 DCHECK(indexed_db_context_); | 61 DCHECK(indexed_db_context_); |
42 } | 62 } |
43 | 63 |
44 IndexedDBDispatcherHost::~IndexedDBDispatcherHost() {} | 64 IndexedDBDispatcherHost::~IndexedDBDispatcherHost() {} |
45 | 65 |
| 66 void IndexedDBDispatcherHost::OnChannelConnected(int32 peer_pid) { |
| 67 BrowserMessageFilter::OnChannelConnected(peer_pid); |
| 68 |
| 69 if (request_context_getter_.get()) { |
| 70 DCHECK(!request_context_); |
| 71 request_context_ = request_context_getter_->GetURLRequestContext(); |
| 72 request_context_getter_ = NULL; |
| 73 DCHECK(request_context_); |
| 74 } |
| 75 } |
| 76 |
46 void IndexedDBDispatcherHost::OnChannelClosing() { | 77 void IndexedDBDispatcherHost::OnChannelClosing() { |
47 BrowserMessageFilter::OnChannelClosing(); | 78 BrowserMessageFilter::OnChannelClosing(); |
48 | 79 |
49 bool success = indexed_db_context_->TaskRunner()->PostTask( | 80 bool success = indexed_db_context_->TaskRunner()->PostTask( |
50 FROM_HERE, | 81 FROM_HERE, |
51 base::Bind(&IndexedDBDispatcherHost::ResetDispatcherHosts, this)); | 82 base::Bind(&IndexedDBDispatcherHost::ResetDispatcherHosts, this)); |
52 | 83 |
53 if (!success) | 84 if (!success) |
54 ResetDispatcherHosts(); | 85 ResetDispatcherHosts(); |
55 } | 86 } |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 | 238 |
208 void IndexedDBDispatcherHost::OnIDBFactoryGetDatabaseNames( | 239 void IndexedDBDispatcherHost::OnIDBFactoryGetDatabaseNames( |
209 const IndexedDBHostMsg_FactoryGetDatabaseNames_Params& params) { | 240 const IndexedDBHostMsg_FactoryGetDatabaseNames_Params& params) { |
210 DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); | 241 DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); |
211 base::FilePath indexed_db_path = indexed_db_context_->data_path(); | 242 base::FilePath indexed_db_path = indexed_db_context_->data_path(); |
212 | 243 |
213 Context()->GetIDBFactory()->GetDatabaseNames( | 244 Context()->GetIDBFactory()->GetDatabaseNames( |
214 new IndexedDBCallbacks( | 245 new IndexedDBCallbacks( |
215 this, params.ipc_thread_id, params.ipc_callbacks_id), | 246 this, params.ipc_thread_id, params.ipc_callbacks_id), |
216 params.database_identifier, | 247 params.database_identifier, |
217 indexed_db_path); | 248 indexed_db_path, |
| 249 Context()->TaskRunner()); |
218 } | 250 } |
219 | 251 |
220 void IndexedDBDispatcherHost::OnIDBFactoryOpen( | 252 void IndexedDBDispatcherHost::OnIDBFactoryOpen( |
221 const IndexedDBHostMsg_FactoryOpen_Params& params) { | 253 const IndexedDBHostMsg_FactoryOpen_Params& params) { |
222 DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); | 254 DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); |
223 base::FilePath indexed_db_path = indexed_db_context_->data_path(); | 255 base::FilePath indexed_db_path = indexed_db_context_->data_path(); |
224 | 256 |
225 GURL origin_url = | 257 GURL origin_url = |
226 webkit_database::GetOriginFromIdentifier(params.database_identifier); | 258 webkit_database::GetOriginFromIdentifier(params.database_identifier); |
227 | 259 |
228 int64 host_transaction_id = HostTransactionId(params.transaction_id); | 260 int64 host_transaction_id = HostTransactionId(params.transaction_id); |
229 | 261 |
230 // TODO(dgrogan): Don't let a non-existing database be opened (and therefore | 262 // TODO(dgrogan): Don't let a non-existing database be opened (and therefore |
231 // created) if this origin is already over quota. | 263 // created) if this origin is already over quota. |
232 scoped_refptr<IndexedDBCallbacks> callbacks = | 264 scoped_refptr<IndexedDBCallbacks> callbacks = |
233 new IndexedDBCallbacks(this, | 265 new IndexedDBCallbacks(this, |
234 params.ipc_thread_id, | 266 params.ipc_thread_id, |
235 params.ipc_callbacks_id, | 267 params.ipc_callbacks_id, |
236 params.ipc_database_callbacks_id, | 268 params.ipc_database_callbacks_id, |
237 host_transaction_id, | 269 host_transaction_id, |
238 origin_url); | 270 origin_url); |
239 scoped_refptr<IndexedDBDatabaseCallbacks> database_callbacks = | 271 scoped_refptr<IndexedDBDatabaseCallbacks> database_callbacks = |
240 new IndexedDBDatabaseCallbacks( | 272 new IndexedDBDatabaseCallbacks( |
241 this, params.ipc_thread_id, params.ipc_database_callbacks_id); | 273 this, params.ipc_thread_id, params.ipc_database_callbacks_id); |
242 Context()->GetIDBFactory()->Open(params.name, | 274 Context()->GetIDBFactory()->Open(params.name, |
243 params.version, | 275 params.version, |
| 276 request_context_, |
244 host_transaction_id, | 277 host_transaction_id, |
245 callbacks, | 278 callbacks, |
246 database_callbacks, | 279 database_callbacks, |
247 params.database_identifier, | 280 params.database_identifier, |
248 indexed_db_path); | 281 indexed_db_path, |
| 282 ipc_process_id_, |
| 283 Context()->TaskRunner()); |
249 } | 284 } |
250 | 285 |
251 void IndexedDBDispatcherHost::OnIDBFactoryDeleteDatabase( | 286 void IndexedDBDispatcherHost::OnIDBFactoryDeleteDatabase( |
252 const IndexedDBHostMsg_FactoryDeleteDatabase_Params& params) { | 287 const IndexedDBHostMsg_FactoryDeleteDatabase_Params& params) { |
253 DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); | 288 DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); |
254 base::FilePath indexed_db_path = indexed_db_context_->data_path(); | 289 base::FilePath indexed_db_path = indexed_db_context_->data_path(); |
255 Context()->GetIDBFactory()->DeleteDatabase( | 290 Context()->GetIDBFactory()->DeleteDatabase( |
256 params.name, | 291 params.name, |
| 292 request_context_, |
257 new IndexedDBCallbacks( | 293 new IndexedDBCallbacks( |
258 this, params.ipc_thread_id, params.ipc_callbacks_id), | 294 this, params.ipc_thread_id, params.ipc_callbacks_id), |
259 params.database_identifier, | 295 params.database_identifier, |
260 indexed_db_path); | 296 indexed_db_path, |
| 297 Context()->TaskRunner()); |
261 } | 298 } |
262 | 299 |
263 void IndexedDBDispatcherHost::FinishTransaction(int64 host_transaction_id, | 300 void IndexedDBDispatcherHost::FinishTransaction(int64 host_transaction_id, |
264 bool committed) { | 301 bool committed) { |
265 DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); | 302 DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); |
266 if (!database_dispatcher_host_) | 303 if (!database_dispatcher_host_) |
267 return; | 304 return; |
268 TransactionIDToURLMap& transaction_url_map = | 305 TransactionIDToURLMap& transaction_url_map = |
269 database_dispatcher_host_->transaction_url_map_; | 306 database_dispatcher_host_->transaction_url_map_; |
270 TransactionIDToSizeMap& transaction_size_map = | 307 TransactionIDToSizeMap& transaction_size_map = |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); | 555 parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); |
519 | 556 |
520 IndexedDBConnection* connection = | 557 IndexedDBConnection* connection = |
521 parent_->GetOrTerminateProcess(&map_, params.ipc_database_id); | 558 parent_->GetOrTerminateProcess(&map_, params.ipc_database_id); |
522 if (!connection) | 559 if (!connection) |
523 return; | 560 return; |
524 scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks( | 561 scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks( |
525 parent_, params.ipc_thread_id, params.ipc_callbacks_id)); | 562 parent_, params.ipc_thread_id, params.ipc_callbacks_id)); |
526 | 563 |
527 int64 host_transaction_id = parent_->HostTransactionId(params.transaction_id); | 564 int64 host_transaction_id = parent_->HostTransactionId(params.transaction_id); |
| 565 |
| 566 std::vector<IndexedDBBlobInfo> blob_info(params.blob_or_file_info.size()); |
| 567 |
| 568 for (size_t i=0; i < params.blob_or_file_info.size(); ++i) { |
| 569 const IndexedDBMsg_BlobOrFileInfo& info = params.blob_or_file_info[i]; |
| 570 if (info.is_file) |
| 571 blob_info[i] = |
| 572 IndexedDBBlobInfo(base::FilePath::FromUTF16Unsafe(info.file_path), |
| 573 info.file_name, info.mime_type); |
| 574 else |
| 575 blob_info[i] = IndexedDBBlobInfo(info.url, info.mime_type, info.size); |
| 576 } |
528 // TODO(alecflett): Avoid a copy here. | 577 // TODO(alecflett): Avoid a copy here. |
529 std::string value_copy(params.value); | 578 IndexedDBValue value; |
| 579 value.bits = params.value; |
| 580 value.blob_info.swap(blob_info); |
530 connection->database()->Put( | 581 connection->database()->Put( |
531 host_transaction_id, | 582 host_transaction_id, |
532 params.object_store_id, | 583 params.object_store_id, |
533 &value_copy, | 584 &value, |
534 make_scoped_ptr(new IndexedDBKey(params.key)), | 585 make_scoped_ptr(new IndexedDBKey(params.key)), |
535 static_cast<IndexedDBDatabase::PutMode>(params.put_mode), | 586 static_cast<IndexedDBDatabase::PutMode>(params.put_mode), |
536 callbacks, | 587 callbacks, |
537 params.index_ids, | 588 params.index_ids, |
538 params.index_keys); | 589 params.index_keys); |
539 TransactionIDToSizeMap* map = | 590 TransactionIDToSizeMap* map = |
540 &parent_->database_dispatcher_host_->transaction_size_map_; | 591 &parent_->database_dispatcher_host_->transaction_size_map_; |
541 // Size can't be big enough to overflow because it represents the | 592 // Size can't be big enough to overflow because it represents the |
542 // actual bytes passed through IPC. | 593 // actual bytes passed through IPC. |
543 (*map)[host_transaction_id] += params.value.size(); | 594 (*map)[host_transaction_id] += params.value.size(); |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
848 } | 899 } |
849 | 900 |
850 void IndexedDBDispatcherHost::CursorDispatcherHost::OnDestroyed( | 901 void IndexedDBDispatcherHost::CursorDispatcherHost::OnDestroyed( |
851 int32 ipc_object_id) { | 902 int32 ipc_object_id) { |
852 DCHECK( | 903 DCHECK( |
853 parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); | 904 parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); |
854 parent_->DestroyObject(&map_, ipc_object_id); | 905 parent_->DestroyObject(&map_, ipc_object_id); |
855 } | 906 } |
856 | 907 |
857 } // namespace content | 908 } // namespace content |
OLD | NEW |