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

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: Refactor GetRegistrationsForOrigin to get real registrations. 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 ResourceListList* resource_lists = new ResourceListList;
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* registrations,
1102 ResourceListList* resource_lists,
1103 const GURL& origin_filter,
1104 ServiceWorkerDatabase::Status status) {
1105 DCHECK(registrations);
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> pushed_registrations;
1117 std::vector<ServiceWorkerRegistration*> regs;
falken 2015/06/05 02:58:22 I think some naming tweaks are in order here, it's
jungkees 2015/06/05 06:58:07 The proposed names look clear. Just renamed them a
1118 size_t index = 0;
1119 for (auto it = (*registrations).begin(); it != (*registrations).end();
1120 ++it, ++index) {
1121 const bool inserted =
1122 pushed_registrations.insert((*it).registration_id).second;
1123 DCHECK(inserted);
1124
1125 scoped_refptr<ServiceWorkerRegistration> registration =
1126 GetOrCreateRegistration(*it, (*resource_lists)[index]);
1127 if (registration.get()) {
1128 regs.push_back(registration.get());
1129 }
1130 }
1131
1132 // Add unstored registrations that are being installed.
1133 for (RegistrationRefsById::const_iterator it =
1134 installing_registrations_.begin();
1135 it != installing_registrations_.end(); ++it) {
1136 if ((!origin_filter.is_valid() ||
1137 it->second->pattern().GetOrigin() == origin_filter) &&
1138 pushed_registrations.insert(it->first).second) {
1139 regs.push_back((it->second).get());
1140 }
1141 }
1142
1143 callback.Run(regs);
1144 }
1145
1146 void ServiceWorkerStorage::DidGetRegistrationsInfos(
1103 const GetRegistrationsInfosCallback& callback, 1147 const GetRegistrationsInfosCallback& callback,
1104 RegistrationList* registrations, 1148 RegistrationList* registrations,
1105 const GURL& origin_filter, 1149 const GURL& origin_filter,
1106 ServiceWorkerDatabase::Status status) { 1150 ServiceWorkerDatabase::Status status) {
1107 DCHECK(registrations); 1151 DCHECK(registrations);
1108 if (status != ServiceWorkerDatabase::STATUS_OK && 1152 if (status != ServiceWorkerDatabase::STATUS_OK &&
1109 status != ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) { 1153 status != ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) {
1110 ScheduleDeleteAndStartOver(); 1154 ScheduleDeleteAndStartOver();
1111 callback.Run(std::vector<ServiceWorkerRegistrationInfo>()); 1155 callback.Run(std::vector<ServiceWorkerRegistrationInfo>());
1112 return; 1156 return;
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after
1563 if (status != ServiceWorkerDatabase::STATUS_OK) { 1607 if (status != ServiceWorkerDatabase::STATUS_OK) {
1564 original_task_runner->PostTask( 1608 original_task_runner->PostTask(
1565 FROM_HERE, 1609 FROM_HERE,
1566 base::Bind( 1610 base::Bind(
1567 callback, false, deleted_version, std::vector<int64>(), status)); 1611 callback, false, deleted_version, std::vector<int64>(), status));
1568 return; 1612 return;
1569 } 1613 }
1570 1614
1571 // TODO(nhiroki): Add convenient method to ServiceWorkerDatabase to check the 1615 // TODO(nhiroki): Add convenient method to ServiceWorkerDatabase to check the
1572 // unique origin list. 1616 // unique origin list.
1573 std::vector<ServiceWorkerDatabase::RegistrationData> registrations; 1617 RegistrationList registrations;
1574 status = database->GetRegistrationsForOrigin(origin, &registrations); 1618 std::vector<ResourceList> resource_lists;
1619 status = database->GetRegistrationsForOrigin(origin, &registrations,
1620 &resource_lists);
falken 2015/06/05 02:58:22 if resource_lists is not used, does it make sense
jungkees 2015/06/05 06:58:06 Yes, that's a better way. I'd mulled it over when
1575 if (status != ServiceWorkerDatabase::STATUS_OK) { 1621 if (status != ServiceWorkerDatabase::STATUS_OK) {
1576 original_task_runner->PostTask( 1622 original_task_runner->PostTask(
1577 FROM_HERE, 1623 FROM_HERE,
1578 base::Bind( 1624 base::Bind(
1579 callback, false, deleted_version, std::vector<int64>(), status)); 1625 callback, false, deleted_version, std::vector<int64>(), status));
1580 return; 1626 return;
1581 } 1627 }
1582 1628
1583 bool deletable = registrations.empty(); 1629 bool deletable = registrations.empty();
1584 original_task_runner->PostTask(FROM_HERE, 1630 original_task_runner->PostTask(FROM_HERE,
(...skipping 23 matching lines...) Expand all
1608 status)); 1654 status));
1609 } 1655 }
1610 1656
1611 void ServiceWorkerStorage::FindForDocumentInDB( 1657 void ServiceWorkerStorage::FindForDocumentInDB(
1612 ServiceWorkerDatabase* database, 1658 ServiceWorkerDatabase* database,
1613 scoped_refptr<base::SequencedTaskRunner> original_task_runner, 1659 scoped_refptr<base::SequencedTaskRunner> original_task_runner,
1614 const GURL& document_url, 1660 const GURL& document_url,
1615 const FindInDBCallback& callback) { 1661 const FindInDBCallback& callback) {
1616 GURL origin = document_url.GetOrigin(); 1662 GURL origin = document_url.GetOrigin();
1617 RegistrationList registrations; 1663 RegistrationList registrations;
1618 ServiceWorkerDatabase::Status status = 1664 std::vector<ResourceList> resource_lists;
1619 database->GetRegistrationsForOrigin(origin, &registrations); 1665 ServiceWorkerDatabase::Status status = database->GetRegistrationsForOrigin(
1666 origin, &registrations, &resource_lists);
1620 if (status != ServiceWorkerDatabase::STATUS_OK) { 1667 if (status != ServiceWorkerDatabase::STATUS_OK) {
1621 original_task_runner->PostTask( 1668 original_task_runner->PostTask(
1622 FROM_HERE, 1669 FROM_HERE,
1623 base::Bind(callback, 1670 base::Bind(callback,
1624 ServiceWorkerDatabase::RegistrationData(), 1671 ServiceWorkerDatabase::RegistrationData(),
1625 ResourceList(), 1672 ResourceList(),
1626 status)); 1673 status));
1627 return; 1674 return;
1628 } 1675 }
1629 1676
(...skipping 16 matching lines...) Expand all
1646 FROM_HERE, 1693 FROM_HERE,
1647 base::Bind(callback, data, resources, status)); 1694 base::Bind(callback, data, resources, status));
1648 } 1695 }
1649 1696
1650 void ServiceWorkerStorage::FindForPatternInDB( 1697 void ServiceWorkerStorage::FindForPatternInDB(
1651 ServiceWorkerDatabase* database, 1698 ServiceWorkerDatabase* database,
1652 scoped_refptr<base::SequencedTaskRunner> original_task_runner, 1699 scoped_refptr<base::SequencedTaskRunner> original_task_runner,
1653 const GURL& scope, 1700 const GURL& scope,
1654 const FindInDBCallback& callback) { 1701 const FindInDBCallback& callback) {
1655 GURL origin = scope.GetOrigin(); 1702 GURL origin = scope.GetOrigin();
1656 std::vector<ServiceWorkerDatabase::RegistrationData> registrations; 1703 RegistrationList registrations;
1657 ServiceWorkerDatabase::Status status = 1704 std::vector<ResourceList> resource_lists;
1658 database->GetRegistrationsForOrigin(origin, &registrations); 1705 ServiceWorkerDatabase::Status status = database->GetRegistrationsForOrigin(
1706 origin, &registrations, &resource_lists);
falken 2015/06/05 02:58:22 same with all these
1659 if (status != ServiceWorkerDatabase::STATUS_OK) { 1707 if (status != ServiceWorkerDatabase::STATUS_OK) {
1660 original_task_runner->PostTask( 1708 original_task_runner->PostTask(
1661 FROM_HERE, 1709 FROM_HERE,
1662 base::Bind(callback, 1710 base::Bind(callback,
1663 ServiceWorkerDatabase::RegistrationData(), 1711 ServiceWorkerDatabase::RegistrationData(),
1664 ResourceList(), 1712 ResourceList(),
1665 status)); 1713 status));
1666 return; 1714 return;
1667 } 1715 }
1668 1716
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
1807 callback.Run(SERVICE_WORKER_ERROR_FAILED); 1855 callback.Run(SERVICE_WORKER_ERROR_FAILED);
1808 return; 1856 return;
1809 } 1857 }
1810 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; 1858 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully.";
1811 ServiceWorkerMetrics::RecordDeleteAndStartOverResult( 1859 ServiceWorkerMetrics::RecordDeleteAndStartOverResult(
1812 ServiceWorkerMetrics::DELETE_OK); 1860 ServiceWorkerMetrics::DELETE_OK);
1813 callback.Run(SERVICE_WORKER_OK); 1861 callback.Run(SERVICE_WORKER_OK);
1814 } 1862 }
1815 1863
1816 } // namespace content 1864 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698