1// Copyright (c) 2012 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_DEVTOOLS_DEVTOOLS_FILE_HELPER_H_ 6#define CHROME_BROWSER_DEVTOOLS_DEVTOOLS_FILE_HELPER_H_ 7 8#include <map> 9#include <string> 10#include <vector> 11 12#include "base/basictypes.h" 13#include "base/callback.h" 14#include "base/memory/ref_counted.h" 15#include "base/memory/weak_ptr.h" 16#include "base/strings/string16.h" 17 18class Profile; 19 20namespace base { 21class FilePath; 22} 23 24namespace content { 25class WebContents; 26} 27 28class DevToolsFileHelper { 29 public: 30 struct FileSystem { 31 FileSystem(); 32 FileSystem(const std::string& file_system_name, 33 const std::string& root_url, 34 const std::string& file_system_path); 35 36 std::string file_system_name; 37 std::string root_url; 38 std::string file_system_path; 39 }; 40 41 DevToolsFileHelper(content::WebContents* web_contents, Profile* profile); 42 ~DevToolsFileHelper(); 43 44 typedef base::Callback<void(void)> SaveCallback; 45 typedef base::Callback<void(void)> AppendCallback; 46 typedef base::Callback< 47 void(const std::vector<DevToolsFileHelper::FileSystem>&)> 48 RequestFileSystemsCallback; 49 typedef base::Callback<void(const DevToolsFileHelper::FileSystem&)> 50 AddFileSystemCallback; 51 typedef base::Callback<void(const base::string16&, 52 const base::Callback<void(bool)>&)> 53 ShowInfoBarCallback; 54 55 // Saves |content| to the file and associates its path with given |url|. 56 // If client is calling this method with given |url| for the first time 57 // or |save_as| is true, confirmation dialog is shown to the user. 58 void Save(const std::string& url, 59 const std::string& content, 60 bool save_as, 61 const SaveCallback& saveCallback, 62 const SaveCallback& cancelCallback); 63 64 // Append |content| to the file that has been associated with given |url|. 65 // The |url| can be associated with a file via calling Save method. 66 // If the Save method has not been called for this |url|, then 67 // Append method does nothing. 68 void Append(const std::string& url, 69 const std::string& content, 70 const AppendCallback& callback); 71 72 // Shows select folder dialog. 73 // If user cancels folder selection, passes empty FileSystem struct to 74 // |callback|. 75 // Shows infobar by means of |show_info_bar_callback| to let the user decide 76 // whether to grant security permissions or not. 77 // If user allows adding file system in infobar, grants renderer read/write 78 // permissions, registers isolated file system for it and passes FileSystem 79 // struct to |callback|. Saves file system path to prefs. 80 // If user denies adding file system in infobar, passes error string to 81 // |callback|. 82 void AddFileSystem(const AddFileSystemCallback& callback, 83 const ShowInfoBarCallback& show_info_bar_callback); 84 85 // Upgrades dragged file system permissions to a read-write access. 86 // Shows infobar by means of |show_info_bar_callback| to let the user decide 87 // whether to grant security permissions or not. 88 // If user allows adding file system in infobar, grants renderer read/write 89 // permissions, registers isolated file system for it and passes FileSystem 90 // struct to |callback|. Saves file system path to prefs. 91 // If user denies adding file system in infobar, passes error string to 92 // |callback|. 93 void UpgradeDraggedFileSystemPermissions( 94 const std::string& file_system_url, 95 const AddFileSystemCallback& callback, 96 const ShowInfoBarCallback& show_info_bar_callback); 97 98 // Loads file system paths from prefs, grants permissions and registers 99 // isolated file system for those of them that contain magic file and passes 100 // FileSystem structs for registered file systems to |callback|. 101 void RequestFileSystems(const RequestFileSystemsCallback& callback); 102 103 // Removes isolated file system for given |file_system_path|. 104 void RemoveFileSystem(const std::string& file_system_path); 105 106 // Returns whether access to the folder on given |file_system_path| was 107 // granted. 108 bool IsFileSystemAdded(const std::string& file_system_path); 109 110 private: 111 void SaveAsFileSelected(const std::string& url, 112 const std::string& content, 113 const SaveCallback& callback, 114 const base::FilePath& path); 115 void SaveAsFileSelectionCanceled(const SaveCallback& callback); 116 void InnerAddFileSystem( 117 const AddFileSystemCallback& callback, 118 const ShowInfoBarCallback& show_info_bar_callback, 119 const base::FilePath& path); 120 void AddUserConfirmedFileSystem( 121 const AddFileSystemCallback& callback, 122 const base::FilePath& path, 123 bool allowed); 124 void RestoreValidatedFileSystems( 125 const RequestFileSystemsCallback& callback, 126 const std::vector<base::FilePath>& file_paths); 127 128 content::WebContents* web_contents_; 129 Profile* profile_; 130 typedef std::map<std::string, base::FilePath> PathsMap; 131 PathsMap saved_files_; 132 base::WeakPtrFactory<DevToolsFileHelper> weak_factory_; 133 DISALLOW_COPY_AND_ASSIGN(DevToolsFileHelper); 134}; 135 136#endif // CHROME_BROWSER_DEVTOOLS_DEVTOOLS_FILE_HELPER_H_ 137