| 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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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, ®istrations); |
| 129 database->GetRegistrationsForOrigin(origin, ®istrations); | |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |