15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_API_FILE_SYSTEM_FILE_SYSTEM_API_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_API_FILE_SYSTEM_FILE_SYSTEM_API_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_function.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/api/file_system.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/shell_dialogs/select_file_dialog.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace base { 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass FilePath; 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass ExtensionPrefs; 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace file_system_api { 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Methods to get and set the path of the directory containing the last file 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// chosen by the user in response to a chrome.fileSystem.chooseEntry() call for 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// the given extension. 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Returns true and populates result on success; false on failure. 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool GetLastChooseEntryDirectory(const ExtensionPrefs* prefs, 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& extension_id, 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath* path); 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SetLastChooseEntryDirectory(ExtensionPrefs* prefs, 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& extension_id, 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::FilePath& path); 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace file_system_api 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileSystemGetDisplayPathFunction : public SyncExtensionFunction { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_EXTENSION_FUNCTION("fileSystem.getDisplayPath", 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FILESYSTEM_GETDISPLAYPATH) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FileSystemGetDisplayPathFunction() {} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool RunImpl() OVERRIDE; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileSystemEntryFunction : public AsyncExtensionFunction { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum EntryType { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) READ_ONLY, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WRITABLE 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FileSystemEntryFunction(); 54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FileSystemEntryFunction() {} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasFileSystemWritePermission(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // This is called when writable file entries are being returned. The function 60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // will ensure the files exist, creating them if necessary, and also check 61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // that none of the files are links. If it succeeds it proceeds to 62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // RegisterFileSystemsAndSendResponse, otherwise to HandleWritableFileError. 63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void CheckWritableFiles(const std::vector<base::FilePath>& path); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This will finish the choose file process. This is either called directly 66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // from FilesSelected, or from WritableFileChecker. It is called on the UI 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thread. 68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void RegisterFileSystemsAndSendResponse( 69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::vector<base::FilePath>& path); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Creates a response dictionary and sets it as the response to be sent. 72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void CreateResponse(); 73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Adds an entry to the response dictionary. 75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void AddEntryToResponse(const base::FilePath& path, 76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& id_override); 7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // called on the UI thread if there is a problem checking a writable file. 79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void HandleWritableFileError(const std::string& error); 80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Whether multiple entries have been requested. 82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool multiple_; 83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The type of the entry or entries to return. 85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EntryType entry_type_; 86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The dictionary to send as the response. 88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::DictionaryValue* response_; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileSystemGetWritableEntryFunction : public FileSystemEntryFunction { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_EXTENSION_FUNCTION("fileSystem.getWritableEntry", 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FILESYSTEM_GETWRITABLEENTRY) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FileSystemGetWritableEntryFunction() {} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool RunImpl() OVERRIDE; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileSystemIsWritableEntryFunction : public SyncExtensionFunction { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_EXTENSION_FUNCTION("fileSystem.isWritableEntry", 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FILESYSTEM_ISWRITABLEENTRY) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FileSystemIsWritableEntryFunction() {} 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool RunImpl() OVERRIDE; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileSystemChooseEntryFunction : public FileSystemEntryFunction { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow picker UI to be skipped in testing. 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void SkipPickerAndAlwaysSelectPathForTest(base::FilePath* path); 115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static void SkipPickerAndAlwaysSelectPathsForTest( 116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::vector<base::FilePath>* paths); 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static void SkipPickerAndSelectSuggestedPathForTest(); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SkipPickerAndAlwaysCancelForTest(); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void StopSkippingPickerForTest(); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Call this with the directory for test file paths. On Chrome OS, accessed 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // path needs to be explicitly registered for smooth integration with Google 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Drive support. 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void RegisterTempExternalFileSystemForTest(const std::string& name, 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DECLARE_EXTENSION_FUNCTION("fileSystem.chooseEntry", FILESYSTEM_CHOOSEENTRY) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<linked_ptr<extensions::api::file_system::AcceptOption> > 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AcceptOptions; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void BuildFileTypeInfo( 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SelectFileDialog::FileTypeInfo* file_type_info, 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath::StringType& suggested_extension, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AcceptOptions* accepts, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool* acceptsAllTypes); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void BuildSuggestion(const std::string* opt_name, 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* suggested_name, 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath::StringType* suggested_extension); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class FilePicker; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FileSystemChooseEntryFunction() {} 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool RunImpl() OVERRIDE; 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ShowPicker(const ui::SelectFileDialog::FileTypeInfo& file_type_info, 146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui::SelectFileDialog::Type picker_type); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetInitialPathOnFileThread(const base::FilePath& suggested_name, 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& previous_path); 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // FilesSelected and FileSelectionCanceled are called by the file picker. 153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void FilesSelected(const std::vector<base::FilePath>& path); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FileSelectionCanceled(); 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath initial_path_; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class FileSystemRetainEntryFunction : public SyncExtensionFunction { 16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DECLARE_EXTENSION_FUNCTION("fileSystem.retainEntry", FILESYSTEM_RETAINENTRY) 16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) protected: 16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~FileSystemRetainEntryFunction() {} 16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool RunImpl() OVERRIDE; 16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Retains the file entry referenced by |entry_id| in apps::SavedFilesService. 16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // |entry_id| must refer to an entry in an isolated file system. 17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool RetainFileEntry(const std::string& entry_id); 17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class FileSystemIsRestorableFunction : public SyncExtensionFunction { 17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DECLARE_EXTENSION_FUNCTION("fileSystem.isRestorable", FILESYSTEM_ISRESTORABLE) 17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) protected: 17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~FileSystemIsRestorableFunction() {} 17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool RunImpl() OVERRIDE; 18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class FileSystemRestoreEntryFunction : public FileSystemEntryFunction { 18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DECLARE_EXTENSION_FUNCTION("fileSystem.restoreEntry", FILESYSTEM_RESTOREENTRY) 18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) protected: 18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~FileSystemRestoreEntryFunction() {} 18890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool RunImpl() OVERRIDE; 18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 19090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_EXTENSIONS_API_FILE_SYSTEM_FILE_SYSTEM_API_H_ 194