| 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 <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 Loading... |
| 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, ®istrations); |
| 143 database->GetRegistrationsForOrigin(origin, ®istrations); | |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |