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 45 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>; 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); 107 virtual void CancelNotification() {} 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