Index: chrome/browser/ui/libgtk2ui/select_file_dialog_impl_kde.cc |
diff --git a/chrome/browser/ui/libgtk2ui/select_file_dialog_impl_kde.cc b/chrome/browser/ui/libgtk2ui/select_file_dialog_impl_kde.cc |
index 21721498b3b5c53ed02f0e3c2dacaf0851d1c0b6..7b9882987edd31819756385a272ab66bbc7ddd0a 100644 |
--- a/chrome/browser/ui/libgtk2ui/select_file_dialog_impl_kde.cc |
+++ b/chrome/browser/ui/libgtk2ui/select_file_dialog_impl_kde.cc |
@@ -5,6 +5,7 @@ |
#include <stddef.h> |
#include <X11/Xlib.h> |
+#include <memory> |
#include <set> |
#include "base/bind.h" |
@@ -74,18 +75,18 @@ class SelectFileDialogImplKDE : public SelectFileDialogImpl { |
bool HasMultipleFileTypeChoicesImpl() override; |
struct KDialogParams { |
- KDialogParams(const std::string& type, const std::string& title, |
- const base::FilePath& default_path, XID parent, |
- bool file_operation, bool multiple_selection, |
- void* kdialog_params, |
- void (SelectFileDialogImplKDE::*callback)(XID, |
- const std::string&, |
- int, void*)) |
- : type(type), title(title), default_path(default_path), parent(parent), |
+ KDialogParams(const std::string& type, |
+ const std::string& title, |
+ const base::FilePath& default_path, |
+ XID parent, |
+ bool file_operation, |
+ bool multiple_selection) |
+ : type(type), |
+ title(title), |
+ default_path(default_path), |
+ parent(parent), |
file_operation(file_operation), |
- multiple_selection(multiple_selection), |
- kdialog_params(kdialog_params), callback(callback) { |
- } |
+ multiple_selection(multiple_selection) {} |
std::string type; |
std::string title; |
@@ -93,9 +94,11 @@ class SelectFileDialogImplKDE : public SelectFileDialogImpl { |
XID parent; |
bool file_operation; |
bool multiple_selection; |
- void* kdialog_params; |
- void (SelectFileDialogImplKDE::*callback)(XID, const std::string&, |
- int, void*); |
+ }; |
+ |
+ struct KDialogOutputParams { |
+ std::string output; |
+ int exit_code; |
}; |
// Get the filters from |file_types_| and concatenate them into |
@@ -111,8 +114,9 @@ class SelectFileDialogImplKDE : public SelectFileDialogImpl { |
bool multiple_selection, |
base::CommandLine* command_line); |
- // Call KDialog on the FILE thread and post results back to the UI thread. |
- void CallKDialogOutput(const KDialogParams& params); |
+ // Call KDialog on the FILE thread and return the results. |
+ std::unique_ptr<KDialogOutputParams> CallKDialogOutput( |
+ const KDialogParams& params); |
// Notifies the listener that a single file was chosen. |
void FileSelected(const base::FilePath& path, void* params); |
@@ -145,18 +149,22 @@ class SelectFileDialogImplKDE : public SelectFileDialogImpl { |
// Common function for OnSelectSingleFileDialogResponse and |
// OnSelectSingleFolderDialogResponse. |
- void SelectSingleFileHelper(const std::string& output, int exit_code, |
- void* params, bool allow_folder); |
- |
- void OnSelectSingleFileDialogResponse(XID parent, |
- const std::string& output, |
- int exit_code, void* params); |
- void OnSelectMultiFileDialogResponse(XID parent, |
- const std::string& output, |
- int exit_code, void* params); |
- void OnSelectSingleFolderDialogResponse(XID parent, |
- const std::string& output, |
- int exit_code, void* params); |
+ void SelectSingleFileHelper(void* params, |
+ bool allow_folder, |
+ std::unique_ptr<KDialogOutputParams> results); |
+ |
+ void OnSelectSingleFileDialogResponse( |
+ XID parent, |
+ void* params, |
+ std::unique_ptr<KDialogOutputParams> results); |
+ void OnSelectMultiFileDialogResponse( |
+ XID parent, |
+ void* params, |
+ std::unique_ptr<KDialogOutputParams> results); |
+ void OnSelectSingleFolderDialogResponse( |
+ XID parent, |
+ void* params, |
+ std::unique_ptr<KDialogOutputParams> results); |
// Should be either DESKTOP_ENVIRONMENT_KDE3, KDE4, or KDE5. |
base::nix::DesktopEnvironment desktop_; |
@@ -296,7 +304,8 @@ std::string SelectFileDialogImplKDE::GetMimeTypeFilterString() { |
return filter_string; |
} |
-void SelectFileDialogImplKDE::CallKDialogOutput(const KDialogParams& params) { |
+std::unique_ptr<SelectFileDialogImplKDE::KDialogOutputParams> |
+SelectFileDialogImplKDE::CallKDialogOutput(const KDialogParams& params) { |
DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
base::CommandLine::StringVector cmd_vector; |
cmd_vector.push_back(kKdialogBinary); |
@@ -304,19 +313,14 @@ void SelectFileDialogImplKDE::CallKDialogOutput(const KDialogParams& params) { |
GetKDialogCommandLine(params.type, params.title, params.default_path, |
params.parent, params.file_operation, |
params.multiple_selection, &command_line); |
- std::string output; |
- int exit_code; |
+ |
+ auto results = base::MakeUnique<KDialogOutputParams>(); |
// Get output from KDialog |
- base::GetAppOutputWithExitCode(command_line, &output, &exit_code); |
- if (!output.empty()) |
- output.erase(output.size() - 1); |
- |
- // Now the dialog is no longer showing, but we can't erase its parent from the |
- // parent set yet because we're on the FILE thread. |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(params.callback, this, params.parent, output, exit_code, |
- params.kdialog_params)); |
+ base::GetAppOutputWithExitCode(command_line, &results->output, |
+ &results->exit_code); |
+ if (!results->output.empty()) |
+ results->output.erase(results->output.size() - 1); |
+ return results; |
} |
void SelectFileDialogImplKDE::GetKDialogCommandLine( |
@@ -392,76 +396,74 @@ void SelectFileDialogImplKDE::CreateSelectFolderDialog( |
int title_message_id = (type == SELECT_UPLOAD_FOLDER) |
? IDS_SELECT_UPLOAD_FOLDER_DIALOG_TITLE |
: IDS_SELECT_FOLDER_DIALOG_TITLE; |
- BrowserThread::PostTask( |
+ BrowserThread::PostTaskAndReplyWithResult( |
BrowserThread::FILE, FROM_HERE, |
base::Bind( |
- &SelectFileDialogImplKDE::CallKDialogOutput, |
- this, |
+ &SelectFileDialogImplKDE::CallKDialogOutput, this, |
KDialogParams( |
- "--getexistingdirectory", |
- GetTitle(title, title_message_id), |
- default_path.empty() ? *last_opened_path_ : default_path, |
- parent, false, false, params, |
- &SelectFileDialogImplKDE::OnSelectSingleFolderDialogResponse))); |
+ "--getexistingdirectory", GetTitle(title, title_message_id), |
+ default_path.empty() ? *last_opened_path_ : default_path, parent, |
+ false, false)), |
+ base::Bind(&SelectFileDialogImplKDE::OnSelectSingleFolderDialogResponse, |
+ this, parent, params)); |
} |
void SelectFileDialogImplKDE::CreateFileOpenDialog( |
const std::string& title, const base::FilePath& default_path, |
XID parent, void* params) { |
- BrowserThread::PostTask( |
+ BrowserThread::PostTaskAndReplyWithResult( |
BrowserThread::FILE, FROM_HERE, |
base::Bind( |
- &SelectFileDialogImplKDE::CallKDialogOutput, |
- this, |
+ &SelectFileDialogImplKDE::CallKDialogOutput, this, |
KDialogParams( |
- "--getopenfilename", |
- GetTitle(title, IDS_OPEN_FILE_DIALOG_TITLE), |
- default_path.empty() ? *last_opened_path_ : default_path, |
- parent, true, false, params, |
- &SelectFileDialogImplKDE::OnSelectSingleFileDialogResponse))); |
+ "--getopenfilename", GetTitle(title, IDS_OPEN_FILE_DIALOG_TITLE), |
+ default_path.empty() ? *last_opened_path_ : default_path, parent, |
+ true, false)), |
+ base::Bind(&SelectFileDialogImplKDE::OnSelectSingleFileDialogResponse, |
+ this, parent, params)); |
} |
void SelectFileDialogImplKDE::CreateMultiFileOpenDialog( |
const std::string& title, const base::FilePath& default_path, |
XID parent, void* params) { |
- BrowserThread::PostTask( |
+ BrowserThread::PostTaskAndReplyWithResult( |
BrowserThread::FILE, FROM_HERE, |
base::Bind( |
- &SelectFileDialogImplKDE::CallKDialogOutput, |
- this, |
+ &SelectFileDialogImplKDE::CallKDialogOutput, this, |
KDialogParams( |
- "--getopenfilename", |
- GetTitle(title, IDS_OPEN_FILES_DIALOG_TITLE), |
- default_path.empty() ? *last_opened_path_ : default_path, |
- parent, true, true, params, |
- &SelectFileDialogImplKDE::OnSelectMultiFileDialogResponse))); |
+ "--getopenfilename", GetTitle(title, IDS_OPEN_FILES_DIALOG_TITLE), |
+ default_path.empty() ? *last_opened_path_ : default_path, parent, |
+ true, true)), |
+ base::Bind(&SelectFileDialogImplKDE::OnSelectMultiFileDialogResponse, |
+ this, parent, params)); |
} |
void SelectFileDialogImplKDE::CreateSaveAsDialog( |
const std::string& title, const base::FilePath& default_path, |
XID parent, void* params) { |
- BrowserThread::PostTask( |
+ BrowserThread::PostTaskAndReplyWithResult( |
BrowserThread::FILE, FROM_HERE, |
base::Bind( |
- &SelectFileDialogImplKDE::CallKDialogOutput, |
- this, |
- KDialogParams( |
- "--getsavefilename", |
- GetTitle(title, IDS_SAVE_AS_DIALOG_TITLE), |
- default_path.empty() ? *last_saved_path_ : default_path, |
- parent, true, false, params, |
- &SelectFileDialogImplKDE::OnSelectSingleFileDialogResponse))); |
+ &SelectFileDialogImplKDE::CallKDialogOutput, this, |
+ KDialogParams("--getsavefilename", |
+ GetTitle(title, IDS_SAVE_AS_DIALOG_TITLE), |
+ default_path.empty() ? *last_saved_path_ : default_path, |
+ parent, true, false)), |
+ base::Bind(&SelectFileDialogImplKDE::OnSelectSingleFileDialogResponse, |
+ this, parent, params)); |
} |
-void SelectFileDialogImplKDE::SelectSingleFileHelper(const std::string& output, |
- int exit_code, void* params, bool allow_folder) { |
- VLOG(1) << "[kdialog] SingleFileResponse: " << output; |
- if (exit_code != 0 || output.empty()) { |
+void SelectFileDialogImplKDE::SelectSingleFileHelper( |
+ void* params, |
+ bool allow_folder, |
+ std::unique_ptr<KDialogOutputParams> results) { |
+ VLOG(1) << "[kdialog] SingleFileResponse: " << results->output; |
+ if (results->exit_code || results->output.empty()) { |
FileNotSelected(params); |
return; |
} |
- base::FilePath path(output); |
+ base::FilePath path(results->output); |
if (allow_folder) { |
FileSelected(path, params); |
return; |
@@ -474,34 +476,40 @@ void SelectFileDialogImplKDE::SelectSingleFileHelper(const std::string& output, |
} |
void SelectFileDialogImplKDE::OnSelectSingleFileDialogResponse( |
- XID parent, const std::string& output, int exit_code, void* params) { |
+ XID parent, |
+ void* params, |
+ std::unique_ptr<KDialogOutputParams> results) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
parents_.erase(parent); |
- SelectSingleFileHelper(output, exit_code, params, false); |
+ SelectSingleFileHelper(params, false, std::move(results)); |
} |
void SelectFileDialogImplKDE::OnSelectSingleFolderDialogResponse( |
- XID parent, const std::string& output, int exit_code, void* params) { |
+ XID parent, |
+ void* params, |
+ std::unique_ptr<KDialogOutputParams> results) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
parents_.erase(parent); |
- SelectSingleFileHelper(output, exit_code, params, true); |
+ SelectSingleFileHelper(params, true, std::move(results)); |
} |
void SelectFileDialogImplKDE::OnSelectMultiFileDialogResponse( |
- XID parent, const std::string& output, int exit_code, void* params) { |
+ XID parent, |
+ void* params, |
+ std::unique_ptr<KDialogOutputParams> results) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- VLOG(1) << "[kdialog] MultiFileResponse: " << output; |
+ VLOG(1) << "[kdialog] MultiFileResponse: " << results->output; |
parents_.erase(parent); |
- if (exit_code != 0 || output.empty()) { |
+ if (results->exit_code || results->output.empty()) { |
FileNotSelected(params); |
return; |
} |
std::vector<base::FilePath> filenames_fp; |
for (const base::StringPiece& line : |
- base::SplitStringPiece(output, "\n", base::KEEP_WHITESPACE, |
+ base::SplitStringPiece(results->output, "\n", base::KEEP_WHITESPACE, |
base::SPLIT_WANT_NONEMPTY)) { |
base::FilePath path(line); |
if (CallDirectoryExistsOnUIThread(path)) |