1 // Copyright (c) 2011 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_EXTENSIONS_EXTENSION_FILE_BROWSER_PRIVATE_API_H_ 6 #define CHROME_BROWSER_EXTENSIONS_EXTENSION_FILE_BROWSER_PRIVATE_API_H_ 7 #pragma once 8 9 #include <map> 10 #include <string> 11 #include <vector> 12 13 #include "base/platform_file.h" 14 #include "chrome/browser/extensions/extension_function.h" 15 #include "chrome/browser/ui/shell_dialogs.h" 16 #include "googleurl/src/url_util.h" 17 #include "webkit/fileapi/file_system_callback_dispatcher.h" 18 19 class GURL; 20 class HtmlDialogView; 21 22 // Implements the chrome.fileBrowserPrivate.requestLocalFileSystem method. 23 class RequestLocalFileSystemFunction : public AsyncExtensionFunction { 24 protected: 25 friend class LocalFileSystemCallbackDispatcher; 26 // AsyncExtensionFunction overrides. 27 virtual bool RunImpl() OVERRIDE; 28 void RespondSuccessOnUIThread(const std::string& name, 29 const GURL& root_path); 30 void RespondFailedOnUIThread(base::PlatformFileError error_code); 31 void RequestOnFileThread(const GURL& source_url, int child_id); 32 DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.requestLocalFileSystem"); 33 }; 34 35 // Implements the chrome.fileBrowserPrivate.getFileTasks method. 36 class GetFileTasksFileBrowserFunction : public AsyncExtensionFunction { 37 protected: 38 // AsyncExtensionFunction overrides. 39 virtual bool RunImpl() OVERRIDE; 40 41 private: 42 DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.getFileTasks"); 43 }; 44 45 46 // Implements the chrome.fileBrowserPrivate.executeTask method. 47 class ExecuteTasksFileBrowserFunction : public AsyncExtensionFunction { 48 protected: 49 // AsyncExtensionFunction overrides. 50 virtual bool RunImpl() OVERRIDE; 51 52 private: 53 struct FileDefinition { 54 GURL target_file_url; 55 FilePath virtual_path; 56 bool is_directory; 57 }; 58 typedef std::vector<FileDefinition> FileDefinitionList; 59 friend class ExecuteTasksFileSystemCallbackDispatcher; 60 // Initates execution of context menu tasks identified with |task_id| for 61 // each element of |files_list|. 62 bool InitiateFileTaskExecution(const std::string& task_id, 63 ListValue* files_list); 64 void RequestFileEntryOnFileThread(const GURL& source_url, 65 const std::string& task_id, 66 const std::vector<GURL>& file_urls); 67 void RespondFailedOnUIThread(base::PlatformFileError error_code); 68 void ExecuteFileActionsOnUIThread(const std::string& task_id, 69 const std::string& file_system_name, 70 const GURL& file_system_root, 71 const FileDefinitionList& file_list); 72 void ExecuteFailedOnUIThread(); 73 DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.executeTask"); 74 }; 75 76 // Parent class for the chromium extension APIs for the file dialog. 77 class FileDialogFunction 78 : public AsyncExtensionFunction { 79 public: 80 FileDialogFunction(); 81 82 // Register/unregister callbacks. 83 // When file selection events occur in a tab, we'll call back the 84 // appropriate listener with the right params. 85 class Callback { 86 public: Callback(SelectFileDialog::Listener * listener,HtmlDialogView * dialog,void * params)87 Callback(SelectFileDialog::Listener* listener, 88 HtmlDialogView* dialog, 89 void* params) 90 : listener_(listener), 91 dialog_(dialog), 92 params_(params) { 93 } listener()94 SelectFileDialog::Listener* listener() const { return listener_; } dialog()95 HtmlDialogView* dialog() const { return dialog_; } params()96 void* params() const { return params_; } IsNull()97 bool IsNull() const { return listener_ == NULL; } 98 99 static void Add(int32 tab_id, 100 SelectFileDialog::Listener* listener, 101 HtmlDialogView* dialog, 102 void* params); 103 static void Remove(int32 tab_id); 104 static const Callback& Find(int32 tab_id); null()105 static const Callback& null() { return null_; } 106 107 private: 108 109 SelectFileDialog::Listener* listener_; 110 HtmlDialogView* dialog_; 111 void* params_; 112 113 // statics. 114 typedef std::map<int32, Callback> Map; 115 static Map map_; 116 static Callback null_; 117 }; 118 119 protected: 120 typedef std::vector<GURL> UrlList; 121 typedef std::vector<FilePath> FilePathList; 122 123 virtual ~FileDialogFunction(); 124 125 // Convert virtual paths to local paths on the file thread. 126 void GetLocalPathsOnFileThread(const UrlList& file_urls, 127 const std::string& internal_task_id); 128 129 // Callback with converted local paths. GetLocalPathsResponseOnUIThread(const FilePathList & files,const std::string & internal_task_id)130 virtual void GetLocalPathsResponseOnUIThread(const FilePathList& files, 131 const std::string& internal_task_id) {} 132 133 // Get the callback for the hosting tab. 134 const Callback& GetCallback() const; 135 136 // Closes the dialog window containing the file dialog HtmlDialogView. 137 void CloseDialog(HtmlDialogView* dialog); 138 139 private: 140 // Figure out the tab_id of the hosting tab. 141 int32 GetTabId() const; 142 }; 143 144 // Select a single file. Closes the dialog window. 145 class SelectFileFunction 146 : public FileDialogFunction { 147 public: SelectFileFunction()148 SelectFileFunction() {} 149 150 protected: ~SelectFileFunction()151 virtual ~SelectFileFunction() {} 152 153 // AsyncExtensionFunction overrides. 154 virtual bool RunImpl() OVERRIDE; 155 156 // FileDialogFunction overrides. 157 virtual void GetLocalPathsResponseOnUIThread( 158 const FilePathList& files, const std::string& internal_task_id) OVERRIDE; 159 160 private: 161 DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.selectFile"); 162 }; 163 164 // View multiple selected files. Window stays open. 165 class ViewFilesFunction 166 : public FileDialogFunction { 167 public: 168 ViewFilesFunction(); 169 170 protected: 171 virtual ~ViewFilesFunction(); 172 173 // AsyncExtensionFunction overrides. 174 virtual bool RunImpl() OVERRIDE; 175 176 // FileDialogFunction overrides. 177 virtual void GetLocalPathsResponseOnUIThread( 178 const FilePathList& files, const std::string& internal_task_id) OVERRIDE; 179 180 private: 181 DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.viewFiles"); 182 }; 183 184 // Select multiple files. Closes the dialog window. 185 class SelectFilesFunction 186 : public FileDialogFunction { 187 public: 188 SelectFilesFunction(); 189 190 protected: 191 virtual ~SelectFilesFunction(); 192 193 // AsyncExtensionFunction overrides. 194 virtual bool RunImpl() OVERRIDE; 195 196 // FileDialogFunction overrides. 197 virtual void GetLocalPathsResponseOnUIThread( 198 const FilePathList& files, const std::string& internal_task_id) OVERRIDE; 199 200 private: 201 DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.selectFiles"); 202 }; 203 204 // Cancel file selection Dialog. Closes the dialog window. 205 class CancelFileDialogFunction 206 : public FileDialogFunction { 207 public: CancelFileDialogFunction()208 CancelFileDialogFunction() {} 209 210 protected: ~CancelFileDialogFunction()211 virtual ~CancelFileDialogFunction() {} 212 213 // AsyncExtensionFunction overrides. 214 virtual bool RunImpl() OVERRIDE; 215 216 private: 217 DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.cancelDialog"); 218 }; 219 220 // File Dialog Strings. 221 class FileDialogStringsFunction : public SyncExtensionFunction { 222 public: FileDialogStringsFunction()223 FileDialogStringsFunction() {} 224 225 protected: ~FileDialogStringsFunction()226 virtual ~FileDialogStringsFunction() {} 227 228 // SyncExtensionFunction overrides. 229 virtual bool RunImpl() OVERRIDE; 230 231 private: 232 DECLARE_EXTENSION_FUNCTION_NAME("fileBrowserPrivate.getStrings"); 233 }; 234 235 #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_FILE_BROWSER_PRIVATE_API_H_ 236