| Index: content/browser/indexed_db/indexed_db_connection.cc
|
| diff --git a/content/browser/indexed_db/indexed_db_connection.cc b/content/browser/indexed_db/indexed_db_connection.cc
|
| index 45f3e81feed54d42f54c83f1ab12e4c43379f4db..c537384404d28fc8ffe5aef3d00600417d72332e 100644
|
| --- a/content/browser/indexed_db/indexed_db_connection.cc
|
| +++ b/content/browser/indexed_db/indexed_db_connection.cc
|
| @@ -4,15 +4,33 @@
|
|
|
| #include "content/browser/indexed_db/indexed_db_connection.h"
|
|
|
| +#include <utility>
|
| +
|
| #include "base/logging.h"
|
| #include "base/stl_util.h"
|
| +#include "content/browser/indexed_db/database_factory_impl.h"
|
| +#include "content/public/browser/indexed_db_context.h"
|
| +#include "storage/browser/quota/quota_manager_proxy.h"
|
| +#include "third_party/WebKit/public/platform/modules/indexeddb/WebIDBDatabaseException.h"
|
| +
|
| +using ::indexed_db::mojom::BlobInfoPtr;
|
| +using ::indexed_db::mojom::CursorDirection;
|
| +using ::indexed_db::mojom::KeyPtr;
|
| +using ::indexed_db::mojom::KeyRangePtr;
|
| +using ::indexed_db::mojom::PutMode;
|
| +using ::indexed_db::mojom::TaskType;
|
| +using ::indexed_db::mojom::TransactionMode;
|
|
|
| namespace content {
|
|
|
| IndexedDBConnection::IndexedDBConnection(
|
| scoped_refptr<IndexedDBDatabase> database,
|
| - scoped_refptr<IndexedDBDatabaseCallbacks> callbacks)
|
| - : database_(database), callbacks_(callbacks), weak_factory_(this) {}
|
| + scoped_refptr<IndexedDBChangeHandler> change_handler)
|
| + : database_(database),
|
| + change_handler_(change_handler),
|
| + weak_factory_(this) {
|
| + change_handler->SetConnection(GetWeakPtr());
|
| +}
|
|
|
| IndexedDBConnection::~IndexedDBConnection() {}
|
|
|
| @@ -21,32 +39,49 @@ void IndexedDBConnection::set_id(int32_t id) {
|
| id_ = id;
|
| }
|
|
|
| -void IndexedDBConnection::Close() {
|
| - if (!callbacks_.get())
|
| +void IndexedDBConnection::ForceClose() {
|
| + if (!change_handler_.get())
|
| return;
|
| +
|
| + // IndexedDBDatabase::Close() can delete this instance.
|
| base::WeakPtr<IndexedDBConnection> this_obj = weak_factory_.GetWeakPtr();
|
| - database_->Close(this, false /* forced */);
|
| + scoped_refptr<IndexedDBChangeHandler> change_handler(change_handler_);
|
| + database_->Close(this, true /* forced */);
|
| if (this_obj) {
|
| database_ = nullptr;
|
| - callbacks_ = nullptr;
|
| + change_handler_ = nullptr;
|
| active_observers_.clear();
|
| }
|
| + change_handler->OnForcedClose();
|
| }
|
|
|
| -void IndexedDBConnection::ForceClose() {
|
| - if (!callbacks_.get())
|
| - return;
|
| +bool IndexedDBConnection::IsConnected() {
|
| + return database_.get() != NULL;
|
| +}
|
|
|
| - // IndexedDBDatabase::Close() can delete this instance.
|
| +void IndexedDBConnection::CreateObjectStore(int64_t transaction_id,
|
| + int64_t object_store_id,
|
| + const std::string& name,
|
| + const IndexedDBKeyPath& key_path,
|
| + bool auto_increment) {}
|
| +
|
| +void IndexedDBConnection::DeleteObjectStore(int64_t transaction_id,
|
| + int64_t object_store_id) {}
|
| +
|
| +void IndexedDBConnection::CreateTransaction(int64_t transaction_id,
|
| + const std::vector<int64_t>& scope,
|
| + TransactionMode transaction_mode) {}
|
| +
|
| +void IndexedDBConnection::Close() {
|
| + if (!change_handler_.get())
|
| + return;
|
| base::WeakPtr<IndexedDBConnection> this_obj = weak_factory_.GetWeakPtr();
|
| - scoped_refptr<IndexedDBDatabaseCallbacks> callbacks(callbacks_);
|
| - database_->Close(this, true /* forced */);
|
| + database_->Close(this, false /* forced */);
|
| if (this_obj) {
|
| database_ = nullptr;
|
| - callbacks_ = nullptr;
|
| + change_handler_ = nullptr;
|
| active_observers_.clear();
|
| }
|
| - callbacks->OnForcedClose();
|
| }
|
|
|
| void IndexedDBConnection::VersionChangeIgnored() {
|
| @@ -55,8 +90,160 @@ void IndexedDBConnection::VersionChangeIgnored() {
|
| database_->VersionChangeIgnored();
|
| }
|
|
|
| -bool IndexedDBConnection::IsConnected() {
|
| - return database_.get() != NULL;
|
| +void IndexedDBConnection::Abort(int64_t transaction_id) {}
|
| +
|
| +void IndexedDBConnection::OnGotUsageAndQuotaForCommit(
|
| + int64_t transaction_id,
|
| + storage::QuotaStatusCode status,
|
| + int64_t usage,
|
| + int64_t quota) {
|
| + DCHECK(context()->TaskRunner()->RunsTasksOnCurrentThread());
|
| + // May have disconnected while quota check was pending.
|
| + if (!IsConnected())
|
| + return;
|
| + // May have aborted while quota check was pending.
|
| + if (!base::ContainsKey(transaction_id_to_size_, transaction_id))
|
| + return;
|
| + int64_t transaction_size = transaction_id_to_size_[transaction_id];
|
| +
|
| + if (status == storage::kQuotaStatusOk && usage + transaction_size <= quota) {
|
| + database()->Commit(transaction_id);
|
| + } else {
|
| + database()->Abort(
|
| + transaction_id,
|
| + IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionQuotaError));
|
| + }
|
| +}
|
| +
|
| +void IndexedDBConnection::Commit(int64_t transaction_id) {
|
| + if (!IsConnected())
|
| + return;
|
| +
|
| + // May have been aborted by back end before front-end could request commit.
|
| + if (!base::ContainsKey(transaction_id_to_size_, transaction_id))
|
| + return;
|
| + int64_t transaction_size = transaction_id_to_size_[transaction_id];
|
| +
|
| + // Always allow empty or delete-only transactions.
|
| + if (!transaction_size) {
|
| + database()->Commit(transaction_id);
|
| + return;
|
| + }
|
| +
|
| + context()->quota_manager_proxy()->GetUsageAndQuota(
|
| + context()->TaskRunner(),
|
| + GURL(transaction_id_to_origin_[transaction_id].Serialize()),
|
| + storage::kStorageTypeTemporary,
|
| + base::Bind(&IndexedDBConnection::OnGotUsageAndQuotaForCommit,
|
| + weak_factory_.GetWeakPtr(), transaction_id));
|
| +}
|
| +
|
| +void IndexedDBConnection::CreateIndex(int64_t transaction_id,
|
| + int64_t object_store_id,
|
| + int64_t index_id,
|
| + const std::string& name,
|
| + const IndexedDBKeyPath& key_path,
|
| + bool unique,
|
| + bool multi_entry) {}
|
| +
|
| +void IndexedDBConnection::DeleteIndex(int64_t transaction_id,
|
| + int64_t object_store_id,
|
| + int64_t index_id) {}
|
| +
|
| +void IndexedDBConnection::Get(int64_t transaction_id,
|
| + int64_t object_store_id,
|
| + int64_t index_id,
|
| + KeyRangePtr key_range,
|
| + bool key_only,
|
| + const GetCallback& callback) {
|
| + if (!IsConnected())
|
| + return;
|
| +
|
| +#if 0
|
| + connection->database()->Get(
|
| + HostTransactionId(transaction_id), object_store_id,
|
| + index_id,
|
| + base::WrapUnique(new IndexedDBKeyRange(key_range)),
|
| + params.key_only, callbacks);
|
| +#endif
|
| +#if 0
|
| + DCHECK(parent_->context()->TaskRunner()->RunsTasksOnCurrentThread());
|
| + IndexedDBConnection* connection =
|
| + parent_->GetOrTerminateProcess(&map_, params.ipc_database_id);
|
| + if (!connection || !connection->IsConnected())
|
| + return;
|
| +
|
| + scoped_refptr<IndexedDBCallbacks> callbacks(new IndexedDBCallbacks(
|
| + parent_, params.ipc_thread_id, params.ipc_callbacks_id));
|
| + connection->database()->Get(
|
| + parent_->HostTransactionId(params.transaction_id), params.object_store_id,
|
| + params.index_id,
|
| + base::WrapUnique(new IndexedDBKeyRange(params.key_range)),
|
| + params.key_only, callbacks);
|
| +#endif
|
| +
|
| + // TODO(cmumford): Set the error data.
|
| + content::IndexedDBDatabaseError error;
|
| + // TODO(cmumford): Can we somehow use GetResult::From()?
|
| + ::indexed_db::mojom::GetResultPtr result =
|
| + ::indexed_db::mojom::GetResult::New();
|
| + result->set_error(error);
|
| + callback.Run(std::move(result));
|
| +}
|
| +
|
| +void IndexedDBConnection::GetAll(int64_t transaction_id,
|
| + int64_t object_store_id,
|
| + int64_t index_id,
|
| + KeyRangePtr key_range,
|
| + int64_t max_count,
|
| + bool key_only) {}
|
| +
|
| +void IndexedDBConnection::Put(int64_t transaction_id,
|
| + int64_t object_store_id,
|
| + const std::vector<int8_t>& value,
|
| + std::vector<BlobInfoPtr> blob_info,
|
| + KeyPtr key,
|
| + PutMode put_mode,
|
| + const std::vector<int64_t>& index_ids,
|
| + std::vector<std::vector<KeyPtr>> index_keys) {}
|
| +
|
| +void IndexedDBConnection::DeleteRange(int64_t transaction_id,
|
| + int64_t object_store_id,
|
| + KeyRangePtr key_range) {}
|
| +
|
| +void IndexedDBConnection::Clear(int64_t transaction_id,
|
| + int64_t object_store_id) {}
|
| +
|
| +void IndexedDBConnection::SetIndexKeys(
|
| + int64_t transaction_id,
|
| + int64_t object_store_id,
|
| + KeyPtr primary_key,
|
| + const std::vector<int64_t>& index_ids,
|
| + std::vector<std::vector<KeyPtr>> index_keys) {}
|
| +
|
| +void IndexedDBConnection::SetIndexesReady(
|
| + int64_t transaction_id,
|
| + int64_t object_store_id,
|
| + const std::vector<int64_t>& index_ids) {}
|
| +
|
| +void IndexedDBConnection::OpenCursor(int64_t transaction_id,
|
| + int64_t object_store_id,
|
| + int64_t index_id,
|
| + KeyRangePtr key_range,
|
| + CursorDirection direction,
|
| + bool key_only,
|
| + TaskType task_type) {}
|
| +
|
| +void IndexedDBConnection::Count(int64_t transaction_id,
|
| + int64_t object_store_id,
|
| + int64_t index_id,
|
| + KeyRangePtr key_range) {}
|
| +
|
| +void IndexedDBConnection::AckReceivedBlobs(
|
| + const std::vector<std::string>& uuids) {}
|
| +
|
| +void IndexedDBConnection::Bind(::indexed_db::mojom::DatabaseRequest request) {
|
| + binding_.AddBinding(this, std::move(request));
|
| }
|
|
|
| // The observers begin listening to changes only once they are activated.
|
| @@ -86,4 +273,24 @@ void IndexedDBConnection::RemoveObservers(
|
| database_->RemovePendingObservers(this, pending_observer_ids);
|
| }
|
|
|
| +void IndexedDBConnection::RegisterTransactionId(int64_t transaction_id,
|
| + const url::Origin& origin) {
|
| + transaction_id_to_size_[transaction_id] = 0;
|
| + transaction_id_to_origin_[transaction_id] = origin;
|
| +}
|
| +
|
| +void IndexedDBConnection::FinishTransaction(int64_t transaction_id,
|
| + bool committed) {
|
| + if (committed)
|
| + context()->TransactionComplete(transaction_id_to_origin_[transaction_id]);
|
| + transaction_id_to_origin_.erase(transaction_id);
|
| + transaction_id_to_size_.erase(transaction_id);
|
| + // TODO(cmumford): transaction_id_to_database_id_ is not currently being set.
|
| + transaction_id_to_database_id_.erase(transaction_id);
|
| +}
|
| +
|
| +IndexedDBContext* IndexedDBConnection::context() const {
|
| + return database_->context();
|
| +}
|
| +
|
| } // namespace content
|
|
|