| Index: chrome/browser/file_select_helper.h
|
| ===================================================================
|
| --- chrome/browser/file_select_helper.h (revision 79702)
|
| +++ 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 "base/compiler_specific.h"
|
| @@ -21,7 +22,6 @@
|
|
|
| class FileSelectHelper
|
| : public SelectFileDialog::Listener,
|
| - public net::DirectoryLister::DirectoryListerDelegate,
|
| public NotificationObserver {
|
| public:
|
| explicit FileSelectHelper(Profile* profile);
|
| @@ -31,7 +31,36 @@
|
| 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);
|
| + };
|
| +
|
| // SelectFileDialog::Listener overrides.
|
| virtual void FileSelected(
|
| const FilePath& path, int index, void* params) OVERRIDE;
|
| @@ -39,19 +68,22 @@
|
| void* params) OVERRIDE;
|
| virtual void FileSelectionCanceled(void* params) OVERRIDE;
|
|
|
| - // net::DirectoryLister::DirectoryListerDelegate overrides.
|
| - virtual void OnListFile(
|
| - const net::DirectoryLister::DirectoryListerData& data) OVERRIDE;
|
| - virtual void OnListDone(int error) OVERRIDE;
|
| -
|
| // NotificationObserver overrides.
|
| virtual void Observe(NotificationType type,
|
| const NotificationSource& source,
|
| const NotificationDetails& details) OVERRIDE;
|
|
|
| - // 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);
|
| +
|
| // 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
|
| @@ -61,7 +93,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.
|
| @@ -70,13 +103,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_;
|
|
|
| @@ -95,6 +132,9 @@
|
| // 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_;
|
|
|
|
|