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_DATABASE_HELPER_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_BROWSING_DATA_DATABASE_HELPER_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/callback.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/synchronization/lock.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/url_constants.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/database/database_tracker.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile;
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// This class fetches database information in the WEBKIT thread, and notifies
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// the UI thread upon completion.
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A client of this class need to call StartFetching from the UI thread to
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// initiate the flow, and it'll be notified by the callback in its UI
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// thread at some later point.
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The client must call CancelNotification() if it's destroyed before the
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// callback is notified.
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BrowsingDataDatabaseHelper
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : public base::RefCountedThreadSafe<BrowsingDataDatabaseHelper> {
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Contains detailed information about a web database.
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct DatabaseInfo {
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DatabaseInfo();
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DatabaseInfo(const std::string& host,
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 const std::string& database_name,
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 const std::string& origin_identifier,
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 const std::string& description,
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 const std::string& origin,
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 int64 size,
4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                 base::Time last_modified);
4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ~DatabaseInfo();
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    bool IsFileSchemeData();
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string host;
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string database_name;
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string origin_identifier;
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string description;
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string origin;
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int64 size;
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    base::Time last_modified;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit BrowsingDataDatabaseHelper(Profile* profile);
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Starts the fetching process, which will notify its completion via
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // callback.
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This must be called only in the UI thread.
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void StartFetching(
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Callback1<const std::vector<DatabaseInfo>& >::Type* callback);
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Cancels the notification callback (i.e., the window that created it no
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // longer exists).
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This must be called only in the UI thread.
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void CancelNotification();
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Requests a single database to be deleted in the WEBKIT thread. This must be
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // called in the UI thread.
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void DeleteDatabase(const std::string& origin,
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              const std::string& name);
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class base::RefCountedThreadSafe<BrowsingDataDatabaseHelper>;
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~BrowsingDataDatabaseHelper();
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Notifies the completion callback. This must be called in the UI thread.
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void NotifyInUIThread();
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // This only mutates in the WEBKIT thread.
8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::vector<DatabaseInfo> database_info_;
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This only mutates on the UI thread.
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<Callback1<const std::vector<DatabaseInfo>& >::Type >
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      completion_callback_;
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Indicates whether or not we're currently fetching information:
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // it's true when StartFetching() is called in the UI thread, and it's reset
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // after we notify the callback in the UI thread.
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This only mutates on the UI thread.
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_fetching_;
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private:
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Enumerates all databases. This must be called in the WEBKIT thread.
9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void FetchDatabaseInfoInWebKitThread();
9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Delete a single database file. This must be called in the WEBKIT thread.
9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void DeleteDatabaseInWebKitThread(const std::string& origin,
9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  const std::string& name);
9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_refptr<webkit_database::DatabaseTracker> tracker_;
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(BrowsingDataDatabaseHelper);
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This class is a thin wrapper around BrowsingDataDatabaseHelper that does not
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// fetch its information from the database tracker, but gets them passed as
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// a parameter during construction.
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CannedBrowsingDataDatabaseHelper : public BrowsingDataDatabaseHelper {
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit CannedBrowsingDataDatabaseHelper(Profile* profile);
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Return a copy of the database helper. Only one consumer can use the
113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // StartFetching method at a time, so we need to create a copy of the helper
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // everytime we instantiate a cookies tree model for it.
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CannedBrowsingDataDatabaseHelper* Clone();
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add a database to the set of canned databases that is returned by this
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // helper.
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddDatabase(const GURL& origin,
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   const std::string& name,
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   const std::string& description);
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Clear the list of canned databases.
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Reset();
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // True if no databases are currently stored.
1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool empty() const;
1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // BrowsingDataDatabaseHelper methods.
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void StartFetching(
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Callback1<const std::vector<DatabaseInfo>& >::Type* callback);
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void CancelNotification() {}
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  struct PendingDatabaseInfo {
13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    PendingDatabaseInfo();
13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    PendingDatabaseInfo(const GURL& origin,
13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                        const std::string& name,
13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                        const std::string& description);
14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ~PendingDatabaseInfo();
14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    GURL origin;
14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    std::string name;
14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    std::string description;
14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  };
14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~CannedBrowsingDataDatabaseHelper();
14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Converts the pending database info structs to database info structs.
15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void ConvertInfoInWebKitThread();
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Used to protect access to pending_database_info_.
15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  mutable base::Lock lock_;
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // This may mutate on WEBKIT and UI threads.
15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::vector<PendingDatabaseInfo> pending_database_info_;
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Profile* profile_;
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(CannedBrowsingDataDatabaseHelper);
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_BROWSING_DATA_DATABASE_HELPER_H_
164