Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(394)

Side by Side Diff: webkit/quota/usage_tracker.cc

Issue 10827298: Quota UsageTracker ASAN fix (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « webkit/quota/usage_tracker.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/quota/usage_tracker.h" 5 #include "webkit/quota/usage_tracker.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <deque> 8 #include <deque>
9 #include <set> 9 #include <set>
10 #include <string> 10 #include <string>
(...skipping 18 matching lines...) Expand all
29 public: 29 public:
30 GatherUsageTaskBase( 30 GatherUsageTaskBase(
31 UsageTracker* tracker, 31 UsageTracker* tracker,
32 QuotaClient* client) 32 QuotaClient* client)
33 : QuotaTask(tracker), 33 : QuotaTask(tracker),
34 client_(client), 34 client_(client),
35 tracker_(tracker), 35 tracker_(tracker),
36 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { 36 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
37 DCHECK(tracker_); 37 DCHECK(tracker_);
38 DCHECK(client_); 38 DCHECK(client_);
39 client_tracker_ = tracker_->GetClientTracker(client_->id()); 39 client_tracker_ = base::AsWeakPtr(
40 DCHECK(client_tracker_); 40 tracker_->GetClientTracker(client_->id()));
41 DCHECK(client_tracker_.get());
41 } 42 }
42 virtual ~GatherUsageTaskBase() {} 43 virtual ~GatherUsageTaskBase() {}
43 44
44 // Get total usage for the given |origins|. 45 // Get total usage for the given |origins|.
45 void GetUsageForOrigins(const std::set<GURL>& origins, StorageType type) { 46 void GetUsageForOrigins(const std::set<GURL>& origins, StorageType type) {
46 DCHECK(original_task_runner()->BelongsToCurrentThread()); 47 DCHECK(original_task_runner()->BelongsToCurrentThread());
48 if (!client_tracker()) {
49 DeleteSoon();
50 return;
51 }
47 // We do not get usage for origins for which we have valid usage cache. 52 // We do not get usage for origins for which we have valid usage cache.
48 std::vector<GURL> origins_to_gather; 53 std::vector<GURL> origins_to_gather;
49 std::set<GURL> cached_origins; 54 std::set<GURL> cached_origins;
50 client_tracker()->GetCachedOrigins(&cached_origins); 55 client_tracker()->GetCachedOrigins(&cached_origins);
51 std::set<GURL> already_added; 56 std::set<GURL> already_added;
52 for (std::set<GURL>::const_iterator iter = origins.begin(); 57 for (std::set<GURL>::const_iterator iter = origins.begin();
53 iter != origins.end(); ++iter) { 58 iter != origins.end(); ++iter) {
54 if (cached_origins.find(*iter) == cached_origins.end() && 59 if (cached_origins.find(*iter) == cached_origins.end() &&
55 already_added.insert(*iter).second) { 60 already_added.insert(*iter).second) {
56 origins_to_gather.push_back(*iter); 61 origins_to_gather.push_back(*iter);
(...skipping 23 matching lines...) Expand all
80 base::Bind(&GatherUsageTaskBase::DidGetUsage, 85 base::Bind(&GatherUsageTaskBase::DidGetUsage,
81 weak_factory_.GetWeakPtr())); 86 weak_factory_.GetWeakPtr()));
82 } 87 }
83 88
84 protected: 89 protected:
85 virtual void Aborted() OVERRIDE { 90 virtual void Aborted() OVERRIDE {
86 DeleteSoon(); 91 DeleteSoon();
87 } 92 }
88 93
89 UsageTracker* tracker() const { return tracker_; } 94 UsageTracker* tracker() const { return tracker_; }
90 ClientUsageTracker* client_tracker() const { return client_tracker_; } 95 ClientUsageTracker* client_tracker() const { return client_tracker_.get(); }
91 96
92 private: 97 private:
93 void DidGetUsage(int64 usage) { 98 void DidGetUsage(int64 usage) {
99 if (!client_tracker()) {
100 DeleteSoon();
101 return;
102 }
103
94 DCHECK(original_task_runner()->BelongsToCurrentThread()); 104 DCHECK(original_task_runner()->BelongsToCurrentThread());
95 DCHECK(!pending_origins_.empty()); 105 DCHECK(!pending_origins_.empty());
96 DCHECK(client_tracker_);
97 106
98 // Defend against confusing inputs from QuotaClients. 107 // Defend against confusing inputs from QuotaClients.
99 DCHECK_GE(usage, 0); 108 DCHECK_GE(usage, 0);
100 if (usage < 0) 109 if (usage < 0)
101 usage = 0; 110 usage = 0;
102 111
103 // This code assumes DidGetUsage callbacks are called in the same 112 // This code assumes DidGetUsage callbacks are called in the same
104 // order as we dispatched GetOriginUsage calls. 113 // order as we dispatched GetOriginUsage calls.
105 const GURL& origin = pending_origins_.front(); 114 const GURL& origin = pending_origins_.front();
106 std::string host = net::GetHostOrSpecFromURL(origin); 115 std::string host = net::GetHostOrSpecFromURL(origin);
107 client_tracker_->AddCachedOrigin(origin, usage); 116 client_tracker_->AddCachedOrigin(origin, usage);
108 117
109 pending_origins_.pop_front(); 118 pending_origins_.pop_front();
110 if (pending_origins_.empty() || 119 if (pending_origins_.empty() ||
111 host != net::GetHostOrSpecFromURL(pending_origins_.front())) { 120 host != net::GetHostOrSpecFromURL(pending_origins_.front())) {
112 client_tracker_->AddCachedHost(host); 121 client_tracker_->AddCachedHost(host);
113 } 122 }
114 123
115 if (pending_origins_.empty()) { 124 if (pending_origins_.empty()) {
116 // We're done. 125 // We're done.
117 CallCompleted(); 126 CallCompleted();
118 DeleteSoon(); 127 DeleteSoon();
119 } 128 }
120 } 129 }
121 130
122 QuotaClient* client_; 131 QuotaClient* client_;
123 UsageTracker* tracker_; 132 UsageTracker* tracker_;
124 ClientUsageTracker* client_tracker_; 133 base::WeakPtr<ClientUsageTracker> client_tracker_;
125 std::deque<GURL> pending_origins_; 134 std::deque<GURL> pending_origins_;
126 std::map<GURL, int64> origin_usage_map_; 135 std::map<GURL, int64> origin_usage_map_;
127 base::WeakPtrFactory<GatherUsageTaskBase> weak_factory_; 136 base::WeakPtrFactory<GatherUsageTaskBase> weak_factory_;
128 137
129 DISALLOW_COPY_AND_ASSIGN(GatherUsageTaskBase); 138 DISALLOW_COPY_AND_ASSIGN(GatherUsageTaskBase);
130 }; 139 };
131 140
132 // A task class for getting the total amount of data used for a given storage 141 // A task class for getting the total amount of data used for a given storage
133 // type. This class is self-destructed. 142 // type. This class is self-destructed.
134 class ClientUsageTracker::GatherGlobalUsageTask 143 class ClientUsageTracker::GatherGlobalUsageTask
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 void ClientUsageTracker::NoopHostUsageCallback( 519 void ClientUsageTracker::NoopHostUsageCallback(
511 const std::string& host, StorageType type, int64 usage) { 520 const std::string& host, StorageType type, int64 usage) {
512 } 521 }
513 522
514 bool ClientUsageTracker::IsStorageUnlimited(const GURL& origin) const { 523 bool ClientUsageTracker::IsStorageUnlimited(const GURL& origin) const {
515 return special_storage_policy_.get() && 524 return special_storage_policy_.get() &&
516 special_storage_policy_->IsStorageUnlimited(origin); 525 special_storage_policy_->IsStorageUnlimited(origin);
517 } 526 }
518 527
519 } // namespace quota 528 } // namespace quota
OLDNEW
« no previous file with comments | « webkit/quota/usage_tracker.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698