Index: chrome/browser/ui/views/select_file_dialog_extension.cc |
diff --git a/chrome/browser/ui/views/select_file_dialog_extension.cc b/chrome/browser/ui/views/select_file_dialog_extension.cc |
index a2dff88dad44113a9dad2aeb95bfbf379fac6709..b2041242dade48a40724a4063e366306f29d5e9d 100644 |
--- a/chrome/browser/ui/views/select_file_dialog_extension.cc |
+++ b/chrome/browser/ui/views/select_file_dialog_extension.cc |
@@ -34,9 +34,6 @@ class PendingDialog { |
static PendingDialog* GetInstance(); |
void Add(int32 tab_id, scoped_refptr<SelectFileDialogExtension> dialog); |
void Remove(int32 tab_id); |
- // Returns scoped_refptr because in some cases, when the listener receives |
- // the callback, it deletes itself and the reference to the dialog, and |
- // otherwise we end up calling Close on a deleted dialog. |
scoped_refptr<SelectFileDialogExtension> Find(int32 tab_id); |
private: |
@@ -56,7 +53,7 @@ void PendingDialog::Add(int32 tab_id, |
if (map_.find(tab_id) == map_.end()) |
map_.insert(std::make_pair(tab_id, dialog)); |
else |
- LOG(WARNING) << "Duplicate pending dialog " << tab_id; |
+ DLOG(WARNING) << "Duplicate pending dialog " << tab_id; |
} |
void PendingDialog::Remove(int32 tab_id) { |
@@ -65,10 +62,8 @@ void PendingDialog::Remove(int32 tab_id) { |
scoped_refptr<SelectFileDialogExtension> PendingDialog::Find(int32 tab_id) { |
Map::const_iterator it = map_.find(tab_id); |
- if (it == map_.end()) { |
- LOG(WARNING) << "Pending dialog not found " << tab_id; |
+ if (it == map_.end()) |
return NULL; |
- } |
return it->second; |
} |
@@ -96,9 +91,11 @@ SelectFileDialogExtension* SelectFileDialogExtension::Create( |
SelectFileDialogExtension::SelectFileDialogExtension(Listener* listener) |
: SelectFileDialog(listener), |
has_multiple_file_type_choices_(false), |
- params_(NULL), |
tab_id_(0), |
- owner_window_(0) { |
+ owner_window_(0), |
+ selection_type_(CANCEL), |
+ selection_index_(0), |
+ params_(NULL) { |
} |
SelectFileDialogExtension::~SelectFileDialogExtension() { |
@@ -117,18 +114,14 @@ void SelectFileDialogExtension::ListenerDestroyed() { |
PendingDialog::GetInstance()->Remove(tab_id_); |
} |
-void SelectFileDialogExtension::ExtensionDialogIsClosing( |
+void SelectFileDialogExtension::ExtensionDialogClosing( |
ExtensionDialog* dialog) { |
owner_window_ = NULL; |
// Release our reference to the dialog to allow it to close. |
extension_dialog_ = NULL; |
PendingDialog::GetInstance()->Remove(tab_id_); |
-} |
- |
-void SelectFileDialogExtension::Close() { |
- if (extension_dialog_) |
- extension_dialog_->Close(); |
- PendingDialog::GetInstance()->Remove(tab_id_); |
+ // Actually invoke the appropriate callback on our listener. |
+ NotifyListener(); |
} |
// static |
@@ -136,11 +129,12 @@ void SelectFileDialogExtension::OnFileSelected( |
int32 tab_id, const FilePath& path, int index) { |
scoped_refptr<SelectFileDialogExtension> dialog = |
PendingDialog::GetInstance()->Find(tab_id); |
- if (dialog) { |
- DCHECK(dialog->listener_); |
- dialog->listener_->FileSelected(path, index, dialog->params_); |
- dialog->Close(); |
- } |
+ if (!dialog) |
+ return; |
+ dialog->selection_type_ = SINGLE_FILE; |
+ dialog->selection_files_.clear(); |
+ dialog->selection_files_.push_back(path); |
+ dialog->selection_index_ = index; |
} |
// static |
@@ -148,22 +142,22 @@ void SelectFileDialogExtension::OnMultiFilesSelected( |
int32 tab_id, const std::vector<FilePath>& files) { |
scoped_refptr<SelectFileDialogExtension> dialog = |
PendingDialog::GetInstance()->Find(tab_id); |
- if (dialog) { |
- DCHECK(dialog->listener_); |
- dialog->listener_->MultiFilesSelected(files, dialog->params_); |
- dialog->Close(); |
- } |
+ if (!dialog) |
+ return; |
+ dialog->selection_type_ = MULTIPLE_FILES; |
+ dialog->selection_files_ = files; |
+ dialog->selection_index_ = 0; |
} |
// static |
void SelectFileDialogExtension::OnFileSelectionCanceled(int32 tab_id) { |
scoped_refptr<SelectFileDialogExtension> dialog = |
PendingDialog::GetInstance()->Find(tab_id); |
- if (dialog) { |
- DCHECK(dialog->listener_); |
- dialog->listener_->FileSelectionCanceled(dialog->params_); |
- dialog->Close(); |
- } |
+ if (!dialog) |
+ return; |
+ dialog->selection_type_ = CANCEL; |
+ dialog->selection_files_.clear(); |
+ dialog->selection_index_ = 0; |
} |
RenderViewHost* SelectFileDialogExtension::GetRenderViewHost() { |
@@ -172,6 +166,25 @@ RenderViewHost* SelectFileDialogExtension::GetRenderViewHost() { |
return NULL; |
} |
+void SelectFileDialogExtension::NotifyListener() { |
+ if (!listener_) |
+ return; |
+ switch (selection_type_) { |
+ case CANCEL: |
+ listener_->FileSelectionCanceled(params_); |
+ break; |
+ case SINGLE_FILE: |
+ listener_->FileSelected(selection_files_[0], selection_index_, params_); |
+ break; |
+ case MULTIPLE_FILES: |
+ listener_->MultiFilesSelected(selection_files_, params_); |
+ break; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+} |
+ |
void SelectFileDialogExtension::AddPending(int32 tab_id) { |
PendingDialog::GetInstance()->Add(tab_id, this); |
} |
@@ -212,8 +225,10 @@ void SelectFileDialogExtension::SelectFileImpl( |
// Check if we have another dialog opened in the tab. It's unlikely, but |
// possible. |
int32 tab_id = tab ? tab->restore_tab_helper()->session_id().id() : 0; |
- if (PendingExists(tab_id)) |
+ if (PendingExists(tab_id)) { |
+ DLOG(WARNING) << "Pending dialog exists with id " << tab_id; |
return; |
+ } |
FilePath virtual_path; |
if (!file_manager_util::ConvertFileToRelativeFileSystemPath( |