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.
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.
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_
18 #include "base/files/file_path.h"
19 #include "chrome/browser/extensions/chrome_extension_function.h"
22 class FileBrowserHandlerInternalSelectFileFunction;
24 namespace file_manager {
27 struct EntryDefinition;
28 struct FileDefinition;
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.
37 virtual ~FileSelector() {}
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 '.'.
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,
60 FileBrowserHandlerInternalSelectFileFunction* function) = 0;
63 // Interface that is used by FileBrowserHandlerInternalSelectFileFunction to
64 // create a FileSelector it can use to select a file path.
65 class FileSelectorFactory {
67 virtual ~FileSelectorFactory() {}
69 // Creates a FileSelector instance for the
70 // FileBrowserHandlerInternalSelectFileFunction.
71 virtual FileSelector* CreateFileSelector() const = 0;
74 } // namespace file_manager
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.
81 // The fileBrowserHandlerInternal.selectFile extension function implementation.
82 // See the file description for more info.
83 class FileBrowserHandlerInternalSelectFileFunction
84 : public ChromeAsyncExtensionFunction {
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();
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);
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);
108 // The class is ref counted, so destructor should not be public.
109 virtual ~FileBrowserHandlerInternalSelectFileFunction();
111 // AsyncExtensionFunction implementation.
112 // Runs the extension function implementation.
113 virtual bool RunAsync() override;
116 // Respond to the API with selected entry definition.
117 void RespondEntryDefinition(
118 const file_manager::util::EntryDefinition& entry_definition);
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
129 void Respond(const file_manager::util::EntryDefinition& entry_definition,
132 // Factory used to create FileSelector to be used for prompting user to select
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_;
138 // List of permissions and paths that have to be granted for the selected
140 std::vector<std::pair<base::FilePath, int> > permissions_to_grant_;
142 DECLARE_EXTENSION_FUNCTION("fileBrowserHandlerInternal.selectFile",
143 FILEBROWSERHANDLERINTERNAL_SELECTFILE)
146 #endif // CHROME_BROWSER_CHROMEOS_EXTENSIONS_FILE_MANAGER_FILE_BROWSER_HANDLER_API_H_