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 // The QuotaService uses heuristics to limit abusive requests | 5 // The QuotaService uses heuristics to limit abusive requests |
6 // made by extensions. In this model 'items' (e.g individual bookmarks) are | 6 // made by extensions. In this model 'items' (e.g individual bookmarks) are |
7 // represented by a 'Bucket' that holds state for that item for one single | 7 // represented by a 'Bucket' that holds state for that item for one single |
8 // interval of time. The interval of time is defined as 'how long we need to | 8 // interval of time. The interval of time is defined as 'how long we need to |
9 // watch an item (for a particular heuristic) before making a decision about | 9 // watch an item (for a particular heuristic) before making a decision about |
10 // quota violations'. A heuristic is two functions: one mapping input | 10 // quota violations'. A heuristic is two functions: one mapping input |
(...skipping 27 matching lines...) Expand all Loading... |
38 // | 38 // |
39 // The QuotaService needs to live entirely on one thread, i.e. be created, | 39 // The QuotaService needs to live entirely on one thread, i.e. be created, |
40 // called and destroyed on the same thread, due to its use of a RepeatingTimer. | 40 // called and destroyed on the same thread, due to its use of a RepeatingTimer. |
41 // It is not a KeyedService because instances exist on both the UI | 41 // It is not a KeyedService because instances exist on both the UI |
42 // and IO threads. | 42 // and IO threads. |
43 class QuotaService : public base::NonThreadSafe { | 43 class QuotaService : public base::NonThreadSafe { |
44 public: | 44 public: |
45 // Some concrete heuristics (declared below) that ExtensionFunctions can | 45 // Some concrete heuristics (declared below) that ExtensionFunctions can |
46 // use to help the service make decisions about quota violations. | 46 // use to help the service make decisions about quota violations. |
47 class TimedLimit; | 47 class TimedLimit; |
48 class SustainedLimit; | |
49 | 48 |
50 QuotaService(); | 49 QuotaService(); |
51 virtual ~QuotaService(); | 50 virtual ~QuotaService(); |
52 | 51 |
53 // Decide whether the invocation of |function| with argument |args| by the | 52 // Decide whether the invocation of |function| with argument |args| by the |
54 // extension specified by |extension_id| results in a quota limit violation. | 53 // extension specified by |extension_id| results in a quota limit violation. |
55 // Returns an error message representing the failure if quota was exceeded, | 54 // Returns an error message representing the failure if quota was exceeded, |
56 // or empty-string if the request is fine and can proceed. | 55 // or empty-string if the request is fine and can proceed. |
57 std::string Assess(const std::string& extension_id, | 56 std::string Assess(const std::string& extension_id, |
58 ExtensionFunction* function, | 57 ExtensionFunction* function, |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
209 | 208 |
210 // A simple per-item heuristic to limit the number of events that can occur in | 209 // A simple per-item heuristic to limit the number of events that can occur in |
211 // a given period of time; e.g "no more than 100 events in an hour". | 210 // a given period of time; e.g "no more than 100 events in an hour". |
212 class QuotaService::TimedLimit : public QuotaLimitHeuristic { | 211 class QuotaService::TimedLimit : public QuotaLimitHeuristic { |
213 public: | 212 public: |
214 TimedLimit(const Config& config, BucketMapper* map, const std::string& name) | 213 TimedLimit(const Config& config, BucketMapper* map, const std::string& name) |
215 : QuotaLimitHeuristic(config, map, name) {} | 214 : QuotaLimitHeuristic(config, map, name) {} |
216 bool Apply(Bucket* bucket, const base::TimeTicks& event_time) override; | 215 bool Apply(Bucket* bucket, const base::TimeTicks& event_time) override; |
217 }; | 216 }; |
218 | 217 |
219 // A per-item heuristic to limit the number of events that can occur in a | |
220 // period of time over a sustained longer interval. E.g "no more than two | |
221 // events per minute, sustained over 10 minutes". | |
222 class QuotaService::SustainedLimit : public QuotaLimitHeuristic { | |
223 public: | |
224 SustainedLimit(const base::TimeDelta& sustain, | |
225 const Config& config, | |
226 BucketMapper* map, | |
227 const std::string& name); | |
228 bool Apply(Bucket* bucket, const base::TimeTicks& event_time) override; | |
229 | |
230 private: | |
231 // Specifies how long exhaustion of buckets is allowed to continue before | |
232 // denying requests. | |
233 const int64 repeat_exhaustion_allowance_; | |
234 int64 num_available_repeat_exhaustions_; | |
235 }; | |
236 | |
237 } // namespace extensions | 218 } // namespace extensions |
238 | 219 |
239 #endif // EXTENSIONS_BROWSER_QUOTA_SERVICE_H_ | 220 #endif // EXTENSIONS_BROWSER_QUOTA_SERVICE_H_ |
OLD | NEW |