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

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

Issue 284123003: ServiceWorker: DB functions should return status code instead of boolean (3) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix Created 6 years, 7 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 | Annotate | Revision Log
« no previous file with comments | « content/browser/service_worker/service_worker_storage.h ('k') | 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 <string> 7 #include <string>
8 8
9 #include "base/bind_helpers.h" 9 #include "base/bind_helpers.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 original_task_runner->PostTask( 93 original_task_runner->PostTask(
94 FROM_HERE, base::Bind(callback, base::Owned(data.release()), status)); 94 FROM_HERE, base::Bind(callback, base::Owned(data.release()), status));
95 return; 95 return;
96 } 96 }
97 97
98 status = database->GetOriginsWithRegistrations(&data->origins); 98 status = database->GetOriginsWithRegistrations(&data->origins);
99 original_task_runner->PostTask( 99 original_task_runner->PostTask(
100 FROM_HERE, base::Bind(callback, base::Owned(data.release()), status)); 100 FROM_HERE, base::Bind(callback, base::Owned(data.release()), status));
101 } 101 }
102 102
103 void ReadRegistrationFromDB(
104 ServiceWorkerDatabase* database,
105 scoped_refptr<base::SequencedTaskRunner> original_task_runner,
106 int64 registration_id,
107 const GURL& origin,
108 const ReadRegistrationCallback& callback) {
109 DCHECK(database);
110 ServiceWorkerDatabase::RegistrationData data;
111 std::vector<ServiceWorkerDatabase::ResourceRecord> resources;
112
113 // TODO(nhiroki): The database should return more detailed status like
114 // ServiceWorkerStatusCode instead of bool value.
115 ServiceWorkerDatabase::Status status = ServiceWorkerDatabase::STATUS_OK;
116 if (!database->ReadRegistration(registration_id, origin, &data, &resources)) {
117 status = database->is_disabled()
118 ? ServiceWorkerDatabase::STATUS_ERROR_FAILED
119 : ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND;
120 }
121 original_task_runner->PostTask(
122 FROM_HERE, base::Bind(callback, data, resources, status));
123 }
124
125 void DeleteRegistrationFromDB( 103 void DeleteRegistrationFromDB(
126 ServiceWorkerDatabase* database, 104 ServiceWorkerDatabase* database,
127 scoped_refptr<base::SequencedTaskRunner> original_task_runner, 105 scoped_refptr<base::SequencedTaskRunner> original_task_runner,
128 int64 registration_id, 106 int64 registration_id,
129 const GURL& origin, 107 const GURL& origin,
130 const DeleteRegistrationCallback& callback) { 108 const DeleteRegistrationCallback& callback) {
131 DCHECK(database); 109 DCHECK(database);
132 if (!database->DeleteRegistration(registration_id, origin)) { 110 ServiceWorkerDatabase::Status status =
111 database->DeleteRegistration(registration_id, origin);
112 if (status != ServiceWorkerDatabase::STATUS_OK) {
133 original_task_runner->PostTask( 113 original_task_runner->PostTask(
134 FROM_HERE, base::Bind(callback, false, 114 FROM_HERE, base::Bind(callback, false, status));
135 ServiceWorkerDatabase::STATUS_ERROR_FAILED));
136 return; 115 return;
137 } 116 }
138 117
139 // TODO(nhiroki): Add convenient method to ServiceWorkerDatabase to check the 118 // TODO(nhiroki): Add convenient method to ServiceWorkerDatabase to check the
140 // unique origin list. 119 // unique origin list.
141 std::vector<ServiceWorkerDatabase::RegistrationData> registrations; 120 std::vector<ServiceWorkerDatabase::RegistrationData> registrations;
142 ServiceWorkerDatabase::Status status = 121 status = database->GetRegistrationsForOrigin(origin, &registrations);
143 database->GetRegistrationsForOrigin(origin, &registrations);
144 if (status != ServiceWorkerDatabase::STATUS_OK) { 122 if (status != ServiceWorkerDatabase::STATUS_OK) {
145 original_task_runner->PostTask( 123 original_task_runner->PostTask(
146 FROM_HERE, base::Bind(callback, false, status)); 124 FROM_HERE, base::Bind(callback, false, status));
147 return; 125 return;
148 } 126 }
149 127
150 bool deletable = registrations.empty(); 128 bool deletable = registrations.empty();
151 original_task_runner->PostTask( 129 original_task_runner->PostTask(
152 FROM_HERE, base::Bind(callback, deletable, 130 FROM_HERE, base::Bind(callback, deletable, status));
153 ServiceWorkerDatabase::STATUS_OK));
154 }
155
156 void UpdateToActiveStateInDB(
157 ServiceWorkerDatabase* database,
158 scoped_refptr<base::SequencedTaskRunner> original_task_runner,
159 int64 registration_id,
160 const GURL& origin,
161 const ServiceWorkerStorage::StatusCallback& callback) {
162 DCHECK(database);
163
164 // TODO(nhiroki): The database should return more detailed status like
165 // ServiceWorkerStatusCode instead of bool value.
166 ServiceWorkerStatusCode status = SERVICE_WORKER_OK;
167 if (!database->UpdateVersionToActive(registration_id, origin)) {
168 status = database->is_disabled() ? SERVICE_WORKER_ERROR_FAILED
169 : SERVICE_WORKER_ERROR_NOT_FOUND;
170 }
171 original_task_runner->PostTask(FROM_HERE, base::Bind(callback, status));
172 } 131 }
173 132
174 } // namespace 133 } // namespace
175 134
176 ServiceWorkerStorage::InitialData::InitialData() 135 ServiceWorkerStorage::InitialData::InitialData()
177 : next_registration_id(kInvalidServiceWorkerRegistrationId), 136 : next_registration_id(kInvalidServiceWorkerRegistrationId),
178 next_version_id(kInvalidServiceWorkerVersionId), 137 next_version_id(kInvalidServiceWorkerVersionId),
179 next_resource_id(kInvalidServiceWorkerResourceId) { 138 next_resource_id(kInvalidServiceWorkerResourceId) {
180 } 139 }
181 140
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 return; 279 return;
321 } 280 }
322 281
323 scoped_refptr<ServiceWorkerRegistration> registration = 282 scoped_refptr<ServiceWorkerRegistration> registration =
324 context_->GetLiveRegistration(registration_id); 283 context_->GetLiveRegistration(registration_id);
325 if (registration) { 284 if (registration) {
326 CompleteFindNow(registration, SERVICE_WORKER_OK, callback); 285 CompleteFindNow(registration, SERVICE_WORKER_OK, callback);
327 return; 286 return;
328 } 287 }
329 288
330 database_task_runner_->PostTask( 289 ServiceWorkerDatabase::RegistrationData* data =
290 new ServiceWorkerDatabase::RegistrationData;
291 ResourceList* resources = new ResourceList;
292 PostTaskAndReplyWithResult(
293 database_task_runner_,
331 FROM_HERE, 294 FROM_HERE,
332 base::Bind(&ReadRegistrationFromDB, 295 base::Bind(&ServiceWorkerDatabase::ReadRegistration,
333 database_.get(), 296 base::Unretained(database_.get()),
334 base::MessageLoopProxy::current(),
335 registration_id, origin, 297 registration_id, origin,
336 base::Bind(&ServiceWorkerStorage::DidReadRegistrationForId, 298 base::Unretained(data),
337 weak_factory_.GetWeakPtr(), callback))); 299 base::Unretained(resources)),
300 base::Bind(&ServiceWorkerStorage::DidReadRegistrationForId,
301 weak_factory_.GetWeakPtr(),
302 callback, base::Owned(data), base::Owned(resources)));
338 } 303 }
339 304
340 void ServiceWorkerStorage::GetAllRegistrations( 305 void ServiceWorkerStorage::GetAllRegistrations(
341 const GetAllRegistrationInfosCallback& callback) { 306 const GetAllRegistrationInfosCallback& callback) {
342 if (!LazyInitialize(base::Bind( 307 if (!LazyInitialize(base::Bind(
343 &ServiceWorkerStorage::GetAllRegistrations, 308 &ServiceWorkerStorage::GetAllRegistrations,
344 weak_factory_.GetWeakPtr(), callback))) { 309 weak_factory_.GetWeakPtr(), callback))) {
345 if (state_ != INITIALIZING || !context_) { 310 if (state_ != INITIALIZING || !context_) {
346 RunSoon(FROM_HERE, base::Bind( 311 RunSoon(FROM_HERE, base::Bind(
347 callback, std::vector<ServiceWorkerRegistrationInfo>())); 312 callback, std::vector<ServiceWorkerRegistrationInfo>()));
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
401 ServiceWorkerRegistration* registration, 366 ServiceWorkerRegistration* registration,
402 const StatusCallback& callback) { 367 const StatusCallback& callback) {
403 DCHECK(registration); 368 DCHECK(registration);
404 369
405 DCHECK(state_ == INITIALIZED || state_ == DISABLED); 370 DCHECK(state_ == INITIALIZED || state_ == DISABLED);
406 if (state_ != INITIALIZED || !context_) { 371 if (state_ != INITIALIZED || !context_) {
407 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); 372 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED));
408 return; 373 return;
409 } 374 }
410 375
411 database_task_runner_->PostTask( 376 PostTaskAndReplyWithResult(
377 database_task_runner_,
412 FROM_HERE, 378 FROM_HERE,
413 base::Bind(&UpdateToActiveStateInDB, 379 base::Bind(&ServiceWorkerDatabase::UpdateVersionToActive,
414 database_.get(), 380 base::Unretained(database_.get()),
415 base::MessageLoopProxy::current(),
416 registration->id(), 381 registration->id(),
417 registration->script_url().GetOrigin(), 382 registration->script_url().GetOrigin()),
383 base::Bind(&ServiceWorkerStorage::DidUpdateToActiveState,
384 weak_factory_.GetWeakPtr(),
418 callback)); 385 callback));
419 } 386 }
420 387
421 void ServiceWorkerStorage::DeleteRegistration( 388 void ServiceWorkerStorage::DeleteRegistration(
422 int64 registration_id, 389 int64 registration_id,
423 const GURL& origin, 390 const GURL& origin,
424 const StatusCallback& callback) { 391 const StatusCallback& callback) {
425 DCHECK(state_ == INITIALIZED || state_ == DISABLED); 392 DCHECK(state_ == INITIALIZED || state_ == DISABLED);
426 if (state_ != INITIALIZED || !context_) { 393 if (state_ != INITIALIZED || !context_) {
427 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); 394 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED));
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 callback.Run(SERVICE_WORKER_OK, installing_registration); 584 callback.Run(SERVICE_WORKER_OK, installing_registration);
618 return; 585 return;
619 } 586 }
620 587
621 callback.Run(SERVICE_WORKER_ERROR_NOT_FOUND, 588 callback.Run(SERVICE_WORKER_ERROR_NOT_FOUND,
622 scoped_refptr<ServiceWorkerRegistration>()); 589 scoped_refptr<ServiceWorkerRegistration>());
623 } 590 }
624 591
625 void ServiceWorkerStorage::DidReadRegistrationForId( 592 void ServiceWorkerStorage::DidReadRegistrationForId(
626 const FindRegistrationCallback& callback, 593 const FindRegistrationCallback& callback,
627 const ServiceWorkerDatabase::RegistrationData& registration, 594 ServiceWorkerDatabase::RegistrationData* registration,
628 const ResourceList& resources, 595 ResourceList* resources,
629 ServiceWorkerDatabase::Status status) { 596 ServiceWorkerDatabase::Status status) {
597 DCHECK(registration);
598 DCHECK(resources);
599
630 if (status == ServiceWorkerDatabase::STATUS_OK) { 600 if (status == ServiceWorkerDatabase::STATUS_OK) {
631 callback.Run(SERVICE_WORKER_OK, CreateRegistration(registration)); 601 callback.Run(SERVICE_WORKER_OK, CreateRegistration(*registration));
632 return; 602 return;
633 } 603 }
634 604
635 if (status == ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) { 605 if (status == ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) {
636 // Look for somthing currently being installed. 606 // Look for somthing currently being installed.
637 scoped_refptr<ServiceWorkerRegistration> installing_registration = 607 scoped_refptr<ServiceWorkerRegistration> installing_registration =
638 FindInstallingRegistrationForId(registration.registration_id); 608 FindInstallingRegistrationForId(registration->registration_id);
639 if (installing_registration) { 609 if (installing_registration) {
640 callback.Run(SERVICE_WORKER_OK, installing_registration); 610 callback.Run(SERVICE_WORKER_OK, installing_registration);
641 return; 611 return;
642 } 612 }
643 callback.Run(SERVICE_WORKER_ERROR_NOT_FOUND, 613 callback.Run(SERVICE_WORKER_ERROR_NOT_FOUND,
644 scoped_refptr<ServiceWorkerRegistration>()); 614 scoped_refptr<ServiceWorkerRegistration>());
645 return; 615 return;
646 } 616 }
647 617
618 // TODO(nhiroki): Handle database error (http://crbug.com/371675).
648 callback.Run(DatabaseStatusToStatusCode(status), 619 callback.Run(DatabaseStatusToStatusCode(status),
649 scoped_refptr<ServiceWorkerRegistration>()); 620 scoped_refptr<ServiceWorkerRegistration>());
650 return; 621 return;
651 } 622 }
652 623
653 void ServiceWorkerStorage::DidGetAllRegistrations( 624 void ServiceWorkerStorage::DidGetAllRegistrations(
654 const GetAllRegistrationInfosCallback& callback, 625 const GetAllRegistrationInfosCallback& callback,
655 RegistrationList* registrations, 626 RegistrationList* registrations,
656 ServiceWorkerDatabase::Status status) { 627 ServiceWorkerDatabase::Status status) {
657 DCHECK(registrations); 628 DCHECK(registrations);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
692 if (pushed_registrations.insert(it->first).second) 663 if (pushed_registrations.insert(it->first).second)
693 infos.push_back(it->second->GetInfo()); 664 infos.push_back(it->second->GetInfo());
694 } 665 }
695 666
696 callback.Run(infos); 667 callback.Run(infos);
697 } 668 }
698 669
699 void ServiceWorkerStorage::DidStoreRegistration( 670 void ServiceWorkerStorage::DidStoreRegistration(
700 const GURL& origin, 671 const GURL& origin,
701 const StatusCallback& callback, 672 const StatusCallback& callback,
702 bool success) { 673 ServiceWorkerDatabase::Status status) {
703 if (!success) { 674 if (status != ServiceWorkerDatabase::STATUS_OK) {
704 callback.Run(SERVICE_WORKER_ERROR_FAILED); 675 // TODO(nhiroki): Handle database error (http://crbug.com/371675).
676 callback.Run(DatabaseStatusToStatusCode(status));
705 return; 677 return;
706 } 678 }
707 registered_origins_.insert(origin); 679 registered_origins_.insert(origin);
708 callback.Run(SERVICE_WORKER_OK); 680 callback.Run(SERVICE_WORKER_OK);
709 } 681 }
710 682
683 void ServiceWorkerStorage::DidUpdateToActiveState(
684 const StatusCallback& callback,
685 ServiceWorkerDatabase::Status status) {
686 // TODO(nhiroki): Handle database error (http://crbug.com/371675).
687 callback.Run(DatabaseStatusToStatusCode(status));
688 }
689
711 void ServiceWorkerStorage::DidDeleteRegistration( 690 void ServiceWorkerStorage::DidDeleteRegistration(
712 const GURL& origin, 691 const GURL& origin,
713 const StatusCallback& callback, 692 const StatusCallback& callback,
714 bool origin_is_deletable, 693 bool origin_is_deletable,
715 ServiceWorkerDatabase::Status status) { 694 ServiceWorkerDatabase::Status status) {
695 if (status != ServiceWorkerDatabase::STATUS_OK) {
696 // TODO(nhiroki): Handle database error (http://crbug.com/371675).
697 callback.Run(DatabaseStatusToStatusCode(status));
698 return;
699 }
716 if (origin_is_deletable) 700 if (origin_is_deletable)
717 registered_origins_.erase(origin); 701 registered_origins_.erase(origin);
718 callback.Run(DatabaseStatusToStatusCode(status)); 702 callback.Run(SERVICE_WORKER_OK);
719 } 703 }
720 704
721 scoped_refptr<ServiceWorkerRegistration> 705 scoped_refptr<ServiceWorkerRegistration>
722 ServiceWorkerStorage::CreateRegistration( 706 ServiceWorkerStorage::CreateRegistration(
723 const ServiceWorkerDatabase::RegistrationData& data) { 707 const ServiceWorkerDatabase::RegistrationData& data) {
724 scoped_refptr<ServiceWorkerRegistration> registration( 708 scoped_refptr<ServiceWorkerRegistration> registration(
725 new ServiceWorkerRegistration( 709 new ServiceWorkerRegistration(
726 data.scope, data.script, data.registration_id, context_)); 710 data.scope, data.script, data.registration_id, context_));
727 711
728 scoped_refptr<ServiceWorkerVersion> version = 712 scoped_refptr<ServiceWorkerVersion> version =
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
791 // TODO(michaeln): Store data on disk and do error checking. 775 // TODO(michaeln): Store data on disk and do error checking.
792 disk_cache_.reset(new ServiceWorkerDiskCache); 776 disk_cache_.reset(new ServiceWorkerDiskCache);
793 int rv = disk_cache_->InitWithMemBackend( 777 int rv = disk_cache_->InitWithMemBackend(
794 kMaxMemDiskCacheSize, 778 kMaxMemDiskCacheSize,
795 base::Bind(&EmptyCompletionCallback)); 779 base::Bind(&EmptyCompletionCallback));
796 DCHECK_EQ(net::OK, rv); 780 DCHECK_EQ(net::OK, rv);
797 return disk_cache_.get(); 781 return disk_cache_.get();
798 } 782 }
799 783
800 } // namespace content 784 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/service_worker/service_worker_storage.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698