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