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