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

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

Issue 1192143002: Service Worker: Use auto / range-based loop for container objects. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 6 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 base::Bind(&ServiceWorkerStorage::DidFindRegistrationForPattern, 360 base::Bind(&ServiceWorkerStorage::DidFindRegistrationForPattern,
361 weak_factory_.GetWeakPtr(), 361 weak_factory_.GetWeakPtr(),
362 scope, 362 scope,
363 callback))); 363 callback)));
364 } 364 }
365 365
366 ServiceWorkerRegistration* ServiceWorkerStorage::GetUninstallingRegistration( 366 ServiceWorkerRegistration* ServiceWorkerStorage::GetUninstallingRegistration(
367 const GURL& scope) { 367 const GURL& scope) {
368 if (state_ != INITIALIZED || !context_) 368 if (state_ != INITIALIZED || !context_)
369 return NULL; 369 return NULL;
370 for (RegistrationRefsById::const_iterator it = 370 for (const auto& registration : uninstalling_registrations_) {
371 uninstalling_registrations_.begin(); 371 if (registration.second->pattern() == scope) {
372 it != uninstalling_registrations_.end(); 372 DCHECK(registration.second->is_uninstalling());
373 ++it) { 373 return registration.second.get();
374 if (it->second->pattern() == scope) {
375 DCHECK(it->second->is_uninstalling());
376 return it->second.get();
377 } 374 }
378 } 375 }
379 return NULL; 376 return NULL;
380 } 377 }
381 378
382 void ServiceWorkerStorage::FindRegistrationForId( 379 void ServiceWorkerStorage::FindRegistrationForId(
383 int64 registration_id, 380 int64 registration_id,
384 const GURL& origin, 381 const GURL& origin,
385 const FindRegistrationCallback& callback) { 382 const FindRegistrationCallback& callback) {
386 if (!LazyInitialize(base::Bind( 383 if (!LazyInitialize(base::Bind(
(...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 void ServiceWorkerStorage::NotifyDoneInstallingRegistration( 864 void ServiceWorkerStorage::NotifyDoneInstallingRegistration(
868 ServiceWorkerRegistration* registration, 865 ServiceWorkerRegistration* registration,
869 ServiceWorkerVersion* version, 866 ServiceWorkerVersion* version,
870 ServiceWorkerStatusCode status) { 867 ServiceWorkerStatusCode status) {
871 installing_registrations_.erase(registration->id()); 868 installing_registrations_.erase(registration->id());
872 if (status != SERVICE_WORKER_OK && version) { 869 if (status != SERVICE_WORKER_OK && version) {
873 ResourceList resources; 870 ResourceList resources;
874 version->script_cache_map()->GetResources(&resources); 871 version->script_cache_map()->GetResources(&resources);
875 872
876 std::set<int64> ids; 873 std::set<int64> ids;
877 for (size_t i = 0; i < resources.size(); ++i) 874 for (const auto& resource : resources)
878 ids.insert(resources[i].resource_id); 875 ids.insert(resource.resource_id);
879 876
880 database_task_manager_->GetTaskRunner()->PostTask( 877 database_task_manager_->GetTaskRunner()->PostTask(
881 FROM_HERE, 878 FROM_HERE,
882 base::Bind(base::IgnoreResult( 879 base::Bind(base::IgnoreResult(
883 &ServiceWorkerDatabase::PurgeUncommittedResourceIds), 880 &ServiceWorkerDatabase::PurgeUncommittedResourceIds),
884 base::Unretained(database_.get()), 881 base::Unretained(database_.get()),
885 ids)); 882 ids));
886 } 883 }
887 } 884 }
888 885
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
1001 registered_origins_.swap(data->origins); 998 registered_origins_.swap(data->origins);
1002 disk_cache_migration_needed_ = data->disk_cache_migration_needed; 999 disk_cache_migration_needed_ = data->disk_cache_migration_needed;
1003 old_disk_cache_deletion_needed_ = data->old_disk_cache_deletion_needed; 1000 old_disk_cache_deletion_needed_ = data->old_disk_cache_deletion_needed;
1004 state_ = INITIALIZED; 1001 state_ = INITIALIZED;
1005 } else { 1002 } else {
1006 DVLOG(2) << "Failed to initialize: " 1003 DVLOG(2) << "Failed to initialize: "
1007 << ServiceWorkerDatabase::StatusToString(status); 1004 << ServiceWorkerDatabase::StatusToString(status);
1008 ScheduleDeleteAndStartOver(); 1005 ScheduleDeleteAndStartOver();
1009 } 1006 }
1010 1007
1011 for (std::vector<base::Closure>::const_iterator it = pending_tasks_.begin(); 1008 for (const auto& task : pending_tasks_)
1012 it != pending_tasks_.end(); ++it) { 1009 RunSoon(FROM_HERE, task);
1013 RunSoon(FROM_HERE, *it);
1014 }
1015 pending_tasks_.clear(); 1010 pending_tasks_.clear();
1016 } 1011 }
1017 1012
1018 void ServiceWorkerStorage::DidFindRegistrationForDocument( 1013 void ServiceWorkerStorage::DidFindRegistrationForDocument(
1019 const GURL& document_url, 1014 const GURL& document_url,
1020 const FindRegistrationCallback& callback, 1015 const FindRegistrationCallback& callback,
1021 int64 callback_id, 1016 int64 callback_id,
1022 const ServiceWorkerDatabase::RegistrationData& data, 1017 const ServiceWorkerDatabase::RegistrationData& data,
1023 const ResourceList& resources, 1018 const ResourceList& resources,
1024 ServiceWorkerDatabase::Status status) { 1019 ServiceWorkerDatabase::Status status) {
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
1138 std::set<int64> registration_ids; 1133 std::set<int64> registration_ids;
1139 std::vector<scoped_refptr<ServiceWorkerRegistration>> registrations; 1134 std::vector<scoped_refptr<ServiceWorkerRegistration>> registrations;
1140 size_t index = 0; 1135 size_t index = 0;
1141 for (const auto& registration_data : *registration_data_list) { 1136 for (const auto& registration_data : *registration_data_list) {
1142 registration_ids.insert(registration_data.registration_id); 1137 registration_ids.insert(registration_data.registration_id);
1143 registrations.push_back(GetOrCreateRegistration( 1138 registrations.push_back(GetOrCreateRegistration(
1144 registration_data, resources_list->at(index++))); 1139 registration_data, resources_list->at(index++)));
1145 } 1140 }
1146 1141
1147 // Add unstored registrations that are being installed. 1142 // Add unstored registrations that are being installed.
1148 for (RegistrationRefsById::const_iterator it = 1143 for (const auto& registration : installing_registrations_) {
1149 installing_registrations_.begin();
1150 it != installing_registrations_.end(); ++it) {
1151 if ((!origin_filter.is_valid() || 1144 if ((!origin_filter.is_valid() ||
1152 it->second->pattern().GetOrigin() == origin_filter) && 1145 registration.second->pattern().GetOrigin() == origin_filter) &&
1153 registration_ids.insert(it->first).second) { 1146 registration_ids.insert(registration.first).second) {
1154 registrations.push_back((it->second).get()); 1147 registrations.push_back(registration.second);
1155 } 1148 }
1156 } 1149 }
1157 1150
1158 callback.Run(registrations); 1151 callback.Run(registrations);
1159 } 1152 }
1160 1153
1161 void ServiceWorkerStorage::DidGetRegistrationsInfos( 1154 void ServiceWorkerStorage::DidGetRegistrationsInfos(
1162 const GetRegistrationsInfosCallback& callback, 1155 const GetRegistrationsInfosCallback& callback,
1163 RegistrationList* registration_data_list, 1156 RegistrationList* registration_data_list,
1164 const GURL& origin_filter, 1157 const GURL& origin_filter,
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1209 } else { 1202 } else {
1210 info.waiting_version.status = ServiceWorkerVersion::INSTALLED; 1203 info.waiting_version.status = ServiceWorkerVersion::INSTALLED;
1211 info.waiting_version.script_url = registration_data.script; 1204 info.waiting_version.script_url = registration_data.script;
1212 info.waiting_version.version_id = registration_data.version_id; 1205 info.waiting_version.version_id = registration_data.version_id;
1213 info.waiting_version.registration_id = registration_data.registration_id; 1206 info.waiting_version.registration_id = registration_data.registration_id;
1214 } 1207 }
1215 infos.push_back(info); 1208 infos.push_back(info);
1216 } 1209 }
1217 1210
1218 // Add unstored registrations that are being installed. 1211 // Add unstored registrations that are being installed.
1219 for (RegistrationRefsById::const_iterator it = 1212 for (const auto& registration : installing_registrations_) {
1220 installing_registrations_.begin();
1221 it != installing_registrations_.end(); ++it) {
1222 if ((!origin_filter.is_valid() || 1213 if ((!origin_filter.is_valid() ||
1223 it->second->pattern().GetOrigin() == origin_filter) && 1214 registration.second->pattern().GetOrigin() == origin_filter) &&
1224 pushed_registrations.insert(it->first).second) { 1215 pushed_registrations.insert(registration.first).second) {
1225 infos.push_back(it->second->GetInfo()); 1216 infos.push_back(registration.second->GetInfo());
1226 } 1217 }
1227 } 1218 }
1228 1219
1229 callback.Run(infos); 1220 callback.Run(infos);
1230 } 1221 }
1231 1222
1232 void ServiceWorkerStorage::DidStoreRegistration( 1223 void ServiceWorkerStorage::DidStoreRegistration(
1233 const StatusCallback& callback, 1224 const StatusCallback& callback,
1234 const ServiceWorkerDatabase::RegistrationData& new_version, 1225 const ServiceWorkerDatabase::RegistrationData& new_version,
1235 const GURL& origin, 1226 const GURL& origin,
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
1382 ServiceWorkerRegistration* 1373 ServiceWorkerRegistration*
1383 ServiceWorkerStorage::FindInstallingRegistrationForDocument( 1374 ServiceWorkerStorage::FindInstallingRegistrationForDocument(
1384 const GURL& document_url) { 1375 const GURL& document_url) {
1385 DCHECK(!document_url.has_ref()); 1376 DCHECK(!document_url.has_ref());
1386 1377
1387 LongestScopeMatcher matcher(document_url); 1378 LongestScopeMatcher matcher(document_url);
1388 ServiceWorkerRegistration* match = NULL; 1379 ServiceWorkerRegistration* match = NULL;
1389 1380
1390 // TODO(nhiroki): This searches over installing registrations linearly and it 1381 // TODO(nhiroki): This searches over installing registrations linearly and it
1391 // couldn't be scalable. Maybe the regs should be partitioned by origin. 1382 // couldn't be scalable. Maybe the regs should be partitioned by origin.
1392 for (RegistrationRefsById::const_iterator it = 1383 for (const auto& registration : installing_registrations_)
1393 installing_registrations_.begin(); 1384 if (matcher.MatchLongest(registration.second->pattern()))
1394 it != installing_registrations_.end(); ++it) { 1385 match = registration.second.get();
1395 if (matcher.MatchLongest(it->second->pattern()))
1396 match = it->second.get();
1397 }
1398 return match; 1386 return match;
1399 } 1387 }
1400 1388
1401 ServiceWorkerRegistration* 1389 ServiceWorkerRegistration*
1402 ServiceWorkerStorage::FindInstallingRegistrationForPattern( 1390 ServiceWorkerStorage::FindInstallingRegistrationForPattern(
1403 const GURL& scope) { 1391 const GURL& scope) {
1404 for (RegistrationRefsById::const_iterator it = 1392 for (const auto& registration : installing_registrations_)
1405 installing_registrations_.begin(); 1393 if (registration.second->pattern() == scope)
1406 it != installing_registrations_.end(); ++it) { 1394 return registration.second.get();
1407 if (it->second->pattern() == scope)
1408 return it->second.get();
1409 }
1410 return NULL; 1395 return NULL;
1411 } 1396 }
1412 1397
1413 ServiceWorkerRegistration* 1398 ServiceWorkerRegistration*
1414 ServiceWorkerStorage::FindInstallingRegistrationForId( 1399 ServiceWorkerStorage::FindInstallingRegistrationForId(
1415 int64 registration_id) { 1400 int64 registration_id) {
1416 RegistrationRefsById::const_iterator found = 1401 RegistrationRefsById::const_iterator found =
1417 installing_registrations_.find(registration_id); 1402 installing_registrations_.find(registration_id);
1418 if (found == installing_registrations_.end()) 1403 if (found == installing_registrations_.end())
1419 return NULL; 1404 return NULL;
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1526 LOG(ERROR) << "Failed to open the serviceworker diskcache: " 1511 LOG(ERROR) << "Failed to open the serviceworker diskcache: "
1527 << net::ErrorToString(rv); 1512 << net::ErrorToString(rv);
1528 ScheduleDeleteAndStartOver(); 1513 ScheduleDeleteAndStartOver();
1529 } 1514 }
1530 ServiceWorkerMetrics::CountInitDiskCacheResult(rv == net::OK); 1515 ServiceWorkerMetrics::CountInitDiskCacheResult(rv == net::OK);
1531 } 1516 }
1532 1517
1533 void ServiceWorkerStorage::StartPurgingResources( 1518 void ServiceWorkerStorage::StartPurgingResources(
1534 const std::vector<int64>& ids) { 1519 const std::vector<int64>& ids) {
1535 DCHECK(has_checked_for_stale_resources_); 1520 DCHECK(has_checked_for_stale_resources_);
1536 for (size_t i = 0; i < ids.size(); ++i) 1521 for (const auto& id : ids)
1537 purgeable_resource_ids_.push_back(ids[i]); 1522 purgeable_resource_ids_.push_back(id);
1538 ContinuePurgingResources(); 1523 ContinuePurgingResources();
1539 } 1524 }
1540 1525
1541 void ServiceWorkerStorage::StartPurgingResources( 1526 void ServiceWorkerStorage::StartPurgingResources(
1542 const ResourceList& resources) { 1527 const ResourceList& resources) {
1543 DCHECK(has_checked_for_stale_resources_); 1528 DCHECK(has_checked_for_stale_resources_);
1544 for (size_t i = 0; i < resources.size(); ++i) 1529 for (const auto& resource : resources)
1545 purgeable_resource_ids_.push_back(resources[i].resource_id); 1530 purgeable_resource_ids_.push_back(resource.resource_id);
1546 ContinuePurgingResources(); 1531 ContinuePurgingResources();
1547 } 1532 }
1548 1533
1549 void ServiceWorkerStorage::ContinuePurgingResources() { 1534 void ServiceWorkerStorage::ContinuePurgingResources() {
1550 if (purgeable_resource_ids_.empty() || is_purge_pending_) 1535 if (purgeable_resource_ids_.empty() || is_purge_pending_)
1551 return; 1536 return;
1552 1537
1553 // Do one at a time until we're done, use RunSoon to avoid recursion when 1538 // Do one at a time until we're done, use RunSoon to avoid recursion when
1554 // DoomEntry returns immediately. 1539 // DoomEntry returns immediately.
1555 is_purge_pending_ = true; 1540 is_purge_pending_ = true;
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
1765 newly_purgeable_resources, 1750 newly_purgeable_resources,
1766 status)); 1751 status));
1767 } 1752 }
1768 1753
1769 void ServiceWorkerStorage::FindForDocumentInDB( 1754 void ServiceWorkerStorage::FindForDocumentInDB(
1770 ServiceWorkerDatabase* database, 1755 ServiceWorkerDatabase* database,
1771 scoped_refptr<base::SequencedTaskRunner> original_task_runner, 1756 scoped_refptr<base::SequencedTaskRunner> original_task_runner,
1772 const GURL& document_url, 1757 const GURL& document_url,
1773 const FindInDBCallback& callback) { 1758 const FindInDBCallback& callback) {
1774 GURL origin = document_url.GetOrigin(); 1759 GURL origin = document_url.GetOrigin();
1775 RegistrationList registrations; 1760 RegistrationList registration_data_list;
1776 ServiceWorkerDatabase::Status status = 1761 ServiceWorkerDatabase::Status status = database->GetRegistrationsForOrigin(
1777 database->GetRegistrationsForOrigin(origin, &registrations, nullptr); 1762 origin, &registration_data_list, nullptr);
1778 if (status != ServiceWorkerDatabase::STATUS_OK) { 1763 if (status != ServiceWorkerDatabase::STATUS_OK) {
1779 original_task_runner->PostTask( 1764 original_task_runner->PostTask(
1780 FROM_HERE, 1765 FROM_HERE,
1781 base::Bind(callback, 1766 base::Bind(callback,
1782 ServiceWorkerDatabase::RegistrationData(), 1767 ServiceWorkerDatabase::RegistrationData(),
1783 ResourceList(), 1768 ResourceList(),
1784 status)); 1769 status));
1785 return; 1770 return;
1786 } 1771 }
1787 1772
1788 ServiceWorkerDatabase::RegistrationData data; 1773 ServiceWorkerDatabase::RegistrationData data;
1789 ResourceList resources; 1774 ResourceList resources;
1790 status = ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND; 1775 status = ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND;
1791 1776
1792 // Find one with a pattern match. 1777 // Find one with a pattern match.
1793 LongestScopeMatcher matcher(document_url); 1778 LongestScopeMatcher matcher(document_url);
1794 int64 match = kInvalidServiceWorkerRegistrationId; 1779 int64 match = kInvalidServiceWorkerRegistrationId;
1795 for (size_t i = 0; i < registrations.size(); ++i) { 1780 for (const auto& registration_data : registration_data_list)
1796 if (matcher.MatchLongest(registrations[i].scope)) 1781 if (matcher.MatchLongest(registration_data.scope))
1797 match = registrations[i].registration_id; 1782 match = registration_data.registration_id;
1798 }
1799
1800 if (match != kInvalidServiceWorkerRegistrationId) 1783 if (match != kInvalidServiceWorkerRegistrationId)
1801 status = database->ReadRegistration(match, origin, &data, &resources); 1784 status = database->ReadRegistration(match, origin, &data, &resources);
1802 1785
1803 original_task_runner->PostTask( 1786 original_task_runner->PostTask(
1804 FROM_HERE, 1787 FROM_HERE,
1805 base::Bind(callback, data, resources, status)); 1788 base::Bind(callback, data, resources, status));
1806 } 1789 }
1807 1790
1808 void ServiceWorkerStorage::FindForPatternInDB( 1791 void ServiceWorkerStorage::FindForPatternInDB(
1809 ServiceWorkerDatabase* database, 1792 ServiceWorkerDatabase* database,
1810 scoped_refptr<base::SequencedTaskRunner> original_task_runner, 1793 scoped_refptr<base::SequencedTaskRunner> original_task_runner,
1811 const GURL& scope, 1794 const GURL& scope,
1812 const FindInDBCallback& callback) { 1795 const FindInDBCallback& callback) {
1813 GURL origin = scope.GetOrigin(); 1796 GURL origin = scope.GetOrigin();
1814 RegistrationList registrations; 1797 RegistrationList registration_data_list;
1815 ServiceWorkerDatabase::Status status = 1798 ServiceWorkerDatabase::Status status = database->GetRegistrationsForOrigin(
1816 database->GetRegistrationsForOrigin(origin, &registrations, nullptr); 1799 origin, &registration_data_list, nullptr);
1817 if (status != ServiceWorkerDatabase::STATUS_OK) { 1800 if (status != ServiceWorkerDatabase::STATUS_OK) {
1818 original_task_runner->PostTask( 1801 original_task_runner->PostTask(
1819 FROM_HERE, 1802 FROM_HERE,
1820 base::Bind(callback, 1803 base::Bind(callback,
1821 ServiceWorkerDatabase::RegistrationData(), 1804 ServiceWorkerDatabase::RegistrationData(),
1822 ResourceList(), 1805 ResourceList(),
1823 status)); 1806 status));
1824 return; 1807 return;
1825 } 1808 }
1826 1809
1827 // Find one with an exact matching scope. 1810 // Find one with an exact matching scope.
1828 ServiceWorkerDatabase::RegistrationData data; 1811 ServiceWorkerDatabase::RegistrationData data;
1829 ResourceList resources; 1812 ResourceList resources;
1830 status = ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND; 1813 status = ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND;
1831 for (RegistrationList::const_iterator it = registrations.begin(); 1814 for (const auto& registration_data : registration_data_list) {
1832 it != registrations.end(); ++it) { 1815 if (scope != registration_data.scope)
1833 if (scope != it->scope)
1834 continue; 1816 continue;
1835 status = database->ReadRegistration(it->registration_id, origin, 1817 status = database->ReadRegistration(registration_data.registration_id,
1836 &data, &resources); 1818 origin, &data, &resources);
1837 break; // We're done looping. 1819 break; // We're done looping.
1838 } 1820 }
1839 1821
1840 original_task_runner->PostTask( 1822 original_task_runner->PostTask(
1841 FROM_HERE, 1823 FROM_HERE,
1842 base::Bind(callback, data, resources, status)); 1824 base::Bind(callback, data, resources, status));
1843 } 1825 }
1844 1826
1845 void ServiceWorkerStorage::FindForIdInDB( 1827 void ServiceWorkerStorage::FindForIdInDB(
1846 ServiceWorkerDatabase* database, 1828 ServiceWorkerDatabase* database,
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
1963 callback.Run(SERVICE_WORKER_ERROR_FAILED); 1945 callback.Run(SERVICE_WORKER_ERROR_FAILED);
1964 return; 1946 return;
1965 } 1947 }
1966 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; 1948 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully.";
1967 ServiceWorkerMetrics::RecordDeleteAndStartOverResult( 1949 ServiceWorkerMetrics::RecordDeleteAndStartOverResult(
1968 ServiceWorkerMetrics::DELETE_OK); 1950 ServiceWorkerMetrics::DELETE_OK);
1969 callback.Run(SERVICE_WORKER_OK); 1951 callback.Run(SERVICE_WORKER_OK);
1970 } 1952 }
1971 1953
1972 } // namespace content 1954 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698