| Index: content/child/indexed_db/indexed_db_callbacks_impl.cc
|
| diff --git a/content/child/indexed_db/indexed_db_callbacks_impl.cc b/content/child/indexed_db/indexed_db_callbacks_impl.cc
|
| index 1e88ab80bf2a796233a2e08bf52866fd7394316c..465cf5759bdcfb75407e1ad6b89f76cac771f626 100644
|
| --- a/content/child/indexed_db/indexed_db_callbacks_impl.cc
|
| +++ b/content/child/indexed_db/indexed_db_callbacks_impl.cc
|
| @@ -6,17 +6,23 @@
|
|
|
| #include "content/child/indexed_db/indexed_db_dispatcher.h"
|
| #include "content/child/indexed_db/indexed_db_key_builders.h"
|
| +#include "content/child/indexed_db/webidbcursor_impl.h"
|
| +#include "content/child/indexed_db/webidbdatabase_impl.h"
|
| #include "content/child/thread_safe_sender.h"
|
| #include "content/common/indexed_db/indexed_db_constants.h"
|
| #include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBCallbacks.h"
|
| #include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBDatabaseError.h"
|
| #include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBMetadata.h"
|
| +#include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBValue.h"
|
|
|
| +using blink::WebBlobInfo;
|
| using blink::WebIDBCallbacks;
|
| using blink::WebIDBDatabase;
|
| using blink::WebIDBMetadata;
|
| +using blink::WebIDBValue;
|
| using blink::WebString;
|
| using blink::WebVector;
|
| +using indexed_db::mojom::DatabaseAssociatedPtrInfo;
|
|
|
| namespace content {
|
|
|
| @@ -58,12 +64,47 @@ void ConvertDatabaseMetadata(const content::IndexedDBDatabaseMetadata& metadata,
|
| ConvertObjectStoreMetadata(iter.second, &output->objectStores[i++]);
|
| }
|
|
|
| +void ConvertValue(const indexed_db::mojom::ValuePtr& value,
|
| + WebIDBValue* web_value) {
|
| + if (value->bits.empty())
|
| + return;
|
| +
|
| + blink::WebVector<WebBlobInfo> local_blob_info(
|
| + value->blob_or_file_info.size());
|
| + for (size_t i = 0; i < value->blob_or_file_info.size(); ++i) {
|
| + const auto& info = value->blob_or_file_info[i];
|
| + if (info->file) {
|
| + local_blob_info[i] = WebBlobInfo(
|
| + WebString::fromUTF8(info->uuid), info->file->path.AsUTF16Unsafe(),
|
| + info->file->name, info->mime_type,
|
| + info->file->last_modified.ToDoubleT(), info->size);
|
| + } else {
|
| + local_blob_info[i] = WebBlobInfo(WebString::fromUTF8(info->uuid),
|
| + info->mime_type, info->size);
|
| + }
|
| + }
|
| +
|
| + web_value->data.assign(&*value->bits.begin(), value->bits.size());
|
| + web_value->webBlobInfo.swap(local_blob_info);
|
| +}
|
| +
|
| +void ConvertReturnValue(const indexed_db::mojom::ReturnValuePtr& value,
|
| + WebIDBValue* web_value) {
|
| + ConvertValue(value->value, web_value);
|
| + web_value->primaryKey = WebIDBKeyBuilder::Build(value->primary_key);
|
| + web_value->keyPath = WebIDBKeyPathBuilder::Build(value->key_path);
|
| +}
|
| +
|
| } // namespace
|
|
|
| IndexedDBCallbacksImpl::IndexedDBCallbacksImpl(
|
| std::unique_ptr<WebIDBCallbacks> callbacks,
|
| + int64_t transaction_id,
|
| + scoped_refptr<base::SingleThreadTaskRunner> io_runner,
|
| scoped_refptr<ThreadSafeSender> thread_safe_sender)
|
| : internal_state_(new InternalState(std::move(callbacks),
|
| + transaction_id,
|
| + std::move(io_runner),
|
| std::move(thread_safe_sender))),
|
| callback_runner_(base::ThreadTaskRunnerHandle::Get()) {}
|
|
|
| @@ -93,7 +134,7 @@ void IndexedDBCallbacksImpl::Blocked(int64_t existing_version) {
|
| }
|
|
|
| void IndexedDBCallbacksImpl::UpgradeNeeded(
|
| - int32_t database_id,
|
| + DatabaseAssociatedPtrInfo database,
|
| int64_t old_version,
|
| blink::WebIDBDataLoss data_loss,
|
| const std::string& data_loss_message,
|
| @@ -101,17 +142,49 @@ void IndexedDBCallbacksImpl::UpgradeNeeded(
|
| callback_runner_->PostTask(
|
| FROM_HERE,
|
| base::Bind(&InternalState::UpgradeNeeded,
|
| - base::Unretained(internal_state_), database_id, old_version,
|
| - data_loss, data_loss_message, metadata));
|
| + base::Unretained(internal_state_), base::Passed(&database),
|
| + old_version, data_loss, data_loss_message, metadata));
|
| }
|
|
|
| void IndexedDBCallbacksImpl::SuccessDatabase(
|
| - int32_t database_id,
|
| + DatabaseAssociatedPtrInfo database,
|
| const content::IndexedDBDatabaseMetadata& metadata) {
|
| + callback_runner_->PostTask(FROM_HERE,
|
| + base::Bind(&InternalState::SuccessDatabase,
|
| + base::Unretained(internal_state_),
|
| + base::Passed(&database), metadata));
|
| +}
|
| +
|
| +void IndexedDBCallbacksImpl::SuccessCursor(int32_t cursor_id,
|
| + const IndexedDBKey& key,
|
| + const IndexedDBKey& primary_key,
|
| + indexed_db::mojom::ValuePtr value) {
|
| + callback_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&InternalState::SuccessCursor,
|
| + base::Unretained(internal_state_), cursor_id, key,
|
| + primary_key, base::Passed(&value)));
|
| +}
|
| +
|
| +void IndexedDBCallbacksImpl::SuccessValue(
|
| + indexed_db::mojom::ReturnValuePtr value) {
|
| callback_runner_->PostTask(
|
| FROM_HERE,
|
| - base::Bind(&InternalState::SuccessDatabase,
|
| - base::Unretained(internal_state_), database_id, metadata));
|
| + base::Bind(&InternalState::SuccessValue,
|
| + base::Unretained(internal_state_), base::Passed(&value)));
|
| +}
|
| +
|
| +void IndexedDBCallbacksImpl::SuccessArray(
|
| + std::vector<indexed_db::mojom::ReturnValuePtr> values) {
|
| + callback_runner_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&InternalState::SuccessArray,
|
| + base::Unretained(internal_state_), base::Passed(&values)));
|
| +}
|
| +
|
| +void IndexedDBCallbacksImpl::SuccessKey(const IndexedDBKey& key) {
|
| + callback_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&InternalState::SuccessKey,
|
| + base::Unretained(internal_state_), key));
|
| }
|
|
|
| void IndexedDBCallbacksImpl::SuccessInteger(int64_t value) {
|
| @@ -120,10 +193,20 @@ void IndexedDBCallbacksImpl::SuccessInteger(int64_t value) {
|
| base::Unretained(internal_state_), value));
|
| }
|
|
|
| +void IndexedDBCallbacksImpl::Success() {
|
| + callback_runner_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&InternalState::Success, base::Unretained(internal_state_)));
|
| +}
|
| +
|
| IndexedDBCallbacksImpl::InternalState::InternalState(
|
| std::unique_ptr<blink::WebIDBCallbacks> callbacks,
|
| + int64_t transaction_id,
|
| + scoped_refptr<base::SingleThreadTaskRunner> io_runner,
|
| scoped_refptr<ThreadSafeSender> thread_safe_sender)
|
| : callbacks_(std::move(callbacks)),
|
| + transaction_id_(transaction_id),
|
| + io_runner_(std::move(io_runner)),
|
| thread_safe_sender_(std::move(thread_safe_sender)) {
|
| IndexedDBDispatcher* dispatcher =
|
| IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get());
|
| @@ -140,48 +223,100 @@ void IndexedDBCallbacksImpl::InternalState::Error(
|
| int32_t code,
|
| const base::string16& message) {
|
| callbacks_->onError(blink::WebIDBDatabaseError(code, message));
|
| + callbacks_.reset();
|
| }
|
|
|
| void IndexedDBCallbacksImpl::InternalState::SuccessStringList(
|
| const std::vector<base::string16>& value) {
|
| callbacks_->onSuccess(WebVector<WebString>(value));
|
| + callbacks_.reset();
|
| }
|
|
|
| void IndexedDBCallbacksImpl::InternalState::Blocked(int64_t existing_version) {
|
| callbacks_->onBlocked(existing_version);
|
| + // Not resetting |callbacks_|.
|
| }
|
|
|
| void IndexedDBCallbacksImpl::InternalState::UpgradeNeeded(
|
| - int32_t database_id,
|
| + DatabaseAssociatedPtrInfo database_info,
|
| int64_t old_version,
|
| blink::WebIDBDataLoss data_loss,
|
| const std::string& data_loss_message,
|
| const content::IndexedDBDatabaseMetadata& metadata) {
|
| - IndexedDBDispatcher* dispatcher =
|
| - IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get());
|
| - WebIDBDatabase* database = dispatcher->RegisterDatabase(database_id);
|
| + WebIDBDatabase* database = new WebIDBDatabaseImpl(
|
| + std::move(database_info), io_runner_, thread_safe_sender_);
|
| WebIDBMetadata web_metadata;
|
| ConvertDatabaseMetadata(metadata, &web_metadata);
|
| callbacks_->onUpgradeNeeded(old_version, database, web_metadata, data_loss,
|
| WebString::fromUTF8(data_loss_message));
|
| + // Not resetting |callbacks_|.
|
| }
|
|
|
| void IndexedDBCallbacksImpl::InternalState::SuccessDatabase(
|
| - int32_t database_id,
|
| + DatabaseAssociatedPtrInfo database_info,
|
| const content::IndexedDBDatabaseMetadata& metadata) {
|
| WebIDBDatabase* database = nullptr;
|
| - if (database_id != kNoDatabase) {
|
| - IndexedDBDispatcher* dispatcher =
|
| - IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get());
|
| - database = dispatcher->RegisterDatabase(database_id);
|
| + if (database_info.is_valid()) {
|
| + database = new WebIDBDatabaseImpl(std::move(database_info), io_runner_,
|
| + thread_safe_sender_);
|
| }
|
| WebIDBMetadata web_metadata;
|
| ConvertDatabaseMetadata(metadata, &web_metadata);
|
| callbacks_->onSuccess(database, web_metadata);
|
| + callbacks_.reset();
|
| +}
|
| +
|
| +void IndexedDBCallbacksImpl::InternalState::SuccessCursor(
|
| + int32_t cursor_id,
|
| + const IndexedDBKey& key,
|
| + const IndexedDBKey& primary_key,
|
| + indexed_db::mojom::ValuePtr value) {
|
| + WebIDBValue web_value;
|
| + if (value)
|
| + ConvertValue(value, &web_value);
|
| +
|
| + WebIDBCursorImpl* cursor = new WebIDBCursorImpl(cursor_id, transaction_id_,
|
| + thread_safe_sender_.get());
|
| + IndexedDBDispatcher* dispatcher =
|
| + IndexedDBDispatcher::ThreadSpecificInstance(thread_safe_sender_.get());
|
| + dispatcher->RegisterCursor(cursor_id, cursor);
|
| + callbacks_->onSuccess(cursor, WebIDBKeyBuilder::Build(key),
|
| + WebIDBKeyBuilder::Build(primary_key), web_value);
|
| + callbacks_.reset();
|
| +}
|
| +
|
| +void IndexedDBCallbacksImpl::InternalState::SuccessKey(
|
| + const IndexedDBKey& key) {
|
| + callbacks_->onSuccess(WebIDBKeyBuilder::Build(key));
|
| + callbacks_.reset();
|
| +}
|
| +
|
| +void IndexedDBCallbacksImpl::InternalState::SuccessValue(
|
| + indexed_db::mojom::ReturnValuePtr value) {
|
| + WebIDBValue web_value;
|
| + if (value)
|
| + ConvertReturnValue(value, &web_value);
|
| + callbacks_->onSuccess(web_value);
|
| + callbacks_.reset();
|
| +}
|
| +
|
| +void IndexedDBCallbacksImpl::InternalState::SuccessArray(
|
| + std::vector<indexed_db::mojom::ReturnValuePtr> values) {
|
| + blink::WebVector<WebIDBValue> web_values(values.size());
|
| + for (size_t i = 0; i < values.size(); ++i)
|
| + ConvertReturnValue(values[i], &web_values[i]);
|
| + callbacks_->onSuccess(web_values);
|
| + callbacks_.reset();
|
| }
|
|
|
| void IndexedDBCallbacksImpl::InternalState::SuccessInteger(int64_t value) {
|
| callbacks_->onSuccess(value);
|
| + callbacks_.reset();
|
| +}
|
| +
|
| +void IndexedDBCallbacksImpl::InternalState::Success() {
|
| + callbacks_->onSuccess();
|
| + callbacks_.reset();
|
| }
|
|
|
| } // namespace content
|
|
|