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

Side by Side Diff: chrome/browser/browsing_data/browsing_data_remover.h

Issue 2554413002: Extract embedder-specific data types from BrowsingDataRemover (Closed)
Patch Set: Android fix Created 4 years 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
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 #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 <queue>
11 #include <set> 11 #include <set>
12 12
13 #include "base/callback_forward.h" 13 #include "base/callback_forward.h"
14 #include "base/gtest_prod_util.h" 14 #include "base/gtest_prod_util.h"
15 #include "base/macros.h" 15 #include "base/macros.h"
16 #include "base/memory/ref_counted.h"
17 #include "base/memory/weak_ptr.h" 16 #include "base/memory/weak_ptr.h"
18 #include "base/observer_list.h" 17 #include "base/observer_list.h"
19 #include "base/sequenced_task_runner_helpers.h"
20 #include "base/synchronization/waitable_event_watcher.h" 18 #include "base/synchronization/waitable_event_watcher.h"
21 #include "base/task/cancelable_task_tracker.h"
22 #include "base/time/time.h" 19 #include "base/time/time.h"
23 #include "build/build_config.h" 20 #include "build/build_config.h"
21 #include "chrome/browser/browsing_data/browsing_data_remover_delegate.h"
24 #include "chrome/common/features.h" 22 #include "chrome/common/features.h"
25 #include "components/browsing_data/core/browsing_data_utils.h" 23 #include "components/browsing_data/core/browsing_data_utils.h"
26 #include "components/content_settings/core/common/content_settings_pattern.h"
27 #include "components/content_settings/core/common/content_settings_types.h"
28 #include "components/keyed_service/core/keyed_service.h" 24 #include "components/keyed_service/core/keyed_service.h"
29 #include "components/offline_pages/core/offline_page_model.h"
30 #include "components/prefs/pref_member.h"
31 #include "components/search_engines/template_url_service.h"
32 #include "media/media_features.h"
33 #include "ppapi/features/features.h" 25 #include "ppapi/features/features.h"
34 #include "storage/common/quota/quota_types.h" 26 #include "storage/common/quota/quota_types.h"
35 #include "url/gurl.h" 27 #include "url/gurl.h"
36 28
37 #if BUILDFLAG(ENABLE_PLUGINS)
38 #include "chrome/browser/pepper_flash_settings_manager.h"
39 #endif
40
41 #if defined(OS_CHROMEOS)
42 #include "chromeos/dbus/dbus_method_call_status.h"
43 #endif
44
45 class BrowsingDataFilterBuilder; 29 class BrowsingDataFilterBuilder;
46 class BrowsingDataFlashLSOHelper; 30 class BrowsingDataFlashLSOHelper;
47 class BrowsingDataRemoverFactory; 31 class BrowsingDataRemoverFactory;
48 class Profile; 32 class Profile;
49 class WebappRegistry;
50
51 namespace chrome_browser_net {
52 class Predictor;
53 }
54 33
55 namespace content { 34 namespace content {
56 class BrowserContext; 35 class BrowserContext;
57 class PluginDataRemover; 36 class PluginDataRemover;
58 class StoragePartition; 37 class StoragePartition;
59 } 38 }
60 39
61 //////////////////////////////////////////////////////////////////////////////// 40 ////////////////////////////////////////////////////////////////////////////////
62 // BrowsingDataRemover is responsible for removing data related to browsing: 41 // BrowsingDataRemover is responsible for removing data related to browsing:
63 // visits in url database, downloads, cookies ... 42 // visits in url database, downloads, cookies ...
(...skipping 19 matching lines...) Expand all
83 // remover->RemoveAndReply(Unbounded(), REMOVE_COOKIES, ALL, this); 62 // remover->RemoveAndReply(Unbounded(), REMOVE_COOKIES, ALL, this);
84 // } 63 // }
85 // 64 //
86 // void OnBrowsingDataRemoverDone() { 65 // void OnBrowsingDataRemoverDone() {
87 // LOG(INFO) << "Cookies were deleted."; 66 // LOG(INFO) << "Cookies were deleted.";
88 // } 67 // }
89 // } 68 // }
90 // 69 //
91 //////////////////////////////////////////////////////////////////////////////// 70 ////////////////////////////////////////////////////////////////////////////////
92 71
93 class BrowsingDataRemover : public KeyedService 72 class BrowsingDataRemover : public KeyedService {
94 #if BUILDFLAG(ENABLE_PLUGINS)
95 , public PepperFlashSettingsManager::Client
96 #endif
97 {
98 public: 73 public:
99 // Mask used for Remove. 74 // Mask used for Remove.
100 enum RemoveDataMask { 75 enum RemoveDataMask {
101 REMOVE_APPCACHE = 1 << 0, 76 REMOVE_APPCACHE = 1 << 0,
102 REMOVE_CACHE = 1 << 1, 77 REMOVE_CACHE = 1 << 1,
103 REMOVE_COOKIES = 1 << 2, 78 REMOVE_COOKIES = 1 << 2,
104 REMOVE_DOWNLOADS = 1 << 3, 79 REMOVE_DOWNLOADS = 1 << 3,
105 REMOVE_FILE_SYSTEMS = 1 << 4, 80 REMOVE_FILE_SYSTEMS = 1 << 4,
106 REMOVE_FORM_DATA = 1 << 5, 81 REMOVE_FORM_DATA = 1 << 5,
107 // In addition to visits, REMOVE_HISTORY removes keywords, last session and 82 // In addition to visits, REMOVE_HISTORY removes keywords, last session and
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 207
233 // Sets a CompletionInhibitor, which will be notified each time an instance is 208 // Sets a CompletionInhibitor, which will be notified each time an instance is
234 // about to complete a browsing data removal process, and will be able to 209 // about to complete a browsing data removal process, and will be able to
235 // artificially delay the completion. 210 // artificially delay the completion.
236 // TODO(crbug.com/483528): Make this non-static. 211 // TODO(crbug.com/483528): Make this non-static.
237 static void set_completion_inhibitor_for_testing( 212 static void set_completion_inhibitor_for_testing(
238 CompletionInhibitor* inhibitor) { 213 CompletionInhibitor* inhibitor) {
239 completion_inhibitor_ = inhibitor; 214 completion_inhibitor_ = inhibitor;
240 } 215 }
241 216
217 // Called by the embedder to provide the delegate that will take care of
218 // deleting embedder-specific data.
219 void set_embedder_delegate(
220 std::unique_ptr<BrowsingDataRemoverDelegate> embedder_delegate) {
221 embedder_delegate_ = std::move(embedder_delegate);
222 }
223
224 BrowsingDataRemoverDelegate* get_embedder_delegate() const {
225 return embedder_delegate_.get();
226 }
227
242 // Removes browsing data within the given |time_range|, with datatypes being 228 // Removes browsing data within the given |time_range|, with datatypes being
243 // specified by |remove_mask| and origin types by |origin_type_mask|. 229 // specified by |remove_mask| and origin types by |origin_type_mask|.
244 void Remove(const TimeRange& time_range, 230 void Remove(const TimeRange& time_range,
245 int remove_mask, 231 int remove_mask,
246 int origin_type_mask); 232 int origin_type_mask);
247 233
248 // A version of the above that in addition informs the |observer| when the 234 // A version of the above that in addition informs the |observer| when the
249 // removal task is finished. 235 // removal task is finished.
250 void RemoveAndReply(const TimeRange& time_range, 236 void RemoveAndReply(const TimeRange& time_range,
251 int remove_mask, 237 int remove_mask,
(...skipping 18 matching lines...) Expand all
270 std::unique_ptr<BrowsingDataFilterBuilder> filter_builder, 256 std::unique_ptr<BrowsingDataFilterBuilder> filter_builder,
271 Observer* observer); 257 Observer* observer);
272 258
273 void AddObserver(Observer* observer); 259 void AddObserver(Observer* observer);
274 void RemoveObserver(Observer* observer); 260 void RemoveObserver(Observer* observer);
275 261
276 // Used for testing. 262 // Used for testing.
277 void OverrideStoragePartitionForTesting( 263 void OverrideStoragePartitionForTesting(
278 content::StoragePartition* storage_partition); 264 content::StoragePartition* storage_partition);
279 265
280 #if BUILDFLAG(ANDROID_JAVA_UI)
281 void OverrideWebappRegistryForTesting(
282 std::unique_ptr<WebappRegistry> webapp_registry);
283 #endif
284
285 #if BUILDFLAG(ENABLE_PLUGINS) 266 #if BUILDFLAG(ENABLE_PLUGINS)
286 void OverrideFlashLSOHelperForTesting( 267 void OverrideFlashLSOHelperForTesting(
287 scoped_refptr<BrowsingDataFlashLSOHelper> flash_lso_helper); 268 scoped_refptr<BrowsingDataFlashLSOHelper> flash_lso_helper);
288 #endif 269 #endif
289 270
290 // Parameters of the last call are exposed to be used by tests. Removal and 271 // Parameters of the last call are exposed to be used by tests. Removal and
291 // origin type masks equal to -1 mean that no removal has ever been executed. 272 // origin type masks equal to -1 mean that no removal has ever been executed.
292 // TODO(msramek): If other consumers than tests are interested in this, 273 // TODO(msramek): If other consumers than tests are interested in this,
293 // consider returning them in OnBrowsingDataRemoverDone() callback. 274 // consider returning them in OnBrowsingDataRemoverDone() callback.
294 const base::Time& GetLastUsedBeginTime(); 275 const base::Time& GetLastUsedBeginTime();
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 std::unique_ptr<BrowsingDataFilterBuilder> filter_builder; 321 std::unique_ptr<BrowsingDataFilterBuilder> filter_builder;
341 Observer* observer; 322 Observer* observer;
342 }; 323 };
343 324
344 void Shutdown() override; 325 void Shutdown() override;
345 326
346 // Setter for |is_removing_|; DCHECKs that we can only start removing if we're 327 // Setter for |is_removing_|; DCHECKs that we can only start removing if we're
347 // not already removing, and vice-versa. 328 // not already removing, and vice-versa.
348 void SetRemoving(bool is_removing); 329 void SetRemoving(bool is_removing);
349 330
350 // Callback for when TemplateURLService has finished loading. Clears the data,
351 // clears the respective waiting flag, and invokes NotifyIfDone.
352 void OnKeywordsLoaded(base::Callback<bool(const GURL&)> url_filter);
353
354 #if BUILDFLAG(ENABLE_PLUGINS) 331 #if BUILDFLAG(ENABLE_PLUGINS)
355 // Called when plugin data has been cleared. Invokes NotifyIfDone. 332 // Called when plugin data has been cleared. Invokes NotifyIfDone.
356 void OnWaitableEventSignaled(base::WaitableEvent* waitable_event); 333 void OnWaitableEventSignaled(base::WaitableEvent* waitable_event);
357 334
358 // Called when the list of |sites| storing Flash LSO cookies is fetched. 335 // Called when the list of |sites| storing Flash LSO cookies is fetched.
359 void OnSitesWithFlashDataFetched( 336 void OnSitesWithFlashDataFetched(
360 base::Callback<bool(const std::string&)> plugin_filter, 337 base::Callback<bool(const std::string&)> plugin_filter,
361 const std::vector<std::string>& sites); 338 const std::vector<std::string>& sites);
362 339
363 // Indicates that LSO cookies for one website have been deleted. 340 // Indicates that LSO cookies for one website have been deleted.
364 void OnFlashDataDeleted(); 341 void OnFlashDataDeleted();
365
366 // PepperFlashSettingsManager::Client implementation.
367 void OnDeauthorizeFlashContentLicensesCompleted(uint32_t request_id,
368 bool success) override;
369 #endif
370
371 #if defined (OS_CHROMEOS)
372 void OnClearPlatformKeys(chromeos::DBusMethodCallStatus call_status,
373 bool result);
374 #endif 342 #endif
375 343
376 // Executes the next removal task. Called after the previous task was finished 344 // Executes the next removal task. Called after the previous task was finished
377 // or directly from Remove() if the task queue was empty. 345 // or directly from Remove() if the task queue was empty.
378 void RunNextTask(); 346 void RunNextTask();
379 347
380 // Removes the specified items related to browsing for a specific host. If the 348 // Removes the specified items related to browsing for a specific host. If the
381 // provided |remove_url| is empty, data is removed for all origins; otherwise, 349 // provided |remove_url| is empty, data is removed for all origins; otherwise,
382 // it is restricted by the origin filter origin (where implemented yet). The 350 // it is restricted by the origin filter origin (where implemented yet). The
383 // |origin_type_mask| parameter defines the set of origins from which data 351 // |origin_type_mask| parameter defines the set of origins from which data
384 // should be removed (protected, unprotected, or both). 352 // should be removed (protected, unprotected, or both).
385 // TODO(ttr314): Remove "(where implemented yet)" constraint above once 353 // TODO(ttr314): Remove "(where implemented yet)" constraint above once
386 // crbug.com/113621 is done. 354 // crbug.com/113621 is done.
387 // TODO(crbug.com/589586): Support all backends w/ origin filter. 355 // TODO(crbug.com/589586): Support all backends w/ origin filter.
388 void RemoveImpl(const TimeRange& time_range, 356 void RemoveImpl(const TimeRange& time_range,
389 int remove_mask, 357 int remove_mask,
390 const BrowsingDataFilterBuilder& filter_builder, 358 const BrowsingDataFilterBuilder& filter_builder,
391 int origin_type_mask); 359 int origin_type_mask);
392 360
393 // Notifies observers and transitions to the idle state. 361 // Notifies observers and transitions to the idle state.
394 void Notify(); 362 void Notify();
395 363
396 // Checks if we are all done, and if so, calls Notify(). 364 // Checks if we are all done, and if so, calls Notify().
397 void NotifyIfDone(); 365 void NotifyIfDone();
398 366
399 // Called when history deletion is done.
400 void OnHistoryDeletionDone();
401
402 // Callback for when the hostname resolution cache has been cleared.
403 // Clears the respective waiting flag and invokes NotifyIfDone.
404 void OnClearedHostnameResolutionCache();
405
406 // Callback for when HTTP auth cache has been cleared. 367 // Callback for when HTTP auth cache has been cleared.
407 // Clears the respective waiting flag and invokes NotifyIfDone. 368 // Clears the respective waiting flag and invokes NotifyIfDone.
408 void OnClearedHttpAuthCache(); 369 void OnClearedHttpAuthCache();
409 370
410 // Callback for when speculative data in the network Predictor has been
411 // cleared. Clears the respective waiting flag and invokes
412 // NotifyIfDone.
413 void OnClearedNetworkPredictor();
414
415 // Callback for when network related data in ProfileIOData has been cleared.
416 // Clears the respective waiting flag and invokes NotifyIfDone.
417 void OnClearedNetworkingHistory();
418
419 // Callback for when the cache has been deleted. Invokes 371 // Callback for when the cache has been deleted. Invokes
420 // NotifyIfDone. 372 // NotifyIfDone.
421 void ClearedCache(); 373 void ClearedCache();
422 #if !defined(DISABLE_NACL)
423 // Callback for when the NaCl cache has been deleted. Invokes
424 // NotifyIfDone.
425 void ClearedNaClCache();
426
427 // Callback for when the PNaCl translation cache has been deleted. Invokes
428 // NotifyIfDone.
429 void ClearedPnaclCache();
430
431 #endif
432
433 // Callback for when passwords for the requested time range have been cleared.
434 void OnClearedPasswords();
435
436 // Callback for when passwords stats for the requested time range have been
437 // cleared.
438 void OnClearedPasswordsStats();
439
440 // Callback for when the autosignin state of passwords has been revoked.
441 void OnClearedAutoSignIn();
442 374
443 // Callback for when cookies have been deleted. Invokes NotifyIfDone. 375 // Callback for when cookies have been deleted. Invokes NotifyIfDone.
444 void OnClearedCookies(); 376 void OnClearedCookies();
445 377
446 // Callback for when channel IDs have been deleted. Invokes 378 // Callback for when channel IDs have been deleted. Invokes
447 // NotifyIfDone. 379 // NotifyIfDone.
448 void OnClearedChannelIDs(); 380 void OnClearedChannelIDs();
449 381
450 // Callback from the above method.
451 void OnClearedFormData();
452
453 // Callback for when the Autofill profile and credit card origin URLs have
454 // been deleted.
455 void OnClearedAutofillOriginURLs();
456
457 // Callback on UI thread when the storage partition related data are cleared. 382 // Callback on UI thread when the storage partition related data are cleared.
458 void OnClearedStoragePartitionData(); 383 void OnClearedStoragePartitionData();
459 384
460 #if BUILDFLAG(ENABLE_WEBRTC) 385 // Callback for when all embedder-specific data have been deleted.
461 // Callback on UI thread when the WebRTC logs have been deleted. 386 // Invokes NotifyIfDone.
462 void OnClearedWebRtcLogs(); 387 void OnClearedEmbedderData();
463 #endif
464
465 #if BUILDFLAG(ANDROID_JAVA_UI)
466 // Callback on UI thread when the precache history has been cleared.
467 void OnClearedPrecacheHistory();
468
469 // Callback on UI thread when the offline page data has been cleared.
470 void OnClearedOfflinePageData(
471 offline_pages::OfflinePageModel::DeletePageResult result);
472 #endif
473
474 void OnClearedDomainReliabilityMonitor();
475 388
476 // Returns true if we're all done. 389 // Returns true if we're all done.
477 bool AllDone(); 390 bool AllDone();
478 391
479 // Profile we're to remove from. 392 // Profile we're to remove from.
480 Profile* profile_; 393 Profile* profile_;
481 394
395 // A delegate to delete the embedder-specific data.
396 std::unique_ptr<BrowsingDataRemoverDelegate> embedder_delegate_;
397
482 // Start time to delete from. 398 // Start time to delete from.
483 base::Time delete_begin_; 399 base::Time delete_begin_;
484 400
485 // End time to delete to. 401 // End time to delete to.
486 base::Time delete_end_; 402 base::Time delete_end_;
487 403
488 // The removal mask for the current removal operation. 404 // The removal mask for the current removal operation.
489 int remove_mask_ = 0; 405 int remove_mask_ = 0;
490 406
491 // From which types of origins should we remove data? 407 // From which types of origins should we remove data?
(...skipping 10 matching lines...) Expand all
502 // to artificially delay completion. Used for testing. 418 // to artificially delay completion. Used for testing.
503 static CompletionInhibitor* completion_inhibitor_; 419 static CompletionInhibitor* completion_inhibitor_;
504 420
505 #if BUILDFLAG(ENABLE_PLUGINS) 421 #if BUILDFLAG(ENABLE_PLUGINS)
506 // Used to delete plugin data. 422 // Used to delete plugin data.
507 std::unique_ptr<content::PluginDataRemover> plugin_data_remover_; 423 std::unique_ptr<content::PluginDataRemover> plugin_data_remover_;
508 base::WaitableEventWatcher watcher_; 424 base::WaitableEventWatcher watcher_;
509 425
510 // Used for per-site plugin data deletion. 426 // Used for per-site plugin data deletion.
511 scoped_refptr<BrowsingDataFlashLSOHelper> flash_lso_helper_; 427 scoped_refptr<BrowsingDataFlashLSOHelper> flash_lso_helper_;
512
513 // Used to deauthorize content licenses for Pepper Flash.
514 std::unique_ptr<PepperFlashSettingsManager> pepper_flash_settings_manager_;
515 #endif 428 #endif
516 429
517 uint32_t deauthorize_flash_content_licenses_request_id_ = 0;
518 // True if we're waiting for various data to be deleted. 430 // True if we're waiting for various data to be deleted.
519 // These may only be accessed from UI thread in order to avoid races! 431 // These may only be accessed from UI thread in order to avoid races!
520 bool waiting_for_synchronous_clear_operations_ = false; 432 bool waiting_for_synchronous_clear_operations_ = false;
521 bool waiting_for_clear_autofill_origin_urls_ = false; 433 bool waiting_for_clear_embedder_data_ = false;
522 bool waiting_for_clear_cache_ = false; 434 bool waiting_for_clear_cache_ = false;
523 bool waiting_for_clear_channel_ids_ = false; 435 bool waiting_for_clear_channel_ids_ = false;
524 bool waiting_for_clear_flash_content_licenses_ = false; 436 bool waiting_for_clear_http_auth_cache_ = false;
525 // Non-zero if waiting for cookies to be cleared. 437 bool waiting_for_clear_storage_partition_data_ = false;
526 int waiting_for_clear_cookies_count_ = 0;
527 // Counts the number of plugin data tasks. Should be the number of LSO cookies 438 // Counts the number of plugin data tasks. Should be the number of LSO cookies
528 // to be deleted, or 1 while we're fetching LSO cookies or deleting in bulk. 439 // to be deleted, or 1 while we're fetching LSO cookies or deleting in bulk.
529 int waiting_for_clear_plugin_data_count_ = 0; 440 int waiting_for_clear_plugin_data_count_ = 0;
530 bool waiting_for_clear_domain_reliability_monitor_ = false;
531 bool waiting_for_clear_form_ = false;
532 bool waiting_for_clear_history_ = false;
533 bool waiting_for_clear_hostname_resolution_cache_ = false;
534 bool waiting_for_clear_http_auth_cache_ = false;
535 bool waiting_for_clear_keyword_data_ = false;
536 bool waiting_for_clear_nacl_cache_ = false;
537 bool waiting_for_clear_network_predictor_ = false;
538 bool waiting_for_clear_networking_history_ = false;
539 bool waiting_for_clear_passwords_ = false;
540 bool waiting_for_clear_passwords_stats_ = false;
541 bool waiting_for_clear_platform_keys_ = false;
542 bool waiting_for_clear_pnacl_cache_ = false;
543 #if BUILDFLAG(ANDROID_JAVA_UI)
544 bool waiting_for_clear_precache_history_ = false;
545 bool waiting_for_clear_offline_page_data_ = false;
546 #endif
547 bool waiting_for_clear_storage_partition_data_ = false;
548 #if BUILDFLAG(ENABLE_WEBRTC)
549 bool waiting_for_clear_webrtc_logs_ = false;
550 #endif
551 bool waiting_for_clear_auto_sign_in_ = false;
552 441
553 // Observers of the global state and individual tasks. 442 // Observers of the global state and individual tasks.
554 base::ObserverList<Observer, true> observer_list_; 443 base::ObserverList<Observer, true> observer_list_;
555 444
556 // Used if we need to clear history.
557 base::CancelableTaskTracker history_task_tracker_;
558
559 std::unique_ptr<TemplateURLService::Subscription> template_url_sub_;
560
561 // We do not own this. 445 // We do not own this.
562 content::StoragePartition* storage_partition_for_testing_ = nullptr; 446 content::StoragePartition* storage_partition_for_testing_ = nullptr;
563 447
564 #if BUILDFLAG(ANDROID_JAVA_UI)
565 // WebappRegistry makes calls across the JNI. In unit tests, the Java side is
566 // not initialised, so the registry must be mocked out.
567 std::unique_ptr<WebappRegistry> webapp_registry_;
568 #endif
569
570 base::WeakPtrFactory<BrowsingDataRemover> weak_ptr_factory_; 448 base::WeakPtrFactory<BrowsingDataRemover> weak_ptr_factory_;
571 449
572 DISALLOW_COPY_AND_ASSIGN(BrowsingDataRemover); 450 DISALLOW_COPY_AND_ASSIGN(BrowsingDataRemover);
573 }; 451 };
574 452
575 #endif // CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_H_ 453 #endif // CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698