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

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

Issue 1146913004: Service Worker: Add ServiceWorkerContainer.getRegistrations() method. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Make GetRegistrationsForOrigin() handle nullptr for resource param. 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
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 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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, &registrations); 1617 status = database->GetRegistrationsForOrigin(origin, &registrations, 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
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, &registrations); 1662 database->GetRegistrationsForOrigin(origin, &registrations, 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
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, &registrations); 1701 database->GetRegistrationsForOrigin(origin, &registrations, 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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698