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 "webkit/browser/quota/quota_manager.h" | 5 #include "webkit/browser/quota/quota_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <deque> | 8 #include <deque> |
9 #include <functional> | 9 #include <functional> |
10 #include <set> | 10 #include <set> |
11 | 11 |
12 #include "base/bind.h" | 12 #include "base/bind.h" |
13 #include "base/bind_helpers.h" | 13 #include "base/bind_helpers.h" |
14 #include "base/callback.h" | 14 #include "base/callback.h" |
15 #include "base/command_line.h" | 15 #include "base/command_line.h" |
16 #include "base/file_util.h" | 16 #include "base/file_util.h" |
17 #include "base/files/file_path.h" | 17 #include "base/files/file_path.h" |
18 #include "base/metrics/histogram.h" | 18 #include "base/metrics/histogram.h" |
19 #include "base/sequenced_task_runner.h" | 19 #include "base/sequenced_task_runner.h" |
20 #include "base/single_thread_task_runner.h" | 20 #include "base/single_thread_task_runner.h" |
21 #include "base/strings/string_number_conversions.h" | 21 #include "base/strings/string_number_conversions.h" |
22 #include "base/sys_info.h" | 22 #include "base/sys_info.h" |
23 #include "base/task_runner_util.h" | 23 #include "base/task_runner_util.h" |
24 #include "base/time/time.h" | 24 #include "base/time/time.h" |
25 #include "net/base/net_util.h" | 25 #include "net/base/net_util.h" |
26 #include "webkit/browser/quota/quota_database.h" | 26 #include "webkit/browser/quota/quota_database.h" |
| 27 #include "webkit/browser/quota/quota_manager_proxy.h" |
27 #include "webkit/browser/quota/quota_temporary_storage_evictor.h" | 28 #include "webkit/browser/quota/quota_temporary_storage_evictor.h" |
28 #include "webkit/browser/quota/usage_tracker.h" | 29 #include "webkit/browser/quota/usage_tracker.h" |
29 #include "webkit/common/quota/quota_types.h" | 30 #include "webkit/common/quota/quota_types.h" |
30 | 31 |
31 #define UMA_HISTOGRAM_MBYTES(name, sample) \ | 32 #define UMA_HISTOGRAM_MBYTES(name, sample) \ |
32 UMA_HISTOGRAM_CUSTOM_COUNTS( \ | 33 UMA_HISTOGRAM_CUSTOM_COUNTS( \ |
33 (name), static_cast<int>((sample) / kMBytes), \ | 34 (name), static_cast<int>((sample) / kMBytes), \ |
34 1, 10 * 1024 * 1024 /* 10TB */, 100) | 35 1, 10 * 1024 * 1024 /* 10TB */, 100) |
35 | 36 |
36 namespace quota { | 37 namespace quota { |
37 | 38 |
38 namespace { | 39 namespace { |
39 | 40 |
40 const int64 kMBytes = 1024 * 1024; | 41 const int64 kMBytes = 1024 * 1024; |
41 const int kMinutesInMilliSeconds = 60 * 1000; | 42 const int kMinutesInMilliSeconds = 60 * 1000; |
42 | 43 |
43 const int64 kReportHistogramInterval = 60 * 60 * 1000; // 1 hour | 44 const int64 kReportHistogramInterval = 60 * 60 * 1000; // 1 hour |
44 const double kTemporaryQuotaRatioToAvail = 1.0 / 3.0; // 33% | 45 const double kTemporaryQuotaRatioToAvail = 1.0 / 3.0; // 33% |
45 | 46 |
46 void DidGetUsageAndQuota( | |
47 base::SequencedTaskRunner* original_task_runner, | |
48 const QuotaManagerProxy::GetUsageAndQuotaCallback& callback, | |
49 QuotaStatusCode status, int64 usage, int64 quota) { | |
50 if (!original_task_runner->RunsTasksOnCurrentThread()) { | |
51 original_task_runner->PostTask( | |
52 FROM_HERE, | |
53 base::Bind(&DidGetUsageAndQuota, | |
54 make_scoped_refptr(original_task_runner), | |
55 callback, status, usage, quota)); | |
56 return; | |
57 } | |
58 callback.Run(status, usage, quota); | |
59 } | |
60 | |
61 } // namespace | 47 } // namespace |
62 | 48 |
63 // Arbitrary for now, but must be reasonably small so that | 49 // Arbitrary for now, but must be reasonably small so that |
64 // in-memory databases can fit. | 50 // in-memory databases can fit. |
65 // TODO(kinuko): Refer SysInfo::AmountOfPhysicalMemory() to determine this. | 51 // TODO(kinuko): Refer SysInfo::AmountOfPhysicalMemory() to determine this. |
66 const int64 QuotaManager::kIncognitoDefaultQuotaLimit = 100 * kMBytes; | 52 const int64 QuotaManager::kIncognitoDefaultQuotaLimit = 100 * kMBytes; |
67 | 53 |
68 const int64 QuotaManager::kNoLimit = kint64max; | 54 const int64 QuotaManager::kNoLimit = kint64max; |
69 | 55 |
70 const int QuotaManager::kPerHostTemporaryPortion = 5; // 20% | 56 const int QuotaManager::kPerHostTemporaryPortion = 5; // 20% |
(...skipping 1527 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1598 // Deleting manager will post another task to DB thread to delete | 1584 // Deleting manager will post another task to DB thread to delete |
1599 // |database_|, therefore we can be sure that database_ is alive when this | 1585 // |database_|, therefore we can be sure that database_ is alive when this |
1600 // task runs. | 1586 // task runs. |
1601 base::PostTaskAndReplyWithResult( | 1587 base::PostTaskAndReplyWithResult( |
1602 db_thread_.get(), | 1588 db_thread_.get(), |
1603 from_here, | 1589 from_here, |
1604 base::Bind(task, base::Unretained(database_.get())), | 1590 base::Bind(task, base::Unretained(database_.get())), |
1605 reply); | 1591 reply); |
1606 } | 1592 } |
1607 | 1593 |
1608 // QuotaManagerProxy ---------------------------------------------------------- | |
1609 | |
1610 void QuotaManagerProxy::RegisterClient(QuotaClient* client) { | |
1611 if (!io_thread_->BelongsToCurrentThread() && | |
1612 io_thread_->PostTask( | |
1613 FROM_HERE, | |
1614 base::Bind(&QuotaManagerProxy::RegisterClient, this, client))) { | |
1615 return; | |
1616 } | |
1617 | |
1618 if (manager_) | |
1619 manager_->RegisterClient(client); | |
1620 else | |
1621 client->OnQuotaManagerDestroyed(); | |
1622 } | |
1623 | |
1624 void QuotaManagerProxy::NotifyStorageAccessed( | |
1625 QuotaClient::ID client_id, | |
1626 const GURL& origin, | |
1627 StorageType type) { | |
1628 if (!io_thread_->BelongsToCurrentThread()) { | |
1629 io_thread_->PostTask( | |
1630 FROM_HERE, | |
1631 base::Bind(&QuotaManagerProxy::NotifyStorageAccessed, this, client_id, | |
1632 origin, type)); | |
1633 return; | |
1634 } | |
1635 | |
1636 if (manager_) | |
1637 manager_->NotifyStorageAccessed(client_id, origin, type); | |
1638 } | |
1639 | |
1640 void QuotaManagerProxy::NotifyStorageModified( | |
1641 QuotaClient::ID client_id, | |
1642 const GURL& origin, | |
1643 StorageType type, | |
1644 int64 delta) { | |
1645 if (!io_thread_->BelongsToCurrentThread()) { | |
1646 io_thread_->PostTask( | |
1647 FROM_HERE, | |
1648 base::Bind(&QuotaManagerProxy::NotifyStorageModified, this, client_id, | |
1649 origin, type, delta)); | |
1650 return; | |
1651 } | |
1652 | |
1653 if (manager_) | |
1654 manager_->NotifyStorageModified(client_id, origin, type, delta); | |
1655 } | |
1656 | |
1657 void QuotaManagerProxy::NotifyOriginInUse( | |
1658 const GURL& origin) { | |
1659 if (!io_thread_->BelongsToCurrentThread()) { | |
1660 io_thread_->PostTask( | |
1661 FROM_HERE, | |
1662 base::Bind(&QuotaManagerProxy::NotifyOriginInUse, this, origin)); | |
1663 return; | |
1664 } | |
1665 | |
1666 if (manager_) | |
1667 manager_->NotifyOriginInUse(origin); | |
1668 } | |
1669 | |
1670 void QuotaManagerProxy::NotifyOriginNoLongerInUse( | |
1671 const GURL& origin) { | |
1672 if (!io_thread_->BelongsToCurrentThread()) { | |
1673 io_thread_->PostTask( | |
1674 FROM_HERE, | |
1675 base::Bind(&QuotaManagerProxy::NotifyOriginNoLongerInUse, this, | |
1676 origin)); | |
1677 return; | |
1678 } | |
1679 if (manager_) | |
1680 manager_->NotifyOriginNoLongerInUse(origin); | |
1681 } | |
1682 | |
1683 void QuotaManagerProxy::SetUsageCacheEnabled(QuotaClient::ID client_id, | |
1684 const GURL& origin, | |
1685 StorageType type, | |
1686 bool enabled) { | |
1687 if (!io_thread_->BelongsToCurrentThread()) { | |
1688 io_thread_->PostTask( | |
1689 FROM_HERE, | |
1690 base::Bind(&QuotaManagerProxy::SetUsageCacheEnabled, this, | |
1691 client_id, origin, type, enabled)); | |
1692 return; | |
1693 } | |
1694 if (manager_) | |
1695 manager_->SetUsageCacheEnabled(client_id, origin, type, enabled); | |
1696 } | |
1697 | |
1698 void QuotaManagerProxy::GetUsageAndQuota( | |
1699 base::SequencedTaskRunner* original_task_runner, | |
1700 const GURL& origin, | |
1701 StorageType type, | |
1702 const GetUsageAndQuotaCallback& callback) { | |
1703 if (!io_thread_->BelongsToCurrentThread()) { | |
1704 io_thread_->PostTask( | |
1705 FROM_HERE, | |
1706 base::Bind(&QuotaManagerProxy::GetUsageAndQuota, this, | |
1707 make_scoped_refptr(original_task_runner), | |
1708 origin, type, callback)); | |
1709 return; | |
1710 } | |
1711 if (!manager_) { | |
1712 DidGetUsageAndQuota(original_task_runner, callback, kQuotaErrorAbort, 0, 0); | |
1713 return; | |
1714 } | |
1715 manager_->GetUsageAndQuota( | |
1716 origin, type, | |
1717 base::Bind(&DidGetUsageAndQuota, | |
1718 make_scoped_refptr(original_task_runner), callback)); | |
1719 } | |
1720 | |
1721 QuotaManager* QuotaManagerProxy::quota_manager() const { | |
1722 DCHECK(!io_thread_.get() || io_thread_->BelongsToCurrentThread()); | |
1723 return manager_; | |
1724 } | |
1725 | |
1726 QuotaManagerProxy::QuotaManagerProxy( | |
1727 QuotaManager* manager, base::SingleThreadTaskRunner* io_thread) | |
1728 : manager_(manager), io_thread_(io_thread) { | |
1729 } | |
1730 | |
1731 QuotaManagerProxy::~QuotaManagerProxy() { | |
1732 } | |
1733 | |
1734 } // namespace quota | 1594 } // namespace quota |
OLD | NEW |