Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(527)

Side by Side Diff: chrome/browser/extensions/api/file_system/file_system_api.h

Issue 2934143002: Move chrome.fileSystem implementation to //extensions (Closed)
Patch Set: rebase Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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_EXTENSIONS_API_FILE_SYSTEM_FILE_SYSTEM_API_H_
6 #define CHROME_BROWSER_EXTENSIONS_API_FILE_SYSTEM_FILE_SYSTEM_API_H_
7
8 #include <memory>
9 #include <string>
10 #include <vector>
11
12 #include "base/files/file.h"
13 #include "base/files/file_path.h"
14 #include "base/macros.h"
15 #include "base/memory/weak_ptr.h"
16 #include "base/values.h"
17 #include "build/build_config.h"
18 #include "chrome/browser/extensions/chrome_extension_function.h"
19 #include "chrome/browser/extensions/chrome_extension_function_details.h"
20 #include "chrome/common/extensions/api/file_system.h"
21 #include "extensions/browser/extension_function.h"
22 #include "ui/shell_dialogs/select_file_dialog.h"
23
24 #if defined(OS_CHROMEOS)
25 #include "chrome/browser/extensions/api/file_system/consent_provider.h"
26 #endif
27
28 namespace content {
29 class WebContents;
30 } // namespace content
31
32 namespace extensions {
33 class ExtensionPrefs;
34
35 namespace file_system_api {
36
37 // Methods to get and set the path of the directory containing the last file
38 // chosen by the user in response to a chrome.fileSystem.chooseEntry() call for
39 // the given extension.
40
41 // Returns an empty path on failure.
42 base::FilePath GetLastChooseEntryDirectory(const ExtensionPrefs* prefs,
43 const std::string& extension_id);
44
45 void SetLastChooseEntryDirectory(ExtensionPrefs* prefs,
46 const std::string& extension_id,
47 const base::FilePath& path);
48
49 #if defined(OS_CHROMEOS)
50 // Dispatches an event about a mounted on unmounted volume in the system to
51 // each extension which can request it.
52 void DispatchVolumeListChangeEvent(Profile* profile);
53 #endif
54
55 } // namespace file_system_api
56
57 class FileSystemGetDisplayPathFunction : public UIThreadExtensionFunction {
58 public:
59 DECLARE_EXTENSION_FUNCTION("fileSystem.getDisplayPath",
60 FILESYSTEM_GETDISPLAYPATH)
61
62 protected:
63 ~FileSystemGetDisplayPathFunction() override {}
64 ResponseAction Run() override;
65 };
66
67 class FileSystemEntryFunction : public ChromeAsyncExtensionFunction {
68 protected:
69 FileSystemEntryFunction();
70
71 ~FileSystemEntryFunction() override {}
72
73 // This is called when writable file entries are being returned. The function
74 // will ensure the files exist, creating them if necessary, and also check
75 // that none of the files are links. If it succeeds it proceeds to
76 // RegisterFileSystemsAndSendResponse, otherwise to HandleWritableFileError.
77 void PrepareFilesForWritableApp(const std::vector<base::FilePath>& path);
78
79 // This will finish the choose file process. This is either called directly
80 // from FilesSelected, or from WritableFileChecker. It is called on the UI
81 // thread.
82 void RegisterFileSystemsAndSendResponse(
83 const std::vector<base::FilePath>& path);
84
85 // Creates a result dictionary.
86 std::unique_ptr<base::DictionaryValue> CreateResult();
87
88 // Adds an entry to the result dictionary.
89 void AddEntryToResult(const base::FilePath& path,
90 const std::string& id_override,
91 base::DictionaryValue* result);
92
93 // called on the UI thread if there is a problem checking a writable file.
94 void HandleWritableFileError(const base::FilePath& error_path);
95
96 // Whether multiple entries have been requested.
97 bool multiple_;
98
99 // Whether a directory has been requested.
100 bool is_directory_;
101 };
102
103 class FileSystemGetWritableEntryFunction : public FileSystemEntryFunction {
104 public:
105 DECLARE_EXTENSION_FUNCTION("fileSystem.getWritableEntry",
106 FILESYSTEM_GETWRITABLEENTRY)
107
108 protected:
109 ~FileSystemGetWritableEntryFunction() override {}
110 bool RunAsync() override;
111
112 private:
113 void CheckPermissionAndSendResponse();
114 void SetIsDirectoryAsync();
115
116 // The path to the file for which a writable entry has been requested.
117 base::FilePath path_;
118 };
119
120 class FileSystemIsWritableEntryFunction : public UIThreadExtensionFunction {
121 public:
122 DECLARE_EXTENSION_FUNCTION("fileSystem.isWritableEntry",
123 FILESYSTEM_ISWRITABLEENTRY)
124
125 protected:
126 ~FileSystemIsWritableEntryFunction() override {}
127 ResponseAction Run() override;
128 };
129
130 class FileSystemChooseEntryFunction : public FileSystemEntryFunction {
131 public:
132 // Allow picker UI to be skipped in testing.
133 static void SkipPickerAndAlwaysSelectPathForTest(base::FilePath* path);
134 static void SkipPickerAndAlwaysSelectPathsForTest(
135 std::vector<base::FilePath>* paths);
136 static void SkipPickerAndSelectSuggestedPathForTest();
137 static void SkipPickerAndAlwaysCancelForTest();
138 static void StopSkippingPickerForTest();
139 // Allow directory access confirmation UI to be skipped in testing.
140 static void SkipDirectoryConfirmationForTest();
141 static void AutoCancelDirectoryConfirmationForTest();
142 static void StopSkippingDirectoryConfirmationForTest();
143 // Call this with the directory for test file paths. On Chrome OS, accessed
144 // path needs to be explicitly registered for smooth integration with Google
145 // Drive support.
146 static void RegisterTempExternalFileSystemForTest(const std::string& name,
147 const base::FilePath& path);
148 DECLARE_EXTENSION_FUNCTION("fileSystem.chooseEntry", FILESYSTEM_CHOOSEENTRY)
149
150 typedef std::vector<api::file_system::AcceptOption> AcceptOptions;
151
152 static void BuildFileTypeInfo(
153 ui::SelectFileDialog::FileTypeInfo* file_type_info,
154 const base::FilePath::StringType& suggested_extension,
155 const AcceptOptions* accepts,
156 const bool* acceptsAllTypes);
157 static void BuildSuggestion(const std::string* opt_name,
158 base::FilePath* suggested_name,
159 base::FilePath::StringType* suggested_extension);
160
161 protected:
162 ~FileSystemChooseEntryFunction() override {}
163 bool RunAsync() override;
164 void ShowPicker(const ui::SelectFileDialog::FileTypeInfo& file_type_info,
165 ui::SelectFileDialog::Type picker_type);
166
167 private:
168 void SetInitialPathAndShowPicker(
169 const base::FilePath& previous_path,
170 const base::FilePath& suggested_name,
171 const ui::SelectFileDialog::FileTypeInfo& file_type_info,
172 ui::SelectFileDialog::Type picker_type,
173 bool is_path_non_native_directory);
174
175 // FilesSelected and FileSelectionCanceled are called by the file picker.
176 void FilesSelected(const std::vector<base::FilePath>& paths);
177 void FileSelectionCanceled();
178
179 // Check if the chosen directory is or is an ancestor of a sensitive
180 // directory. If so, show a dialog to confirm that the user wants to open the
181 // directory. Calls OnDirectoryAccessConfirmed if the directory isn't
182 // sensitive or the user chooses to open it. Otherwise, calls
183 // FileSelectionCanceled.
184 void ConfirmDirectoryAccessAsync(bool non_native_path,
185 const std::vector<base::FilePath>& paths,
186 content::WebContents* web_contents);
187 void OnDirectoryAccessConfirmed(const std::vector<base::FilePath>& paths);
188
189 base::FilePath initial_path_;
190 };
191
192 class FileSystemRetainEntryFunction : public ChromeAsyncExtensionFunction {
193 public:
194 DECLARE_EXTENSION_FUNCTION("fileSystem.retainEntry", FILESYSTEM_RETAINENTRY)
195
196 protected:
197 ~FileSystemRetainEntryFunction() override {}
198 bool RunAsync() override;
199
200 private:
201 // Retains the file entry referenced by |entry_id| in apps::SavedFilesService.
202 // |entry_id| must refer to an entry in an isolated file system. |path| is a
203 // path of the entry. |file_info| is base::File::Info of the entry if it can
204 // be obtained.
205 void RetainFileEntry(const std::string& entry_id,
206 const base::FilePath& path,
207 std::unique_ptr<base::File::Info> file_info);
208 };
209
210 class FileSystemIsRestorableFunction : public UIThreadExtensionFunction {
211 public:
212 DECLARE_EXTENSION_FUNCTION("fileSystem.isRestorable", FILESYSTEM_ISRESTORABLE)
213
214 protected:
215 ~FileSystemIsRestorableFunction() override {}
216 ResponseAction Run() override;
217 };
218
219 class FileSystemRestoreEntryFunction : public FileSystemEntryFunction {
220 public:
221 DECLARE_EXTENSION_FUNCTION("fileSystem.restoreEntry", FILESYSTEM_RESTOREENTRY)
222
223 protected:
224 ~FileSystemRestoreEntryFunction() override {}
225 bool RunAsync() override;
226 };
227
228 class FileSystemObserveDirectoryFunction : public UIThreadExtensionFunction {
229 public:
230 DECLARE_EXTENSION_FUNCTION("fileSystem.observeDirectory",
231 FILESYSTEM_OBSERVEDIRECTORY)
232
233 protected:
234 ~FileSystemObserveDirectoryFunction() override {}
235 ResponseAction Run() override;
236 };
237
238 class FileSystemUnobserveEntryFunction : public UIThreadExtensionFunction {
239 public:
240 DECLARE_EXTENSION_FUNCTION("fileSystem.unobserveEntry",
241 FILESYSTEM_UNOBSERVEENTRY)
242
243 protected:
244 ~FileSystemUnobserveEntryFunction() override {}
245 ResponseAction Run() override;
246 };
247
248 class FileSystemGetObservedEntriesFunction : public UIThreadExtensionFunction {
249 public:
250 DECLARE_EXTENSION_FUNCTION("fileSystem.getObservedEntries",
251 FILESYSTEM_GETOBSERVEDENTRIES);
252
253 protected:
254 ~FileSystemGetObservedEntriesFunction() override {}
255 ResponseAction Run() override;
256 };
257
258 #if !defined(OS_CHROMEOS)
259 // Stub for non Chrome OS operating systems.
260 class FileSystemRequestFileSystemFunction : public UIThreadExtensionFunction {
261 public:
262 DECLARE_EXTENSION_FUNCTION("fileSystem.requestFileSystem",
263 FILESYSTEM_REQUESTFILESYSTEM);
264
265 protected:
266 ~FileSystemRequestFileSystemFunction() override {}
267
268 // UIThreadExtensionFunction overrides.
269 ExtensionFunction::ResponseAction Run() override;
270 };
271
272 // Stub for non Chrome OS operating systems.
273 class FileSystemGetVolumeListFunction : public UIThreadExtensionFunction {
274 public:
275 DECLARE_EXTENSION_FUNCTION("fileSystem.getVolumeList",
276 FILESYSTEM_GETVOLUMELIST);
277
278 protected:
279 ~FileSystemGetVolumeListFunction() override {}
280
281 // UIThreadExtensionFunction overrides.
282 ExtensionFunction::ResponseAction Run() override;
283 };
284
285 #else
286 // Requests a file system for the specified volume id.
287 class FileSystemRequestFileSystemFunction : public UIThreadExtensionFunction {
288 public:
289 DECLARE_EXTENSION_FUNCTION("fileSystem.requestFileSystem",
290 FILESYSTEM_REQUESTFILESYSTEM)
291 FileSystemRequestFileSystemFunction();
292
293 protected:
294 ~FileSystemRequestFileSystemFunction() override;
295
296 // UIThreadExtensionFunction overrides.
297 ExtensionFunction::ResponseAction Run() override;
298
299 private:
300 // Called when a user grants or rejects permissions for the file system
301 // access.
302 void OnConsentReceived(const base::WeakPtr<file_manager::Volume>& volume,
303 bool writable,
304 file_system_api::ConsentProvider::Consent result);
305
306 ChromeExtensionFunctionDetails chrome_details_;
307 };
308
309 // Requests a list of available volumes.
310 class FileSystemGetVolumeListFunction : public UIThreadExtensionFunction {
311 public:
312 DECLARE_EXTENSION_FUNCTION("fileSystem.getVolumeList",
313 FILESYSTEM_GETVOLUMELIST);
314 FileSystemGetVolumeListFunction();
315
316 protected:
317 ~FileSystemGetVolumeListFunction() override;
318
319 // UIThreadExtensionFunction overrides.
320 ExtensionFunction::ResponseAction Run() override;
321
322 private:
323 ChromeExtensionFunctionDetails chrome_details_;
324 };
325 #endif
326
327 } // namespace extensions
328
329 #endif // CHROME_BROWSER_EXTENSIONS_API_FILE_SYSTEM_FILE_SYSTEM_API_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698