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

Side by Side Diff: content/browser/service_worker/service_worker_storage.cc

Issue 1411953002: Store foreign fetch scopes in database with other SW information. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@foreign-fetch-interface
Patch Set: Created 5 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/service_worker/service_worker_storage.h" 5 #include "content/browser/service_worker/service_worker_storage.h"
6 6
7 #include "base/bind_helpers.h" 7 #include "base/bind_helpers.h"
8 #include "base/files/file_util.h" 8 #include "base/files/file_util.h"
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "base/sequenced_task_runner.h" 10 #include "base/sequenced_task_runner.h"
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 } 400 }
401 401
402 ServiceWorkerDatabase::RegistrationData data; 402 ServiceWorkerDatabase::RegistrationData data;
403 data.registration_id = registration->id(); 403 data.registration_id = registration->id();
404 data.scope = registration->pattern(); 404 data.scope = registration->pattern();
405 data.script = version->script_url(); 405 data.script = version->script_url();
406 data.has_fetch_handler = true; 406 data.has_fetch_handler = true;
407 data.version_id = version->version_id(); 407 data.version_id = version->version_id();
408 data.last_update_check = registration->last_update_check(); 408 data.last_update_check = registration->last_update_check();
409 data.is_active = (version == registration->active_version()); 409 data.is_active = (version == registration->active_version());
410 data.foreign_fetch_scopes = version->foreign_fetch_scopes();
410 411
411 ResourceList resources; 412 ResourceList resources;
412 version->script_cache_map()->GetResources(&resources); 413 version->script_cache_map()->GetResources(&resources);
413 414
414 if (resources.empty()) { 415 if (resources.empty()) {
415 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); 416 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED));
416 return; 417 return;
417 } 418 }
418 419
419 uint64 resources_total_size_bytes = 0; 420 uint64 resources_total_size_bytes = 0;
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
678 base::Bind( 679 base::Bind(
679 &ServiceWorkerStorage::GetUserDataForAllRegistrationsInDB, 680 &ServiceWorkerStorage::GetUserDataForAllRegistrationsInDB,
680 database_.get(), 681 database_.get(),
681 base::ThreadTaskRunnerHandle::Get(), 682 base::ThreadTaskRunnerHandle::Get(),
682 key, 683 key,
683 base::Bind(&ServiceWorkerStorage::DidGetUserDataForAllRegistrations, 684 base::Bind(&ServiceWorkerStorage::DidGetUserDataForAllRegistrations,
684 weak_factory_.GetWeakPtr(), 685 weak_factory_.GetWeakPtr(),
685 callback))); 686 callback)));
686 } 687 }
687 688
689 bool ServiceWorkerStorage::OriginHasForeignFetchRegistrations(
690 const GURL& origin) {
nhiroki 2015/10/21 05:42:54 This should return false if the storage is disable
Marijn Kruisselbrink 2015/10/21 20:33:46 Done
691 return foreign_fetch_origins_.find(origin) != foreign_fetch_origins_.end();
692 }
693
688 void ServiceWorkerStorage::DeleteAndStartOver(const StatusCallback& callback) { 694 void ServiceWorkerStorage::DeleteAndStartOver(const StatusCallback& callback) {
689 Disable(); 695 Disable();
690 696
691 // Delete the database on the database thread. 697 // Delete the database on the database thread.
692 PostTaskAndReplyWithResult( 698 PostTaskAndReplyWithResult(
693 database_task_manager_->GetTaskRunner(), FROM_HERE, 699 database_task_manager_->GetTaskRunner(), FROM_HERE,
694 base::Bind(&ServiceWorkerDatabase::DestroyDatabase, 700 base::Bind(&ServiceWorkerDatabase::DestroyDatabase,
695 base::Unretained(database_.get())), 701 base::Unretained(database_.get())),
696 base::Bind(&ServiceWorkerStorage::DidDeleteDatabase, 702 base::Bind(&ServiceWorkerStorage::DidDeleteDatabase,
697 weak_factory_.GetWeakPtr(), callback)); 703 weak_factory_.GetWeakPtr(), callback));
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
847 DCHECK(data); 853 DCHECK(data);
848 DCHECK_EQ(INITIALIZING, state_); 854 DCHECK_EQ(INITIALIZING, state_);
849 855
850 if (status == ServiceWorkerDatabase::STATUS_OK) { 856 if (status == ServiceWorkerDatabase::STATUS_OK) {
851 next_registration_id_ = data->next_registration_id; 857 next_registration_id_ = data->next_registration_id;
852 next_version_id_ = data->next_version_id; 858 next_version_id_ = data->next_version_id;
853 next_resource_id_ = data->next_resource_id; 859 next_resource_id_ = data->next_resource_id;
854 registered_origins_.swap(data->origins); 860 registered_origins_.swap(data->origins);
855 disk_cache_migration_needed_ = data->disk_cache_migration_needed; 861 disk_cache_migration_needed_ = data->disk_cache_migration_needed;
856 old_disk_cache_deletion_needed_ = data->old_disk_cache_deletion_needed; 862 old_disk_cache_deletion_needed_ = data->old_disk_cache_deletion_needed;
863 foreign_fetch_origins_.swap(data->foreign_fetch_origins);
857 state_ = INITIALIZED; 864 state_ = INITIALIZED;
858 } else { 865 } else {
859 DVLOG(2) << "Failed to initialize: " 866 DVLOG(2) << "Failed to initialize: "
860 << ServiceWorkerDatabase::StatusToString(status); 867 << ServiceWorkerDatabase::StatusToString(status);
861 ScheduleDeleteAndStartOver(); 868 ScheduleDeleteAndStartOver();
862 } 869 }
863 870
864 for (const auto& task : pending_tasks_) 871 for (const auto& task : pending_tasks_)
865 RunSoon(FROM_HERE, task); 872 RunSoon(FROM_HERE, task);
866 pending_tasks_.clear(); 873 pending_tasks_.clear();
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
1083 const GURL& origin, 1090 const GURL& origin,
1084 const ServiceWorkerDatabase::RegistrationData& deleted_version, 1091 const ServiceWorkerDatabase::RegistrationData& deleted_version,
1085 const std::vector<int64>& newly_purgeable_resources, 1092 const std::vector<int64>& newly_purgeable_resources,
1086 ServiceWorkerDatabase::Status status) { 1093 ServiceWorkerDatabase::Status status) {
1087 if (status != ServiceWorkerDatabase::STATUS_OK) { 1094 if (status != ServiceWorkerDatabase::STATUS_OK) {
1088 ScheduleDeleteAndStartOver(); 1095 ScheduleDeleteAndStartOver();
1089 callback.Run(DatabaseStatusToStatusCode(status)); 1096 callback.Run(DatabaseStatusToStatusCode(status));
1090 return; 1097 return;
1091 } 1098 }
1092 registered_origins_.insert(origin); 1099 registered_origins_.insert(origin);
1100 if (!new_version.foreign_fetch_scopes.empty())
1101 foreign_fetch_origins_.insert(origin);
1093 1102
1094 scoped_refptr<ServiceWorkerRegistration> registration = 1103 scoped_refptr<ServiceWorkerRegistration> registration =
1095 context_->GetLiveRegistration(new_version.registration_id); 1104 context_->GetLiveRegistration(new_version.registration_id);
1096 if (registration) { 1105 if (registration) {
1097 registration->set_resources_total_size_bytes( 1106 registration->set_resources_total_size_bytes(
1098 new_version.resources_total_size_bytes); 1107 new_version.resources_total_size_bytes);
1099 } 1108 }
1100 if (quota_manager_proxy_) { 1109 if (quota_manager_proxy_) {
1101 // Can be nullptr in tests. 1110 // Can be nullptr in tests.
1102 quota_manager_proxy_->NotifyStorageModified( 1111 quota_manager_proxy_->NotifyStorageModified(
(...skipping 15 matching lines...) Expand all
1118 ServiceWorkerDatabase::Status status) { 1127 ServiceWorkerDatabase::Status status) {
1119 if (status != ServiceWorkerDatabase::STATUS_OK && 1128 if (status != ServiceWorkerDatabase::STATUS_OK &&
1120 status != ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) { 1129 status != ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) {
1121 ScheduleDeleteAndStartOver(); 1130 ScheduleDeleteAndStartOver();
1122 } 1131 }
1123 callback.Run(DatabaseStatusToStatusCode(status)); 1132 callback.Run(DatabaseStatusToStatusCode(status));
1124 } 1133 }
1125 1134
1126 void ServiceWorkerStorage::DidDeleteRegistration( 1135 void ServiceWorkerStorage::DidDeleteRegistration(
1127 const DidDeleteRegistrationParams& params, 1136 const DidDeleteRegistrationParams& params,
1128 bool origin_is_deletable, 1137 OriginState origin_state,
1129 const ServiceWorkerDatabase::RegistrationData& deleted_version, 1138 const ServiceWorkerDatabase::RegistrationData& deleted_version,
1130 const std::vector<int64>& newly_purgeable_resources, 1139 const std::vector<int64>& newly_purgeable_resources,
1131 ServiceWorkerDatabase::Status status) { 1140 ServiceWorkerDatabase::Status status) {
1132 pending_deletions_.erase(params.registration_id); 1141 pending_deletions_.erase(params.registration_id);
1133 if (status != ServiceWorkerDatabase::STATUS_OK) { 1142 if (status != ServiceWorkerDatabase::STATUS_OK) {
1134 ScheduleDeleteAndStartOver(); 1143 ScheduleDeleteAndStartOver();
1135 params.callback.Run(DatabaseStatusToStatusCode(status)); 1144 params.callback.Run(DatabaseStatusToStatusCode(status));
1136 return; 1145 return;
1137 } 1146 }
1138 if (quota_manager_proxy_) { 1147 if (quota_manager_proxy_) {
1139 // Can be nullptr in tests. 1148 // Can be nullptr in tests.
1140 quota_manager_proxy_->NotifyStorageModified( 1149 quota_manager_proxy_->NotifyStorageModified(
1141 storage::QuotaClient::kServiceWorker, 1150 storage::QuotaClient::kServiceWorker,
1142 params.origin, 1151 params.origin,
1143 storage::StorageType::kStorageTypeTemporary, 1152 storage::StorageType::kStorageTypeTemporary,
1144 -deleted_version.resources_total_size_bytes); 1153 -deleted_version.resources_total_size_bytes);
1145 } 1154 }
1146 if (origin_is_deletable) 1155 if (origin_state == OriginState::DELETE_FROM_ALL)
1147 registered_origins_.erase(params.origin); 1156 registered_origins_.erase(params.origin);
1157 if (origin_state == OriginState::DELETE_FROM_ALL ||
1158 origin_state == OriginState::DELETE_FROM_FOREIGN_FETCH)
1159 foreign_fetch_origins_.erase(params.origin);
1148 params.callback.Run(SERVICE_WORKER_OK); 1160 params.callback.Run(SERVICE_WORKER_OK);
1149 1161
1150 if (!context_->GetLiveVersion(deleted_version.version_id)) 1162 if (!context_->GetLiveVersion(deleted_version.version_id))
1151 StartPurgingResources(newly_purgeable_resources); 1163 StartPurgingResources(newly_purgeable_resources);
1152 } 1164 }
1153 1165
1154 void ServiceWorkerStorage::DidWriteUncommittedResourceIds( 1166 void ServiceWorkerStorage::DidWriteUncommittedResourceIds(
1155 ServiceWorkerDatabase::Status status) { 1167 ServiceWorkerDatabase::Status status) {
1156 if (status != ServiceWorkerDatabase::STATUS_OK) 1168 if (status != ServiceWorkerDatabase::STATUS_OK)
1157 ScheduleDeleteAndStartOver(); 1169 ScheduleDeleteAndStartOver();
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1226 registration->set_is_deleted(true); 1238 registration->set_is_deleted(true);
1227 } 1239 }
1228 scoped_refptr<ServiceWorkerVersion> version = 1240 scoped_refptr<ServiceWorkerVersion> version =
1229 context_->GetLiveVersion(data.version_id); 1241 context_->GetLiveVersion(data.version_id);
1230 if (!version) { 1242 if (!version) {
1231 version = new ServiceWorkerVersion( 1243 version = new ServiceWorkerVersion(
1232 registration.get(), data.script, data.version_id, context_); 1244 registration.get(), data.script, data.version_id, context_);
1233 version->SetStatus(data.is_active ? 1245 version->SetStatus(data.is_active ?
1234 ServiceWorkerVersion::ACTIVATED : ServiceWorkerVersion::INSTALLED); 1246 ServiceWorkerVersion::ACTIVATED : ServiceWorkerVersion::INSTALLED);
1235 version->script_cache_map()->SetResources(resources); 1247 version->script_cache_map()->SetResources(resources);
1248 version->set_foreign_fetch_scopes(data.foreign_fetch_scopes);
1236 } 1249 }
1237 1250
1238 if (version->status() == ServiceWorkerVersion::ACTIVATED) 1251 if (version->status() == ServiceWorkerVersion::ACTIVATED)
1239 registration->SetActiveVersion(version); 1252 registration->SetActiveVersion(version);
1240 else if (version->status() == ServiceWorkerVersion::INSTALLED) 1253 else if (version->status() == ServiceWorkerVersion::INSTALLED)
1241 registration->SetWaitingVersion(version); 1254 registration->SetWaitingVersion(version);
1242 else 1255 else
1243 NOTREACHED(); 1256 NOTREACHED();
1244 1257
1245 return registration; 1258 return registration;
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
1569 1582
1570 status = database->IsOldDiskCacheDeletionNeeded( 1583 status = database->IsOldDiskCacheDeletionNeeded(
1571 &data->old_disk_cache_deletion_needed); 1584 &data->old_disk_cache_deletion_needed);
1572 if (status != ServiceWorkerDatabase::STATUS_OK) { 1585 if (status != ServiceWorkerDatabase::STATUS_OK) {
1573 original_task_runner->PostTask( 1586 original_task_runner->PostTask(
1574 FROM_HERE, base::Bind(callback, base::Passed(data.Pass()), status)); 1587 FROM_HERE, base::Bind(callback, base::Passed(data.Pass()), status));
1575 return; 1588 return;
1576 } 1589 }
1577 1590
1578 status = database->GetOriginsWithRegistrations(&data->origins); 1591 status = database->GetOriginsWithRegistrations(&data->origins);
1592 if (status != ServiceWorkerDatabase::STATUS_OK) {
1593 original_task_runner->PostTask(
1594 FROM_HERE, base::Bind(callback, base::Passed(data.Pass()), status));
1595 return;
1596 }
1597
1598 status = database->GetOriginsWithForeignFetchRegistrations(
1599 &data->foreign_fetch_origins);
1579 original_task_runner->PostTask( 1600 original_task_runner->PostTask(
1580 FROM_HERE, base::Bind(callback, base::Passed(data.Pass()), status)); 1601 FROM_HERE, base::Bind(callback, base::Passed(data.Pass()), status));
1581 } 1602 }
1582 1603
1583 void ServiceWorkerStorage::DeleteOldDiskCacheInDB( 1604 void ServiceWorkerStorage::DeleteOldDiskCacheInDB(
1584 ServiceWorkerDatabase* database, 1605 ServiceWorkerDatabase* database,
1585 const base::FilePath& disk_cache_path) { 1606 const base::FilePath& disk_cache_path) {
1586 // Ignore a failure. A retry will happen on the next initialization. 1607 // Ignore a failure. A retry will happen on the next initialization.
1587 if (!base::DeleteFile(disk_cache_path, true)) 1608 if (!base::DeleteFile(disk_cache_path, true))
1588 return; 1609 return;
1589 database->SetOldDiskCacheDeletionNotNeeded(); 1610 database->SetOldDiskCacheDeletionNotNeeded();
1590 } 1611 }
1591 1612
1592 void ServiceWorkerStorage::DeleteRegistrationFromDB( 1613 void ServiceWorkerStorage::DeleteRegistrationFromDB(
1593 ServiceWorkerDatabase* database, 1614 ServiceWorkerDatabase* database,
1594 scoped_refptr<base::SequencedTaskRunner> original_task_runner, 1615 scoped_refptr<base::SequencedTaskRunner> original_task_runner,
1595 int64 registration_id, 1616 int64 registration_id,
1596 const GURL& origin, 1617 const GURL& origin,
1597 const DeleteRegistrationCallback& callback) { 1618 const DeleteRegistrationCallback& callback) {
1598 DCHECK(database); 1619 DCHECK(database);
1599 1620
1600 ServiceWorkerDatabase::RegistrationData deleted_version; 1621 ServiceWorkerDatabase::RegistrationData deleted_version;
1601 std::vector<int64> newly_purgeable_resources; 1622 std::vector<int64> newly_purgeable_resources;
1602 ServiceWorkerDatabase::Status status = database->DeleteRegistration( 1623 ServiceWorkerDatabase::Status status = database->DeleteRegistration(
1603 registration_id, origin, &deleted_version, &newly_purgeable_resources); 1624 registration_id, origin, &deleted_version, &newly_purgeable_resources);
1604 if (status != ServiceWorkerDatabase::STATUS_OK) { 1625 if (status != ServiceWorkerDatabase::STATUS_OK) {
1605 original_task_runner->PostTask( 1626 original_task_runner->PostTask(
1606 FROM_HERE, 1627 FROM_HERE, base::Bind(callback, OriginState::KEEP_ALL, deleted_version,
1607 base::Bind( 1628 std::vector<int64>(), status));
1608 callback, false, deleted_version, std::vector<int64>(), status));
1609 return; 1629 return;
1610 } 1630 }
1611 1631
1612 // TODO(nhiroki): Add convenient method to ServiceWorkerDatabase to check the 1632 // TODO(nhiroki): Add convenient method to ServiceWorkerDatabase to check the
1613 // unique origin list. 1633 // unique origin list.
1614 RegistrationList registrations; 1634 RegistrationList registrations;
1615 status = database->GetRegistrationsForOrigin(origin, &registrations, nullptr); 1635 status = database->GetRegistrationsForOrigin(origin, &registrations, nullptr);
1616 if (status != ServiceWorkerDatabase::STATUS_OK) { 1636 if (status != ServiceWorkerDatabase::STATUS_OK) {
1617 original_task_runner->PostTask( 1637 original_task_runner->PostTask(
1618 FROM_HERE, 1638 FROM_HERE, base::Bind(callback, OriginState::KEEP_ALL, deleted_version,
1619 base::Bind( 1639 std::vector<int64>(), status));
1620 callback, false, deleted_version, std::vector<int64>(), status));
1621 return; 1640 return;
1622 } 1641 }
1623 1642
1624 bool deletable = registrations.empty(); 1643 OriginState origin_state = registrations.empty()
1625 original_task_runner->PostTask(FROM_HERE, 1644 ? OriginState::DELETE_FROM_ALL
1626 base::Bind(callback, 1645 : OriginState::DELETE_FROM_FOREIGN_FETCH;
1627 deletable, 1646
1628 deleted_version, 1647 // TODO(mek): Add convenient method to ServiceWorkerDatabase to check the
1629 newly_purgeable_resources, 1648 // foreign fetch scope origin list.
1630 status)); 1649 for (const auto& registration : registrations) {
1650 if (!registration.foreign_fetch_scopes.empty()) {
1651 origin_state = OriginState::KEEP_ALL;
1652 break;
1653 }
1654 }
1655 original_task_runner->PostTask(
1656 FROM_HERE, base::Bind(callback, origin_state, deleted_version,
1657 newly_purgeable_resources, status));
1631 } 1658 }
1632 1659
1633 void ServiceWorkerStorage::WriteRegistrationInDB( 1660 void ServiceWorkerStorage::WriteRegistrationInDB(
1634 ServiceWorkerDatabase* database, 1661 ServiceWorkerDatabase* database,
1635 scoped_refptr<base::SequencedTaskRunner> original_task_runner, 1662 scoped_refptr<base::SequencedTaskRunner> original_task_runner,
1636 const ServiceWorkerDatabase::RegistrationData& data, 1663 const ServiceWorkerDatabase::RegistrationData& data,
1637 const ResourceList& resources, 1664 const ResourceList& resources,
1638 const WriteRegistrationCallback& callback) { 1665 const WriteRegistrationCallback& callback) {
1639 DCHECK(database); 1666 DCHECK(database);
1640 ServiceWorkerDatabase::RegistrationData deleted_version; 1667 ServiceWorkerDatabase::RegistrationData deleted_version;
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
1843 callback.Run(SERVICE_WORKER_ERROR_FAILED); 1870 callback.Run(SERVICE_WORKER_ERROR_FAILED);
1844 return; 1871 return;
1845 } 1872 }
1846 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; 1873 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully.";
1847 ServiceWorkerMetrics::RecordDeleteAndStartOverResult( 1874 ServiceWorkerMetrics::RecordDeleteAndStartOverResult(
1848 ServiceWorkerMetrics::DELETE_OK); 1875 ServiceWorkerMetrics::DELETE_OK);
1849 callback.Run(SERVICE_WORKER_OK); 1876 callback.Run(SERVICE_WORKER_OK);
1850 } 1877 }
1851 1878
1852 } // namespace content 1879 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698