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

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: 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
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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 original_task_runner->PostTask( 81 original_task_runner->PostTask(
82 FROM_HERE, base::Bind(callback, base::Owned(data.release()), status)); 82 FROM_HERE, base::Bind(callback, base::Owned(data.release()), status));
83 return; 83 return;
84 } 84 }
85 85
86 status = database->GetOriginsWithRegistrations(&data->origins); 86 status = database->GetOriginsWithRegistrations(&data->origins);
87 original_task_runner->PostTask( 87 original_task_runner->PostTask(
88 FROM_HERE, base::Bind(callback, base::Owned(data.release()), status)); 88 FROM_HERE, base::Bind(callback, base::Owned(data.release()), status));
89 } 89 }
90 90
91 void ReadRegistrationFromDB(
92 ServiceWorkerDatabase* database,
93 scoped_refptr<base::SequencedTaskRunner> original_task_runner,
94 int64 registration_id,
95 const GURL& origin,
96 const ReadRegistrationCallback& callback) {
97 DCHECK(database);
98 ServiceWorkerDatabase::RegistrationData data;
99 std::vector<ServiceWorkerDatabase::ResourceRecord> resources;
100
101 // TODO(nhiroki): The database should return more detailed status like
102 // ServiceWorkerStatusCode instead of bool value.
103 ServiceWorkerStatusCode status = SERVICE_WORKER_OK;
104 if (!database->ReadRegistration(registration_id, origin, &data, &resources)) {
105 status = database->is_disabled() ? SERVICE_WORKER_ERROR_FAILED
106 : SERVICE_WORKER_ERROR_NOT_FOUND;
107 }
108 original_task_runner->PostTask(
109 FROM_HERE, base::Bind(callback, data, resources, status));
110 }
111
112 void DeleteRegistrationFromDB( 91 void DeleteRegistrationFromDB(
113 ServiceWorkerDatabase* database, 92 ServiceWorkerDatabase* database,
114 scoped_refptr<base::SequencedTaskRunner> original_task_runner, 93 scoped_refptr<base::SequencedTaskRunner> original_task_runner,
115 int64 registration_id, 94 int64 registration_id,
116 const GURL& origin, 95 const GURL& origin,
117 const DeleteRegistrationCallback& callback) { 96 const DeleteRegistrationCallback& callback) {
118 DCHECK(database); 97 DCHECK(database);
119 if (!database->DeleteRegistration(registration_id, origin)) { 98 ServiceWorkerStatusCode status =
99 database->DeleteRegistration(registration_id, origin);
100 if (status != SERVICE_WORKER_OK) {
120 original_task_runner->PostTask( 101 original_task_runner->PostTask(
121 FROM_HERE, base::Bind(callback, false, SERVICE_WORKER_ERROR_FAILED)); 102 FROM_HERE, base::Bind(callback, false, SERVICE_WORKER_ERROR_FAILED));
122 return; 103 return;
123 } 104 }
124 105
125 // TODO(nhiroki): Add convenient method to ServiceWorkerDatabase to check the 106 // TODO(nhiroki): Add convenient method to ServiceWorkerDatabase to check the
126 // unique origin list. 107 // unique origin list.
127 std::vector<ServiceWorkerDatabase::RegistrationData> registrations; 108 std::vector<ServiceWorkerDatabase::RegistrationData> registrations;
128 ServiceWorkerStatusCode status = 109 status = database->GetRegistrationsForOrigin(origin, &registrations);
129 database->GetRegistrationsForOrigin(origin, &registrations);
130 if (status != SERVICE_WORKER_OK) { 110 if (status != SERVICE_WORKER_OK) {
131 original_task_runner->PostTask( 111 original_task_runner->PostTask(
132 FROM_HERE, base::Bind(callback, false, status)); 112 FROM_HERE, base::Bind(callback, false, status));
133 return; 113 return;
134 } 114 }
135 115
136 bool deletable = registrations.empty(); 116 bool deletable = registrations.empty();
137 original_task_runner->PostTask( 117 original_task_runner->PostTask(
138 FROM_HERE, base::Bind(callback, deletable, SERVICE_WORKER_OK)); 118 FROM_HERE, base::Bind(callback, deletable, SERVICE_WORKER_OK));
139 } 119 }
140 120
141 void UpdateToActiveStateInDB(
142 ServiceWorkerDatabase* database,
143 scoped_refptr<base::SequencedTaskRunner> original_task_runner,
144 int64 registration_id,
145 const GURL& origin,
146 const ServiceWorkerStorage::StatusCallback& callback) {
147 DCHECK(database);
148
149 // TODO(nhiroki): The database should return more detailed status like
150 // ServiceWorkerStatusCode instead of bool value.
151 ServiceWorkerStatusCode status = SERVICE_WORKER_OK;
152 if (!database->UpdateVersionToActive(registration_id, origin)) {
153 status = database->is_disabled() ? SERVICE_WORKER_ERROR_FAILED
154 : SERVICE_WORKER_ERROR_NOT_FOUND;
155 }
156 original_task_runner->PostTask(FROM_HERE, base::Bind(callback, status));
157 }
158
159 } // namespace 121 } // namespace
160 122
161 ServiceWorkerStorage::InitialData::InitialData() 123 ServiceWorkerStorage::InitialData::InitialData()
162 : next_registration_id(kInvalidServiceWorkerRegistrationId), 124 : next_registration_id(kInvalidServiceWorkerRegistrationId),
163 next_version_id(kInvalidServiceWorkerVersionId), 125 next_version_id(kInvalidServiceWorkerVersionId),
164 next_resource_id(kInvalidServiceWorkerResourceId) { 126 next_resource_id(kInvalidServiceWorkerResourceId) {
165 } 127 }
166 128
167 ServiceWorkerStorage::InitialData::~InitialData() { 129 ServiceWorkerStorage::InitialData::~InitialData() {
168 } 130 }
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 return; 267 return;
306 } 268 }
307 269
308 scoped_refptr<ServiceWorkerRegistration> registration = 270 scoped_refptr<ServiceWorkerRegistration> registration =
309 context_->GetLiveRegistration(registration_id); 271 context_->GetLiveRegistration(registration_id);
310 if (registration) { 272 if (registration) {
311 CompleteFindNow(registration, SERVICE_WORKER_OK, callback); 273 CompleteFindNow(registration, SERVICE_WORKER_OK, callback);
312 return; 274 return;
313 } 275 }
314 276
315 database_task_runner_->PostTask( 277 ServiceWorkerDatabase::RegistrationData* data =
278 new ServiceWorkerDatabase::RegistrationData;
279 ResourceList* resources = new ResourceList;
280 PostTaskAndReplyWithResult(
281 database_task_runner_,
316 FROM_HERE, 282 FROM_HERE,
317 base::Bind(&ReadRegistrationFromDB, 283 base::Bind(&ServiceWorkerDatabase::ReadRegistration,
318 database_.get(), 284 base::Unretained(database_.get()),
319 base::MessageLoopProxy::current(),
320 registration_id, origin, 285 registration_id, origin,
321 base::Bind(&ServiceWorkerStorage::DidReadRegistrationForId, 286 base::Unretained(data),
322 weak_factory_.GetWeakPtr(), callback))); 287 base::Unretained(resources)),
288 base::Bind(&ServiceWorkerStorage::DidReadRegistrationForId,
289 weak_factory_.GetWeakPtr(),
290 callback, base::Owned(data), base::Owned(resources)));
323 } 291 }
324 292
325 void ServiceWorkerStorage::GetAllRegistrations( 293 void ServiceWorkerStorage::GetAllRegistrations(
326 const GetAllRegistrationInfosCallback& callback) { 294 const GetAllRegistrationInfosCallback& callback) {
327 if (!LazyInitialize(base::Bind( 295 if (!LazyInitialize(base::Bind(
328 &ServiceWorkerStorage::GetAllRegistrations, 296 &ServiceWorkerStorage::GetAllRegistrations,
329 weak_factory_.GetWeakPtr(), callback))) { 297 weak_factory_.GetWeakPtr(), callback))) {
330 if (state_ != INITIALIZING || !context_) { 298 if (state_ != INITIALIZING || !context_) {
331 RunSoon(FROM_HERE, base::Bind( 299 RunSoon(FROM_HERE, base::Bind(
332 callback, std::vector<ServiceWorkerRegistrationInfo>())); 300 callback, std::vector<ServiceWorkerRegistrationInfo>()));
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
386 ServiceWorkerRegistration* registration, 354 ServiceWorkerRegistration* registration,
387 const StatusCallback& callback) { 355 const StatusCallback& callback) {
388 DCHECK(registration); 356 DCHECK(registration);
389 357
390 DCHECK(state_ == INITIALIZED || state_ == DISABLED); 358 DCHECK(state_ == INITIALIZED || state_ == DISABLED);
391 if (state_ != INITIALIZED || !context_) { 359 if (state_ != INITIALIZED || !context_) {
392 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); 360 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED));
393 return; 361 return;
394 } 362 }
395 363
396 database_task_runner_->PostTask( 364 PostTaskAndReplyWithResult(
365 database_task_runner_,
397 FROM_HERE, 366 FROM_HERE,
398 base::Bind(&UpdateToActiveStateInDB, 367 base::Bind(&ServiceWorkerDatabase::UpdateVersionToActive,
399 database_.get(), 368 base::Unretained(database_.get()),
400 base::MessageLoopProxy::current(),
401 registration->id(), 369 registration->id(),
402 registration->script_url().GetOrigin(), 370 registration->script_url().GetOrigin()),
371 base::Bind(&ServiceWorkerStorage::DidDatabaseOperation,
372 weak_factory_.GetWeakPtr(),
403 callback)); 373 callback));
404 } 374 }
405 375
406 void ServiceWorkerStorage::DeleteRegistration( 376 void ServiceWorkerStorage::DeleteRegistration(
407 int64 registration_id, 377 int64 registration_id,
408 const GURL& origin, 378 const GURL& origin,
409 const StatusCallback& callback) { 379 const StatusCallback& callback) {
410 DCHECK(state_ == INITIALIZED || state_ == DISABLED); 380 DCHECK(state_ == INITIALIZED || state_ == DISABLED);
411 if (state_ != INITIALIZED || !context_) { 381 if (state_ != INITIALIZED || !context_) {
412 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); 382 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED));
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
603 callback.Run(SERVICE_WORKER_OK, installing_registration); 573 callback.Run(SERVICE_WORKER_OK, installing_registration);
604 return; 574 return;
605 } 575 }
606 576
607 callback.Run(SERVICE_WORKER_ERROR_NOT_FOUND, 577 callback.Run(SERVICE_WORKER_ERROR_NOT_FOUND,
608 scoped_refptr<ServiceWorkerRegistration>()); 578 scoped_refptr<ServiceWorkerRegistration>());
609 } 579 }
610 580
611 void ServiceWorkerStorage::DidReadRegistrationForId( 581 void ServiceWorkerStorage::DidReadRegistrationForId(
612 const FindRegistrationCallback& callback, 582 const FindRegistrationCallback& callback,
613 const ServiceWorkerDatabase::RegistrationData& registration, 583 ServiceWorkerDatabase::RegistrationData* registration,
614 const ResourceList& resources, 584 ResourceList* resources,
615 ServiceWorkerStatusCode status) { 585 ServiceWorkerStatusCode status) {
586 DCHECK(registration);
587 DCHECK(resources);
616 if (status == SERVICE_WORKER_OK) { 588 if (status == SERVICE_WORKER_OK) {
617 callback.Run(status, CreateRegistration(registration)); 589 callback.Run(status, CreateRegistration(*registration));
618 return; 590 return;
619 } 591 }
620 592
621 if (status == SERVICE_WORKER_ERROR_NOT_FOUND) { 593 if (status == SERVICE_WORKER_ERROR_NOT_FOUND) {
622 // Look for somthing currently being installed. 594 // Look for somthing currently being installed.
623 scoped_refptr<ServiceWorkerRegistration> installing_registration = 595 scoped_refptr<ServiceWorkerRegistration> installing_registration =
624 FindInstallingRegistrationForId(registration.registration_id); 596 FindInstallingRegistrationForId(registration->registration_id);
625 if (installing_registration) { 597 if (installing_registration) {
626 callback.Run(SERVICE_WORKER_OK, installing_registration); 598 callback.Run(SERVICE_WORKER_OK, installing_registration);
627 return; 599 return;
628 } 600 }
629 callback.Run(SERVICE_WORKER_ERROR_NOT_FOUND, 601 callback.Run(SERVICE_WORKER_ERROR_NOT_FOUND,
630 scoped_refptr<ServiceWorkerRegistration>()); 602 scoped_refptr<ServiceWorkerRegistration>());
631 return; 603 return;
632 } 604 }
633 605
606 // TODO(nhiroki): Handle database error (http://crbug.com/371675).
634 callback.Run(status, scoped_refptr<ServiceWorkerRegistration>()); 607 callback.Run(status, scoped_refptr<ServiceWorkerRegistration>());
635 return; 608 return;
636 } 609 }
637 610
638 void ServiceWorkerStorage::DidGetAllRegistrations( 611 void ServiceWorkerStorage::DidGetAllRegistrations(
639 const GetAllRegistrationInfosCallback& callback, 612 const GetAllRegistrationInfosCallback& callback,
640 RegistrationList* registrations, 613 RegistrationList* registrations,
641 ServiceWorkerStatusCode status) { 614 ServiceWorkerStatusCode status) {
642 DCHECK(registrations); 615 DCHECK(registrations);
643 if (status != SERVICE_WORKER_OK) { 616 if (status != SERVICE_WORKER_OK) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
677 if (pushed_registrations.insert(it->first).second) 650 if (pushed_registrations.insert(it->first).second)
678 infos.push_back(it->second->GetInfo()); 651 infos.push_back(it->second->GetInfo());
679 } 652 }
680 653
681 callback.Run(infos); 654 callback.Run(infos);
682 } 655 }
683 656
684 void ServiceWorkerStorage::DidStoreRegistration( 657 void ServiceWorkerStorage::DidStoreRegistration(
685 const GURL& origin, 658 const GURL& origin,
686 const StatusCallback& callback, 659 const StatusCallback& callback,
687 bool success) { 660 ServiceWorkerStatusCode status) {
688 if (!success) { 661 if (status != SERVICE_WORKER_OK) {
662 // TODO(nhiroki): Handle database error (http://crbug.com/371675).
689 callback.Run(SERVICE_WORKER_ERROR_FAILED); 663 callback.Run(SERVICE_WORKER_ERROR_FAILED);
690 return; 664 return;
691 } 665 }
692 registered_origins_.insert(origin); 666 registered_origins_.insert(origin);
693 callback.Run(SERVICE_WORKER_OK); 667 callback.Run(status);
694 } 668 }
695 669
696 void ServiceWorkerStorage::DidDeleteRegistration( 670 void ServiceWorkerStorage::DidDeleteRegistration(
697 const GURL& origin, 671 const GURL& origin,
698 const StatusCallback& callback, 672 const StatusCallback& callback,
699 bool origin_is_deletable, 673 bool origin_is_deletable,
700 ServiceWorkerStatusCode status) { 674 ServiceWorkerStatusCode status) {
675 if (status != SERVICE_WORKER_OK) {
676 // TODO(nhiroki): Handle database error (http://crbug.com/371675).
677 callback.Run(SERVICE_WORKER_ERROR_FAILED);
678 return;
679 }
701 if (origin_is_deletable) 680 if (origin_is_deletable)
702 registered_origins_.erase(origin); 681 registered_origins_.erase(origin);
703 callback.Run(status); 682 callback.Run(status);
704 } 683 }
705 684
685 void ServiceWorkerStorage::DidDatabaseOperation(
686 const StatusCallback& callback,
687 ServiceWorkerStatusCode status) {
688 if (status != SERVICE_WORKER_OK && status != SERVICE_WORKER_ERROR_NOT_FOUND) {
689 // TODO(nhiroki): Handle database error (http://crbug.com/371675).
690 callback.Run(SERVICE_WORKER_ERROR_FAILED);
691 return;
692 }
693 callback.Run(status);
694 }
695
706 scoped_refptr<ServiceWorkerRegistration> 696 scoped_refptr<ServiceWorkerRegistration>
707 ServiceWorkerStorage::CreateRegistration( 697 ServiceWorkerStorage::CreateRegistration(
708 const ServiceWorkerDatabase::RegistrationData& data) { 698 const ServiceWorkerDatabase::RegistrationData& data) {
709 scoped_refptr<ServiceWorkerRegistration> registration( 699 scoped_refptr<ServiceWorkerRegistration> registration(
710 new ServiceWorkerRegistration( 700 new ServiceWorkerRegistration(
711 data.scope, data.script, data.registration_id, context_)); 701 data.scope, data.script, data.registration_id, context_));
712 702
713 scoped_refptr<ServiceWorkerVersion> version = 703 scoped_refptr<ServiceWorkerVersion> version =
714 context_->GetLiveVersion(data.version_id); 704 context_->GetLiveVersion(data.version_id);
715 if (!version) { 705 if (!version) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
775 // TODO(michaeln): Store data on disk and do error checking. 765 // TODO(michaeln): Store data on disk and do error checking.
776 disk_cache_.reset(new ServiceWorkerDiskCache); 766 disk_cache_.reset(new ServiceWorkerDiskCache);
777 int rv = disk_cache_->InitWithMemBackend( 767 int rv = disk_cache_->InitWithMemBackend(
778 kMaxMemDiskCacheSize, 768 kMaxMemDiskCacheSize,
779 base::Bind(&EmptyCompletionCallback)); 769 base::Bind(&EmptyCompletionCallback));
780 DCHECK_EQ(net::OK, rv); 770 DCHECK_EQ(net::OK, rv);
781 return disk_cache_.get(); 771 return disk_cache_.get();
782 } 772 }
783 773
784 } // namespace content 774 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698