| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/child/indexed_db/indexed_db_dispatcher.h" | 5 #include "content/child/indexed_db/indexed_db_dispatcher.h" |
| 6 | 6 |
| 7 #include "base/format_macros.h" | 7 #include "base/format_macros.h" |
| 8 #include "base/lazy_instance.h" | 8 #include "base/lazy_instance.h" |
| 9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
| 10 #include "base/threading/thread_local.h" | 10 #include "base/threading/thread_local.h" |
| 11 #include "content/child/indexed_db/indexed_db_key_builders.h" |
| 11 #include "content/child/indexed_db/proxy_webidbcursor_impl.h" | 12 #include "content/child/indexed_db/proxy_webidbcursor_impl.h" |
| 12 #include "content/child/indexed_db/proxy_webidbdatabase_impl.h" | 13 #include "content/child/indexed_db/proxy_webidbdatabase_impl.h" |
| 13 #include "content/child/thread_safe_sender.h" | 14 #include "content/child/thread_safe_sender.h" |
| 14 #include "content/common/indexed_db/indexed_db_messages.h" | 15 #include "content/common/indexed_db/indexed_db_messages.h" |
| 15 #include "ipc/ipc_channel.h" | 16 #include "ipc/ipc_channel.h" |
| 16 #include "third_party/WebKit/public/platform/WebIDBDatabaseCallbacks.h" | 17 #include "third_party/WebKit/public/platform/WebIDBDatabaseCallbacks.h" |
| 17 #include "third_party/WebKit/public/platform/WebIDBDatabaseError.h" | 18 #include "third_party/WebKit/public/platform/WebIDBDatabaseError.h" |
| 18 #include "third_party/WebKit/public/platform/WebIDBDatabaseException.h" | 19 #include "third_party/WebKit/public/platform/WebIDBDatabaseException.h" |
| 19 #include "third_party/WebKit/public/platform/WebIDBKeyRange.h" | |
| 20 | 20 |
| 21 using WebKit::WebData; | 21 using WebKit::WebData; |
| 22 using WebKit::WebIDBCallbacks; | 22 using WebKit::WebIDBCallbacks; |
| 23 using WebKit::WebIDBDatabase; | 23 using WebKit::WebIDBDatabase; |
| 24 using WebKit::WebIDBDatabaseCallbacks; | 24 using WebKit::WebIDBDatabaseCallbacks; |
| 25 using WebKit::WebIDBDatabaseError; | 25 using WebKit::WebIDBDatabaseError; |
| 26 using WebKit::WebIDBKey; | 26 using WebKit::WebIDBKey; |
| 27 using WebKit::WebIDBKeyRange; | |
| 28 using WebKit::WebIDBMetadata; | 27 using WebKit::WebIDBMetadata; |
| 29 using WebKit::WebString; | 28 using WebKit::WebString; |
| 30 using WebKit::WebVector; | 29 using WebKit::WebVector; |
| 31 using base::ThreadLocalPointer; | 30 using base::ThreadLocalPointer; |
| 32 using webkit_glue::WorkerTaskRunner; | 31 using webkit_glue::WorkerTaskRunner; |
| 33 | 32 |
| 34 namespace content { | 33 namespace content { |
| 35 static base::LazyInstance<ThreadLocalPointer<IndexedDBDispatcher> >::Leaky | 34 static base::LazyInstance<ThreadLocalPointer<IndexedDBDispatcher> >::Leaky |
| 36 g_idb_dispatcher_tls = LAZY_INSTANCE_INITIALIZER; | 35 g_idb_dispatcher_tls = LAZY_INSTANCE_INITIALIZER; |
| 37 | 36 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 WebVector<WebIDBMetadata::ObjectStore>(idb_metadata.object_stores.size()); | 92 WebVector<WebIDBMetadata::ObjectStore>(idb_metadata.object_stores.size()); |
| 94 | 93 |
| 95 for (size_t i = 0; i < idb_metadata.object_stores.size(); ++i) { | 94 for (size_t i = 0; i < idb_metadata.object_stores.size(); ++i) { |
| 96 const IndexedDBObjectStoreMetadata& idb_store_metadata = | 95 const IndexedDBObjectStoreMetadata& idb_store_metadata = |
| 97 idb_metadata.object_stores[i]; | 96 idb_metadata.object_stores[i]; |
| 98 WebIDBMetadata::ObjectStore& web_store_metadata = | 97 WebIDBMetadata::ObjectStore& web_store_metadata = |
| 99 web_metadata.objectStores[i]; | 98 web_metadata.objectStores[i]; |
| 100 | 99 |
| 101 web_store_metadata.id = idb_store_metadata.id; | 100 web_store_metadata.id = idb_store_metadata.id; |
| 102 web_store_metadata.name = idb_store_metadata.name; | 101 web_store_metadata.name = idb_store_metadata.name; |
| 103 web_store_metadata.keyPath = idb_store_metadata.keyPath; | 102 web_store_metadata.keyPath = |
| 103 IndexedDBKeyPathBuilder::Build(idb_store_metadata.keyPath); |
| 104 web_store_metadata.autoIncrement = idb_store_metadata.autoIncrement; | 104 web_store_metadata.autoIncrement = idb_store_metadata.autoIncrement; |
| 105 web_store_metadata.maxIndexId = idb_store_metadata.max_index_id; | 105 web_store_metadata.maxIndexId = idb_store_metadata.max_index_id; |
| 106 web_store_metadata.indexes = | 106 web_store_metadata.indexes = |
| 107 WebVector<WebIDBMetadata::Index>(idb_store_metadata.indexes.size()); | 107 WebVector<WebIDBMetadata::Index>(idb_store_metadata.indexes.size()); |
| 108 | 108 |
| 109 for (size_t j = 0; j < idb_store_metadata.indexes.size(); ++j) { | 109 for (size_t j = 0; j < idb_store_metadata.indexes.size(); ++j) { |
| 110 const IndexedDBIndexMetadata& idb_index_metadata = | 110 const IndexedDBIndexMetadata& idb_index_metadata = |
| 111 idb_store_metadata.indexes[j]; | 111 idb_store_metadata.indexes[j]; |
| 112 WebIDBMetadata::Index& web_index_metadata = web_store_metadata.indexes[j]; | 112 WebIDBMetadata::Index& web_index_metadata = web_store_metadata.indexes[j]; |
| 113 | 113 |
| 114 web_index_metadata.id = idb_index_metadata.id; | 114 web_index_metadata.id = idb_index_metadata.id; |
| 115 web_index_metadata.name = idb_index_metadata.name; | 115 web_index_metadata.name = idb_index_metadata.name; |
| 116 web_index_metadata.keyPath = idb_index_metadata.keyPath; | 116 web_index_metadata.keyPath = |
| 117 IndexedDBKeyPathBuilder::Build(idb_index_metadata.keyPath); |
| 117 web_index_metadata.unique = idb_index_metadata.unique; | 118 web_index_metadata.unique = idb_index_metadata.unique; |
| 118 web_index_metadata.multiEntry = idb_index_metadata.multiEntry; | 119 web_index_metadata.multiEntry = idb_index_metadata.multiEntry; |
| 119 } | 120 } |
| 120 } | 121 } |
| 121 | 122 |
| 122 return web_metadata; | 123 return web_metadata; |
| 123 } | 124 } |
| 124 | 125 |
| 125 void IndexedDBDispatcher::OnMessageReceived(const IPC::Message& msg) { | 126 void IndexedDBDispatcher::OnMessageReceived(const IPC::Message& msg) { |
| 126 bool handled = true; | 127 bool handled = true; |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 | 353 |
| 353 COMPILE_ASSERT(sizeof(params.index_ids[0]) == sizeof(index_ids[0]), | 354 COMPILE_ASSERT(sizeof(params.index_ids[0]) == sizeof(index_ids[0]), |
| 354 Cant_copy); | 355 Cant_copy); |
| 355 params.index_ids | 356 params.index_ids |
| 356 .assign(index_ids.data(), index_ids.data() + index_ids.size()); | 357 .assign(index_ids.data(), index_ids.data() + index_ids.size()); |
| 357 | 358 |
| 358 params.index_keys.resize(index_keys.size()); | 359 params.index_keys.resize(index_keys.size()); |
| 359 for (size_t i = 0; i < index_keys.size(); ++i) { | 360 for (size_t i = 0; i < index_keys.size(); ++i) { |
| 360 params.index_keys[i].resize(index_keys[i].size()); | 361 params.index_keys[i].resize(index_keys[i].size()); |
| 361 for (size_t j = 0; j < index_keys[i].size(); ++j) { | 362 for (size_t j = 0; j < index_keys[i].size(); ++j) { |
| 362 params.index_keys[i][j] = IndexedDBKey(index_keys[i][j]); | 363 params.index_keys[i][j] = |
| 364 IndexedDBKey(IndexedDBKeyBuilder::Build(index_keys[i][j])); |
| 363 } | 365 } |
| 364 } | 366 } |
| 365 Send(new IndexedDBHostMsg_DatabasePut(params)); | 367 Send(new IndexedDBHostMsg_DatabasePut(params)); |
| 366 } | 368 } |
| 367 | 369 |
| 368 void IndexedDBDispatcher::RequestIDBDatabaseOpenCursor( | 370 void IndexedDBDispatcher::RequestIDBDatabaseOpenCursor( |
| 369 int32 ipc_database_id, | 371 int32 ipc_database_id, |
| 370 int64 transaction_id, | 372 int64 transaction_id, |
| 371 int64 object_store_id, | 373 int64 object_store_id, |
| 372 int64 index_id, | 374 int64 index_id, |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 466 pending_callbacks_.Remove(ipc_callbacks_id); | 468 pending_callbacks_.Remove(ipc_callbacks_id); |
| 467 } | 469 } |
| 468 | 470 |
| 469 void IndexedDBDispatcher::OnSuccessIndexedDBKey(int32 ipc_thread_id, | 471 void IndexedDBDispatcher::OnSuccessIndexedDBKey(int32 ipc_thread_id, |
| 470 int32 ipc_callbacks_id, | 472 int32 ipc_callbacks_id, |
| 471 const IndexedDBKey& key) { | 473 const IndexedDBKey& key) { |
| 472 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); | 474 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); |
| 473 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); | 475 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); |
| 474 if (!callbacks) | 476 if (!callbacks) |
| 475 return; | 477 return; |
| 476 callbacks->onSuccess(WebIDBKey(key)); | 478 callbacks->onSuccess(IndexedDBKeyBuilder::Build(key)); |
| 477 pending_callbacks_.Remove(ipc_callbacks_id); | 479 pending_callbacks_.Remove(ipc_callbacks_id); |
| 478 } | 480 } |
| 479 | 481 |
| 480 void IndexedDBDispatcher::OnSuccessStringList( | 482 void IndexedDBDispatcher::OnSuccessStringList( |
| 481 int32 ipc_thread_id, | 483 int32 ipc_thread_id, |
| 482 int32 ipc_callbacks_id, | 484 int32 ipc_callbacks_id, |
| 483 const std::vector<string16>& value) { | 485 const std::vector<string16>& value) { |
| 484 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); | 486 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); |
| 485 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); | 487 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); |
| 486 if (!callbacks) | 488 if (!callbacks) |
| (...skipping 22 matching lines...) Expand all Loading... |
| 509 const std::string& value, | 511 const std::string& value, |
| 510 const IndexedDBKey& primary_key, | 512 const IndexedDBKey& primary_key, |
| 511 const IndexedDBKeyPath& key_path) { | 513 const IndexedDBKeyPath& key_path) { |
| 512 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); | 514 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); |
| 513 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); | 515 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); |
| 514 if (!callbacks) | 516 if (!callbacks) |
| 515 return; | 517 return; |
| 516 WebData web_value; | 518 WebData web_value; |
| 517 if (value.size()) | 519 if (value.size()) |
| 518 web_value.assign(&*value.begin(), value.size()); | 520 web_value.assign(&*value.begin(), value.size()); |
| 519 callbacks->onSuccess(web_value, primary_key, key_path); | 521 callbacks->onSuccess(web_value, |
| 522 IndexedDBKeyBuilder::Build(primary_key), |
| 523 IndexedDBKeyPathBuilder::Build(key_path)); |
| 520 pending_callbacks_.Remove(ipc_callbacks_id); | 524 pending_callbacks_.Remove(ipc_callbacks_id); |
| 521 } | 525 } |
| 522 | 526 |
| 523 void IndexedDBDispatcher::OnSuccessInteger(int32 ipc_thread_id, | 527 void IndexedDBDispatcher::OnSuccessInteger(int32 ipc_thread_id, |
| 524 int32 ipc_callbacks_id, | 528 int32 ipc_callbacks_id, |
| 525 int64 value) { | 529 int64 value) { |
| 526 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); | 530 DCHECK_EQ(ipc_thread_id, CurrentWorkerId()); |
| 527 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); | 531 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); |
| 528 if (!callbacks) | 532 if (!callbacks) |
| 529 return; | 533 return; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 552 if (p.value.size()) | 556 if (p.value.size()) |
| 553 web_value.assign(&*p.value.begin(), p.value.size()); | 557 web_value.assign(&*p.value.begin(), p.value.size()); |
| 554 | 558 |
| 555 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); | 559 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); |
| 556 if (!callbacks) | 560 if (!callbacks) |
| 557 return; | 561 return; |
| 558 | 562 |
| 559 RendererWebIDBCursorImpl* cursor = | 563 RendererWebIDBCursorImpl* cursor = |
| 560 new RendererWebIDBCursorImpl(ipc_object_id, thread_safe_sender_.get()); | 564 new RendererWebIDBCursorImpl(ipc_object_id, thread_safe_sender_.get()); |
| 561 cursors_[ipc_object_id] = cursor; | 565 cursors_[ipc_object_id] = cursor; |
| 562 callbacks->onSuccess(cursor, key, primary_key, web_value); | 566 callbacks->onSuccess(cursor, IndexedDBKeyBuilder::Build(key), |
| 567 IndexedDBKeyBuilder::Build(primary_key), web_value); |
| 563 | 568 |
| 564 pending_callbacks_.Remove(ipc_callbacks_id); | 569 pending_callbacks_.Remove(ipc_callbacks_id); |
| 565 } | 570 } |
| 566 | 571 |
| 567 void IndexedDBDispatcher::OnSuccessCursorContinue( | 572 void IndexedDBDispatcher::OnSuccessCursorContinue( |
| 568 const IndexedDBMsg_CallbacksSuccessCursorContinue_Params& p) { | 573 const IndexedDBMsg_CallbacksSuccessCursorContinue_Params& p) { |
| 569 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); | 574 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); |
| 570 int32 ipc_callbacks_id = p.ipc_callbacks_id; | 575 int32 ipc_callbacks_id = p.ipc_callbacks_id; |
| 571 int32 ipc_cursor_id = p.ipc_cursor_id; | 576 int32 ipc_cursor_id = p.ipc_cursor_id; |
| 572 const IndexedDBKey& key = p.key; | 577 const IndexedDBKey& key = p.key; |
| 573 const IndexedDBKey& primary_key = p.primary_key; | 578 const IndexedDBKey& primary_key = p.primary_key; |
| 574 const std::string& value = p.value; | 579 const std::string& value = p.value; |
| 575 | 580 |
| 576 RendererWebIDBCursorImpl* cursor = cursors_[ipc_cursor_id]; | 581 RendererWebIDBCursorImpl* cursor = cursors_[ipc_cursor_id]; |
| 577 DCHECK(cursor); | 582 DCHECK(cursor); |
| 578 | 583 |
| 579 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); | 584 WebIDBCallbacks* callbacks = pending_callbacks_.Lookup(ipc_callbacks_id); |
| 580 if (!callbacks) | 585 if (!callbacks) |
| 581 return; | 586 return; |
| 582 | 587 |
| 583 WebData web_value; | 588 WebData web_value; |
| 584 if (value.size()) | 589 if (value.size()) |
| 585 web_value.assign(&*value.begin(), value.size()); | 590 web_value.assign(&*value.begin(), value.size()); |
| 586 callbacks->onSuccess(key, primary_key, web_value); | 591 callbacks->onSuccess(IndexedDBKeyBuilder::Build(key), |
| 592 IndexedDBKeyBuilder::Build(primary_key), web_value); |
| 587 | 593 |
| 588 pending_callbacks_.Remove(ipc_callbacks_id); | 594 pending_callbacks_.Remove(ipc_callbacks_id); |
| 589 } | 595 } |
| 590 | 596 |
| 591 void IndexedDBDispatcher::OnSuccessCursorPrefetch( | 597 void IndexedDBDispatcher::OnSuccessCursorPrefetch( |
| 592 const IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params& p) { | 598 const IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params& p) { |
| 593 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); | 599 DCHECK_EQ(p.ipc_thread_id, CurrentWorkerId()); |
| 594 int32 ipc_callbacks_id = p.ipc_callbacks_id; | 600 int32 ipc_callbacks_id = p.ipc_callbacks_id; |
| 595 int32 ipc_cursor_id = p.ipc_cursor_id; | 601 int32 ipc_cursor_id = p.ipc_cursor_id; |
| 596 const std::vector<IndexedDBKey>& keys = p.keys; | 602 const std::vector<IndexedDBKey>& keys = p.keys; |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 707 int32 ipc_exception_cursor_id) { | 713 int32 ipc_exception_cursor_id) { |
| 708 typedef std::map<int32, RendererWebIDBCursorImpl*>::iterator Iterator; | 714 typedef std::map<int32, RendererWebIDBCursorImpl*>::iterator Iterator; |
| 709 for (Iterator i = cursors_.begin(); i != cursors_.end(); ++i) { | 715 for (Iterator i = cursors_.begin(); i != cursors_.end(); ++i) { |
| 710 if (i->first == ipc_exception_cursor_id) | 716 if (i->first == ipc_exception_cursor_id) |
| 711 continue; | 717 continue; |
| 712 i->second->ResetPrefetchCache(); | 718 i->second->ResetPrefetchCache(); |
| 713 } | 719 } |
| 714 } | 720 } |
| 715 | 721 |
| 716 } // namespace content | 722 } // namespace content |
| OLD | NEW |