| // Copyright (c) 2011 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 CHROME_BROWSER_FILE_SELECT_HELPER_H_ |
| #define CHROME_BROWSER_FILE_SELECT_HELPER_H_ |
| #pragma once |
| |
| #include <map> |
| #include <vector> |
| |
| #include "base/compiler_specific.h" |
| #include "chrome/browser/ui/shell_dialogs.h" |
| #include "content/browser/tab_contents/tab_contents_observer.h" |
| #include "content/common/notification_observer.h" |
| #include "content/common/notification_registrar.h" |
| #include "net/base/directory_lister.h" |
| |
| class Profile; |
| class RenderViewHost; |
| struct ViewHostMsg_RunFileChooser_Params; |
| |
| |
| // This class handles file-selection requests coming from WebUI elements |
| // (via the ExtensionHost class). It implements both the initialisation |
| // and listener functions for file-selection dialogs. |
| class FileSelectHelper |
| : public SelectFileDialog::Listener, |
| public NotificationObserver { |
| public: |
| explicit FileSelectHelper(Profile* profile); |
| ~FileSelectHelper(); |
| |
| // Show the file chooser dialog. |
| void RunFileChooser(RenderViewHost* render_view_host, |
| TabContents* tab_contents, |
| const ViewHostMsg_RunFileChooser_Params& params); |
| |
| // Enumerates all the files in directory. |
| void EnumerateDirectory(int request_id, |
| RenderViewHost* render_view_host, |
| const FilePath& path); |
| |
| private: |
| // Utility class which can listen for directory lister events and relay |
| // them to the main object with the correct tracking id. |
| class DirectoryListerDispatchDelegate |
| : public net::DirectoryLister::DirectoryListerDelegate { |
| public: |
| DirectoryListerDispatchDelegate(FileSelectHelper* parent, int id) |
| : parent_(parent), |
| id_(id) {} |
| ~DirectoryListerDispatchDelegate() {} |
| virtual void OnListFile( |
| const net::DirectoryLister::DirectoryListerData& data) { |
| parent_->OnListFile(id_, data); |
| } |
| virtual void OnListDone(int error) { |
| parent_->OnListDone(id_, error); |
| } |
| private: |
| // This FileSelectHelper owns this object. |
| FileSelectHelper* parent_; |
| int id_; |
| |
| DISALLOW_COPY_AND_ASSIGN(DirectoryListerDispatchDelegate); |
| }; |
| |
| // SelectFileDialog::Listener overrides. |
| virtual void FileSelected( |
| const FilePath& path, int index, void* params) OVERRIDE; |
| virtual void MultiFilesSelected(const std::vector<FilePath>& files, |
| void* params) OVERRIDE; |
| virtual void FileSelectionCanceled(void* params) OVERRIDE; |
| |
| // NotificationObserver overrides. |
| virtual void Observe(NotificationType type, |
| const NotificationSource& source, |
| const NotificationDetails& details) OVERRIDE; |
| |
| // Kicks off a new directory enumeration. |
| void StartNewEnumeration(const FilePath& path, |
| int request_id, |
| RenderViewHost* render_view_host); |
| |
| // Callbacks from directory enumeration. |
| virtual void OnListFile( |
| int id, |
| const net::DirectoryLister::DirectoryListerData& data); |
| virtual void OnListDone(int id, int error); |
| |
| // Helper method to get allowed extensions for select file dialog from |
| // the specified accept types as defined in the spec: |
| // http://whatwg.org/html/number-state.html#attr-input-accept |
| SelectFileDialog::FileTypeInfo* GetFileTypesFromAcceptType( |
| const string16& accept_types); |
| |
| // Profile used to set/retrieve the last used directory. |
| Profile* profile_; |
| |
| // The RenderViewHost for the page showing a file dialog (may only be one |
| // such dialog). |
| RenderViewHost* render_view_host_; |
| |
| // Dialog box used for choosing files to upload from file form fields. |
| scoped_refptr<SelectFileDialog> select_file_dialog_; |
| |
| // The type of file dialog last shown. |
| SelectFileDialog::Type dialog_type_; |
| |
| // Maintain a list of active directory enumerations. These could come from |
| // the file select dialog or from drag-and-drop of directories, so there could |
| // be more than one going on at a time. |
| struct ActiveDirectoryEnumeration; |
| std::map<int, ActiveDirectoryEnumeration*> directory_enumerations_; |
| |
| // Registrar for notifications regarding our RenderViewHost. |
| NotificationRegistrar notification_registrar_; |
| |
| DISALLOW_COPY_AND_ASSIGN(FileSelectHelper); |
| }; |
| |
| class FileSelectObserver : public TabContentsObserver { |
| public: |
| explicit FileSelectObserver(TabContents* tab_contents); |
| ~FileSelectObserver(); |
| |
| private: |
| // TabContentsObserver overrides. |
| virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; |
| |
| // Called when a file selection is to be done. |
| void OnRunFileChooser(const ViewHostMsg_RunFileChooser_Params& params); |
| |
| // Called when a direction enumeration is to be done. |
| void OnEnumerateDirectory(int request_id, const FilePath& path); |
| |
| // FileSelectHelper, lazily created. |
| scoped_ptr<FileSelectHelper> file_select_helper_; |
| |
| DISALLOW_COPY_AND_ASSIGN(FileSelectObserver); |
| }; |
| |
| #endif // CHROME_BROWSER_FILE_SELECT_HELPER_H_ |