Home | History | Annotate | Download | only in browser
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_BROWSING_DATA_REMOVER_H_
      6 #define CHROME_BROWSER_BROWSING_DATA_REMOVER_H_
      7 #pragma once
      8 
      9 #include <vector>
     10 
     11 #include "base/memory/ref_counted.h"
     12 #include "base/observer_list.h"
     13 #include "base/synchronization/waitable_event_watcher.h"
     14 #include "base/time.h"
     15 #include "content/browser/appcache/chrome_appcache_service.h"
     16 #include "content/browser/cancelable_request.h"
     17 #include "content/common/notification_registrar.h"
     18 
     19 class ExtensionSpecialStoragePolicy;
     20 class IOThread;
     21 class PluginDataRemover;
     22 class Profile;
     23 
     24 namespace disk_cache {
     25 class Backend;
     26 }
     27 
     28 namespace net {
     29 class URLRequestContextGetter;
     30 }
     31 
     32 namespace webkit_database {
     33 class DatabaseTracker;
     34 }
     35 
     36 // BrowsingDataRemover is responsible for removing data related to browsing:
     37 // visits in url database, downloads, cookies ...
     38 
     39 class BrowsingDataRemover : public NotificationObserver,
     40                             public base::WaitableEventWatcher::Delegate {
     41  public:
     42   // Time period ranges available when doing browsing data removals.
     43   enum TimePeriod {
     44     LAST_HOUR = 0,
     45     LAST_DAY,
     46     LAST_WEEK,
     47     FOUR_WEEKS,
     48     EVERYTHING
     49   };
     50 
     51   // Mask used for Remove.
     52 
     53   // In addition to visits, this removes keywords and the last session.
     54   static const int REMOVE_HISTORY = 1 << 0;
     55   static const int REMOVE_DOWNLOADS = 1 << 1;
     56   static const int REMOVE_COOKIES = 1 << 2;
     57   static const int REMOVE_PASSWORDS = 1 << 3;
     58   static const int REMOVE_FORM_DATA = 1 << 4;
     59   static const int REMOVE_CACHE = 1 << 5;
     60   static const int REMOVE_LSO_DATA = 1 << 6;
     61 
     62   // Observer is notified when the removal is done. Done means keywords have
     63   // been deleted, cache cleared and all other tasks scheduled.
     64   class Observer {
     65    public:
     66     virtual void OnBrowsingDataRemoverDone() = 0;
     67 
     68    protected:
     69     virtual ~Observer() {}
     70   };
     71 
     72   // Creates a BrowsingDataRemover to remove browser data from the specified
     73   // profile in the specified time range. Use Remove to initiate the removal.
     74   BrowsingDataRemover(Profile* profile, base::Time delete_begin,
     75                       base::Time delete_end);
     76 
     77   // Creates a BrowsingDataRemover to remove browser data from the specified
     78   // profile in the specified time range.
     79   BrowsingDataRemover(Profile* profile, TimePeriod time_period,
     80                       base::Time delete_end);
     81 
     82   // Removes the specified items related to browsing.
     83   void Remove(int remove_mask);
     84 
     85   void AddObserver(Observer* observer);
     86   void RemoveObserver(Observer* observer);
     87 
     88   // Called when history deletion is done.
     89   void OnHistoryDeletionDone();
     90 
     91   static bool is_removing() { return removing_; }
     92 
     93  private:
     94   enum CacheState {
     95     STATE_NONE,
     96     STATE_CREATE_MAIN,
     97     STATE_CREATE_MEDIA,
     98     STATE_DELETE_MAIN,
     99     STATE_DELETE_MEDIA,
    100     STATE_DONE
    101   };
    102 
    103   // BrowsingDataRemover deletes itself (using DeleteTask) and is not supposed
    104   // to be deleted by other objects so make destructor private and DeleteTask
    105   // a friend.
    106   friend class DeleteTask<BrowsingDataRemover>;
    107   ~BrowsingDataRemover();
    108 
    109   // NotificationObserver method. Callback when TemplateURLModel has finished
    110   // loading. Deletes the entries from the model, and if we're not waiting on
    111   // anything else notifies observers and deletes this BrowsingDataRemover.
    112   virtual void Observe(NotificationType type,
    113                        const NotificationSource& source,
    114                        const NotificationDetails& details);
    115 
    116   // WaitableEventWatcher implementation.
    117   // Called when plug-in data has been cleared. Invokes NotifyAndDeleteIfDone.
    118   virtual void OnWaitableEventSignaled(base::WaitableEvent* waitable_event);
    119 
    120   // If we're not waiting on anything, notifies observers and deletes this
    121   // object.
    122   void NotifyAndDeleteIfDone();
    123 
    124   // Callback when the network history has been deleted. Invokes
    125   // NotifyAndDeleteIfDone.
    126   void ClearedNetworkHistory();
    127 
    128   // Invoked on the IO thread to clear the HostCache, speculative data about
    129   // subresources on visited sites, and initial navigation history.
    130   void ClearNetworkingHistory(IOThread* io_thread);
    131 
    132   // Callback when the cache has been deleted. Invokes NotifyAndDeleteIfDone.
    133   void ClearedCache();
    134 
    135   // Invoked on the IO thread to delete from the cache.
    136   void ClearCacheOnIOThread();
    137 
    138   // Performs the actual work to delete the cache.
    139   void DoClearCache(int rv);
    140 
    141   // Callback when HTML5 databases have been deleted. Invokes
    142   // NotifyAndDeleteIfDone.
    143   void OnClearedDatabases(int rv);
    144 
    145   // Invoked on the FILE thread to delete HTML5 databases.
    146   void ClearDatabasesOnFILEThread();
    147 
    148   // Callback when the appcache has been cleared. Invokes
    149   // NotifyAndDeleteIfDone.
    150   void OnClearedAppCache();
    151 
    152   // Invoked on the IO thread to delete from the AppCache.
    153   void ClearAppCacheOnIOThread();
    154 
    155   // Lower level helpers.
    156   void OnGotAppCacheInfo(int rv);
    157   void OnAppCacheDeleted(int rv);
    158   ChromeAppCacheService* GetAppCacheService();
    159 
    160   // Calculate the begin time for the deletion range specified by |time_period|.
    161   base::Time CalculateBeginDeleteTime(TimePeriod time_period);
    162 
    163   // Returns true if we're all done.
    164   bool all_done() {
    165     return registrar_.IsEmpty() && !waiting_for_clear_cache_ &&
    166            !waiting_for_clear_history_ &&
    167            !waiting_for_clear_networking_history_ &&
    168            !waiting_for_clear_databases_ && !waiting_for_clear_appcache_ &&
    169            !waiting_for_clear_lso_data_;
    170   }
    171 
    172   NotificationRegistrar registrar_;
    173 
    174   // Profile we're to remove from.
    175   Profile* profile_;
    176 
    177   // 'Protected' origins are not subject to data removal.
    178   scoped_refptr<ExtensionSpecialStoragePolicy> special_storage_policy_;
    179 
    180   // Start time to delete from.
    181   const base::Time delete_begin_;
    182 
    183   // End time to delete to.
    184   const base::Time delete_end_;
    185 
    186   // True if Remove has been invoked.
    187   static bool removing_;
    188 
    189   // Reference to database tracker held while deleting databases.
    190   scoped_refptr<webkit_database::DatabaseTracker> database_tracker_;
    191 
    192   net::CompletionCallbackImpl<BrowsingDataRemover> database_cleared_callback_;
    193   net::CompletionCallbackImpl<BrowsingDataRemover> cache_callback_;
    194 
    195   // Used to clear the appcache.
    196   net::CompletionCallbackImpl<BrowsingDataRemover> appcache_got_info_callback_;
    197   net::CompletionCallbackImpl<BrowsingDataRemover> appcache_deleted_callback_;
    198   scoped_refptr<appcache::AppCacheInfoCollection> appcache_info_;
    199   int appcaches_to_be_deleted_count_;
    200 
    201   // Used to delete data from the HTTP caches.
    202   CacheState next_cache_state_;
    203   disk_cache::Backend* cache_;
    204 
    205   // Used to delete data from HTTP cache and appcache.
    206   scoped_refptr<net::URLRequestContextGetter> main_context_getter_;
    207   scoped_refptr<net::URLRequestContextGetter> media_context_getter_;
    208 
    209   // Used to delete plugin data.
    210   scoped_refptr<PluginDataRemover> plugin_data_remover_;
    211   base::WaitableEventWatcher watcher_;
    212 
    213   // True if we're waiting for various data to be deleted.
    214   bool waiting_for_clear_databases_;
    215   bool waiting_for_clear_history_;
    216   bool waiting_for_clear_networking_history_;
    217   bool waiting_for_clear_cache_;
    218   bool waiting_for_clear_appcache_;
    219   bool waiting_for_clear_lso_data_;
    220 
    221   ObserverList<Observer> observer_list_;
    222 
    223   // Used if we need to clear history.
    224   CancelableRequestConsumer request_consumer_;
    225 
    226   DISALLOW_COPY_AND_ASSIGN(BrowsingDataRemover);
    227 };
    228 
    229 #endif  // CHROME_BROWSER_BROWSING_DATA_REMOVER_H_
    230