| Index: content/browser/service_worker/service_worker_database.cc
|
| diff --git a/content/browser/service_worker/service_worker_database.cc b/content/browser/service_worker/service_worker_database.cc
|
| index db8f735d792b7bb88360678fcf1d7780c8931ed8..c0ce66791b7aaec550c5dd2e728513f650f11c72 100644
|
| --- a/content/browser/service_worker/service_worker_database.cc
|
| +++ b/content/browser/service_worker/service_worker_database.cc
|
| @@ -211,16 +211,16 @@ bool ParseResourceRecord(const std::string& serialized,
|
| return true;
|
| }
|
|
|
| -ServiceWorkerStatusCode LevelDBStatusToServiceWorkerStatusCode(
|
| +ServiceWorkerDatabase::Status LevelDBStatusToStatus(
|
| const leveldb::Status& status) {
|
| if (status.ok())
|
| - return SERVICE_WORKER_OK;
|
| + return ServiceWorkerDatabase::STATUS_OK;
|
| else if (status.IsNotFound())
|
| - return SERVICE_WORKER_ERROR_NOT_FOUND;
|
| + return ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND;
|
| else if (status.IsCorruption())
|
| - return SERVICE_WORKER_ERROR_DB_CORRUPTED;
|
| + return ServiceWorkerDatabase::STATUS_ERROR_CORRUPTED;
|
| else
|
| - return SERVICE_WORKER_ERROR_FAILED;
|
| + return ServiceWorkerDatabase::STATUS_ERROR_FAILED;
|
| }
|
|
|
| } // namespace
|
| @@ -251,7 +251,7 @@ ServiceWorkerDatabase::~ServiceWorkerDatabase() {
|
| db_.reset();
|
| }
|
|
|
| -ServiceWorkerStatusCode ServiceWorkerDatabase::GetNextAvailableIds(
|
| +ServiceWorkerDatabase::Status ServiceWorkerDatabase::GetNextAvailableIds(
|
| int64* next_avail_registration_id,
|
| int64* next_avail_version_id,
|
| int64* next_avail_resource_id) {
|
| @@ -260,52 +260,49 @@ ServiceWorkerStatusCode ServiceWorkerDatabase::GetNextAvailableIds(
|
| DCHECK(next_avail_version_id);
|
| DCHECK(next_avail_resource_id);
|
|
|
| - if (!LazyOpen(false)) {
|
| - if (is_disabled_)
|
| - return SERVICE_WORKER_ERROR_FAILED;
|
| - // Database has never been used.
|
| + Status status = LazyOpen(false);
|
| + if (IsNewOrNonexistentDatabase(status)) {
|
| *next_avail_registration_id = 0;
|
| *next_avail_version_id = 0;
|
| *next_avail_resource_id = 0;
|
| - return SERVICE_WORKER_OK;
|
| + return STATUS_OK;
|
| }
|
| + if (status != STATUS_OK)
|
| + return status;
|
|
|
| - ServiceWorkerStatusCode status =
|
| - ReadNextAvailableId(kNextRegIdKey, &next_avail_registration_id_);
|
| - if (status != SERVICE_WORKER_OK)
|
| + status = ReadNextAvailableId(kNextRegIdKey, &next_avail_registration_id_);
|
| + if (status != STATUS_OK)
|
| return status;
|
| status = ReadNextAvailableId(kNextVerIdKey, &next_avail_version_id_);
|
| - if (status != SERVICE_WORKER_OK)
|
| + if (status != STATUS_OK)
|
| return status;
|
| status = ReadNextAvailableId(kNextResIdKey, &next_avail_resource_id_);
|
| - if (status != SERVICE_WORKER_OK)
|
| + if (status != STATUS_OK)
|
| return status;
|
|
|
| *next_avail_registration_id = next_avail_registration_id_;
|
| *next_avail_version_id = next_avail_version_id_;
|
| *next_avail_resource_id = next_avail_resource_id_;
|
| - return SERVICE_WORKER_OK;
|
| + return STATUS_OK;
|
| }
|
|
|
| -ServiceWorkerStatusCode ServiceWorkerDatabase::GetOriginsWithRegistrations(
|
| - std::set<GURL>* origins) {
|
| +ServiceWorkerDatabase::Status
|
| +ServiceWorkerDatabase::GetOriginsWithRegistrations(std::set<GURL>* origins) {
|
| DCHECK(sequence_checker_.CalledOnValidSequencedThread());
|
| - DCHECK(origins);
|
| + DCHECK(origins->empty());
|
|
|
| - if (!LazyOpen(false)) {
|
| - if (is_disabled_)
|
| - return SERVICE_WORKER_ERROR_FAILED;
|
| - // Database has never been used.
|
| - origins->clear();
|
| - return SERVICE_WORKER_OK;
|
| - }
|
| + Status status = LazyOpen(false);
|
| + if (IsNewOrNonexistentDatabase(status))
|
| + return STATUS_OK;
|
| + if (status != STATUS_OK)
|
| + return status;
|
|
|
| scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions()));
|
| for (itr->Seek(kUniqueOriginKey); itr->Valid(); itr->Next()) {
|
| if (!itr->status().ok()) {
|
| HandleError(FROM_HERE, itr->status());
|
| origins->clear();
|
| - return LevelDBStatusToServiceWorkerStatusCode(itr->status());
|
| + return LevelDBStatusToStatus(itr->status());
|
| }
|
|
|
| std::string origin;
|
| @@ -313,22 +310,20 @@ ServiceWorkerStatusCode ServiceWorkerDatabase::GetOriginsWithRegistrations(
|
| break;
|
| origins->insert(GURL(origin));
|
| }
|
| - return SERVICE_WORKER_OK;
|
| + return STATUS_OK;
|
| }
|
|
|
| -bool ServiceWorkerDatabase::GetRegistrationsForOrigin(
|
| +ServiceWorkerDatabase::Status ServiceWorkerDatabase::GetRegistrationsForOrigin(
|
| const GURL& origin,
|
| std::vector<RegistrationData>* registrations) {
|
| DCHECK(sequence_checker_.CalledOnValidSequencedThread());
|
| - DCHECK(registrations);
|
| + DCHECK(registrations->empty());
|
|
|
| - if (!LazyOpen(false)) {
|
| - if (is_disabled_)
|
| - return false;
|
| - // Database has never been used.
|
| - registrations->clear();
|
| - return true;
|
| - }
|
| + Status status = LazyOpen(false);
|
| + if (IsNewOrNonexistentDatabase(status))
|
| + return STATUS_OK;
|
| + if (status != STATUS_OK)
|
| + return status;
|
|
|
| // Create a key prefix for registrations.
|
| std::string prefix = base::StringPrintf(
|
| @@ -339,7 +334,7 @@ bool ServiceWorkerDatabase::GetRegistrationsForOrigin(
|
| if (!itr->status().ok()) {
|
| HandleError(FROM_HERE, itr->status());
|
| registrations->clear();
|
| - return false;
|
| + return LevelDBStatusToStatus(itr->status());
|
| }
|
|
|
| if (!RemovePrefix(itr->key().ToString(), prefix, NULL))
|
| @@ -349,32 +344,30 @@ bool ServiceWorkerDatabase::GetRegistrationsForOrigin(
|
| if (!ParseRegistrationData(itr->value().ToString(), ®istration)) {
|
| HandleError(FROM_HERE, leveldb::Status::Corruption("failed to parse"));
|
| registrations->clear();
|
| - return false;
|
| + return STATUS_ERROR_CORRUPTED;
|
| }
|
| registrations->push_back(registration);
|
| }
|
| - return true;
|
| + return STATUS_OK;
|
| }
|
|
|
| -bool ServiceWorkerDatabase::GetAllRegistrations(
|
| +ServiceWorkerDatabase::Status ServiceWorkerDatabase::GetAllRegistrations(
|
| std::vector<RegistrationData>* registrations) {
|
| DCHECK(sequence_checker_.CalledOnValidSequencedThread());
|
| - DCHECK(registrations);
|
| + DCHECK(registrations->empty());
|
|
|
| - if (!LazyOpen(false)) {
|
| - if (is_disabled_)
|
| - return false;
|
| - // Database has never been used.
|
| - registrations->clear();
|
| - return true;
|
| - }
|
| + Status status = LazyOpen(false);
|
| + if (IsNewOrNonexistentDatabase(status))
|
| + return STATUS_OK;
|
| + if (status != STATUS_OK)
|
| + return status;
|
|
|
| scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions()));
|
| for (itr->Seek(kRegKeyPrefix); itr->Valid(); itr->Next()) {
|
| if (!itr->status().ok()) {
|
| HandleError(FROM_HERE, itr->status());
|
| registrations->clear();
|
| - return false;
|
| + return LevelDBStatusToStatus(itr->status());
|
| }
|
|
|
| if (!RemovePrefix(itr->key().ToString(), kRegKeyPrefix, NULL))
|
| @@ -384,11 +377,11 @@ bool ServiceWorkerDatabase::GetAllRegistrations(
|
| if (!ParseRegistrationData(itr->value().ToString(), ®istration)) {
|
| HandleError(FROM_HERE, leveldb::Status::Corruption("failed to parse"));
|
| registrations->clear();
|
| - return false;
|
| + return STATUS_ERROR_CORRUPTED;
|
| }
|
| registrations->push_back(registration);
|
| }
|
| - return true;
|
| + return STATUS_OK;
|
| }
|
|
|
| bool ServiceWorkerDatabase::ReadRegistration(
|
| @@ -400,7 +393,8 @@ bool ServiceWorkerDatabase::ReadRegistration(
|
| DCHECK(registration);
|
| DCHECK(resources);
|
|
|
| - if (!LazyOpen(false) || is_disabled_)
|
| + Status status = LazyOpen(false);
|
| + if (IsNewOrNonexistentDatabase(status) || status != STATUS_OK)
|
| return false;
|
|
|
| RegistrationData value;
|
| @@ -418,7 +412,7 @@ bool ServiceWorkerDatabase::WriteRegistration(
|
| const RegistrationData& registration,
|
| const std::vector<ResourceRecord>& resources) {
|
| DCHECK(sequence_checker_.CalledOnValidSequencedThread());
|
| - if (!LazyOpen(true) || is_disabled_)
|
| + if (LazyOpen(true) != STATUS_OK)
|
| return false;
|
|
|
| leveldb::WriteBatch batch;
|
| @@ -474,7 +468,8 @@ bool ServiceWorkerDatabase::WriteRegistration(
|
| bool ServiceWorkerDatabase::UpdateVersionToActive(int64 registration_id,
|
| const GURL& origin) {
|
| DCHECK(sequence_checker_.CalledOnValidSequencedThread());
|
| - if (!LazyOpen(false) || is_disabled_)
|
| + ServiceWorkerDatabase::Status status = LazyOpen(false);
|
| + if (IsNewOrNonexistentDatabase(status) || status != STATUS_OK)
|
| return false;
|
|
|
| RegistrationData registration;
|
| @@ -492,7 +487,8 @@ bool ServiceWorkerDatabase::UpdateLastCheckTime(int64 registration_id,
|
| const GURL& origin,
|
| const base::Time& time) {
|
| DCHECK(sequence_checker_.CalledOnValidSequencedThread());
|
| - if (!LazyOpen(false) || is_disabled_)
|
| + ServiceWorkerDatabase::Status status = LazyOpen(false);
|
| + if (IsNewOrNonexistentDatabase(status) || status != STATUS_OK)
|
| return false;
|
|
|
| RegistrationData registration;
|
| @@ -509,7 +505,10 @@ bool ServiceWorkerDatabase::UpdateLastCheckTime(int64 registration_id,
|
| bool ServiceWorkerDatabase::DeleteRegistration(int64 registration_id,
|
| const GURL& origin) {
|
| DCHECK(sequence_checker_.CalledOnValidSequencedThread());
|
| - if (!LazyOpen(false) || is_disabled_)
|
| + Status status = LazyOpen(false);
|
| + if (IsNewOrNonexistentDatabase(status))
|
| + return STATUS_OK;
|
| + if (status != STATUS_OK || !origin.is_valid())
|
| return false;
|
|
|
| leveldb::WriteBatch batch;
|
| @@ -518,7 +517,7 @@ bool ServiceWorkerDatabase::DeleteRegistration(int64 registration_id,
|
| // |registration_id| is the only one for |origin|.
|
| // TODO(nhiroki): Check the uniqueness by more efficient way.
|
| std::vector<RegistrationData> registrations;
|
| - if (!GetRegistrationsForOrigin(origin, ®istrations))
|
| + if (GetRegistrationsForOrigin(origin, ®istrations) != STATUS_OK)
|
| return false;
|
| if (registrations.size() == 1 &&
|
| registrations[0].registration_id == registration_id) {
|
| @@ -571,7 +570,10 @@ bool ServiceWorkerDatabase::ClearPurgeableResourceIds(
|
|
|
| bool ServiceWorkerDatabase::DeleteAllDataForOrigin(const GURL& origin) {
|
| DCHECK(sequence_checker_.CalledOnValidSequencedThread());
|
| - if (!LazyOpen(true) || is_disabled_ || !origin.is_valid())
|
| + Status status = LazyOpen(false);
|
| + if (IsNewOrNonexistentDatabase(status))
|
| + return STATUS_OK;
|
| + if (status != STATUS_OK || !origin.is_valid())
|
| return false;
|
|
|
| leveldb::WriteBatch batch;
|
| @@ -580,7 +582,7 @@ bool ServiceWorkerDatabase::DeleteAllDataForOrigin(const GURL& origin) {
|
| batch.Delete(CreateUniqueOriginKey(origin));
|
|
|
| std::vector<RegistrationData> registrations;
|
| - if (!GetRegistrationsForOrigin(origin, ®istrations))
|
| + if (GetRegistrationsForOrigin(origin, ®istrations) != STATUS_OK)
|
| return false;
|
|
|
| // Delete registrations and resource records.
|
| @@ -594,54 +596,66 @@ bool ServiceWorkerDatabase::DeleteAllDataForOrigin(const GURL& origin) {
|
| return WriteBatch(&batch);
|
| }
|
|
|
| -bool ServiceWorkerDatabase::LazyOpen(bool create_if_needed) {
|
| +ServiceWorkerDatabase::Status ServiceWorkerDatabase::LazyOpen(
|
| + bool create_if_missing) {
|
| DCHECK(sequence_checker_.CalledOnValidSequencedThread());
|
| - if (IsOpen())
|
| - return true;
|
|
|
| // Do not try to open a database if we tried and failed once.
|
| if (is_disabled_)
|
| - return false;
|
| + return STATUS_ERROR_FAILED;
|
| + if (IsOpen())
|
| + return STATUS_OK;
|
|
|
| // When |path_| is empty, open a database in-memory.
|
| bool use_in_memory_db = path_.empty();
|
|
|
| - if (!create_if_needed) {
|
| + if (!create_if_missing) {
|
| // Avoid opening a database if it does not exist at the |path_|.
|
| if (use_in_memory_db ||
|
| !base::PathExists(path_) ||
|
| base::IsDirectoryEmpty(path_)) {
|
| - return false;
|
| + return STATUS_ERROR_NOT_FOUND;
|
| }
|
| }
|
|
|
| leveldb::Options options;
|
| - options.create_if_missing = create_if_needed;
|
| + options.create_if_missing = create_if_missing;
|
| if (use_in_memory_db) {
|
| env_.reset(leveldb::NewMemEnv(leveldb::Env::Default()));
|
| options.env = env_.get();
|
| }
|
|
|
| leveldb::DB* db = NULL;
|
| - leveldb::Status status =
|
| + leveldb::Status db_status =
|
| leveldb::DB::Open(options, path_.AsUTF8Unsafe(), &db);
|
| - if (!status.ok()) {
|
| + if (!db_status.ok()) {
|
| DCHECK(!db);
|
| // TODO(nhiroki): Should we retry to open the database?
|
| - HandleError(FROM_HERE, status);
|
| - return false;
|
| + HandleError(FROM_HERE, db_status);
|
| + return LevelDBStatusToStatus(db_status);
|
| }
|
| db_.reset(db);
|
|
|
| int64 db_version;
|
| - if (!ReadDatabaseVersion(&db_version))
|
| - return false;
|
| + Status status = ReadDatabaseVersion(&db_version);
|
| + if (status != STATUS_OK)
|
| + return status;
|
| + DCHECK_LE(0, db_version);
|
| if (db_version > 0)
|
| is_initialized_ = true;
|
| - return true;
|
| + return STATUS_OK;
|
| +}
|
| +
|
| +bool ServiceWorkerDatabase::IsNewOrNonexistentDatabase(
|
| + ServiceWorkerDatabase::Status status) {
|
| + if (status == STATUS_ERROR_NOT_FOUND)
|
| + return true;
|
| + if (status == STATUS_OK && !is_initialized_)
|
| + return true;
|
| + return false;
|
| }
|
|
|
| -ServiceWorkerStatusCode ServiceWorkerDatabase::ReadNextAvailableId(
|
| +ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadNextAvailableId(
|
| const char* id_key,
|
| int64* next_avail_id) {
|
| DCHECK(id_key);
|
| @@ -652,22 +666,22 @@ ServiceWorkerStatusCode ServiceWorkerDatabase::ReadNextAvailableId(
|
| if (status.IsNotFound()) {
|
| // Nobody has gotten the next resource id for |id_key|.
|
| *next_avail_id = 0;
|
| - return SERVICE_WORKER_OK;
|
| + return STATUS_OK;
|
| }
|
|
|
| if (!status.ok()) {
|
| HandleError(FROM_HERE, status);
|
| - return LevelDBStatusToServiceWorkerStatusCode(status);
|
| + return LevelDBStatusToStatus(status);
|
| }
|
|
|
| int64 parsed;
|
| if (!base::StringToInt64(value, &parsed)) {
|
| HandleError(FROM_HERE, leveldb::Status::Corruption("failed to parse"));
|
| - return SERVICE_WORKER_ERROR_DB_CORRUPTED;
|
| + return STATUS_ERROR_CORRUPTED;
|
| }
|
|
|
| *next_avail_id = parsed;
|
| - return SERVICE_WORKER_OK;
|
| + return STATUS_OK;
|
| }
|
|
|
| bool ServiceWorkerDatabase::ReadRegistrationData(
|
| @@ -762,9 +776,12 @@ bool ServiceWorkerDatabase::ReadResourceIds(const char* id_key_prefix,
|
| std::set<int64>* ids) {
|
| DCHECK(sequence_checker_.CalledOnValidSequencedThread());
|
| DCHECK(id_key_prefix);
|
| - DCHECK(ids);
|
| + DCHECK(ids->empty());
|
|
|
| - if (!LazyOpen(false) || is_disabled_)
|
| + Status status = LazyOpen(false);
|
| + if (IsNewOrNonexistentDatabase(status))
|
| + return true;
|
| + if (status != STATUS_OK)
|
| return false;
|
|
|
| scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions()));
|
| @@ -795,7 +812,7 @@ bool ServiceWorkerDatabase::WriteResourceIds(const char* id_key_prefix,
|
| DCHECK(sequence_checker_.CalledOnValidSequencedThread());
|
| DCHECK(id_key_prefix);
|
|
|
| - if (!LazyOpen(true) || is_disabled_)
|
| + if (LazyOpen(true) != STATUS_OK)
|
| return false;
|
| if (ids.empty())
|
| return true;
|
| @@ -814,8 +831,12 @@ bool ServiceWorkerDatabase::DeleteResourceIds(const char* id_key_prefix,
|
| DCHECK(sequence_checker_.CalledOnValidSequencedThread());
|
| DCHECK(id_key_prefix);
|
|
|
| - if (!LazyOpen(true) || is_disabled_)
|
| + Status status = LazyOpen(false);
|
| + if (IsNewOrNonexistentDatabase(status))
|
| + return true;
|
| + if (status != STATUS_OK)
|
| return false;
|
| +
|
| if (ids.empty())
|
| return true;
|
|
|
| @@ -827,34 +848,35 @@ bool ServiceWorkerDatabase::DeleteResourceIds(const char* id_key_prefix,
|
| return WriteBatch(&batch);
|
| }
|
|
|
| -bool ServiceWorkerDatabase::ReadDatabaseVersion(int64* db_version) {
|
| +ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadDatabaseVersion(
|
| + int64* db_version) {
|
| std::string value;
|
| leveldb::Status status =
|
| db_->Get(leveldb::ReadOptions(), kDatabaseVersionKey, &value);
|
| if (status.IsNotFound()) {
|
| // The database hasn't been initialized yet.
|
| *db_version = 0;
|
| - return true;
|
| + return STATUS_OK;
|
| }
|
| if (!status.ok()) {
|
| HandleError(FROM_HERE, status);
|
| - return false;
|
| + return LevelDBStatusToStatus(status);
|
| }
|
|
|
| int64 parsed;
|
| if (!base::StringToInt64(value, &parsed)) {
|
| HandleError(FROM_HERE, leveldb::Status::Corruption("failed to parse"));
|
| - return false;
|
| + return STATUS_ERROR_CORRUPTED;
|
| }
|
|
|
| const int kFirstValidVersion = 1;
|
| if (parsed < kFirstValidVersion || kCurrentSchemaVersion < parsed) {
|
| HandleError(FROM_HERE, leveldb::Status::Corruption("invalid DB version"));
|
| - return false;
|
| + return STATUS_ERROR_CORRUPTED;
|
| }
|
|
|
| *db_version = parsed;
|
| - return true;
|
| + return STATUS_OK;
|
| }
|
|
|
| bool ServiceWorkerDatabase::WriteBatch(leveldb::WriteBatch* batch) {
|
|
|