Index: chrome/browser/file_select_helper.h |
=================================================================== |
--- chrome/browser/file_select_helper.h (revision 76768) |
+++ chrome/browser/file_select_helper.h (working copy) |
@@ -6,6 +6,7 @@ |
#define CHROME_BROWSER_FILE_SELECT_HELPER_H_ |
#pragma once |
+#include <map> |
#include <vector> |
#include "chrome/browser/ui/shell_dialogs.h" |
@@ -19,7 +20,6 @@ |
class FileSelectHelper |
: public SelectFileDialog::Listener, |
- public net::DirectoryLister::DirectoryListerDelegate, |
public NotificationObserver { |
public: |
explicit FileSelectHelper(Profile* profile); |
@@ -31,24 +31,57 @@ |
void* params); |
virtual void FileSelectionCanceled(void* params); |
- // net::DirectoryLister::DirectoryListerDelegate |
- virtual void OnListFile( |
- const net::DirectoryLister::DirectoryListerData& data); |
- virtual void OnListDone(int error); |
- |
// Show the file chooser dialog. |
void RunFileChooser(RenderViewHost* render_view_host, |
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); |
+ }; |
+ |
// NotificationObserver implementation. |
virtual void Observe(NotificationType type, |
const NotificationSource& source, |
const NotificationDetails& details); |
- // Helper method for handling the SelectFileDialog::Listener callbacks. |
- void DirectorySelected(const FilePath& path); |
+ // 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); |
Jay Civelli
2011/03/07 17:27:12
Nit: this can fit on the previous line.
|
+ |
// 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 |
@@ -58,7 +91,8 @@ |
// Profile used to set/retrieve the last used directory. |
Profile* profile_; |
- // The RenderViewHost for the page we are associated with. |
+ // 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. |
@@ -67,13 +101,17 @@ |
// The type of file dialog last shown. |
SelectFileDialog::Type dialog_type_; |
- // The current directory lister (runs on a separate thread). |
- scoped_refptr<net::DirectoryLister> directory_lister_; |
+ // 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 { |
+ scoped_ptr<DirectoryListerDispatchDelegate> delegate_; |
+ scoped_refptr<net::DirectoryLister> lister_; |
+ RenderViewHost* rvh_; |
+ std::vector<FilePath> results_; |
+ }; |
+ std::map<int, ActiveDirectoryEnumeration*> directory_enumerations_; |
- // The current directory lister results, which may update incrementally |
- // as the listing proceeds. |
- std::vector<FilePath> directory_lister_results_; |
- |
// Registrar for notifications regarding our RenderViewHost. |
NotificationRegistrar notification_registrar_; |