| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef EXTENSIONS_BROWSER_API_FILE_SYSTEM_FILE_SYSTEM_DELEGATE_H_ |
| #define EXTENSIONS_BROWSER_API_FILE_SYSTEM_FILE_SYSTEM_DELEGATE_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "base/callback_forward.h" |
| #include "base/macros.h" |
| #include "base/memory/ref_counted.h" |
| #include "build/build_config.h" |
| #include "build/chromeos_buildflags.h" |
| #include "extensions/common/api/file_system.h" |
| #include "ui/shell_dialogs/select_file_dialog.h" |
| |
| class ExtensionFunction; |
| |
| namespace base { |
| class FilePath; |
| } // namespace base |
| |
| namespace content { |
| class BrowserContext; |
| class RenderFrameHost; |
| class WebContents; |
| } // namespace content |
| |
| namespace extensions { |
| |
| class Extension; |
| class SavedFilesServiceInterface; |
| |
| // Delegate class for embedder-specific file system access. |
| class FileSystemDelegate { |
| public: |
| using ErrorCallback = base::OnceCallback<void(const std::string&)>; |
| using FileSystemCallback = |
| base::OnceCallback<void(const std::string& id, const std::string& path)>; |
| using FilesSelectedCallback = |
| base::OnceCallback<void(const std::vector<base::FilePath>& paths)>; |
| using VolumeListCallback = |
| base::OnceCallback<void(const std::vector<api::file_system::Volume>&)>; |
| |
| enum GrantVolumesMode { kGrantAll, kGrantNone, kGrantPerVolume }; |
| |
| virtual ~FileSystemDelegate() {} |
| |
| virtual base::FilePath GetDefaultDirectory() = 0; |
| |
| // Shows a dialog to prompt the user to select files/directories. Returns |
| // false if the dialog cannot be shown, i.e. there is no valid WebContents. |
| virtual bool ShowSelectFileDialog( |
| scoped_refptr<ExtensionFunction> extension_function, |
| ui::SelectFileDialog::Type type, |
| const base::FilePath& default_path, |
| const ui::SelectFileDialog::FileTypeInfo* file_types, |
| FileSystemDelegate::FilesSelectedCallback files_selected_callback, |
| base::OnceClosure file_selection_canceled_callback) = 0; |
| |
| // Confirms (e.g. with a dialog) whether the user wants to open the directory |
| // for a given app. |
| virtual void ConfirmSensitiveDirectoryAccess( |
| bool has_write_permission, |
| const std::u16string& app_name, |
| content::WebContents* web_contents, |
| base::OnceClosure on_accept, |
| base::OnceClosure on_cancel) = 0; |
| |
| // Finds a string describing the accept type. Returns 0 if no applicable |
| // string ID is found. |
| virtual int GetDescriptionIdForAcceptType(const std::string& accept_type) = 0; |
| |
| #if BUILDFLAG(IS_CHROMEOS_ASH) |
| // Checks whether the extension can be granted access. |
| virtual GrantVolumesMode GetGrantVolumesMode( |
| content::BrowserContext* browser_context, |
| content::RenderFrameHost* render_frame_host, |
| const Extension& extension) = 0; |
| |
| // Grants or denies an extension's request for access to the named file |
| // system. May prompt the user for consent. |
| virtual void RequestFileSystem(content::BrowserContext* browser_context, |
| scoped_refptr<ExtensionFunction> requester, |
| const Extension& extension, |
| std::string volume_id, |
| bool writable, |
| FileSystemCallback success_callback, |
| ErrorCallback error_callback) = 0; |
| |
| // Immediately calls VolumeListCallback or ErrorCallback. |
| virtual void GetVolumeList(content::BrowserContext* browser_context, |
| const Extension& extension, |
| VolumeListCallback success_callback, |
| ErrorCallback error_callback) = 0; |
| #endif |
| |
| virtual SavedFilesServiceInterface* GetSavedFilesService( |
| content::BrowserContext* browser_context) = 0; |
| }; |
| |
| } // namespace extensions |
| |
| #endif // EXTENSIONS_BROWSER_API_FILE_SYSTEM_FILE_SYSTEM_DELEGATE_H_ |