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 <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <utility> | |
10 | |
11 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
12 #include "base/files/file_util.h" | 10 #include "base/files/file_util.h" |
13 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
14 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
15 #include "base/sequenced_task_runner.h" | 13 #include "base/sequenced_task_runner.h" |
16 #include "base/single_thread_task_runner.h" | 14 #include "base/single_thread_task_runner.h" |
17 #include "base/task_runner_util.h" | 15 #include "base/task_runner_util.h" |
18 #include "base/thread_task_runner_handle.h" | 16 #include "base/thread_task_runner_handle.h" |
19 #include "base/trace_event/trace_event.h" | 17 #include "base/trace_event/trace_event.h" |
20 #include "content/browser/service_worker/service_worker_context_core.h" | 18 #include "content/browser/service_worker/service_worker_context_core.h" |
(...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
567 return; | 565 return; |
568 | 566 |
569 PostTaskAndReplyWithResult( | 567 PostTaskAndReplyWithResult( |
570 database_task_manager_->GetTaskRunner(), FROM_HERE, | 568 database_task_manager_->GetTaskRunner(), FROM_HERE, |
571 base::Bind(&ServiceWorkerDatabase::PurgeUncommittedResourceIds, | 569 base::Bind(&ServiceWorkerDatabase::PurgeUncommittedResourceIds, |
572 base::Unretained(database_.get()), resource_ids), | 570 base::Unretained(database_.get()), resource_ids), |
573 base::Bind(&ServiceWorkerStorage::DidPurgeUncommittedResourceIds, | 571 base::Bind(&ServiceWorkerStorage::DidPurgeUncommittedResourceIds, |
574 weak_factory_.GetWeakPtr(), resource_ids)); | 572 weak_factory_.GetWeakPtr(), resource_ids)); |
575 } | 573 } |
576 | 574 |
577 void ServiceWorkerStorage::StoreUserData(int64_t registration_id, | 575 void ServiceWorkerStorage::StoreUserData( |
578 const GURL& origin, | 576 int64_t registration_id, |
579 const std::string& key, | 577 const GURL& origin, |
580 const std::string& data, | 578 const std::vector<std::pair<std::string, std::string>>& key_value_pairs, |
581 const StatusCallback& callback) { | 579 const StatusCallback& callback) { |
582 DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; | 580 DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; |
583 if (IsDisabled()) { | 581 if (IsDisabled()) { |
584 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_ABORT)); | 582 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_ABORT)); |
585 return; | 583 return; |
586 } | 584 } |
587 | 585 |
588 if (registration_id == kInvalidServiceWorkerRegistrationId || key.empty()) { | 586 if (registration_id == kInvalidServiceWorkerRegistrationId || |
| 587 key_value_pairs.empty()) { |
589 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); | 588 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); |
590 return; | 589 return; |
591 } | 590 } |
| 591 for (const auto& kv : key_value_pairs) { |
| 592 if (kv.first.empty()) { |
| 593 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); |
| 594 return; |
| 595 } |
| 596 } |
592 | 597 |
593 PostTaskAndReplyWithResult( | 598 PostTaskAndReplyWithResult( |
594 database_task_manager_->GetTaskRunner(), | 599 database_task_manager_->GetTaskRunner(), FROM_HERE, |
595 FROM_HERE, | |
596 base::Bind(&ServiceWorkerDatabase::WriteUserData, | 600 base::Bind(&ServiceWorkerDatabase::WriteUserData, |
597 base::Unretained(database_.get()), | 601 base::Unretained(database_.get()), registration_id, origin, |
598 registration_id, origin, key, data), | 602 key_value_pairs), |
599 base::Bind(&ServiceWorkerStorage::DidStoreUserData, | 603 base::Bind(&ServiceWorkerStorage::DidStoreUserData, |
600 weak_factory_.GetWeakPtr(), | 604 weak_factory_.GetWeakPtr(), callback)); |
601 callback)); | |
602 } | 605 } |
603 | 606 |
604 void ServiceWorkerStorage::GetUserData(int64_t registration_id, | 607 void ServiceWorkerStorage::GetUserData(int64_t registration_id, |
605 const std::string& key, | 608 const std::vector<std::string>& keys, |
606 const GetUserDataCallback& callback) { | 609 const GetUserDataCallback& callback) { |
607 DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; | 610 DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; |
608 if (IsDisabled()) { | 611 if (IsDisabled()) { |
609 RunSoon(FROM_HERE, | 612 RunSoon(FROM_HERE, base::Bind(callback, std::vector<std::string>(), |
610 base::Bind(callback, std::string(), SERVICE_WORKER_ERROR_ABORT)); | 613 SERVICE_WORKER_ERROR_ABORT)); |
611 return; | 614 return; |
612 } | 615 } |
613 | 616 |
614 if (registration_id == kInvalidServiceWorkerRegistrationId || key.empty()) { | 617 if (registration_id == kInvalidServiceWorkerRegistrationId || keys.empty()) { |
615 RunSoon(FROM_HERE, | 618 RunSoon(FROM_HERE, base::Bind(callback, std::vector<std::string>(), |
616 base::Bind(callback, std::string(), SERVICE_WORKER_ERROR_FAILED)); | 619 SERVICE_WORKER_ERROR_FAILED)); |
617 return; | 620 return; |
618 } | 621 } |
| 622 for (const std::string& key : keys) { |
| 623 if (key.empty()) { |
| 624 RunSoon(FROM_HERE, base::Bind(callback, std::vector<std::string>(), |
| 625 SERVICE_WORKER_ERROR_FAILED)); |
| 626 return; |
| 627 } |
| 628 } |
619 | 629 |
620 database_task_manager_->GetTaskRunner()->PostTask( | 630 database_task_manager_->GetTaskRunner()->PostTask( |
621 FROM_HERE, | 631 FROM_HERE, |
622 base::Bind(&ServiceWorkerStorage::GetUserDataInDB, | 632 base::Bind(&ServiceWorkerStorage::GetUserDataInDB, database_.get(), |
623 database_.get(), | 633 base::ThreadTaskRunnerHandle::Get(), registration_id, keys, |
624 base::ThreadTaskRunnerHandle::Get(), | |
625 registration_id, | |
626 key, | |
627 base::Bind(&ServiceWorkerStorage::DidGetUserData, | 634 base::Bind(&ServiceWorkerStorage::DidGetUserData, |
628 weak_factory_.GetWeakPtr(), | 635 weak_factory_.GetWeakPtr(), callback))); |
629 callback))); | |
630 } | 636 } |
631 | 637 |
632 void ServiceWorkerStorage::ClearUserData(int64_t registration_id, | 638 void ServiceWorkerStorage::ClearUserData(int64_t registration_id, |
633 const std::string& key, | 639 const std::vector<std::string>& keys, |
634 const StatusCallback& callback) { | 640 const StatusCallback& callback) { |
635 DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; | 641 DCHECK(state_ == INITIALIZED || state_ == DISABLED) << state_; |
636 if (IsDisabled()) { | 642 if (IsDisabled()) { |
637 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_ABORT)); | 643 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_ABORT)); |
638 return; | 644 return; |
639 } | 645 } |
640 | 646 |
641 if (registration_id == kInvalidServiceWorkerRegistrationId || key.empty()) { | 647 if (registration_id == kInvalidServiceWorkerRegistrationId || keys.empty()) { |
642 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); | 648 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); |
643 return; | 649 return; |
644 } | 650 } |
| 651 for (const std::string& key : keys) { |
| 652 if (key.empty()) { |
| 653 RunSoon(FROM_HERE, base::Bind(callback, SERVICE_WORKER_ERROR_FAILED)); |
| 654 return; |
| 655 } |
| 656 } |
645 | 657 |
646 PostTaskAndReplyWithResult( | 658 PostTaskAndReplyWithResult( |
647 database_task_manager_->GetTaskRunner(), | 659 database_task_manager_->GetTaskRunner(), FROM_HERE, |
648 FROM_HERE, | |
649 base::Bind(&ServiceWorkerDatabase::DeleteUserData, | 660 base::Bind(&ServiceWorkerDatabase::DeleteUserData, |
650 base::Unretained(database_.get()), | 661 base::Unretained(database_.get()), registration_id, keys), |
651 registration_id, key), | |
652 base::Bind(&ServiceWorkerStorage::DidDeleteUserData, | 662 base::Bind(&ServiceWorkerStorage::DidDeleteUserData, |
653 weak_factory_.GetWeakPtr(), | 663 weak_factory_.GetWeakPtr(), callback)); |
654 callback)); | |
655 } | 664 } |
656 | 665 |
657 void ServiceWorkerStorage::GetUserDataForAllRegistrations( | 666 void ServiceWorkerStorage::GetUserDataForAllRegistrations( |
658 const std::string& key, | 667 const std::string& key, |
659 const ServiceWorkerStorage::GetUserDataForAllRegistrationsCallback& | 668 const ServiceWorkerStorage::GetUserDataForAllRegistrationsCallback& |
660 callback) { | 669 callback) { |
661 if (!LazyInitialize( | 670 if (!LazyInitialize( |
662 base::Bind(&ServiceWorkerStorage::GetUserDataForAllRegistrations, | 671 base::Bind(&ServiceWorkerStorage::GetUserDataForAllRegistrations, |
663 weak_factory_.GetWeakPtr(), key, callback))) { | 672 weak_factory_.GetWeakPtr(), key, callback))) { |
664 if (state_ != INITIALIZING) { | 673 if (state_ != INITIALIZING) { |
(...skipping 514 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1179 // recovery. | 1188 // recovery. |
1180 if (status != ServiceWorkerDatabase::STATUS_OK && | 1189 if (status != ServiceWorkerDatabase::STATUS_OK && |
1181 status != ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) { | 1190 status != ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) { |
1182 ScheduleDeleteAndStartOver(); | 1191 ScheduleDeleteAndStartOver(); |
1183 } | 1192 } |
1184 callback.Run(DatabaseStatusToStatusCode(status)); | 1193 callback.Run(DatabaseStatusToStatusCode(status)); |
1185 } | 1194 } |
1186 | 1195 |
1187 void ServiceWorkerStorage::DidGetUserData( | 1196 void ServiceWorkerStorage::DidGetUserData( |
1188 const GetUserDataCallback& callback, | 1197 const GetUserDataCallback& callback, |
1189 const std::string& data, | 1198 const std::vector<std::string>& data, |
1190 ServiceWorkerDatabase::Status status) { | 1199 ServiceWorkerDatabase::Status status) { |
1191 if (status != ServiceWorkerDatabase::STATUS_OK && | 1200 if (status != ServiceWorkerDatabase::STATUS_OK && |
1192 status != ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) { | 1201 status != ServiceWorkerDatabase::STATUS_ERROR_NOT_FOUND) { |
1193 ScheduleDeleteAndStartOver(); | 1202 ScheduleDeleteAndStartOver(); |
1194 } | 1203 } |
1195 callback.Run(data, DatabaseStatusToStatusCode(status)); | 1204 callback.Run(data, DatabaseStatusToStatusCode(status)); |
1196 } | 1205 } |
1197 | 1206 |
1198 void ServiceWorkerStorage::DidDeleteUserData( | 1207 void ServiceWorkerStorage::DidDeleteUserData( |
1199 const StatusCallback& callback, | 1208 const StatusCallback& callback, |
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1665 return; | 1674 return; |
1666 } | 1675 } |
1667 FindForIdInDB(database, original_task_runner, registration_id, origin, | 1676 FindForIdInDB(database, original_task_runner, registration_id, origin, |
1668 callback); | 1677 callback); |
1669 } | 1678 } |
1670 | 1679 |
1671 void ServiceWorkerStorage::GetUserDataInDB( | 1680 void ServiceWorkerStorage::GetUserDataInDB( |
1672 ServiceWorkerDatabase* database, | 1681 ServiceWorkerDatabase* database, |
1673 scoped_refptr<base::SequencedTaskRunner> original_task_runner, | 1682 scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
1674 int64_t registration_id, | 1683 int64_t registration_id, |
1675 const std::string& key, | 1684 const std::vector<std::string>& keys, |
1676 const GetUserDataInDBCallback& callback) { | 1685 const GetUserDataInDBCallback& callback) { |
1677 std::string data; | 1686 std::vector<std::string> values; |
1678 ServiceWorkerDatabase::Status status = | 1687 ServiceWorkerDatabase::Status status = |
1679 database->ReadUserData(registration_id, key, &data); | 1688 database->ReadUserData(registration_id, keys, &values); |
1680 original_task_runner->PostTask( | 1689 original_task_runner->PostTask(FROM_HERE, |
1681 FROM_HERE, base::Bind(callback, data, status)); | 1690 base::Bind(callback, values, status)); |
1682 } | 1691 } |
1683 | 1692 |
1684 void ServiceWorkerStorage::GetUserDataForAllRegistrationsInDB( | 1693 void ServiceWorkerStorage::GetUserDataForAllRegistrationsInDB( |
1685 ServiceWorkerDatabase* database, | 1694 ServiceWorkerDatabase* database, |
1686 scoped_refptr<base::SequencedTaskRunner> original_task_runner, | 1695 scoped_refptr<base::SequencedTaskRunner> original_task_runner, |
1687 const std::string& key, | 1696 const std::string& key, |
1688 const GetUserDataForAllRegistrationsInDBCallback& callback) { | 1697 const GetUserDataForAllRegistrationsInDBCallback& callback) { |
1689 std::vector<std::pair<int64_t, std::string>> user_data; | 1698 std::vector<std::pair<int64_t, std::string>> user_data; |
1690 ServiceWorkerDatabase::Status status = | 1699 ServiceWorkerDatabase::Status status = |
1691 database->ReadUserDataForAllRegistrations(key, &user_data); | 1700 database->ReadUserDataForAllRegistrations(key, &user_data); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1760 callback.Run(SERVICE_WORKER_ERROR_FAILED); | 1769 callback.Run(SERVICE_WORKER_ERROR_FAILED); |
1761 return; | 1770 return; |
1762 } | 1771 } |
1763 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; | 1772 DVLOG(1) << "Deleted ServiceWorkerDiskCache successfully."; |
1764 ServiceWorkerMetrics::RecordDeleteAndStartOverResult( | 1773 ServiceWorkerMetrics::RecordDeleteAndStartOverResult( |
1765 ServiceWorkerMetrics::DELETE_OK); | 1774 ServiceWorkerMetrics::DELETE_OK); |
1766 callback.Run(SERVICE_WORKER_OK); | 1775 callback.Run(SERVICE_WORKER_OK); |
1767 } | 1776 } |
1768 | 1777 |
1769 } // namespace content | 1778 } // namespace content |
OLD | NEW |