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/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
11 #include "base/files/file_util.h" | 11 #include "base/files/file_util.h" |
12 #include "base/hash.h" | |
13 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
14 #include "base/sequenced_task_runner.h" | 13 #include "base/sequenced_task_runner.h" |
15 #include "base/single_thread_task_runner.h" | 14 #include "base/single_thread_task_runner.h" |
16 #include "base/task_runner_util.h" | 15 #include "base/task_runner_util.h" |
17 #include "content/browser/service_worker/service_worker_context_core.h" | 16 #include "content/browser/service_worker/service_worker_context_core.h" |
18 #include "content/browser/service_worker/service_worker_disk_cache.h" | 17 #include "content/browser/service_worker/service_worker_disk_cache.h" |
19 #include "content/browser/service_worker/service_worker_info.h" | 18 #include "content/browser/service_worker/service_worker_info.h" |
20 #include "content/browser/service_worker/service_worker_metrics.h" | 19 #include "content/browser/service_worker/service_worker_metrics.h" |
21 #include "content/browser/service_worker/service_worker_registration.h" | 20 #include "content/browser/service_worker/service_worker_registration.h" |
22 #include "content/browser/service_worker/service_worker_utils.h" | 21 #include "content/browser/service_worker/service_worker_utils.h" |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
273 // Look for something currently being installed. | 272 // Look for something currently being installed. |
274 scoped_refptr<ServiceWorkerRegistration> installing_registration = | 273 scoped_refptr<ServiceWorkerRegistration> installing_registration = |
275 FindInstallingRegistrationForDocument(document_url); | 274 FindInstallingRegistrationForDocument(document_url); |
276 ServiceWorkerStatusCode status = installing_registration.get() ? | 275 ServiceWorkerStatusCode status = installing_registration.get() ? |
277 SERVICE_WORKER_OK : SERVICE_WORKER_ERROR_NOT_FOUND; | 276 SERVICE_WORKER_OK : SERVICE_WORKER_ERROR_NOT_FOUND; |
278 TRACE_EVENT_INSTANT2( | 277 TRACE_EVENT_INSTANT2( |
279 "ServiceWorker", | 278 "ServiceWorker", |
280 "ServiceWorkerStorage::FindRegistrationForDocument:CheckInstalling", | 279 "ServiceWorkerStorage::FindRegistrationForDocument:CheckInstalling", |
281 TRACE_EVENT_SCOPE_THREAD, | 280 TRACE_EVENT_SCOPE_THREAD, |
282 "URL", document_url.spec(), | 281 "URL", document_url.spec(), |
283 "Status", (status == SERVICE_WORKER_OK) ? "Found" : "Not Found"); | 282 "Status", ServiceWorkerStatusToString(status)); |
284 CompleteFindNow(installing_registration, | 283 CompleteFindNow(installing_registration, |
285 status, | 284 status, |
286 callback); | 285 callback); |
287 return; | 286 return; |
288 } | 287 } |
289 | 288 |
290 // To connect this TRACE_EVENT with the callback, TimeTicks is used for | 289 // To connect this TRACE_EVENT with the callback, TimeTicks is used for |
291 // callback id. | 290 // callback id. |
292 int64 callback_id = base::TimeTicks::Now().ToInternalValue(); | 291 int64 callback_id = base::TimeTicks::Now().ToInternalValue(); |
293 TRACE_EVENT_ASYNC_BEGIN1( | 292 TRACE_EVENT_ASYNC_BEGIN1( |
(...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
763 DCHECK(data); | 762 DCHECK(data); |
764 DCHECK_EQ(INITIALIZING, state_); | 763 DCHECK_EQ(INITIALIZING, state_); |
765 | 764 |
766 if (status == ServiceWorkerDatabase::STATUS_OK) { | 765 if (status == ServiceWorkerDatabase::STATUS_OK) { |
767 next_registration_id_ = data->next_registration_id; | 766 next_registration_id_ = data->next_registration_id; |
768 next_version_id_ = data->next_version_id; | 767 next_version_id_ = data->next_version_id; |
769 next_resource_id_ = data->next_resource_id; | 768 next_resource_id_ = data->next_resource_id; |
770 registered_origins_.swap(data->origins); | 769 registered_origins_.swap(data->origins); |
771 state_ = INITIALIZED; | 770 state_ = INITIALIZED; |
772 } else { | 771 } else { |
773 // TODO(nhiroki): Stringify |status| using StatusToString() defined in | 772 DVLOG(2) << "Failed to initialize: " |
774 // service_worker_database.cc. | 773 << ServiceWorkerDatabase::StatusToString(status); |
775 DVLOG(2) << "Failed to initialize: " << status; | |
776 ScheduleDeleteAndStartOver(); | 774 ScheduleDeleteAndStartOver(); |
777 } | 775 } |
778 | 776 |
779 for (std::vector<base::Closure>::const_iterator it = pending_tasks_.begin(); | 777 for (std::vector<base::Closure>::const_iterator it = pending_tasks_.begin(); |
780 it != pending_tasks_.end(); ++it) { | 778 it != pending_tasks_.end(); ++it) { |
781 RunSoon(FROM_HERE, *it); | 779 RunSoon(FROM_HERE, *it); |
782 } | 780 } |
783 pending_tasks_.clear(); | 781 pending_tasks_.clear(); |
784 } | 782 } |
785 | 783 |
786 void ServiceWorkerStorage::DidFindRegistrationForDocument( | 784 void ServiceWorkerStorage::DidFindRegistrationForDocument( |
787 const GURL& document_url, | 785 const GURL& document_url, |
788 const FindRegistrationCallback& callback, | 786 const FindRegistrationCallback& callback, |
789 int64 callback_id, | 787 int64 callback_id, |
790 const ServiceWorkerDatabase::RegistrationData& data, | 788 const ServiceWorkerDatabase::RegistrationData& data, |
791 const ResourceList& resources, | 789 const ResourceList& resources, |
792 ServiceWorkerDatabase::Status status) { | 790 ServiceWorkerDatabase::Status status) { |
793 if (status == ServiceWorkerDatabase::STATUS_OK) { | 791 if (status == ServiceWorkerDatabase::STATUS_OK) { |
794 ReturnFoundRegistration(callback, data, resources); | 792 ReturnFoundRegistration(callback, data, resources); |
795 TRACE_EVENT_ASYNC_END1( | 793 TRACE_EVENT_ASYNC_END1( |
796 "ServiceWorker", | 794 "ServiceWorker", |
797 "ServiceWorkerStorage::FindRegistrationForDocument", | 795 "ServiceWorkerStorage::FindRegistrationForDocument", |
798 callback_id, | 796 callback_id, |
799 "Status", "OK"); | 797 "Status", ServiceWorkerDatabase::StatusToString(status)); |
800 return; | 798 return; |
801 } | 799 } |
802 | 800 |
803 if (status == ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) { | 801 if (status == ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) { |
804 // Look for something currently being installed. | 802 // Look for something currently being installed. |
805 scoped_refptr<ServiceWorkerRegistration> installing_registration = | 803 scoped_refptr<ServiceWorkerRegistration> installing_registration = |
806 FindInstallingRegistrationForDocument(document_url); | 804 FindInstallingRegistrationForDocument(document_url); |
807 callback.Run(installing_registration.get() ? SERVICE_WORKER_OK | 805 ServiceWorkerStatusCode installing_status = installing_registration.get() ? |
808 : SERVICE_WORKER_ERROR_NOT_FOUND, | 806 SERVICE_WORKER_OK : SERVICE_WORKER_ERROR_NOT_FOUND; |
809 installing_registration); | 807 callback.Run(installing_status, installing_registration); |
810 TRACE_EVENT_ASYNC_END1( | 808 TRACE_EVENT_ASYNC_END2( |
811 "ServiceWorker", | 809 "ServiceWorker", |
812 "ServiceWorkerStorage::FindRegistrationForDocument", | 810 "ServiceWorkerStorage::FindRegistrationForDocument", |
813 callback_id, | 811 callback_id, |
814 "Status", status); | 812 "Status", ServiceWorkerDatabase::StatusToString(status), |
| 813 "Info", |
| 814 (installing_status == SERVICE_WORKER_OK) ? |
| 815 "Installing registration is found" : |
| 816 "Any registrations are not found"); |
815 return; | 817 return; |
816 } | 818 } |
817 | 819 |
818 ScheduleDeleteAndStartOver(); | 820 ScheduleDeleteAndStartOver(); |
819 callback.Run(DatabaseStatusToStatusCode(status), | 821 callback.Run(DatabaseStatusToStatusCode(status), |
820 scoped_refptr<ServiceWorkerRegistration>()); | 822 scoped_refptr<ServiceWorkerRegistration>()); |
821 TRACE_EVENT_ASYNC_END1( | 823 TRACE_EVENT_ASYNC_END1( |
822 "ServiceWorker", | 824 "ServiceWorker", |
823 "ServiceWorkerStorage::FindRegistrationForDocument", | 825 "ServiceWorkerStorage::FindRegistrationForDocument", |
824 callback_id, | 826 callback_id, |
825 "Status", status); | 827 "Status", ServiceWorkerDatabase::StatusToString(status)); |
826 } | 828 } |
827 | 829 |
828 void ServiceWorkerStorage::DidFindRegistrationForPattern( | 830 void ServiceWorkerStorage::DidFindRegistrationForPattern( |
829 const GURL& scope, | 831 const GURL& scope, |
830 const FindRegistrationCallback& callback, | 832 const FindRegistrationCallback& callback, |
831 const ServiceWorkerDatabase::RegistrationData& data, | 833 const ServiceWorkerDatabase::RegistrationData& data, |
832 const ResourceList& resources, | 834 const ResourceList& resources, |
833 ServiceWorkerDatabase::Status status) { | 835 ServiceWorkerDatabase::Status status) { |
834 if (status == ServiceWorkerDatabase::STATUS_OK) { | 836 if (status == ServiceWorkerDatabase::STATUS_OK) { |
835 ReturnFoundRegistration(callback, data, resources); | 837 ReturnFoundRegistration(callback, data, resources); |
(...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1405 DVLOG(1) << "Schedule to delete the context and start over."; | 1407 DVLOG(1) << "Schedule to delete the context and start over."; |
1406 context_->ScheduleDeleteAndStartOver(); | 1408 context_->ScheduleDeleteAndStartOver(); |
1407 } | 1409 } |
1408 | 1410 |
1409 void ServiceWorkerStorage::DidDeleteDatabase( | 1411 void ServiceWorkerStorage::DidDeleteDatabase( |
1410 const StatusCallback& callback, | 1412 const StatusCallback& callback, |
1411 ServiceWorkerDatabase::Status status) { | 1413 ServiceWorkerDatabase::Status status) { |
1412 DCHECK_EQ(DISABLED, state_); | 1414 DCHECK_EQ(DISABLED, state_); |
1413 if (status != ServiceWorkerDatabase::STATUS_OK) { | 1415 if (status != ServiceWorkerDatabase::STATUS_OK) { |
1414 // Give up the corruption recovery until the browser restarts. | 1416 // Give up the corruption recovery until the browser restarts. |
1415 LOG(ERROR) << "Failed to delete the database: " << status; | 1417 LOG(ERROR) << "Failed to delete the database: " |
| 1418 << ServiceWorkerDatabase::StatusToString(status); |
1416 callback.Run(DatabaseStatusToStatusCode(status)); | 1419 callback.Run(DatabaseStatusToStatusCode(status)); |
1417 return; | 1420 return; |
1418 } | 1421 } |
1419 DVLOG(1) << "Deleted ServiceWorkerDatabase successfully."; | 1422 DVLOG(1) << "Deleted ServiceWorkerDatabase successfully."; |
1420 | 1423 |
1421 // Delete the disk cache on the cache thread. | 1424 // Delete the disk cache on the cache thread. |
1422 // TODO(nhiroki): What if there is a bunch of files in the cache directory? | 1425 // TODO(nhiroki): What if there is a bunch of files in the cache directory? |
1423 // Deleting the directory could take a long time and restart could be delayed. | 1426 // Deleting the directory could take a long time and restart could be delayed. |
1424 // We should probably rename the directory and delete it later. | 1427 // We should probably rename the directory and delete it later. |
1425 PostTaskAndReplyWithResult( | 1428 PostTaskAndReplyWithResult( |
(...skipping 12 matching lines...) Expand all Loading... |
1438 // Give up the corruption recovery until the browser restarts. | 1441 // Give up the corruption recovery until the browser restarts. |
1439 LOG(ERROR) << "Failed to delete the diskcache."; | 1442 LOG(ERROR) << "Failed to delete the diskcache."; |
1440 callback.Run(SERVICE_WORKER_ERROR_FAILED); | 1443 callback.Run(SERVICE_WORKER_ERROR_FAILED); |
1441 return; | 1444 return; |
1442 } | 1445 } |
1443 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; | 1446 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; |
1444 callback.Run(SERVICE_WORKER_OK); | 1447 callback.Run(SERVICE_WORKER_OK); |
1445 } | 1448 } |
1446 | 1449 |
1447 } // namespace content | 1450 } // namespace content |
OLD | NEW |