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 ba06cf42601cd8920b88d5f317792103ba28448f..fb47878328ac65c604dfb9ec560925faf30948c3 100644 |
--- a/content/browser/service_worker/service_worker_database.cc |
+++ b/content/browser/service_worker/service_worker_database.cc |
@@ -398,7 +398,7 @@ ServiceWorkerStatusCode ServiceWorkerDatabase::GetAllRegistrations( |
return SERVICE_WORKER_OK; |
} |
-bool ServiceWorkerDatabase::ReadRegistration( |
+ServiceWorkerStatusCode ServiceWorkerDatabase::ReadRegistration( |
int64 registration_id, |
const GURL& origin, |
RegistrationData* registration, |
@@ -408,26 +408,33 @@ bool ServiceWorkerDatabase::ReadRegistration( |
DCHECK(resources); |
ServiceWorkerStatusCode status = LazyOpen(false); |
- if (status != SERVICE_WORKER_OK || !is_initialized_) |
- return false; |
+ if (status == SERVICE_WORKER_ERROR_NOT_FOUND || |
+ (status == SERVICE_WORKER_OK && !is_initialized_)) { |
+ return SERVICE_WORKER_ERROR_NOT_FOUND; |
+ } |
+ if (status != SERVICE_WORKER_OK) |
+ return status; |
RegistrationData value; |
- if (!ReadRegistrationData(registration_id, origin, &value)) |
- return false; |
+ status = ReadRegistrationData(registration_id, origin, &value); |
+ if (status != SERVICE_WORKER_OK) |
+ return status; |
- if (!ReadResourceRecords(value.version_id, resources)) |
- return false; |
+ status = ReadResourceRecords(value.version_id, resources); |
+ if (status != SERVICE_WORKER_OK) |
+ return status; |
*registration = value; |
- return true; |
+ return SERVICE_WORKER_OK; |
} |
-bool ServiceWorkerDatabase::WriteRegistration( |
+ServiceWorkerStatusCode ServiceWorkerDatabase::WriteRegistration( |
const RegistrationData& registration, |
const std::vector<ResourceRecord>& resources) { |
DCHECK(sequence_checker_.CalledOnValidSequencedThread()); |
- if (LazyOpen(true) != SERVICE_WORKER_OK) |
- return false; |
+ ServiceWorkerStatusCode status = LazyOpen(true); |
+ if (status != SERVICE_WORKER_OK) |
+ return status; |
leveldb::WriteBatch batch; |
BumpNextRegistrationIdIfNeeded(registration.registration_id, &batch); |
@@ -441,20 +448,21 @@ bool ServiceWorkerDatabase::WriteRegistration( |
// Retrieve a previous version to sweep purgeable resources. |
RegistrationData old_registration; |
- if (!ReadRegistrationData(registration.registration_id, |
- registration.scope.GetOrigin(), |
- &old_registration)) { |
- if (is_disabled_) |
- return false; |
- // Just not found. |
+ status = ReadRegistrationData(registration.registration_id, |
+ registration.scope.GetOrigin(), |
+ &old_registration); |
+ if (status != SERVICE_WORKER_OK) { |
+ if (status != SERVICE_WORKER_ERROR_NOT_FOUND) |
michaeln
2014/05/15 20:44:58
nit: could be restructured to only utilize early r
nhiroki
2014/05/19 04:58:04
Done.
|
+ return status; |
} else { |
DCHECK_LT(old_registration.version_id, registration.version_id); |
// Currently resource sharing across versions and registrations is not |
// suppported, so resource ids should not be overlapped between |
// |registration| and |old_registration|. |
// TODO(nhiroki): Add DCHECK to make sure the overlap does not exist. |
- if (!DeleteResourceRecords(old_registration.version_id, &batch)) |
- return false; |
+ status = DeleteResourceRecords(old_registration.version_id, &batch); |
+ if (status != SERVICE_WORKER_OK) |
+ return status; |
} |
// Used for avoiding multiple writes for the same resource id or url. |
@@ -463,7 +471,7 @@ bool ServiceWorkerDatabase::WriteRegistration( |
for (std::vector<ResourceRecord>::const_iterator itr = resources.begin(); |
itr != resources.end(); ++itr) { |
if (!itr->url.is_valid()) |
- return false; |
+ return SERVICE_WORKER_ERROR_FAILED; |
// Duplicated resource id or url should not exist. |
DCHECK(pushed_resources.insert(itr->resource_id).second); |
@@ -479,15 +487,25 @@ bool ServiceWorkerDatabase::WriteRegistration( |
return WriteBatch(&batch); |
} |
-bool ServiceWorkerDatabase::UpdateVersionToActive(int64 registration_id, |
- const GURL& origin) { |
+ServiceWorkerStatusCode ServiceWorkerDatabase::UpdateVersionToActive( |
+ int64 registration_id, |
+ const GURL& origin) { |
DCHECK(sequence_checker_.CalledOnValidSequencedThread()); |
- if (LazyOpen(false) != SERVICE_WORKER_OK || !is_initialized_) |
- return false; |
+ ServiceWorkerStatusCode status = LazyOpen(false); |
+ if (status == SERVICE_WORKER_ERROR_NOT_FOUND || |
+ (status == SERVICE_WORKER_OK && !is_initialized_)) { |
+ // Database has never been used. |
+ return SERVICE_WORKER_ERROR_NOT_FOUND; |
+ } |
+ if (status != SERVICE_WORKER_OK) |
+ return status; |
+ if (!origin.is_valid()) |
+ return SERVICE_WORKER_ERROR_FAILED; |
RegistrationData registration; |
- if (!ReadRegistrationData(registration_id, origin, ®istration)) |
- return false; |
+ status = ReadRegistrationData(registration_id, origin, ®istration); |
+ if (status != SERVICE_WORKER_OK) |
+ return status; |
registration.is_active = true; |
@@ -496,16 +514,26 @@ bool ServiceWorkerDatabase::UpdateVersionToActive(int64 registration_id, |
return WriteBatch(&batch); |
} |
-bool ServiceWorkerDatabase::UpdateLastCheckTime(int64 registration_id, |
- const GURL& origin, |
- const base::Time& time) { |
+ServiceWorkerStatusCode ServiceWorkerDatabase::UpdateLastCheckTime( |
+ int64 registration_id, |
+ const GURL& origin, |
+ const base::Time& time) { |
DCHECK(sequence_checker_.CalledOnValidSequencedThread()); |
- if (LazyOpen(false) != SERVICE_WORKER_OK || !is_initialized_) |
- return false; |
+ ServiceWorkerStatusCode status = LazyOpen(false); |
+ if (status == SERVICE_WORKER_ERROR_NOT_FOUND || |
+ (status == SERVICE_WORKER_OK && !is_initialized_)) { |
michaeln
2014/05/15 20:44:58
this test is a recurring theme, stuffing it in a h
nhiroki
2014/05/19 04:58:04
Done.
|
+ // Database has never been used. |
+ return SERVICE_WORKER_ERROR_NOT_FOUND; |
+ } |
+ if (status != SERVICE_WORKER_OK) |
+ return status; |
+ if (!origin.is_valid()) |
+ return SERVICE_WORKER_ERROR_FAILED; |
RegistrationData registration; |
- if (!ReadRegistrationData(registration_id, origin, ®istration)) |
- return false; |
+ status = ReadRegistrationData(registration_id, origin, ®istration); |
+ if (status != SERVICE_WORKER_OK) |
+ return status; |
registration.last_update_check = time; |
@@ -514,17 +542,20 @@ bool ServiceWorkerDatabase::UpdateLastCheckTime(int64 registration_id, |
return WriteBatch(&batch); |
} |
-bool ServiceWorkerDatabase::DeleteRegistration(int64 registration_id, |
- const GURL& origin) { |
+ServiceWorkerStatusCode ServiceWorkerDatabase::DeleteRegistration( |
+ int64 registration_id, |
+ const GURL& origin) { |
DCHECK(sequence_checker_.CalledOnValidSequencedThread()); |
ServiceWorkerStatusCode status = LazyOpen(false); |
if (status == SERVICE_WORKER_ERROR_NOT_FOUND || |
(status == SERVICE_WORKER_OK && !is_initialized_)) { |
// Database has never been used. |
- return true; |
+ return SERVICE_WORKER_ERROR_NOT_FOUND; |
} |
- if (status != SERVICE_WORKER_OK || !origin.is_valid()) |
- return false; |
+ if (status != SERVICE_WORKER_OK) |
+ return status; |
+ if (!origin.is_valid()) |
+ return SERVICE_WORKER_ERROR_FAILED; |
leveldb::WriteBatch batch; |
@@ -532,8 +563,9 @@ 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) != SERVICE_WORKER_OK) |
- return false; |
+ status = GetRegistrationsForOrigin(origin, ®istrations); |
+ if (status != SERVICE_WORKER_OK) |
+ return status; |
if (registrations.size() == 1 && |
registrations[0].registration_id == registration_id) { |
batch.Delete(CreateUniqueOriginKey(origin)); |
@@ -546,8 +578,9 @@ bool ServiceWorkerDatabase::DeleteRegistration(int64 registration_id, |
for (std::vector<RegistrationData>::const_iterator itr = |
registrations.begin(); itr != registrations.end(); ++itr) { |
if (itr->registration_id == registration_id) { |
- if (!DeleteResourceRecords(itr->version_id, &batch)) |
- return false; |
+ status = DeleteResourceRecords(itr->version_id, &batch); |
+ if (status != SERVICE_WORKER_OK) |
+ return status; |
break; |
} |
} |
@@ -583,16 +616,19 @@ bool ServiceWorkerDatabase::ClearPurgeableResourceIds( |
return DeleteResourceIds(kPurgeableResIdKeyPrefix, ids); |
} |
-bool ServiceWorkerDatabase::DeleteAllDataForOrigin(const GURL& origin) { |
+ServiceWorkerStatusCode ServiceWorkerDatabase::DeleteAllDataForOrigin( |
+ const GURL& origin) { |
DCHECK(sequence_checker_.CalledOnValidSequencedThread()); |
ServiceWorkerStatusCode status = LazyOpen(false); |
if (status == SERVICE_WORKER_ERROR_NOT_FOUND || |
(status == SERVICE_WORKER_OK && !is_initialized_)) { |
// Database has never been used. |
- return true; |
+ return SERVICE_WORKER_ERROR_NOT_FOUND; |
} |
- if (status != SERVICE_WORKER_OK || !origin.is_valid()) |
- return false; |
+ if (status != SERVICE_WORKER_OK) |
+ return status; |
+ if (!origin.is_valid()) |
+ return SERVICE_WORKER_ERROR_FAILED; |
leveldb::WriteBatch batch; |
@@ -600,15 +636,17 @@ bool ServiceWorkerDatabase::DeleteAllDataForOrigin(const GURL& origin) { |
batch.Delete(CreateUniqueOriginKey(origin)); |
std::vector<RegistrationData> registrations; |
- if (GetRegistrationsForOrigin(origin, ®istrations) != SERVICE_WORKER_OK) |
- return false; |
+ status = GetRegistrationsForOrigin(origin, ®istrations); |
+ if (status != SERVICE_WORKER_OK) |
+ return status; |
// Delete registrations and resource records. |
for (std::vector<RegistrationData>::const_iterator itr = |
registrations.begin(); itr != registrations.end(); ++itr) { |
batch.Delete(CreateRegistrationKey(itr->registration_id, origin)); |
- if (!DeleteResourceRecords(itr->version_id, &batch)) |
- return false; |
+ status = DeleteResourceRecords(itr->version_id, &batch); |
+ if (status != SERVICE_WORKER_OK) |
+ return status; |
} |
return WriteBatch(&batch); |
@@ -693,7 +731,7 @@ ServiceWorkerStatusCode ServiceWorkerDatabase::ReadNextAvailableId( |
return SERVICE_WORKER_OK; |
} |
-bool ServiceWorkerDatabase::ReadRegistrationData( |
+ServiceWorkerStatusCode ServiceWorkerDatabase::ReadRegistrationData( |
int64 registration_id, |
const GURL& origin, |
RegistrationData* registration) { |
@@ -706,20 +744,20 @@ bool ServiceWorkerDatabase::ReadRegistrationData( |
if (!status.ok()) { |
if (!status.IsNotFound()) |
HandleError(FROM_HERE, status); |
- return false; |
+ return LevelDBStatusToServiceWorkerStatusCode(status); |
} |
RegistrationData parsed; |
if (!ParseRegistrationData(value, &parsed)) { |
HandleError(FROM_HERE, leveldb::Status::Corruption("failed to parse")); |
- return false; |
+ return SERVICE_WORKER_ERROR_DB_CORRUPTED; |
} |
*registration = parsed; |
- return true; |
+ return SERVICE_WORKER_OK; |
} |
-bool ServiceWorkerDatabase::ReadResourceRecords( |
+ServiceWorkerStatusCode ServiceWorkerDatabase::ReadResourceRecords( |
int64 version_id, |
std::vector<ResourceRecord>* resources) { |
DCHECK(resources); |
@@ -730,7 +768,7 @@ bool ServiceWorkerDatabase::ReadResourceRecords( |
if (!itr->status().ok()) { |
HandleError(FROM_HERE, itr->status()); |
resources->clear(); |
- return false; |
+ return LevelDBStatusToServiceWorkerStatusCode(itr->status()); |
} |
if (!RemovePrefix(itr->key().ToString(), prefix, NULL)) |
@@ -740,14 +778,14 @@ bool ServiceWorkerDatabase::ReadResourceRecords( |
if (!ParseResourceRecord(itr->value().ToString(), &resource)) { |
HandleError(FROM_HERE, leveldb::Status::Corruption("failed to parse")); |
resources->clear(); |
- return false; |
+ return SERVICE_WORKER_ERROR_DB_CORRUPTED; |
} |
resources->push_back(resource); |
} |
- return true; |
+ return SERVICE_WORKER_OK; |
} |
-bool ServiceWorkerDatabase::DeleteResourceRecords( |
+ServiceWorkerStatusCode ServiceWorkerDatabase::DeleteResourceRecords( |
int64 version_id, |
leveldb::WriteBatch* batch) { |
DCHECK(batch); |
@@ -757,7 +795,7 @@ bool ServiceWorkerDatabase::DeleteResourceRecords( |
for (itr->Seek(prefix); itr->Valid(); itr->Next()) { |
if (!itr->status().ok()) { |
HandleError(FROM_HERE, itr->status()); |
- return false; |
+ return LevelDBStatusToServiceWorkerStatusCode(itr->status()); |
} |
std::string key = itr->key().ToString(); |
@@ -768,7 +806,7 @@ bool ServiceWorkerDatabase::DeleteResourceRecords( |
int64 resource_id; |
if (!base::StringToInt64(unprefixed, &resource_id)) { |
HandleError(FROM_HERE, leveldb::Status::Corruption("failed to parse")); |
- return false; |
+ return SERVICE_WORKER_ERROR_DB_CORRUPTED; |
} |
// Remove a resource record. |
@@ -778,7 +816,7 @@ bool ServiceWorkerDatabase::DeleteResourceRecords( |
// supported, so we can purge this without caring about it. |
PutPurgeableResourceIdToBatch(resource_id, batch); |
} |
- return true; |
+ return SERVICE_WORKER_OK; |
} |
bool ServiceWorkerDatabase::ReadResourceIds(const char* id_key_prefix, |
@@ -836,7 +874,10 @@ bool ServiceWorkerDatabase::WriteResourceIds(const char* id_key_prefix, |
// Value should be empty. |
batch.Put(CreateResourceIdKey(id_key_prefix, *itr), ""); |
} |
- return WriteBatch(&batch); |
+ |
+ if (WriteBatch(&batch) != SERVICE_WORKER_OK) |
+ return false; |
+ return true; |
michaeln
2014/05/15 20:44:58
nit: return WriteBatch() == OK;
nhiroki
2014/05/19 04:58:04
Removed this branch.
|
} |
bool ServiceWorkerDatabase::DeleteResourceIds(const char* id_key_prefix, |
@@ -861,7 +902,10 @@ bool ServiceWorkerDatabase::DeleteResourceIds(const char* id_key_prefix, |
itr != ids.end(); ++itr) { |
batch.Delete(CreateResourceIdKey(id_key_prefix, *itr)); |
} |
- return WriteBatch(&batch); |
+ |
+ if (WriteBatch(&batch) != SERVICE_WORKER_OK) |
+ return false; |
+ return true; |
michaeln
2014/05/15 20:44:58
ditto
nhiroki
2014/05/19 04:58:04
Done.
|
} |
ServiceWorkerStatusCode ServiceWorkerDatabase::ReadDatabaseVersion( |
@@ -895,7 +939,8 @@ ServiceWorkerStatusCode ServiceWorkerDatabase::ReadDatabaseVersion( |
return SERVICE_WORKER_OK; |
} |
-bool ServiceWorkerDatabase::WriteBatch(leveldb::WriteBatch* batch) { |
+ServiceWorkerStatusCode ServiceWorkerDatabase::WriteBatch( |
+ leveldb::WriteBatch* batch) { |
DCHECK(batch); |
DCHECK(!is_disabled_); |
@@ -906,11 +951,9 @@ bool ServiceWorkerDatabase::WriteBatch(leveldb::WriteBatch* batch) { |
} |
leveldb::Status status = db_->Write(leveldb::WriteOptions(), batch); |
- if (!status.ok()) { |
+ if (!status.ok()) |
HandleError(FROM_HERE, status); |
- return false; |
- } |
- return true; |
+ return LevelDBStatusToServiceWorkerStatusCode(status); |
} |
void ServiceWorkerDatabase::BumpNextRegistrationIdIfNeeded( |