• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
~Observer()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 
is_removing()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.
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