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