text: // 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_
  