// Copyright 2019 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 WEBLAYER_BROWSER_FILE_SELECT_HELPER_H_ #define WEBLAYER_BROWSER_FILE_SELECT_HELPER_H_ #include #include #include "base/macros.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/file_select_listener.h" #include "content/public/browser/web_contents_observer.h" #include "ui/shell_dialogs/select_file_dialog.h" namespace content { class FileSelectListener; } // namespace content namespace ui { struct SelectedFileInfo; } namespace weblayer { // This class handles file-selection requests coming from renderer processes. // It implements both the initialisation and listener functions for // file-selection dialogs. // // Since FileSelectHelper listens to observations of a widget, it needs to live // on and be destroyed on the UI thread. References to FileSelectHelper may be // passed on to other threads. class FileSelectHelper : public base::RefCountedThreadSafe< FileSelectHelper, content::BrowserThread::DeleteOnUIThread>, public ui::SelectFileDialog::Listener, public content::WebContentsObserver { public: // Show the file chooser dialog. static void RunFileChooser( content::RenderFrameHost* render_frame_host, std::unique_ptr listener, const blink::mojom::FileChooserParams& params); private: friend class base::RefCountedThreadSafe; friend class base::DeleteHelper; friend struct content::BrowserThread::DeleteOnThread< content::BrowserThread::UI>; FileSelectHelper(); ~FileSelectHelper() override; void RunFileChooser(content::RenderFrameHost* render_frame_host, std::unique_ptr listener, blink::mojom::FileChooserParamsPtr params); // Cleans up and releases this instance. This must be called after the last // callback is received from the file chooser dialog. void RunFileChooserEnd(); // SelectFileDialog::Listener overrides. void FileSelected(const base::FilePath& path, int index, void* params) override; void FileSelectedWithExtraInfo(const ui::SelectedFileInfo& file, int index, void* params) override; void MultiFilesSelected(const std::vector& files, void* params) override; void MultiFilesSelectedWithExtraInfo( const std::vector& files, void* params) override; void FileSelectionCanceled(void* params) override; // This method is called after the user has chosen the file(s) in the UI in // order to process and filter the list before returning the final result to // the caller. void ConvertToFileChooserFileInfoList( const std::vector& files); // Calls RunFileChooserEnd() if the webcontents was destroyed. Returns true // if the file chooser operation shouldn't proceed. bool AbortIfWebContentsDestroyed(); // |listener_| receives the result of the FileSelectHelper. std::unique_ptr listener_; // Dialog box used for choosing files to upload from file form fields. scoped_refptr select_file_dialog_; // The type of file dialog last shown. ui::SelectFileDialog::Type dialog_type_ = ui::SelectFileDialog::SELECT_OPEN_FILE; // The mode of file dialog last shown. blink::mojom::FileChooserParams::Mode dialog_mode_ = blink::mojom::FileChooserParams::Mode::kOpen; DISALLOW_COPY_AND_ASSIGN(FileSelectHelper); }; } // namespace weblayer #endif // WEBLAYER_BROWSER_FILE_SELECT_HELPER_H_