• 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_INDEXED_DB_HELPER_H_
6 #define CHROME_BROWSER_BROWSING_DATA_INDEXED_DB_HELPER_H_
7 #pragma once
8 
9 #include <string>
10 #include <vector>
11 
12 #include "base/callback.h"
13 #include "base/file_path.h"
14 #include "base/memory/ref_counted.h"
15 #include "base/memory/scoped_ptr.h"
16 #include "base/synchronization/lock.h"
17 #include "base/time.h"
18 #include "chrome/common/url_constants.h"
19 #include "googleurl/src/gurl.h"
20 
21 class Profile;
22 
23 // BrowsingDataIndexedDBHelper is an interface for classes dealing with
24 // aggregating and deleting browsing data stored in indexed databases.  A
25 // client of this class need to call StartFetching from the UI thread to
26 // initiate the flow, and it'll be notified by the callback in its UI thread at
27 // some later point.  The client must call CancelNotification() if it's
28 // destroyed before the callback is notified.
29 class BrowsingDataIndexedDBHelper
30     : public base::RefCountedThreadSafe<BrowsingDataIndexedDBHelper> {
31  public:
32   // Contains detailed information about an indexed database.
33   struct IndexedDBInfo {
34     IndexedDBInfo(
35         const std::string& protocol,
36         const std::string& host,
37         unsigned short port,
38         const std::string& database_identifier,
39         const std::string& origin,
40         const FilePath& file_path,
41         int64 size,
42         base::Time last_modified);
43     ~IndexedDBInfo();
44 
IsFileSchemeDataIndexedDBInfo45     bool IsFileSchemeData() {
46       return protocol == chrome::kFileScheme;
47     }
48 
49     std::string protocol;
50     std::string host;
51     unsigned short port;
52     std::string database_identifier;
53     std::string origin;
54     FilePath file_path;
55     int64 size;
56     base::Time last_modified;
57   };
58 
59   // Create a BrowsingDataIndexedDBHelper instance for the indexed databases
60   // stored in |profile|'s user data directory.
61   static BrowsingDataIndexedDBHelper* Create(Profile* profile);
62 
63   // Starts the fetching process, which will notify its completion via
64   // callback.
65   // This must be called only in the UI thread.
66   virtual void StartFetching(
67       Callback1<const std::vector<IndexedDBInfo>& >::Type* callback) = 0;
68   // Cancels the notification callback (i.e., the window that created it no
69   // longer exists).
70   // This must be called only in the UI thread.
71   virtual void CancelNotification() = 0;
72   // Requests a single indexed database file to be deleted in the WEBKIT thread.
73   virtual void DeleteIndexedDBFile(const FilePath& file_path) = 0;
74 
75  protected:
76   friend class base::RefCountedThreadSafe<BrowsingDataIndexedDBHelper>;
~BrowsingDataIndexedDBHelper()77   virtual ~BrowsingDataIndexedDBHelper() {}
78 };
79 
80 // This class is an implementation of BrowsingDataIndexedDBHelper that does
81 // not fetch its information from the indexed database tracker, but gets them
82 // passed as a parameter.
83 class CannedBrowsingDataIndexedDBHelper
84     : public BrowsingDataIndexedDBHelper {
85  public:
86   explicit CannedBrowsingDataIndexedDBHelper(Profile* profile);
87 
88   // Return a copy of the IndexedDB helper. Only one consumer can use the
89   // StartFetching method at a time, so we need to create a copy of the helper
90   // everytime we instantiate a cookies tree model for it.
91   CannedBrowsingDataIndexedDBHelper* Clone();
92 
93   // Add a indexed database to the set of canned indexed databases that is
94   // returned by this helper.
95   void AddIndexedDB(const GURL& origin,
96                     const string16& description);
97 
98   // Clear the list of canned indexed databases.
99   void Reset();
100 
101   // True if no indexed databases are currently stored.
102   bool empty() const;
103 
104   // BrowsingDataIndexedDBHelper methods.
105   virtual void StartFetching(
106       Callback1<const std::vector<IndexedDBInfo>& >::Type* callback);
CancelNotification()107   virtual void CancelNotification() {}
DeleteIndexedDBFile(const FilePath & file_path)108   virtual void DeleteIndexedDBFile(const FilePath& file_path) {}
109 
110  private:
111   struct PendingIndexedDBInfo {
112     PendingIndexedDBInfo();
113     PendingIndexedDBInfo(const GURL& origin, const string16& description);
114     ~PendingIndexedDBInfo();
115 
116     GURL origin;
117     string16 description;
118   };
119 
120   virtual ~CannedBrowsingDataIndexedDBHelper();
121 
122   // Convert the pending indexed db info to indexed db info objects.
123   void ConvertPendingInfoInWebKitThread();
124 
125   void NotifyInUIThread();
126 
127   Profile* profile_;
128 
129   // Lock to protect access to pending_indexed_db_info_;
130   mutable base::Lock lock_;
131 
132   // This may mutate on WEBKIT and UI threads.
133   std::vector<PendingIndexedDBInfo> pending_indexed_db_info_;
134 
135   // This only mutates on the WEBKIT thread.
136   std::vector<IndexedDBInfo> indexed_db_info_;
137 
138   // This only mutates on the UI thread.
139   scoped_ptr<Callback1<const std::vector<IndexedDBInfo>& >::Type >
140       completion_callback_;
141 
142   // Indicates whether or not we're currently fetching information:
143   // it's true when StartFetching() is called in the UI thread, and it's reset
144   // after we notified the callback in the UI thread.
145   // This only mutates on the UI thread.
146   bool is_fetching_;
147 
148   DISALLOW_COPY_AND_ASSIGN(CannedBrowsingDataIndexedDBHelper);
149 };
150 
151 #endif  // CHROME_BROWSER_BROWSING_DATA_INDEXED_DB_HELPER_H_
152