 Chromium Code Reviews
 Chromium Code Reviews Issue 1146913004:
  Service Worker: Add ServiceWorkerContainer.getRegistrations() method.  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master
    
  
    Issue 1146913004:
  Service Worker: Add ServiceWorkerContainer.getRegistrations() method.  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master| OLD | NEW | 
|---|---|
| 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 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 453 base::Bind(&FindForIdOnlyInDB, | 453 base::Bind(&FindForIdOnlyInDB, | 
| 454 database_.get(), | 454 database_.get(), | 
| 455 base::ThreadTaskRunnerHandle::Get(), | 455 base::ThreadTaskRunnerHandle::Get(), | 
| 456 registration_id, | 456 registration_id, | 
| 457 base::Bind(&ServiceWorkerStorage::DidFindRegistrationForId, | 457 base::Bind(&ServiceWorkerStorage::DidFindRegistrationForId, | 
| 458 weak_factory_.GetWeakPtr(), | 458 weak_factory_.GetWeakPtr(), | 
| 459 callback))); | 459 callback))); | 
| 460 } | 460 } | 
| 461 | 461 | 
| 462 void ServiceWorkerStorage::GetRegistrationsForOrigin( | 462 void ServiceWorkerStorage::GetRegistrationsForOrigin( | 
| 463 const GURL& origin, const GetRegistrationsInfosCallback& callback) { | 463 const GURL& origin, | 
| 464 const GetRegistrationsCallback& callback) { | |
| 464 if (!LazyInitialize(base::Bind( | 465 if (!LazyInitialize(base::Bind( | 
| 465 &ServiceWorkerStorage::GetRegistrationsForOrigin, | 466 &ServiceWorkerStorage::GetRegistrationsForOrigin, | 
| 466 weak_factory_.GetWeakPtr(), origin, callback))) { | 467 weak_factory_.GetWeakPtr(), origin, callback))) { | 
| 467 if (state_ != INITIALIZING || !context_) { | 468 if (state_ != INITIALIZING || !context_) { | 
| 468 RunSoon(FROM_HERE, base::Bind( | 469 RunSoon(FROM_HERE, | 
| 469 callback, std::vector<ServiceWorkerRegistrationInfo>())); | 470 base::Bind(callback, std::vector<ServiceWorkerRegistration*>())); | 
| 470 } | 471 } | 
| 471 return; | 472 return; | 
| 472 } | 473 } | 
| 473 DCHECK_EQ(INITIALIZED, state_); | 474 DCHECK_EQ(INITIALIZED, state_); | 
| 474 | 475 | 
| 475 RegistrationList* registrations = new RegistrationList; | 476 RegistrationList* registrations = new RegistrationList; | 
| 477 std::vector<ResourceList>* resource_lists = new std::vector<ResourceList>; | |
| 476 PostTaskAndReplyWithResult( | 478 PostTaskAndReplyWithResult( | 
| 477 database_task_manager_->GetTaskRunner(), | 479 database_task_manager_->GetTaskRunner(), FROM_HERE, | 
| 478 FROM_HERE, | |
| 479 base::Bind(&ServiceWorkerDatabase::GetRegistrationsForOrigin, | 480 base::Bind(&ServiceWorkerDatabase::GetRegistrationsForOrigin, | 
| 480 base::Unretained(database_.get()), | 481 base::Unretained(database_.get()), origin, | 
| 481 origin, | 482 base::Unretained(registrations), | 
| 482 base::Unretained(registrations)), | 483 base::Unretained(resource_lists)), | 
| 483 base::Bind(&ServiceWorkerStorage::DidGetRegistrations, | 484 base::Bind(&ServiceWorkerStorage::DidGetRegistrations, | 
| 484 weak_factory_.GetWeakPtr(), | 485 weak_factory_.GetWeakPtr(), callback, | 
| 485 callback, | 486 base::Owned(registrations), base::Owned(resource_lists), | 
| 486 base::Owned(registrations), | |
| 487 origin)); | 487 origin)); | 
| 488 } | 488 } | 
| 489 | 489 | 
| 490 void ServiceWorkerStorage::GetAllRegistrations( | 490 void ServiceWorkerStorage::GetAllRegistrationsInfos( | 
| 491 const GetRegistrationsInfosCallback& callback) { | 491 const GetRegistrationsInfosCallback& callback) { | 
| 492 if (!LazyInitialize(base::Bind( | 492 if (!LazyInitialize( | 
| 493 &ServiceWorkerStorage::GetAllRegistrations, | 493 base::Bind(&ServiceWorkerStorage::GetAllRegistrationsInfos, | 
| 494 weak_factory_.GetWeakPtr(), callback))) { | 494 weak_factory_.GetWeakPtr(), callback))) { | 
| 495 if (state_ != INITIALIZING || !context_) { | 495 if (state_ != INITIALIZING || !context_) { | 
| 496 RunSoon(FROM_HERE, base::Bind( | 496 RunSoon(FROM_HERE, base::Bind( | 
| 497 callback, std::vector<ServiceWorkerRegistrationInfo>())); | 497 callback, std::vector<ServiceWorkerRegistrationInfo>())); | 
| 498 } | 498 } | 
| 499 return; | 499 return; | 
| 500 } | 500 } | 
| 501 DCHECK_EQ(INITIALIZED, state_); | 501 DCHECK_EQ(INITIALIZED, state_); | 
| 502 | 502 | 
| 503 RegistrationList* registrations = new RegistrationList; | 503 RegistrationList* registrations = new RegistrationList; | 
| 504 PostTaskAndReplyWithResult( | 504 PostTaskAndReplyWithResult( | 
| 505 database_task_manager_->GetTaskRunner(), | 505 database_task_manager_->GetTaskRunner(), FROM_HERE, | 
| 506 FROM_HERE, | |
| 507 base::Bind(&ServiceWorkerDatabase::GetAllRegistrations, | 506 base::Bind(&ServiceWorkerDatabase::GetAllRegistrations, | 
| 508 base::Unretained(database_.get()), | 507 base::Unretained(database_.get()), | 
| 509 base::Unretained(registrations)), | 508 base::Unretained(registrations)), | 
| 510 base::Bind(&ServiceWorkerStorage::DidGetRegistrations, | 509 base::Bind(&ServiceWorkerStorage::DidGetRegistrationsInfos, | 
| 511 weak_factory_.GetWeakPtr(), | 510 weak_factory_.GetWeakPtr(), callback, | 
| 512 callback, | 511 base::Owned(registrations), GURL())); | 
| 513 base::Owned(registrations), | |
| 514 GURL())); | |
| 515 } | 512 } | 
| 516 | 513 | 
| 517 void ServiceWorkerStorage::StoreRegistration( | 514 void ServiceWorkerStorage::StoreRegistration( | 
| 518 ServiceWorkerRegistration* registration, | 515 ServiceWorkerRegistration* registration, | 
| 519 ServiceWorkerVersion* version, | 516 ServiceWorkerVersion* version, | 
| 520 const StatusCallback& callback) { | 517 const StatusCallback& callback) { | 
| 521 DCHECK(registration); | 518 DCHECK(registration); | 
| 522 DCHECK(version); | 519 DCHECK(version); | 
| 523 | 520 | 
| 524 DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; | 521 DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; | 
| (...skipping 568 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1093 void ServiceWorkerStorage::ReturnFoundRegistration( | 1090 void ServiceWorkerStorage::ReturnFoundRegistration( | 
| 1094 const FindRegistrationCallback& callback, | 1091 const FindRegistrationCallback& callback, | 
| 1095 const ServiceWorkerDatabase::RegistrationData& data, | 1092 const ServiceWorkerDatabase::RegistrationData& data, | 
| 1096 const ResourceList& resources) { | 1093 const ResourceList& resources) { | 
| 1097 scoped_refptr<ServiceWorkerRegistration> registration = | 1094 scoped_refptr<ServiceWorkerRegistration> registration = | 
| 1098 GetOrCreateRegistration(data, resources); | 1095 GetOrCreateRegistration(data, resources); | 
| 1099 CompleteFindNow(registration, SERVICE_WORKER_OK, callback); | 1096 CompleteFindNow(registration, SERVICE_WORKER_OK, callback); | 
| 1100 } | 1097 } | 
| 1101 | 1098 | 
| 1102 void ServiceWorkerStorage::DidGetRegistrations( | 1099 void ServiceWorkerStorage::DidGetRegistrations( | 
| 1100 const GetRegistrationsCallback& callback, | |
| 1101 RegistrationList* registration_data, | |
| 1102 std::vector<ResourceList>* resource_lists, | |
| 1103 const GURL& origin_filter, | |
| 1104 ServiceWorkerDatabase::Status status) { | |
| 1105 DCHECK(registration_data); | |
| 1106 DCHECK(resource_lists); | |
| 1107 | |
| 1108 if (status != ServiceWorkerDatabase::STATUS_OK && | |
| 1109 status != ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) { | |
| 1110 ScheduleDeleteAndStartOver(); | |
| 1111 callback.Run(std::vector<ServiceWorkerRegistration*>()); | |
| 1112 return; | |
| 1113 } | |
| 1114 | |
| 1115 // Add all stored registrations. | |
| 1116 std::set<int64> registration_ids; | |
| 1117 std::vector<ServiceWorkerRegistration*> registrations; | |
| 
michaeln
2015/06/05 21:50:41
This needs to be a vector of scoped_refptrs, other
 
jungkees
2015/06/06 13:55:12
I had to be more careful about this indeed. Addres
 | |
| 1118 size_t index = 0; | |
| 1119 for (auto it = (*registration_data).begin(); it != (*registration_data).end(); | |
| 
michaeln
2015/06/05 21:50:42
This loop probably could be easier to read and mat
 
jungkees
2015/06/06 13:55:12
Neat! Addressed. Thanks.
 | |
| 1120 ++it, ++index) { | |
| 1121 const bool inserted = registration_ids.insert((*it).registration_id).second; | |
| 1122 DCHECK(inserted); | |
| 1123 | |
| 1124 scoped_refptr<ServiceWorkerRegistration> registration = | |
| 1125 GetOrCreateRegistration(*it, (*resource_lists)[index]); | |
| 1126 if (registration.get()) { | |
| 
michaeln
2015/06/05 21:50:42
no need for the null check, it's either gotten or
 
jungkees
2015/06/06 13:55:12
Right. This condition has been removed by replacin
 | |
| 1127 registrations.push_back(registration.get()); | |
| 1128 } | |
| 1129 } | |
| 1130 | |
| 1131 // Add unstored registrations that are being installed. | |
| 1132 for (RegistrationRefsById::const_iterator it = | |
| 1133 installing_registrations_.begin(); | |
| 1134 it != installing_registrations_.end(); ++it) { | |
| 1135 if ((!origin_filter.is_valid() || | |
| 1136 it->second->pattern().GetOrigin() == origin_filter) && | |
| 1137 registration_ids.insert(it->first).second) { | |
| 1138 registrations.push_back((it->second).get()); | |
| 1139 } | |
| 1140 } | |
| 1141 | |
| 1142 callback.Run(registrations); | |
| 1143 } | |
| 1144 | |
| 1145 void ServiceWorkerStorage::DidGetRegistrationsInfos( | |
| 1103 const GetRegistrationsInfosCallback& callback, | 1146 const GetRegistrationsInfosCallback& callback, | 
| 1104 RegistrationList* registrations, | 1147 RegistrationList* registrations, | 
| 1105 const GURL& origin_filter, | 1148 const GURL& origin_filter, | 
| 1106 ServiceWorkerDatabase::Status status) { | 1149 ServiceWorkerDatabase::Status status) { | 
| 1107 DCHECK(registrations); | 1150 DCHECK(registrations); | 
| 1108 if (status != ServiceWorkerDatabase::STATUS_OK && | 1151 if (status != ServiceWorkerDatabase::STATUS_OK && | 
| 1109 status != ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) { | 1152 status != ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) { | 
| 1110 ScheduleDeleteAndStartOver(); | 1153 ScheduleDeleteAndStartOver(); | 
| 1111 callback.Run(std::vector<ServiceWorkerRegistrationInfo>()); | 1154 callback.Run(std::vector<ServiceWorkerRegistrationInfo>()); | 
| 1112 return; | 1155 return; | 
| (...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1563 if (status != ServiceWorkerDatabase::STATUS_OK) { | 1606 if (status != ServiceWorkerDatabase::STATUS_OK) { | 
| 1564 original_task_runner->PostTask( | 1607 original_task_runner->PostTask( | 
| 1565 FROM_HERE, | 1608 FROM_HERE, | 
| 1566 base::Bind( | 1609 base::Bind( | 
| 1567 callback, false, deleted_version, std::vector<int64>(), status)); | 1610 callback, false, deleted_version, std::vector<int64>(), status)); | 
| 1568 return; | 1611 return; | 
| 1569 } | 1612 } | 
| 1570 | 1613 | 
| 1571 // TODO(nhiroki): Add convenient method to ServiceWorkerDatabase to check the | 1614 // TODO(nhiroki): Add convenient method to ServiceWorkerDatabase to check the | 
| 1572 // unique origin list. | 1615 // unique origin list. | 
| 1573 std::vector<ServiceWorkerDatabase::RegistrationData> registrations; | 1616 RegistrationList registrations; | 
| 1574 status = database->GetRegistrationsForOrigin(origin, ®istrations); | 1617 status = database->GetRegistrationsForOrigin(origin, ®istrations, nullptr); | 
| 1575 if (status != ServiceWorkerDatabase::STATUS_OK) { | 1618 if (status != ServiceWorkerDatabase::STATUS_OK) { | 
| 1576 original_task_runner->PostTask( | 1619 original_task_runner->PostTask( | 
| 1577 FROM_HERE, | 1620 FROM_HERE, | 
| 1578 base::Bind( | 1621 base::Bind( | 
| 1579 callback, false, deleted_version, std::vector<int64>(), status)); | 1622 callback, false, deleted_version, std::vector<int64>(), status)); | 
| 1580 return; | 1623 return; | 
| 1581 } | 1624 } | 
| 1582 | 1625 | 
| 1583 bool deletable = registrations.empty(); | 1626 bool deletable = registrations.empty(); | 
| 1584 original_task_runner->PostTask(FROM_HERE, | 1627 original_task_runner->PostTask(FROM_HERE, | 
| (...skipping 24 matching lines...) Expand all Loading... | |
| 1609 } | 1652 } | 
| 1610 | 1653 | 
| 1611 void ServiceWorkerStorage::FindForDocumentInDB( | 1654 void ServiceWorkerStorage::FindForDocumentInDB( | 
| 1612 ServiceWorkerDatabase* database, | 1655 ServiceWorkerDatabase* database, | 
| 1613 scoped_refptr<base::SequencedTaskRunner> original_task_runner, | 1656 scoped_refptr<base::SequencedTaskRunner> original_task_runner, | 
| 1614 const GURL& document_url, | 1657 const GURL& document_url, | 
| 1615 const FindInDBCallback& callback) { | 1658 const FindInDBCallback& callback) { | 
| 1616 GURL origin = document_url.GetOrigin(); | 1659 GURL origin = document_url.GetOrigin(); | 
| 1617 RegistrationList registrations; | 1660 RegistrationList registrations; | 
| 1618 ServiceWorkerDatabase::Status status = | 1661 ServiceWorkerDatabase::Status status = | 
| 1619 database->GetRegistrationsForOrigin(origin, ®istrations); | 1662 database->GetRegistrationsForOrigin(origin, ®istrations, nullptr); | 
| 1620 if (status != ServiceWorkerDatabase::STATUS_OK) { | 1663 if (status != ServiceWorkerDatabase::STATUS_OK) { | 
| 1621 original_task_runner->PostTask( | 1664 original_task_runner->PostTask( | 
| 1622 FROM_HERE, | 1665 FROM_HERE, | 
| 1623 base::Bind(callback, | 1666 base::Bind(callback, | 
| 1624 ServiceWorkerDatabase::RegistrationData(), | 1667 ServiceWorkerDatabase::RegistrationData(), | 
| 1625 ResourceList(), | 1668 ResourceList(), | 
| 1626 status)); | 1669 status)); | 
| 1627 return; | 1670 return; | 
| 1628 } | 1671 } | 
| 1629 | 1672 | 
| (...skipping 16 matching lines...) Expand all Loading... | |
| 1646 FROM_HERE, | 1689 FROM_HERE, | 
| 1647 base::Bind(callback, data, resources, status)); | 1690 base::Bind(callback, data, resources, status)); | 
| 1648 } | 1691 } | 
| 1649 | 1692 | 
| 1650 void ServiceWorkerStorage::FindForPatternInDB( | 1693 void ServiceWorkerStorage::FindForPatternInDB( | 
| 1651 ServiceWorkerDatabase* database, | 1694 ServiceWorkerDatabase* database, | 
| 1652 scoped_refptr<base::SequencedTaskRunner> original_task_runner, | 1695 scoped_refptr<base::SequencedTaskRunner> original_task_runner, | 
| 1653 const GURL& scope, | 1696 const GURL& scope, | 
| 1654 const FindInDBCallback& callback) { | 1697 const FindInDBCallback& callback) { | 
| 1655 GURL origin = scope.GetOrigin(); | 1698 GURL origin = scope.GetOrigin(); | 
| 1656 std::vector<ServiceWorkerDatabase::RegistrationData> registrations; | 1699 RegistrationList registrations; | 
| 1657 ServiceWorkerDatabase::Status status = | 1700 ServiceWorkerDatabase::Status status = | 
| 1658 database->GetRegistrationsForOrigin(origin, ®istrations); | 1701 database->GetRegistrationsForOrigin(origin, ®istrations, nullptr); | 
| 1659 if (status != ServiceWorkerDatabase::STATUS_OK) { | 1702 if (status != ServiceWorkerDatabase::STATUS_OK) { | 
| 1660 original_task_runner->PostTask( | 1703 original_task_runner->PostTask( | 
| 1661 FROM_HERE, | 1704 FROM_HERE, | 
| 1662 base::Bind(callback, | 1705 base::Bind(callback, | 
| 1663 ServiceWorkerDatabase::RegistrationData(), | 1706 ServiceWorkerDatabase::RegistrationData(), | 
| 1664 ResourceList(), | 1707 ResourceList(), | 
| 1665 status)); | 1708 status)); | 
| 1666 return; | 1709 return; | 
| 1667 } | 1710 } | 
| 1668 | 1711 | 
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1807 callback.Run(SERVICE_WORKER_ERROR_FAILED); | 1850 callback.Run(SERVICE_WORKER_ERROR_FAILED); | 
| 1808 return; | 1851 return; | 
| 1809 } | 1852 } | 
| 1810 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; | 1853 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; | 
| 1811 ServiceWorkerMetrics::RecordDeleteAndStartOverResult( | 1854 ServiceWorkerMetrics::RecordDeleteAndStartOverResult( | 
| 1812 ServiceWorkerMetrics::DELETE_OK); | 1855 ServiceWorkerMetrics::DELETE_OK); | 
| 1813 callback.Run(SERVICE_WORKER_OK); | 1856 callback.Run(SERVICE_WORKER_OK); | 
| 1814 } | 1857 } | 
| 1815 | 1858 | 
| 1816 } // namespace content | 1859 } // namespace content | 
| OLD | NEW |