| 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 <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| 11 #include "base/files/file_path.h" | 11 #include "base/files/file_path.h" |
| 12 #include "base/process.h" | 12 #include "base/process.h" |
| 13 #include "base/process_util.h" | 13 #include "base/process_util.h" |
| 14 #include "base/strings/utf_string_conversions.h" | 14 #include "base/strings/utf_string_conversions.h" |
| 15 #include "content/browser/indexed_db/indexed_db_callbacks.h" | 15 #include "content/browser/indexed_db/indexed_db_callbacks.h" |
| 16 #include "content/browser/indexed_db/indexed_db_context_impl.h" | 16 #include "content/browser/indexed_db/indexed_db_context_impl.h" |
| 17 #include "content/browser/indexed_db/indexed_db_database_callbacks.h" | 17 #include "content/browser/indexed_db/indexed_db_database_callbacks.h" |
| 18 #include "content/browser/indexed_db/indexed_db_metadata.h" | 18 #include "content/browser/indexed_db/indexed_db_metadata.h" |
| 19 #include "content/browser/indexed_db/webidbcursor_impl.h" | 19 #include "content/browser/indexed_db/webidbcursor_impl.h" |
| 20 #include "content/browser/indexed_db/webidbcursor_impl.h" | 20 #include "content/browser/indexed_db/webidbcursor_impl.h" |
| 21 #include "content/browser/indexed_db/webidbdatabase_impl.h" | 21 #include "content/browser/indexed_db/webidbdatabase_impl.h" |
| 22 #include "content/browser/renderer_host/render_message_filter.h" | 22 #include "content/browser/renderer_host/render_message_filter.h" |
| 23 #include "content/common/indexed_db/indexed_db_messages.h" | 23 #include "content/common/indexed_db/indexed_db_messages.h" |
| 24 #include "content/public/browser/browser_thread.h" | 24 #include "content/public/browser/browser_thread.h" |
| 25 #include "content/public/browser/user_metrics.h" | 25 #include "content/public/browser/user_metrics.h" |
| 26 #include "content/public/common/content_switches.h" | 26 #include "content/public/common/content_switches.h" |
| 27 #include "content/public/common/result_codes.h" | 27 #include "content/public/common/result_codes.h" |
| 28 #include "googleurl/src/gurl.h" | 28 #include "googleurl/src/gurl.h" |
| 29 #include "third_party/WebKit/public/platform/WebIDBDatabase.h" | 29 #include "third_party/WebKit/public/platform/WebIDBDatabase.h" |
| 30 #include "third_party/WebKit/public/platform/WebIDBDatabaseError.h" | |
| 31 #include "third_party/WebKit/public/platform/WebIDBDatabaseException.h" | 30 #include "third_party/WebKit/public/platform/WebIDBDatabaseException.h" |
| 32 #include "webkit/browser/database/database_util.h" | 31 #include "webkit/browser/database/database_util.h" |
| 33 #include "webkit/common/database/database_identifier.h" | 32 #include "webkit/common/database/database_identifier.h" |
| 34 | 33 |
| 35 using webkit_database::DatabaseUtil; | 34 using webkit_database::DatabaseUtil; |
| 36 using WebKit::WebIDBDatabaseError; | |
| 37 using WebKit::WebIDBKey; | 35 using WebKit::WebIDBKey; |
| 38 | 36 |
| 39 namespace content { | 37 namespace content { |
| 40 | 38 |
| 41 IndexedDBDispatcherHost::IndexedDBDispatcherHost( | 39 IndexedDBDispatcherHost::IndexedDBDispatcherHost( |
| 42 int ipc_process_id, | 40 int ipc_process_id, |
| 43 IndexedDBContextImpl* indexed_db_context) | 41 IndexedDBContextImpl* indexed_db_context) |
| 44 : indexed_db_context_(indexed_db_context), | 42 : indexed_db_context_(indexed_db_context), |
| 45 database_dispatcher_host_(new DatabaseDispatcherHost(this)), | 43 database_dispatcher_host_(new DatabaseDispatcherHost(this)), |
| 46 cursor_dispatcher_host_(new CursorDispatcherHost(this)), | 44 cursor_dispatcher_host_(new CursorDispatcherHost(this)), |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 214 } | 212 } |
| 215 | 213 |
| 216 void IndexedDBDispatcherHost::OnIDBFactoryGetDatabaseNames( | 214 void IndexedDBDispatcherHost::OnIDBFactoryGetDatabaseNames( |
| 217 const IndexedDBHostMsg_FactoryGetDatabaseNames_Params& params) { | 215 const IndexedDBHostMsg_FactoryGetDatabaseNames_Params& params) { |
| 218 DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); | 216 DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); |
| 219 base::FilePath indexed_db_path = indexed_db_context_->data_path(); | 217 base::FilePath indexed_db_path = indexed_db_context_->data_path(); |
| 220 | 218 |
| 221 Context()->GetIDBFactory()->getDatabaseNames( | 219 Context()->GetIDBFactory()->getDatabaseNames( |
| 222 new IndexedDBCallbacks<std::vector<string16> >( | 220 new IndexedDBCallbacks<std::vector<string16> >( |
| 223 this, params.ipc_thread_id, params.ipc_callbacks_id), | 221 this, params.ipc_thread_id, params.ipc_callbacks_id), |
| 224 WebKit::WebString::fromUTF8(params.database_identifier), | 222 base::UTF8ToUTF16(params.database_identifier), |
| 225 indexed_db_path.AsUTF16Unsafe()); | 223 indexed_db_path.AsUTF16Unsafe()); |
| 226 } | 224 } |
| 227 | 225 |
| 228 void IndexedDBDispatcherHost::OnIDBFactoryOpen( | 226 void IndexedDBDispatcherHost::OnIDBFactoryOpen( |
| 229 const IndexedDBHostMsg_FactoryOpen_Params& params) { | 227 const IndexedDBHostMsg_FactoryOpen_Params& params) { |
| 230 DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); | 228 DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); |
| 231 base::FilePath indexed_db_path = indexed_db_context_->data_path(); | 229 base::FilePath indexed_db_path = indexed_db_context_->data_path(); |
| 232 | 230 |
| 233 GURL origin_url = | 231 GURL origin_url = |
| 234 webkit_database::GetOriginFromIdentifier(params.database_identifier); | 232 webkit_database::GetOriginFromIdentifier(params.database_identifier); |
| 235 | 233 |
| 236 int64 host_transaction_id = HostTransactionId(params.transaction_id); | 234 int64 host_transaction_id = HostTransactionId(params.transaction_id); |
| 237 | 235 |
| 238 // TODO(dgrogan): Don't let a non-existing database be opened (and therefore | 236 // TODO(dgrogan): Don't let a non-existing database be opened (and therefore |
| 239 // created) if this origin is already over quota. | 237 // created) if this origin is already over quota. |
| 240 Context()->GetIDBFactory() | 238 Context()->GetIDBFactory() |
| 241 ->open(params.name, | 239 ->open(params.name, |
| 242 params.version, | 240 params.version, |
| 243 host_transaction_id, | 241 host_transaction_id, |
| 244 new IndexedDBCallbacksDatabase(this, | 242 new IndexedDBCallbacksDatabase(this, |
| 245 params.ipc_thread_id, | 243 params.ipc_thread_id, |
| 246 params.ipc_callbacks_id, | 244 params.ipc_callbacks_id, |
| 247 params.ipc_database_callbacks_id, | 245 params.ipc_database_callbacks_id, |
| 248 host_transaction_id, | 246 host_transaction_id, |
| 249 origin_url), | 247 origin_url), |
| 250 new IndexedDBDatabaseCallbacks( | 248 new IndexedDBDatabaseCallbacks( |
| 251 this, params.ipc_thread_id, params.ipc_database_callbacks_id), | 249 this, params.ipc_thread_id, params.ipc_database_callbacks_id), |
| 252 WebKit::WebString::fromUTF8(params.database_identifier), | 250 base::UTF8ToUTF16(params.database_identifier), |
| 253 indexed_db_path.AsUTF16Unsafe()); | 251 indexed_db_path.AsUTF16Unsafe()); |
| 254 } | 252 } |
| 255 | 253 |
| 256 void IndexedDBDispatcherHost::OnIDBFactoryDeleteDatabase( | 254 void IndexedDBDispatcherHost::OnIDBFactoryDeleteDatabase( |
| 257 const IndexedDBHostMsg_FactoryDeleteDatabase_Params& params) { | 255 const IndexedDBHostMsg_FactoryDeleteDatabase_Params& params) { |
| 258 DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); | 256 DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); |
| 259 base::FilePath indexed_db_path = indexed_db_context_->data_path(); | 257 base::FilePath indexed_db_path = indexed_db_context_->data_path(); |
| 260 | 258 |
| 261 Context()->GetIDBFactory() | 259 Context()->GetIDBFactory() |
| 262 ->deleteDatabase(params.name, | 260 ->deleteDatabase(params.name, |
| 263 new IndexedDBCallbacks<std::vector<char> >( | 261 new IndexedDBCallbacks<std::vector<char> >( |
| 264 this, params.ipc_thread_id, params.ipc_callbacks_id), | 262 this, params.ipc_thread_id, params.ipc_callbacks_id), |
| 265 WebKit::WebString::fromUTF8(params.database_identifier), | 263 base::UTF8ToUTF16(params.database_identifier), |
| 266 indexed_db_path.AsUTF16Unsafe()); | 264 indexed_db_path.AsUTF16Unsafe()); |
| 267 } | 265 } |
| 268 | 266 |
| 269 void IndexedDBDispatcherHost::FinishTransaction(int64 host_transaction_id, | 267 void IndexedDBDispatcherHost::FinishTransaction(int64 host_transaction_id, |
| 270 bool committed) { | 268 bool committed) { |
| 271 DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); | 269 DCHECK(indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); |
| 272 TransactionIDToURLMap& transaction_url_map = | 270 TransactionIDToURLMap& transaction_url_map = |
| 273 database_dispatcher_host_->transaction_url_map_; | 271 database_dispatcher_host_->transaction_url_map_; |
| 274 TransactionIDToSizeMap& transaction_size_map = | 272 TransactionIDToSizeMap& transaction_size_map = |
| 275 database_dispatcher_host_->transaction_size_map_; | 273 database_dispatcher_host_->transaction_size_map_; |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 343 for (TransactionIDToDatabaseIDMap::iterator iter = | 341 for (TransactionIDToDatabaseIDMap::iterator iter = |
| 344 transaction_database_map_.begin(); | 342 transaction_database_map_.begin(); |
| 345 iter != transaction_database_map_.end();) { | 343 iter != transaction_database_map_.end();) { |
| 346 int64 transaction_id = iter->first; | 344 int64 transaction_id = iter->first; |
| 347 int32 ipc_database_id = iter->second; | 345 int32 ipc_database_id = iter->second; |
| 348 ++iter; | 346 ++iter; |
| 349 WebIDBDatabaseImpl* database = map_.Lookup(ipc_database_id); | 347 WebIDBDatabaseImpl* database = map_.Lookup(ipc_database_id); |
| 350 if (database) { | 348 if (database) { |
| 351 database->abort( | 349 database->abort( |
| 352 transaction_id, | 350 transaction_id, |
| 353 WebIDBDatabaseError(WebKit::WebIDBDatabaseExceptionUnknownError)); | 351 IndexedDBDatabaseError(WebKit::WebIDBDatabaseExceptionUnknownError)); |
| 354 } | 352 } |
| 355 } | 353 } |
| 356 DCHECK(transaction_database_map_.empty()); | 354 DCHECK(transaction_database_map_.empty()); |
| 357 | 355 |
| 358 for (WebIDBObjectIDToURLMap::iterator iter = database_url_map_.begin(); | 356 for (WebIDBObjectIDToURLMap::iterator iter = database_url_map_.begin(); |
| 359 iter != database_url_map_.end(); | 357 iter != database_url_map_.end(); |
| 360 iter++) { | 358 iter++) { |
| 361 WebIDBDatabaseImpl* database = map_.Lookup(iter->first); | 359 WebIDBDatabaseImpl* database = map_.Lookup(iter->first); |
| 362 if (database) { | 360 if (database) { |
| 363 database->close(); | 361 database->close(); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 417 int64 host_transaction_id = parent_->HostTransactionId(params.transaction_id); | 415 int64 host_transaction_id = parent_->HostTransactionId(params.transaction_id); |
| 418 database->createObjectStore(host_transaction_id, | 416 database->createObjectStore(host_transaction_id, |
| 419 params.object_store_id, | 417 params.object_store_id, |
| 420 params.name, | 418 params.name, |
| 421 params.key_path, | 419 params.key_path, |
| 422 params.auto_increment); | 420 params.auto_increment); |
| 423 if (parent_->Context()->IsOverQuota( | 421 if (parent_->Context()->IsOverQuota( |
| 424 database_url_map_[params.ipc_database_id])) { | 422 database_url_map_[params.ipc_database_id])) { |
| 425 database->abort( | 423 database->abort( |
| 426 host_transaction_id, | 424 host_transaction_id, |
| 427 WebIDBDatabaseError(WebKit::WebIDBDatabaseExceptionQuotaError)); | 425 IndexedDBDatabaseError(WebKit::WebIDBDatabaseExceptionQuotaError)); |
| 428 } | 426 } |
| 429 } | 427 } |
| 430 | 428 |
| 431 void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnDeleteObjectStore( | 429 void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnDeleteObjectStore( |
| 432 int32 ipc_database_id, | 430 int32 ipc_database_id, |
| 433 int64 transaction_id, | 431 int64 transaction_id, |
| 434 int64 object_store_id) { | 432 int64 object_store_id) { |
| 435 DCHECK( | 433 DCHECK( |
| 436 parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); | 434 parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); |
| 437 WebIDBDatabaseImpl* database = | 435 WebIDBDatabaseImpl* database = |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 544 parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); | 542 parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); |
| 545 WebIDBDatabaseImpl* database = | 543 WebIDBDatabaseImpl* database = |
| 546 parent_->GetOrTerminateProcess(&map_, params.ipc_database_id); | 544 parent_->GetOrTerminateProcess(&map_, params.ipc_database_id); |
| 547 if (!database) | 545 if (!database) |
| 548 return; | 546 return; |
| 549 | 547 |
| 550 int64 host_transaction_id = parent_->HostTransactionId(params.transaction_id); | 548 int64 host_transaction_id = parent_->HostTransactionId(params.transaction_id); |
| 551 if (params.index_ids.size() != params.index_keys.size()) { | 549 if (params.index_ids.size() != params.index_keys.size()) { |
| 552 database->abort( | 550 database->abort( |
| 553 host_transaction_id, | 551 host_transaction_id, |
| 554 WebIDBDatabaseError( | 552 IndexedDBDatabaseError( |
| 555 WebKit::WebIDBDatabaseExceptionUnknownError, | 553 WebKit::WebIDBDatabaseExceptionUnknownError, |
| 556 "Malformed IPC message: index_ids.size() != index_keys.size()")); | 554 "Malformed IPC message: index_ids.size() != index_keys.size()")); |
| 557 return; | 555 return; |
| 558 } | 556 } |
| 559 | 557 |
| 560 database->setIndexKeys(host_transaction_id, | 558 database->setIndexKeys(host_transaction_id, |
| 561 params.object_store_id, | 559 params.object_store_id, |
| 562 params.primary_key, | 560 params.primary_key, |
| 563 params.index_ids, | 561 params.index_ids, |
| 564 params.index_keys); | 562 params.index_keys); |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 684 if (!database) | 682 if (!database) |
| 685 return; | 683 return; |
| 686 | 684 |
| 687 int64 host_transaction_id = parent_->HostTransactionId(transaction_id); | 685 int64 host_transaction_id = parent_->HostTransactionId(transaction_id); |
| 688 int64 transaction_size = transaction_size_map_[host_transaction_id]; | 686 int64 transaction_size = transaction_size_map_[host_transaction_id]; |
| 689 if (transaction_size && | 687 if (transaction_size && |
| 690 parent_->Context()->WouldBeOverQuota( | 688 parent_->Context()->WouldBeOverQuota( |
| 691 transaction_url_map_[host_transaction_id], transaction_size)) { | 689 transaction_url_map_[host_transaction_id], transaction_size)) { |
| 692 database->abort( | 690 database->abort( |
| 693 host_transaction_id, | 691 host_transaction_id, |
| 694 WebIDBDatabaseError(WebKit::WebIDBDatabaseExceptionQuotaError)); | 692 IndexedDBDatabaseError(WebKit::WebIDBDatabaseExceptionQuotaError)); |
| 695 return; | 693 return; |
| 696 } | 694 } |
| 697 | 695 |
| 698 database->commit(host_transaction_id); | 696 database->commit(host_transaction_id); |
| 699 } | 697 } |
| 700 | 698 |
| 701 void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnCreateIndex( | 699 void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnCreateIndex( |
| 702 const IndexedDBHostMsg_DatabaseCreateIndex_Params& params) { | 700 const IndexedDBHostMsg_DatabaseCreateIndex_Params& params) { |
| 703 DCHECK( | 701 DCHECK( |
| 704 parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); | 702 parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); |
| 705 WebIDBDatabaseImpl* database = | 703 WebIDBDatabaseImpl* database = |
| 706 parent_->GetOrTerminateProcess(&map_, params.ipc_database_id); | 704 parent_->GetOrTerminateProcess(&map_, params.ipc_database_id); |
| 707 if (!database) | 705 if (!database) |
| 708 return; | 706 return; |
| 709 | 707 |
| 710 int64 host_transaction_id = parent_->HostTransactionId(params.transaction_id); | 708 int64 host_transaction_id = parent_->HostTransactionId(params.transaction_id); |
| 711 database->createIndex(host_transaction_id, | 709 database->createIndex(host_transaction_id, |
| 712 params.object_store_id, | 710 params.object_store_id, |
| 713 params.index_id, | 711 params.index_id, |
| 714 params.name, | 712 params.name, |
| 715 params.key_path, | 713 params.key_path, |
| 716 params.unique, | 714 params.unique, |
| 717 params.multi_entry); | 715 params.multi_entry); |
| 718 if (parent_->Context()->IsOverQuota( | 716 if (parent_->Context()->IsOverQuota( |
| 719 database_url_map_[params.ipc_database_id])) { | 717 database_url_map_[params.ipc_database_id])) { |
| 720 database->abort( | 718 database->abort( |
| 721 host_transaction_id, | 719 host_transaction_id, |
| 722 WebIDBDatabaseError(WebKit::WebIDBDatabaseExceptionQuotaError)); | 720 IndexedDBDatabaseError(WebKit::WebIDBDatabaseExceptionQuotaError)); |
| 723 } | 721 } |
| 724 } | 722 } |
| 725 | 723 |
| 726 void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnDeleteIndex( | 724 void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnDeleteIndex( |
| 727 int32 ipc_database_id, | 725 int32 ipc_database_id, |
| 728 int64 transaction_id, | 726 int64 transaction_id, |
| 729 int64 object_store_id, | 727 int64 object_store_id, |
| 730 int64 index_id) { | 728 int64 index_id) { |
| 731 DCHECK( | 729 DCHECK( |
| 732 parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); | 730 parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 844 } | 842 } |
| 845 | 843 |
| 846 void IndexedDBDispatcherHost::CursorDispatcherHost::OnDestroyed( | 844 void IndexedDBDispatcherHost::CursorDispatcherHost::OnDestroyed( |
| 847 int32 ipc_object_id) { | 845 int32 ipc_object_id) { |
| 848 DCHECK( | 846 DCHECK( |
| 849 parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); | 847 parent_->indexed_db_context_->TaskRunner()->RunsTasksOnCurrentThread()); |
| 850 parent_->DestroyObject(&map_, ipc_object_id); | 848 parent_->DestroyObject(&map_, ipc_object_id); |
| 851 } | 849 } |
| 852 | 850 |
| 853 } // namespace content | 851 } // namespace content |
| OLD | NEW |