• 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