| 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 |