• 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_DATABASE_HELPER_H_
6 #define CHROME_BROWSER_BROWSING_DATA_DATABASE_HELPER_H_
7 #pragma once
8 
9 #include <string>
10 #include <vector>
11 
12 #include "base/callback.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/synchronization/lock.h"
15 #include "chrome/common/url_constants.h"
16 #include "googleurl/src/gurl.h"
17 #include "webkit/database/database_tracker.h"
18 
19 class Profile;
20 
21 // This class fetches database information in the WEBKIT thread, and notifies
22 // the UI thread upon completion.
23 // A client of this class need to call StartFetching from the UI thread to
24 // initiate the flow, and it'll be notified by the callback in its UI
25 // thread at some later point.
26 // The client must call CancelNotification() if it's destroyed before the
27 // callback is notified.
28 class BrowsingDataDatabaseHelper
29     : public base::RefCountedThreadSafe<BrowsingDataDatabaseHelper> {
30  public:
31   // Contains detailed information about a web database.
32   struct DatabaseInfo {
33     DatabaseInfo();
34     DatabaseInfo(const std::string& host,
35                  const std::string& database_name,
36                  const std::string& origin_identifier,
37                  const std::string& description,
38                  const std::string& origin,
39                  int64 size,
40                  base::Time last_modified);
41     ~DatabaseInfo();
42 
43     bool IsFileSchemeData();
44 
45     std::string host;
46     std::string database_name;
47     std::string origin_identifier;
48     std::string description;
49     std::string origin;
50     int64 size;
51     base::Time last_modified;
52   };
53 
54   explicit BrowsingDataDatabaseHelper(Profile* profile);
55 
56   // Starts the fetching process, which will notify its completion via
57   // callback.
58   // This must be called only in the UI thread.
59   virtual void StartFetching(
60       Callback1<const std::vector<DatabaseInfo>& >::Type* callback);
61 
62   // Cancels the notification callback (i.e., the window that created it no
63   // longer exists).
64   // This must be called only in the UI thread.
65   virtual void CancelNotification();
66 
67   // Requests a single database to be deleted in the WEBKIT thread. This must be
68   // called in the UI thread.
69   virtual void DeleteDatabase(const std::string& origin,
70                               const std::string& name);
71 
72  protected:
73   friend class base::RefCountedThreadSafe<BrowsingDataDatabaseHelper>;
74   virtual ~BrowsingDataDatabaseHelper();
75 
76   // Notifies the completion callback. This must be called in the UI thread.
77   void NotifyInUIThread();
78 
79   // This only mutates in the WEBKIT thread.
80   std::vector<DatabaseInfo> database_info_;
81 
82   // This only mutates on the UI thread.
83   scoped_ptr<Callback1<const std::vector<DatabaseInfo>& >::Type >
84       completion_callback_;
85 
86   // Indicates whether or not we're currently fetching information:
87   // it's true when StartFetching() is called in the UI thread, and it's reset
88   // after we notify the callback in the UI thread.
89   // This only mutates on the UI thread.
90   bool is_fetching_;
91 
92  private:
93   // Enumerates all databases. This must be called in the WEBKIT thread.
94   void FetchDatabaseInfoInWebKitThread();
95 
96   // Delete a single database file. This must be called in the WEBKIT thread.
97   void DeleteDatabaseInWebKitThread(const std::string& origin,
98                                   const std::string& name);
99 
100   scoped_refptr<webkit_database::DatabaseTracker> tracker_;
101 
102   DISALLOW_COPY_AND_ASSIGN(BrowsingDataDatabaseHelper);
103 };
104 
105 // This class is a thin wrapper around BrowsingDataDatabaseHelper that does not
106 // fetch its information from the database tracker, but gets them passed as
107 // a parameter during construction.
108 class CannedBrowsingDataDatabaseHelper : public BrowsingDataDatabaseHelper {
109  public:
110   explicit CannedBrowsingDataDatabaseHelper(Profile* profile);
111 
112   // Return a copy of the database helper. Only one consumer can use the
113   // StartFetching method at a time, so we need to create a copy of the helper
114   // everytime we instantiate a cookies tree model for it.
115   CannedBrowsingDataDatabaseHelper* Clone();
116 
117   // Add a database to the set of canned databases that is returned by this
118   // helper.
119   void AddDatabase(const GURL& origin,
120                    const std::string& name,
121                    const std::string& description);
122 
123   // Clear the list of canned databases.
124   void Reset();
125 
126   // True if no databases are currently stored.
127   bool empty() const;
128 
129   // BrowsingDataDatabaseHelper methods.
130   virtual void StartFetching(
131       Callback1<const std::vector<DatabaseInfo>& >::Type* callback);
CancelNotification()132   virtual void CancelNotification() {}
133 
134  private:
135   struct PendingDatabaseInfo {
136     PendingDatabaseInfo();
137     PendingDatabaseInfo(const GURL& origin,
138                         const std::string& name,
139                         const std::string& description);
140     ~PendingDatabaseInfo();
141 
142     GURL origin;
143     std::string name;
144     std::string description;
145   };
146 
147   virtual ~CannedBrowsingDataDatabaseHelper();
148 
149   // Converts the pending database info structs to database info structs.
150   void ConvertInfoInWebKitThread();
151 
152   // Used to protect access to pending_database_info_.
153   mutable base::Lock lock_;
154 
155   // This may mutate on WEBKIT and UI threads.
156   std::vector<PendingDatabaseInfo> pending_database_info_;
157 
158   Profile* profile_;
159 
160   DISALLOW_COPY_AND_ASSIGN(CannedBrowsingDataDatabaseHelper);
161 };
162 
163 #endif  // CHROME_BROWSER_BROWSING_DATA_DATABASE_HELPER_H_
164