OLD | NEW |
---|---|
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 #ifndef CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_H_ | 5 #ifndef CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_H_ |
6 #define CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_H_ | 6 #define CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_H_ |
7 | 7 |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <queue> | |
10 #include <set> | 11 #include <set> |
11 | 12 |
12 #include "base/callback_forward.h" | 13 #include "base/callback_forward.h" |
13 #include "base/gtest_prod_util.h" | 14 #include "base/gtest_prod_util.h" |
14 #include "base/macros.h" | 15 #include "base/macros.h" |
15 #include "base/memory/ref_counted.h" | 16 #include "base/memory/ref_counted.h" |
16 #include "base/memory/weak_ptr.h" | 17 #include "base/memory/weak_ptr.h" |
17 #include "base/observer_list.h" | 18 #include "base/observer_list.h" |
18 #include "base/sequenced_task_runner_helpers.h" | 19 #include "base/sequenced_task_runner_helpers.h" |
19 #include "base/synchronization/waitable_event_watcher.h" | 20 #include "base/synchronization/waitable_event_watcher.h" |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
56 } | 57 } |
57 | 58 |
58 namespace net { | 59 namespace net { |
59 class URLRequestContextGetter; | 60 class URLRequestContextGetter; |
60 } | 61 } |
61 | 62 |
62 #if BUILDFLAG(ANDROID_JAVA_UI) | 63 #if BUILDFLAG(ANDROID_JAVA_UI) |
63 class WebappRegistry; | 64 class WebappRegistry; |
64 #endif | 65 #endif |
65 | 66 |
67 //////////////////////////////////////////////////////////////////////////////// | |
66 // BrowsingDataRemover is responsible for removing data related to browsing: | 68 // BrowsingDataRemover is responsible for removing data related to browsing: |
67 // visits in url database, downloads, cookies ... | 69 // visits in url database, downloads, cookies ... |
70 // | |
71 // USAGE: | |
72 // | |
73 // 0. Instantiation. | |
74 // | |
75 // BrowsingDataRemover remover = | |
76 // BrowsingDataRemoverFactory::GetForBrowserContext(profile); | |
77 // | |
78 // 1. No observer. | |
79 // | |
80 // remover->Remove(Unbounded(), REMOVE_COOKIES, ALL); | |
81 // | |
82 // 2. Using an observer to report when one's own removal task is finished. | |
83 // | |
84 // class CookiesDeleter : public BrowsingDataRemover::Observer { | |
85 // CookiesDeleter() { remover->AddObserver(this); } | |
86 // ~CookiesDeleter() { remover->RemoveObserver(this); } | |
87 // | |
88 // void DeleteCookies() { | |
89 // remover->RemoveAndReply(Unbounded(), REMOVE_COOKIES, ALL, this); | |
90 // } | |
91 // | |
92 // void OnBrowsingDataRemoverDone() { | |
93 // LOG(INFO) << "Cookies were deleted."; | |
94 // } | |
95 // } | |
96 // | |
97 // 3. Using an observer to report when any removal task started or all removal | |
98 // tasks finished (i.e. when BrowsingDataRemover changes state from idle | |
99 // to busy and vice versa). | |
100 // | |
101 // class BrowsingDataRemoverStatusObsever { | |
102 // BrowsingDataRemoverStatusObserver() { remover->AddObserver(this); } | |
103 // ~BrowsingDataRemoverStatusObserver() { | |
104 // remover->RemoveObserver(this); | |
105 // } | |
106 // | |
107 // void OnBrowsingDataRemoving(bool removing) { | |
108 // LOG(INFO) << "Remover is now " << (removing ? "busy" : "idle"); | |
109 // } | |
110 // } | |
111 // | |
112 //////////////////////////////////////////////////////////////////////////////// | |
113 | |
68 class BrowsingDataRemover : public KeyedService | 114 class BrowsingDataRemover : public KeyedService |
69 #if defined(ENABLE_PLUGINS) | 115 #if defined(ENABLE_PLUGINS) |
70 , public PepperFlashSettingsManager::Client | 116 , public PepperFlashSettingsManager::Client |
71 #endif | 117 #endif |
72 { | 118 { |
73 public: | 119 public: |
74 // Mask used for Remove. | 120 // Mask used for Remove. |
75 enum RemoveDataMask { | 121 enum RemoveDataMask { |
76 REMOVE_APPCACHE = 1 << 0, | 122 REMOVE_APPCACHE = 1 << 0, |
77 REMOVE_CACHE = 1 << 1, | 123 REMOVE_CACHE = 1 << 1, |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
146 | 192 |
147 struct TimeRange { | 193 struct TimeRange { |
148 TimeRange(base::Time begin, base::Time end) : begin(begin), end(end) {} | 194 TimeRange(base::Time begin, base::Time end) : begin(begin), end(end) {} |
149 bool operator==(const TimeRange& other) const; | 195 bool operator==(const TimeRange& other) const; |
150 | 196 |
151 base::Time begin; | 197 base::Time begin; |
152 base::Time end; | 198 base::Time end; |
153 }; | 199 }; |
154 | 200 |
155 // Observer is notified when the removal is active and when it's done. | 201 // Observer is notified when the removal is active and when it's done. |
202 // TODO(msramek): The semantics of the two methods are slightly different; | |
203 // one is called for every observer at the same time, while the other only | |
204 // for one observer at a time. Split the interface or deprecate | |
205 // OnBrowsingDataRemoving(). | |
156 class Observer { | 206 class Observer { |
157 public: | 207 public: |
158 // NOTE: DEPRECATED; talk to dbeam/msramek before using this. | 208 // NOTE: DEPRECATED; talk to dbeam/msramek before using this. |
159 // | 209 // |
160 // Whether removal is active. Note that not having an active removal is not | 210 // Whether removal is active. Note that not having an active removal is not |
161 // same as completing a removal. That is why the removing status is separate | 211 // same as completing a removal. That is why the removing status is separate |
162 // from the done message. | 212 // from the done message. |
163 virtual void OnBrowsingDataRemoving(bool is_removing) {} | 213 virtual void OnBrowsingDataRemoving(bool is_removing) {} |
164 | 214 |
165 // Done means keywords have been deleted, cache cleared and all other | 215 // Called when a removal task is finished. Note that every removal task can |
166 // removal tasks are scheduled. | 216 // only have one observer attached to it, and only that one is called. |
167 virtual void OnBrowsingDataRemoverDone() {} | 217 virtual void OnBrowsingDataRemoverDone() {} |
168 | 218 |
169 protected: | 219 protected: |
170 virtual ~Observer() {} | 220 virtual ~Observer() {} |
171 }; | 221 }; |
172 | 222 |
173 // The completion inhibitor can artificially delay completion of the browsing | 223 // The completion inhibitor can artificially delay completion of the browsing |
174 // data removal process. It is used during testing to simulate scenarios in | 224 // data removal process. It is used during testing to simulate scenarios in |
175 // which the deletion stalls or takes a very long time. | 225 // which the deletion stalls or takes a very long time. |
176 class CompletionInhibitor { | 226 class CompletionInhibitor { |
(...skipping 18 matching lines...) Expand all Loading... | |
195 | 245 |
196 // Sets a CompletionInhibitor, which will be notified each time an instance is | 246 // Sets a CompletionInhibitor, which will be notified each time an instance is |
197 // about to complete a browsing data removal process, and will be able to | 247 // about to complete a browsing data removal process, and will be able to |
198 // artificially delay the completion. | 248 // artificially delay the completion. |
199 // TODO(crbug.com/483528): Make this non-static. | 249 // TODO(crbug.com/483528): Make this non-static. |
200 static void set_completion_inhibitor_for_testing( | 250 static void set_completion_inhibitor_for_testing( |
201 CompletionInhibitor* inhibitor) { | 251 CompletionInhibitor* inhibitor) { |
202 completion_inhibitor_ = inhibitor; | 252 completion_inhibitor_ = inhibitor; |
203 } | 253 } |
204 | 254 |
205 // Removes the specified items related to browsing for all origins that match | 255 // Removes browsing data within the given |time_range|, with datatypes being |
206 // the provided |origin_type_mask| (see BrowsingDataHelper::OriginTypeMask). | 256 // specified by |remove_mask| and origin types by |origin_type_mask|. |
207 void Remove(const TimeRange& time_range, | 257 void Remove(const TimeRange& time_range, |
208 int remove_mask, | 258 int remove_mask, |
209 int origin_type_mask); | 259 int origin_type_mask); |
210 | 260 |
211 // Removes the specified items related to browsing for all origins that match | 261 // A version of the above that in addition informs the |observer| when the |
212 // the provided |origin_type_mask| (see BrowsingDataHelper::OriginTypeMask). | 262 // removal task is finished. |
213 // The |origin_filter| is used as a final filter for clearing operations. | 263 void RemoveAndReply(const TimeRange& time_range, |
264 int remove_mask, | |
265 int origin_type_mask, | |
266 Observer* observer); | |
267 | |
268 // Like Remove(), but in case of URL-keyed only removes data whose URL match | |
269 // |filter_builder| (e.g. are on certain origin or domain). | |
214 // TODO(dmurph): Support all backends with filter (crbug.com/113621). | 270 // TODO(dmurph): Support all backends with filter (crbug.com/113621). |
215 // DO NOT USE THIS METHOD UNLESS CALLER KNOWS WHAT THEY'RE DOING. NOT ALL | 271 // DO NOT USE THIS METHOD UNLESS CALLER KNOWS WHAT THEY'RE DOING. NOT ALL |
216 // BACKENDS ARE SUPPORTED YET, AND MORE DATA THAN EXPECTED COULD BE DELETED. | 272 // BACKENDS ARE SUPPORTED YET, AND MORE DATA THAN EXPECTED COULD BE DELETED. |
217 virtual void RemoveWithFilter(const TimeRange& time_range, | 273 virtual void RemoveWithFilter( |
218 int remove_mask, | 274 const TimeRange& time_range, |
219 int origin_type_mask, | 275 int remove_mask, |
220 const BrowsingDataFilterBuilder& origin_filter); | 276 int origin_type_mask, |
277 std::unique_ptr<BrowsingDataFilterBuilder> filter_builder); | |
278 | |
279 // A version of the above that in addition informs the |observer| when the | |
280 // removal task is finished. | |
281 virtual void RemoveWithFilterAndReply( | |
282 const TimeRange& time_range, | |
283 int remove_mask, | |
284 int origin_type_mask, | |
285 std::unique_ptr<BrowsingDataFilterBuilder> filter_builder, | |
286 Observer* observer); | |
Bernhard Bauer
2016/08/04 12:30:51
You might want to make these non-virtual anymore.
msramek
2016/08/04 12:48:57
It's actually "not yet" rather than "anymore". Thi
Bernhard Bauer
2016/08/04 12:57:41
Could you just declare the Internal method as virt
Bernhard Bauer
2016/08/04 12:57:41
Could you just declare the Internal method as virt
msramek
2016/08/04 13:20:27
...yes :) Apparently I'm a bit slow today. Done. A
| |
221 | 287 |
222 void AddObserver(Observer* observer); | 288 void AddObserver(Observer* observer); |
223 void RemoveObserver(Observer* observer); | 289 void RemoveObserver(Observer* observer); |
224 | 290 |
225 // Used for testing. | 291 // Used for testing. |
226 void OverrideStoragePartitionForTesting( | 292 void OverrideStoragePartitionForTesting( |
227 content::StoragePartition* storage_partition); | 293 content::StoragePartition* storage_partition); |
228 | 294 |
229 #if BUILDFLAG(ANDROID_JAVA_UI) | 295 #if BUILDFLAG(ANDROID_JAVA_UI) |
230 void OverrideWebappRegistryForTesting( | 296 void OverrideWebappRegistryForTesting( |
(...skipping 14 matching lines...) Expand all Loading... | |
245 // this class. The constructor is protected so that the class is mockable. | 311 // this class. The constructor is protected so that the class is mockable. |
246 BrowsingDataRemover(content::BrowserContext* browser_context); | 312 BrowsingDataRemover(content::BrowserContext* browser_context); |
247 ~BrowsingDataRemover() override; | 313 ~BrowsingDataRemover() override; |
248 | 314 |
249 private: | 315 private: |
250 // The clear API needs to be able to toggle removing_ in order to test that | 316 // The clear API needs to be able to toggle removing_ in order to test that |
251 // only one BrowsingDataRemover instance can be called at a time. | 317 // only one BrowsingDataRemover instance can be called at a time. |
252 FRIEND_TEST_ALL_PREFIXES(ExtensionBrowsingDataTest, OneAtATime); | 318 FRIEND_TEST_ALL_PREFIXES(ExtensionBrowsingDataTest, OneAtATime); |
253 // Testing our static method, ClearSettingsForOneTypeWithPredicate. | 319 // Testing our static method, ClearSettingsForOneTypeWithPredicate. |
254 FRIEND_TEST_ALL_PREFIXES(BrowsingDataRemoverTest, ClearWithPredicate); | 320 FRIEND_TEST_ALL_PREFIXES(BrowsingDataRemoverTest, ClearWithPredicate); |
321 // Testing the private RemovalTask. | |
322 FRIEND_TEST_ALL_PREFIXES(BrowsingDataRemoverTest, MultipleTasks); | |
255 | 323 |
256 // The BrowsingDataRemover tests need to be able to access the implementation | 324 // The BrowsingDataRemover tests need to be able to access the implementation |
257 // of Remove(), as it exposes details that aren't yet available in the public | 325 // of Remove(), as it exposes details that aren't yet available in the public |
258 // API. As soon as those details are exposed via new methods, this should be | 326 // API. As soon as those details are exposed via new methods, this should be |
259 // removed. | 327 // removed. |
260 // | 328 // |
261 // TODO(mkwst): See http://crbug.com/113621 | 329 // TODO(mkwst): See http://crbug.com/113621 |
262 friend class BrowsingDataRemoverTest; | 330 friend class BrowsingDataRemoverTest; |
263 | 331 |
264 friend class BrowsingDataRemoverFactory; | 332 friend class BrowsingDataRemoverFactory; |
265 | 333 |
334 // Represents a single removal task. Contains all parameters needed to execute | |
335 // it and a pointer to the observer that added it. | |
336 struct RemovalTask { | |
337 RemovalTask(const TimeRange& time_range, | |
338 int remove_mask, | |
339 int origin_type_mask, | |
340 std::unique_ptr<BrowsingDataFilterBuilder> filter_builder, | |
341 Observer* observer); | |
342 ~RemovalTask(); | |
343 | |
344 TimeRange time_range; | |
345 int remove_mask; | |
346 int origin_type_mask; | |
347 std::unique_ptr<BrowsingDataFilterBuilder> filter_builder; | |
348 Observer* observer; | |
349 }; | |
350 | |
266 // Clears all host-specific settings for one content type that satisfy the | 351 // Clears all host-specific settings for one content type that satisfy the |
267 // given predicate. | 352 // given predicate. |
268 // | 353 // |
269 // This should only be called on the UI thread. | 354 // This should only be called on the UI thread. |
270 static void ClearSettingsForOneTypeWithPredicate( | 355 static void ClearSettingsForOneTypeWithPredicate( |
271 HostContentSettingsMap* content_settings_map, | 356 HostContentSettingsMap* content_settings_map, |
272 ContentSettingsType content_type, | 357 ContentSettingsType content_type, |
273 const base::Callback< | 358 const base::Callback< |
274 bool(const ContentSettingsPattern& primary_pattern, | 359 bool(const ContentSettingsPattern& primary_pattern, |
275 const ContentSettingsPattern& secondary_pattern)>& predicate); | 360 const ContentSettingsPattern& secondary_pattern)>& predicate); |
(...skipping 15 matching lines...) Expand all Loading... | |
291 // PepperFlashSettingsManager::Client implementation. | 376 // PepperFlashSettingsManager::Client implementation. |
292 void OnDeauthorizeFlashContentLicensesCompleted(uint32_t request_id, | 377 void OnDeauthorizeFlashContentLicensesCompleted(uint32_t request_id, |
293 bool success) override; | 378 bool success) override; |
294 #endif | 379 #endif |
295 | 380 |
296 #if defined (OS_CHROMEOS) | 381 #if defined (OS_CHROMEOS) |
297 void OnClearPlatformKeys(chromeos::DBusMethodCallStatus call_status, | 382 void OnClearPlatformKeys(chromeos::DBusMethodCallStatus call_status, |
298 bool result); | 383 bool result); |
299 #endif | 384 #endif |
300 | 385 |
386 // A common reduction of all public Remove[WithFilter][AndReply] methods. | |
387 virtual void RemoveInternal( | |
388 const TimeRange& time_range, | |
389 int remove_mask, | |
390 int origin_type_mask, | |
391 std::unique_ptr<BrowsingDataFilterBuilder> filter_builder, | |
392 Observer* observer); | |
393 | |
394 // Executes the next removal task. Called after the previous task was finished | |
395 // or directly from Remove() if the task queue was empty. | |
396 void RunNextTask(); | |
397 | |
301 // Removes the specified items related to browsing for a specific host. If the | 398 // Removes the specified items related to browsing for a specific host. If the |
302 // provided |remove_url| is empty, data is removed for all origins; otherwise, | 399 // provided |remove_url| is empty, data is removed for all origins; otherwise, |
303 // it is restricted by the origin filter origin (where implemented yet). The | 400 // it is restricted by the origin filter origin (where implemented yet). The |
304 // |origin_type_mask| parameter defines the set of origins from which data | 401 // |origin_type_mask| parameter defines the set of origins from which data |
305 // should be removed (protected, unprotected, or both). | 402 // should be removed (protected, unprotected, or both). |
306 // TODO(ttr314): Remove "(where implemented yet)" constraint above once | 403 // TODO(ttr314): Remove "(where implemented yet)" constraint above once |
307 // crbug.com/113621 is done. | 404 // crbug.com/113621 is done. |
308 // TODO(crbug.com/589586): Support all backends w/ origin filter. | 405 // TODO(crbug.com/589586): Support all backends w/ origin filter. |
309 void RemoveImpl(const TimeRange& time_range, | 406 void RemoveImpl(const TimeRange& time_range, |
310 int remove_mask, | 407 int remove_mask, |
311 const BrowsingDataFilterBuilder& origin_filter, | 408 const BrowsingDataFilterBuilder& filter_builder, |
312 int origin_type_mask); | 409 int origin_type_mask); |
313 | 410 |
314 // Notifies observers and transitions to the idle state. | 411 // Notifies observers and transitions to the idle state. |
315 void Notify(); | 412 void Notify(); |
316 | 413 |
317 // Checks if we are all done, and if so, calls Notify(). | 414 // Checks if we are all done, and if so, calls Notify(). |
318 void NotifyIfDone(); | 415 void NotifyIfDone(); |
319 | 416 |
320 // Called when history deletion is done. | 417 // Called when history deletion is done. |
321 void OnHistoryDeletionDone(); | 418 void OnHistoryDeletionDone(); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
404 | 501 |
405 // Start time to delete from. | 502 // Start time to delete from. |
406 base::Time delete_begin_; | 503 base::Time delete_begin_; |
407 | 504 |
408 // End time to delete to. | 505 // End time to delete to. |
409 base::Time delete_end_; | 506 base::Time delete_end_; |
410 | 507 |
411 // True if Remove has been invoked. | 508 // True if Remove has been invoked. |
412 bool is_removing_; | 509 bool is_removing_; |
413 | 510 |
511 // Removal tasks to be processed. | |
512 std::queue<RemovalTask> task_queue_; | |
513 | |
414 // If non-NULL, the |completion_inhibitor_| is notified each time an instance | 514 // If non-NULL, the |completion_inhibitor_| is notified each time an instance |
415 // is about to complete a browsing data removal process, and has the ability | 515 // is about to complete a browsing data removal process, and has the ability |
416 // to artificially delay completion. Used for testing. | 516 // to artificially delay completion. Used for testing. |
417 static CompletionInhibitor* completion_inhibitor_; | 517 static CompletionInhibitor* completion_inhibitor_; |
418 | 518 |
419 #if defined(ENABLE_PLUGINS) | 519 #if defined(ENABLE_PLUGINS) |
420 // Used to delete plugin data. | 520 // Used to delete plugin data. |
421 std::unique_ptr<content::PluginDataRemover> plugin_data_remover_; | 521 std::unique_ptr<content::PluginDataRemover> plugin_data_remover_; |
422 base::WaitableEventWatcher watcher_; | 522 base::WaitableEventWatcher watcher_; |
423 | 523 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
459 bool waiting_for_clear_webrtc_logs_ = false; | 559 bool waiting_for_clear_webrtc_logs_ = false; |
460 #endif | 560 #endif |
461 bool waiting_for_clear_auto_sign_in_ = false; | 561 bool waiting_for_clear_auto_sign_in_ = false; |
462 | 562 |
463 // The removal mask for the current removal operation. | 563 // The removal mask for the current removal operation. |
464 int remove_mask_ = 0; | 564 int remove_mask_ = 0; |
465 | 565 |
466 // From which types of origins should we remove data? | 566 // From which types of origins should we remove data? |
467 int origin_type_mask_ = 0; | 567 int origin_type_mask_ = 0; |
468 | 568 |
569 // Observers of the global state and individual tasks. | |
469 base::ObserverList<Observer, true> observer_list_; | 570 base::ObserverList<Observer, true> observer_list_; |
470 | 571 |
471 // Used if we need to clear history. | 572 // Used if we need to clear history. |
472 base::CancelableTaskTracker history_task_tracker_; | 573 base::CancelableTaskTracker history_task_tracker_; |
473 | 574 |
474 std::unique_ptr<TemplateURLService::Subscription> template_url_sub_; | 575 std::unique_ptr<TemplateURLService::Subscription> template_url_sub_; |
475 | 576 |
476 // We do not own this. | 577 // We do not own this. |
477 content::StoragePartition* storage_partition_for_testing_ = nullptr; | 578 content::StoragePartition* storage_partition_for_testing_ = nullptr; |
478 | 579 |
479 #if BUILDFLAG(ANDROID_JAVA_UI) | 580 #if BUILDFLAG(ANDROID_JAVA_UI) |
480 // WebappRegistry makes calls across the JNI. In unit tests, the Java side is | 581 // WebappRegistry makes calls across the JNI. In unit tests, the Java side is |
481 // not initialised, so the registry must be mocked out. | 582 // not initialised, so the registry must be mocked out. |
482 std::unique_ptr<WebappRegistry> webapp_registry_; | 583 std::unique_ptr<WebappRegistry> webapp_registry_; |
483 #endif | 584 #endif |
484 | 585 |
485 base::WeakPtrFactory<BrowsingDataRemover> weak_ptr_factory_; | 586 base::WeakPtrFactory<BrowsingDataRemover> weak_ptr_factory_; |
486 | 587 |
487 DISALLOW_COPY_AND_ASSIGN(BrowsingDataRemover); | 588 DISALLOW_COPY_AND_ASSIGN(BrowsingDataRemover); |
488 }; | 589 }; |
489 | 590 |
490 #endif // CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_H_ | 591 #endif // CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_H_ |
OLD | NEW |