172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_BROWSING_DATA_LOCAL_STORAGE_HELPER_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_BROWSING_DATA_LOCAL_STORAGE_HELPER_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include <vector>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/callback.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_path.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/synchronization/lock.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/url_constants.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile;
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This class fetches local storage information in the WebKit thread, and
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// notifies the UI thread upon completion.
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A client of this class need to call StartFetching from the UI thread to
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// initiate the flow, and it'll be notified by the callback in its UI
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// thread at some later point.
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The client must call CancelNotification() if it's destroyed before the
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// callback is notified.
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BrowsingDataLocalStorageHelper
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : public base::RefCountedThreadSafe<BrowsingDataLocalStorageHelper> {
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Contains detailed information about local storage.
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct LocalStorageInfo {
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    LocalStorageInfo();
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LocalStorageInfo(
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        const std::string& protocol,
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        const std::string& host,
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        unsigned short port,
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        const std::string& database_identifier,
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        const std::string& origin,
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        const FilePath& file_path,
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        int64 size,
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        base::Time last_modified);
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ~LocalStorageInfo();
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool IsFileSchemeData() {
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return protocol == chrome::kFileScheme;
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string protocol;
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string host;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    unsigned short port;
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string database_identifier;
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string origin;
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FilePath file_path;
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int64 size;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    base::Time last_modified;
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit BrowsingDataLocalStorageHelper(Profile* profile);
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Starts the fetching process, which will notify its completion via
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // callback.
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This must be called only in the UI thread.
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void StartFetching(
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Callback1<const std::vector<LocalStorageInfo>& >::Type* callback);
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Cancels the notification callback (i.e., the window that created it no
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // longer exists).
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This must be called only in the UI thread.
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void CancelNotification();
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Requests a single local storage file to be deleted in the WEBKIT thread.
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void DeleteLocalStorageFile(const FilePath& file_path);
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class base::RefCountedThreadSafe<BrowsingDataLocalStorageHelper>;
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~BrowsingDataLocalStorageHelper();
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Notifies the completion callback in the UI thread.
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void NotifyInUIThread();
8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  Profile* profile_;
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This only mutates on the UI thread.
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<Callback1<const std::vector<LocalStorageInfo>& >::Type >
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      completion_callback_;
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Indicates whether or not we're currently fetching information:
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // it's true when StartFetching() is called in the UI thread, and it's reset
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // after we notified the callback in the UI thread.
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This only mutates on the UI thread.
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_fetching_;
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // This only mutates in the WEBKIT thread.
9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::vector<LocalStorageInfo> local_storage_info_;
9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private:
9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Enumerates all local storage files in the WEBKIT thread.
9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void FetchLocalStorageInfoInWebKitThread();
9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Delete a single local storage file in the WEBKIT thread.
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void DeleteLocalStorageFileInWebKitThread(const FilePath& file_path);
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(BrowsingDataLocalStorageHelper);
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This class is a thin wrapper around BrowsingDataLocalStorageHelper that does
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// not fetch its information from the local storage tracker, but gets them
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// passed as a parameter during construction.
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CannedBrowsingDataLocalStorageHelper
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : public BrowsingDataLocalStorageHelper {
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit CannedBrowsingDataLocalStorageHelper(Profile* profile);
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Return a copy of the local storage helper. Only one consumer can use the
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // StartFetching method at a time, so we need to create a copy of the helper
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // everytime we instantiate a cookies tree model for it.
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CannedBrowsingDataLocalStorageHelper* Clone();
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add a local storage to the set of canned local storages that is returned
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // by this helper.
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddLocalStorage(const GURL& origin);
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Clear the list of canned local storages.
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Reset();
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // True if no local storages are currently stored.
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool empty() const;
1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // BrowsingDataLocalStorageHelper methods.
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void StartFetching(
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Callback1<const std::vector<LocalStorageInfo>& >::Type* callback);
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void CancelNotification() {}
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~CannedBrowsingDataLocalStorageHelper();
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Convert the pending local storage info to local storage info objects.
13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void ConvertPendingInfoInWebKitThread();
13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Used to protect access to pending_local_storage_info_.
14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  mutable base::Lock lock_;
14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // May mutate on WEBKIT and UI threads.
14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::vector<GURL> pending_local_storage_info_;
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Profile* profile_;
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(CannedBrowsingDataLocalStorageHelper);
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_BROWSING_DATA_LOCAL_STORAGE_HELPER_H_
151