Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(53)

Unified Diff: content/browser/service_worker/service_worker_database.cc

Issue 2394443002: ServiceWorker: Ensure that a resource list contains the main script (Closed)
Patch Set: fix tests Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 35e64e97db2886772b92c148800e9518e830129d..fed2adb34adfa52af1c5408734bf41f9f92afd47 100644
--- a/content/browser/service_worker/service_worker_database.cc
+++ b/content/browser/service_worker/service_worker_database.cc
@@ -461,7 +461,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::GetRegistrationsForOrigin(
if (opt_resources_list) {
std::vector<ResourceRecord> resources;
- status = ReadResourceRecords(registration.version_id, &resources);
+ status = ReadResourceRecords(registration, &resources);
if (status != STATUS_OK) {
registrations->clear();
opt_resources_list->clear();
@@ -534,7 +534,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadRegistration(
if (status != STATUS_OK)
return status;
- status = ReadResourceRecords(value.version_id, resources);
+ status = ReadResourceRecords(value, resources);
if (status != STATUS_OK)
return status;
@@ -1265,13 +1265,14 @@ void ServiceWorkerDatabase::WriteRegistrationDataInBatch(
}
ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadResourceRecords(
- int64_t version_id,
+ const RegistrationData& registration,
std::vector<ResourceRecord>* resources) {
DCHECK(resources->empty());
Status status = STATUS_OK;
- const std::string prefix = CreateResourceRecordKeyPrefix(version_id);
-
+ bool has_main_resource = false;
+ const std::string prefix =
+ CreateResourceRecordKeyPrefix(registration.version_id);
{
std::unique_ptr<leveldb::Iterator> itr(
db_->NewIterator(leveldb::ReadOptions()));
@@ -1291,10 +1292,22 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadResourceRecords(
resources->clear();
break;
}
+
+ if (registration.script == resource.url) {
+ DCHECK(!has_main_resource);
+ has_main_resource = true;
+ }
+
resources->push_back(resource);
}
}
+ // |resources| should contain the main script.
+ if (!has_main_resource) {
+ resources->clear();
+ status = STATUS_ERROR_CORRUPTED;
+ }
+
HandleReadResult(FROM_HERE, status);
return status;
}

Powered by Google App Engine
This is Rietveld 408576698