Home | History | Annotate | Download | only in file_manager
      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 // File contains the fileBrowserHandlerInternal.selectFile extension function.
      6 // The function prompts user to select a file path to be used by the caller. It
      7 // will fail if it isn't invoked by a user gesture (e.g. a mouse click or a
      8 // keyboard key press).
      9 // Note that the target file is never actually created by this function, even
     10 // if the selected path doesn't exist.
     11 
     12 #ifndef CHROME_BROWSER_CHROMEOS_EXTENSIONS_FILE_MANAGER_FILE_BROWSER_HANDLER_API_H_
     13 #define CHROME_BROWSER_CHROMEOS_EXTENSIONS_FILE_MANAGER_FILE_BROWSER_HANDLER_API_H_
     14 
     15 #include <string>
     16 #include <vector>
     17 
     18 #include "base/files/file_path.h"
     19 #include "chrome/browser/extensions/chrome_extension_function.h"
     20 
     21 class Browser;
     22 class FileBrowserHandlerInternalSelectFileFunction;
     23 
     24 namespace file_manager {
     25 
     26 namespace util {
     27 struct EntryDefinition;
     28 struct FileDefinition;
     29 }
     30 
     31 // Interface that is used by FileBrowserHandlerInternalSelectFileFunction to
     32 // select the file path that should be reported back to the extension function
     33 // caller.  Nobody will take the ownership of the interface implementation, so
     34 // it should delete itself once it's done.
     35 class FileSelector {
     36  public:
     37   virtual ~FileSelector() {}
     38 
     39   // Starts the file selection. It should prompt user to select a file path.
     40   // Once the selection is made it should asynchronously call
     41   // |function_->OnFilePathSelected| with the selection information.
     42   // User should be initially suggested to select file named |suggested_name|.
     43   // |allowed_extensions| specifies the file extensions allowed to be shown,
     44   // and selected. Extensions should not include '.'. This spec comes from
     45   // ui::SelectFileDialog() which takes extensions without '.'.
     46   //
     47   // Selection UI should be displayed using |browser|. |browser| should outlive
     48   // the interface implementation.
     49   // |function| if the extension function that called the method and needs to
     50   // be notified of user action. The interface implementation should keep a
     51   // reference to the function until it is notified (extension function
     52   // implementations are ref counted).
     53   // |SelectFile| will be called at most once by a single extension function.
     54   // The interface implementation should delete itself after the extension
     55   // function is notified of file selection result.
     56   virtual void SelectFile(
     57       const base::FilePath& suggested_name,
     58       const std::vector<std::string>& allowed_extensions,
     59       Browser* browser,
     60       FileBrowserHandlerInternalSelectFileFunction* function) = 0;
     61 };
     62 
     63 // Interface that is used by FileBrowserHandlerInternalSelectFileFunction to
     64 // create a FileSelector it can use to select a file path.
     65 class FileSelectorFactory {
     66  public:
     67   virtual ~FileSelectorFactory() {}
     68 
     69   // Creates a FileSelector instance for the
     70   // FileBrowserHandlerInternalSelectFileFunction.
     71   virtual FileSelector* CreateFileSelector() const = 0;
     72 };
     73 
     74 }  // namespace file_manager
     75 
     76 
     77 // Note that this class is not in 'file_manager' class to be consistent with
     78 // all other extension functions registered in
     79 // chrome/common/extensions/api/generated_api.cc being in the global namespace.
     80 //
     81 // The fileBrowserHandlerInternal.selectFile extension function implementation.
     82 // See the file description for more info.
     83 class FileBrowserHandlerInternalSelectFileFunction
     84     : public ChromeAsyncExtensionFunction {
     85  public:
     86   // Default constructor used in production code.
     87   // It will create its own FileSelectorFactory implementation, and set the
     88   // value of |user_gesture_check_enabled| to true.
     89   FileBrowserHandlerInternalSelectFileFunction();
     90 
     91   // This constructor should be used only in tests to inject test file selector
     92   // factory and to allow extension function to run even if it hasn't been
     93   // invoked by user gesture.
     94   // Created object will take the ownership of the |file_selector_factory|.
     95   FileBrowserHandlerInternalSelectFileFunction(
     96       file_manager::FileSelectorFactory* file_selector_factory,
     97       bool enable_user_gesture_check);
     98 
     99   // Called by FileSelector implementation when the user selects the file's
    100   // file path. File access permissions for the selected file are granted and
    101   // caller is notified of the selection result after this method is called.
    102   // |success| Whether the path was selected.
    103   // |full_path| The selected file path if one was selected. It is ignored if
    104   // the selection did not succeed.
    105   void OnFilePathSelected(bool success, const base::FilePath& full_path);
    106 
    107  protected:
    108   // The class is ref counted, so destructor should not be public.
    109   virtual ~FileBrowserHandlerInternalSelectFileFunction();
    110 
    111   // AsyncExtensionFunction implementation.
    112   // Runs the extension function implementation.
    113   virtual bool RunAsync() OVERRIDE;
    114 
    115  private:
    116   // Respond to the API with selected entry definition.
    117   void RespondEntryDefinition(
    118       const file_manager::util::EntryDefinition& entry_definition);
    119 
    120   // Creates dictionary value that will be used to as the extension function's
    121   // callback argument and ends extension function execution by calling
    122   // |SendResponse(true)|.
    123   // The |results_| value will be set to dictionary containing two properties:
    124   // * boolean 'success', which will be equal to |success|.
    125   // * object 'entry', which will be set only when |success| is true, and the
    126   //   conversion to |entry_definition| was successful. In such case, it will
    127   //   contain information needed to create a FileEntry object for the selected
    128   //   file.
    129   void Respond(const file_manager::util::EntryDefinition& entry_definition,
    130                bool success);
    131 
    132   // Factory used to create FileSelector to be used for prompting user to select
    133   // file.
    134   scoped_ptr<file_manager::FileSelectorFactory> file_selector_factory_;
    135   // Whether user gesture check is disabled. This should be true only in tests.
    136   bool user_gesture_check_enabled_;
    137 
    138   // List of permissions and paths that have to be granted for the selected
    139   // files.
    140   std::vector<std::pair<base::FilePath, int> > permissions_to_grant_;
    141 
    142   DECLARE_EXTENSION_FUNCTION("fileBrowserHandlerInternal.selectFile",
    143                              FILEBROWSERHANDLERINTERNAL_SELECTFILE)
    144 };
    145 
    146 #endif  // CHROME_BROWSER_CHROMEOS_EXTENSIONS_FILE_MANAGER_FILE_BROWSER_HANDLER_API_H_
    147