| 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 8e3c99a42a8dbcbd645727fdd8b111e031d0d2fa..5f05ab9bf2c669c998b6d796bc25d69f0f08a4b0 100644
|
| --- a/content/browser/service_worker/service_worker_database.cc
|
| +++ b/content/browser/service_worker/service_worker_database.cc
|
| @@ -83,6 +83,17 @@
|
| // value: <empty>
|
| // - This entry represents that the old BlockFile diskcache was deleted
|
| // after diskcache migration (http://crbug.com/487482).
|
| +//
|
| +// Version 3
|
| +//
|
| +// Deprecate
|
| +// key: "INITDATA_NEXT_VERSION_ID"
|
| +// value: <int64 'next_available_version_id'>
|
| +//
|
| +// Data type change
|
| +// key: "RES:" + <std::string 'version_uuid'> + '\x00' + <int64 'resource_id'>
|
| +// (ex. "RES:123456\x00654321")
|
| +// value: <ServiceWorkerResourceRecord serialized as a string>
|
| namespace content {
|
|
|
| namespace {
|
| @@ -90,7 +101,6 @@ namespace {
|
| const char kDatabaseVersionKey[] = "INITDATA_DB_VERSION";
|
| const char kNextRegIdKey[] = "INITDATA_NEXT_REGISTRATION_ID";
|
| const char kNextResIdKey[] = "INITDATA_NEXT_RESOURCE_ID";
|
| -const char kNextVerIdKey[] = "INITDATA_NEXT_VERSION_ID";
|
| const char kUniqueOriginKey[] = "INITDATA_UNIQUE_ORIGIN:";
|
| const char kDiskCacheMigrationNotNeededKey[] =
|
| "INITDATA_DISKCACHE_MIGRATION_NOT_NEEDED";
|
| @@ -140,17 +150,15 @@ std::string CreateRegistrationKey(int64 registration_id,
|
| .append(base::Int64ToString(registration_id));
|
| }
|
|
|
| -std::string CreateResourceRecordKeyPrefix(int64 version_id) {
|
| - return base::StringPrintf("%s%s%c",
|
| - kResKeyPrefix,
|
| - base::Int64ToString(version_id).c_str(),
|
| +std::string CreateResourceRecordKeyPrefix(std::string version_uuid) {
|
| + return base::StringPrintf("%s%s%c", kResKeyPrefix, version_uuid.c_str(),
|
| kKeySeparator);
|
| }
|
|
|
| -std::string CreateResourceRecordKey(int64 version_id,
|
| +std::string CreateResourceRecordKey(std::string version_uuid,
|
| int64 resource_id) {
|
| - return CreateResourceRecordKeyPrefix(version_id).append(
|
| - base::Int64ToString(resource_id));
|
| + return CreateResourceRecordKeyPrefix(version_uuid)
|
| + .append(base::Int64ToString(resource_id));
|
| }
|
|
|
| std::string CreateUniqueOriginKey(const GURL& origin) {
|
| @@ -201,7 +209,7 @@ void PutRegistrationDataToBatch(
|
| data.set_registration_id(input.registration_id);
|
| data.set_scope_url(input.scope.spec());
|
| data.set_script_url(input.script.spec());
|
| - data.set_version_id(input.version_id);
|
| + data.set_version_uuid(input.version_uuid);
|
| data.set_is_active(input.is_active);
|
| data.set_has_fetch_handler(input.has_fetch_handler);
|
| data.set_last_update_check_time(input.last_update_check.ToInternalValue());
|
| @@ -216,7 +224,7 @@ void PutRegistrationDataToBatch(
|
|
|
| void PutResourceRecordToBatch(
|
| const ServiceWorkerDatabase::ResourceRecord& input,
|
| - int64 version_id,
|
| + std::string version_uuid,
|
| leveldb::WriteBatch* batch) {
|
| DCHECK(batch);
|
| DCHECK_GE(input.size_bytes, 0);
|
| @@ -230,7 +238,7 @@ void PutResourceRecordToBatch(
|
| std::string value;
|
| bool success = record.SerializeToString(&value);
|
| DCHECK(success);
|
| - batch->Put(CreateResourceRecordKey(version_id, input.resource_id), value);
|
| + batch->Put(CreateResourceRecordKey(version_uuid, input.resource_id), value);
|
| }
|
|
|
| void PutUniqueOriginToBatch(const GURL& origin,
|
| @@ -299,7 +307,7 @@ ServiceWorkerDatabase::Status ParseRegistrationData(
|
| out->registration_id = data.registration_id();
|
| out->scope = scope_url;
|
| out->script = script_url;
|
| - out->version_id = data.version_id();
|
| + out->version_uuid = data.version_uuid();
|
| out->is_active = data.is_active();
|
| out->has_fetch_handler = data.has_fetch_handler();
|
| out->last_update_check =
|
| @@ -375,7 +383,7 @@ const char* ServiceWorkerDatabase::StatusToString(
|
|
|
| ServiceWorkerDatabase::RegistrationData::RegistrationData()
|
| : registration_id(kInvalidServiceWorkerRegistrationId),
|
| - version_id(kInvalidServiceWorkerVersionId),
|
| + version_uuid(std::string()),
|
| is_active(false),
|
| has_fetch_handler(false),
|
| resources_total_size_bytes(0) {
|
| @@ -388,7 +396,6 @@ ServiceWorkerDatabase::ServiceWorkerDatabase(const base::FilePath& path)
|
| : path_(path),
|
| next_avail_registration_id_(0),
|
| next_avail_resource_id_(0),
|
| - next_avail_version_id_(0),
|
| state_(UNINITIALIZED),
|
| skip_writing_diskcache_migration_state_on_init_for_testing_(false) {
|
| sequence_checker_.DetachFromSequence();
|
| @@ -401,17 +408,14 @@ ServiceWorkerDatabase::~ServiceWorkerDatabase() {
|
|
|
| ServiceWorkerDatabase::Status ServiceWorkerDatabase::GetNextAvailableIds(
|
| int64* next_avail_registration_id,
|
| - int64* next_avail_version_id,
|
| int64* next_avail_resource_id) {
|
| DCHECK(sequence_checker_.CalledOnValidSequencedThread());
|
| DCHECK(next_avail_registration_id);
|
| - DCHECK(next_avail_version_id);
|
| DCHECK(next_avail_resource_id);
|
|
|
| Status status = LazyOpen(false);
|
| if (IsNewOrNonexistentDatabase(status)) {
|
| *next_avail_registration_id = 0;
|
| - *next_avail_version_id = 0;
|
| *next_avail_resource_id = 0;
|
| return STATUS_OK;
|
| }
|
| @@ -421,15 +425,11 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::GetNextAvailableIds(
|
| status = ReadNextAvailableId(kNextRegIdKey, &next_avail_registration_id_);
|
| if (status != STATUS_OK)
|
| return status;
|
| - status = ReadNextAvailableId(kNextVerIdKey, &next_avail_version_id_);
|
| - if (status != STATUS_OK)
|
| - return status;
|
| status = ReadNextAvailableId(kNextResIdKey, &next_avail_resource_id_);
|
| 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 STATUS_OK;
|
| }
|
| @@ -600,7 +600,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::GetRegistrationsForOrigin(
|
|
|
| if (opt_resources_list) {
|
| std::vector<ResourceRecord> resources;
|
| - status = ReadResourceRecords(registration.version_id, &resources);
|
| + status = ReadResourceRecords(registration.version_uuid, &resources);
|
| if (status != STATUS_OK) {
|
| HandleReadResult(FROM_HERE, status);
|
| registrations->clear();
|
| @@ -672,7 +672,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadRegistration(
|
| if (status != STATUS_OK)
|
| return status;
|
|
|
| - status = ReadResourceRecords(value.version_id, resources);
|
| + status = ReadResourceRecords(value.version_uuid, resources);
|
| if (status != STATUS_OK)
|
| return status;
|
|
|
| @@ -727,13 +727,13 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::WriteRegistration(
|
| DCHECK(old_registration);
|
| DCHECK(!resources.empty());
|
| Status status = LazyOpen(true);
|
| - old_registration->version_id = kInvalidServiceWorkerVersionId;
|
| + old_registration->version_uuid = std::string();
|
| if (status != STATUS_OK)
|
| return status;
|
|
|
| leveldb::WriteBatch batch;
|
| BumpNextRegistrationIdIfNeeded(registration.registration_id, &batch);
|
| - BumpNextVersionIdIfNeeded(registration.version_id, &batch);
|
| + // BumpNextVersionIdIfNeeded(registration.version_uuid, &batch);
|
|
|
| PutUniqueOriginToBatch(registration.scope.GetOrigin(), &batch);
|
|
|
| @@ -758,7 +758,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::WriteRegistration(
|
| DCHECK(pushed_resources.insert(itr->resource_id).second);
|
| DCHECK(pushed_urls.insert(itr->url).second);
|
|
|
| - PutResourceRecordToBatch(*itr, registration.version_id, &batch);
|
| + PutResourceRecordToBatch(*itr, registration.version_uuid, &batch);
|
|
|
| // Delete a resource from the uncommitted list.
|
| batch.Delete(CreateResourceIdKey(
|
| @@ -775,9 +775,9 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::WriteRegistration(
|
| if (status != STATUS_OK && status != STATUS_ERROR_NOT_FOUND)
|
| return status;
|
| if (status == STATUS_OK) {
|
| - DCHECK_LT(old_registration->version_id, registration.version_id);
|
| - status = DeleteResourceRecords(
|
| - old_registration->version_id, newly_purgeable_resources, &batch);
|
| + DCHECK_NE(old_registration->version_uuid, registration.version_uuid);
|
| + status = DeleteResourceRecords(old_registration->version_uuid,
|
| + newly_purgeable_resources, &batch);
|
| if (status != STATUS_OK)
|
| return status;
|
|
|
| @@ -849,7 +849,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::DeleteRegistration(
|
| std::vector<int64>* newly_purgeable_resources) {
|
| DCHECK(sequence_checker_.CalledOnValidSequencedThread());
|
| DCHECK(deleted_version);
|
| - deleted_version->version_id = kInvalidServiceWorkerVersionId;
|
| + deleted_version->version_uuid = std::string();
|
| Status status = LazyOpen(false);
|
| if (IsNewOrNonexistentDatabase(status))
|
| return STATUS_OK;
|
| @@ -881,8 +881,8 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::DeleteRegistration(
|
| for (const auto& registration : registrations) {
|
| if (registration.registration_id == registration_id) {
|
| *deleted_version = registration;
|
| - status = DeleteResourceRecords(
|
| - registration.version_id, newly_purgeable_resources, &batch);
|
| + status = DeleteResourceRecords(registration.version_uuid,
|
| + newly_purgeable_resources, &batch);
|
| if (status != STATUS_OK)
|
| return status;
|
|
|
| @@ -1090,8 +1090,8 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::DeleteAllDataForOrigins(
|
| batch.Delete(CreateRegistrationKey(data.registration_id, origin));
|
| batch.Delete(CreateRegistrationIdToOriginKey(data.registration_id));
|
|
|
| - status = DeleteResourceRecords(
|
| - data.version_id, newly_purgeable_resources, &batch);
|
| + status = DeleteResourceRecords(data.version_uuid,
|
| + newly_purgeable_resources, &batch);
|
| if (status != STATUS_OK)
|
| return status;
|
|
|
| @@ -1288,12 +1288,12 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadRegistrationData(
|
| }
|
|
|
| ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadResourceRecords(
|
| - int64 version_id,
|
| + std::string version_uuid,
|
| std::vector<ResourceRecord>* resources) {
|
| DCHECK(resources->empty());
|
|
|
| Status status = STATUS_OK;
|
| - const std::string prefix = CreateResourceRecordKeyPrefix(version_id);
|
| + const std::string prefix = CreateResourceRecordKeyPrefix(version_uuid);
|
|
|
| scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions()));
|
| for (itr->Seek(prefix); itr->Valid(); itr->Next()) {
|
| @@ -1322,13 +1322,13 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadResourceRecords(
|
| }
|
|
|
| ServiceWorkerDatabase::Status ServiceWorkerDatabase::DeleteResourceRecords(
|
| - int64 version_id,
|
| + std::string version_uuid,
|
| std::vector<int64>* newly_purgeable_resources,
|
| leveldb::WriteBatch* batch) {
|
| DCHECK(batch);
|
|
|
| Status status = STATUS_OK;
|
| - const std::string prefix = CreateResourceRecordKeyPrefix(version_id);
|
| + const std::string prefix = CreateResourceRecordKeyPrefix(version_uuid);
|
|
|
| scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions()));
|
| for (itr->Seek(prefix); itr->Valid(); itr->Next()) {
|
| @@ -1551,15 +1551,6 @@ void ServiceWorkerDatabase::BumpNextResourceIdIfNeeded(
|
| }
|
| }
|
|
|
| -void ServiceWorkerDatabase::BumpNextVersionIdIfNeeded(
|
| - int64 used_id, leveldb::WriteBatch* batch) {
|
| - DCHECK(batch);
|
| - if (next_avail_version_id_ <= used_id) {
|
| - next_avail_version_id_ = used_id + 1;
|
| - batch->Put(kNextVerIdKey, base::Int64ToString(next_avail_version_id_));
|
| - }
|
| -}
|
| -
|
| bool ServiceWorkerDatabase::IsOpen() {
|
| return db_ != NULL;
|
| }
|
|
|