Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(303)

Unified Diff: ui/shell_dialogs/select_file_dialog_win.cc

Issue 419523006: Experimentally isolate GetOpenFileName in a utility process. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase. Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/shell_dialogs/select_file_dialog_win.cc
diff --git a/ui/shell_dialogs/select_file_dialog_win.cc b/ui/shell_dialogs/select_file_dialog_win.cc
index 5bdbb2dabd4012d128a42a3454fddf28eccc2165..e3613cdc12cb51e7f3bcbfc01258d42e80e3f82f 100644
--- a/ui/shell_dialogs/select_file_dialog_win.cc
+++ b/ui/shell_dialogs/select_file_dialog_win.cc
@@ -4,8 +4,6 @@
#include "ui/shell_dialogs/select_file_dialog_win.h"
-#include <windows.h>
-#include <commdlg.h>
#include <shlobj.h>
#include <algorithm>
@@ -38,6 +36,10 @@
namespace {
+ bool CallBuiltinGetOpenFileName(OPENFILENAME* ofn) {
sky 2014/07/31 20:47:46 nit: don't indent this (same as 44 below).
erikwright (departed) 2014/08/01 13:53:15 Done.
+ return GetOpenFileName(ofn) == TRUE;
+ }
+
// Given |extension|, if it's not empty, then remove the leading dot.
std::wstring GetExtensionWithoutLeadingDot(const std::wstring& extension) {
DCHECK(extension.empty() || extension[0] == L'.');
@@ -45,25 +47,6 @@ std::wstring GetExtensionWithoutLeadingDot(const std::wstring& extension) {
}
// Diverts to a metro-specific implementation as appropriate.
-bool CallGetOpenFileName(OPENFILENAME* ofn) {
- HMODULE metro_module = base::win::GetMetroModule();
- if (metro_module != NULL) {
- typedef BOOL (*MetroGetOpenFileName)(OPENFILENAME*);
- MetroGetOpenFileName metro_get_open_file_name =
- reinterpret_cast<MetroGetOpenFileName>(
- ::GetProcAddress(metro_module, "MetroGetOpenFileName"));
- if (metro_get_open_file_name == NULL) {
- NOTREACHED();
- return false;
- }
-
- return metro_get_open_file_name(ofn) == TRUE;
- } else {
- return GetOpenFileName(ofn) == TRUE;
- }
-}
-
-// Diverts to a metro-specific implementation as appropriate.
bool CallGetSaveFileName(OPENFILENAME* ofn) {
HMODULE metro_module = base::win::GetMetroModule();
if (metro_module != NULL) {
@@ -410,8 +393,10 @@ bool SaveFileAs(HWND owner,
class SelectFileDialogImpl : public ui::SelectFileDialog,
public ui::BaseShellDialogImpl {
public:
- explicit SelectFileDialogImpl(Listener* listener,
- ui::SelectFilePolicy* policy);
+ SelectFileDialogImpl(
+ Listener* listener,
+ ui::SelectFilePolicy* policy,
+ const base::Callback<bool(OPENFILENAME*)>& get_open_file_name_impl);
// BaseShellDialog implementation:
virtual bool IsRunning(gfx::NativeWindow owning_window) const OVERRIDE;
@@ -520,15 +505,19 @@ class SelectFileDialogImpl : public ui::SelectFileDialog,
base::string16 GetFilterForFileTypes(const FileTypeInfo* file_types);
bool has_multiple_file_type_choices_;
+ base::Callback<bool(OPENFILENAME*)> get_open_file_name_impl_;
DISALLOW_COPY_AND_ASSIGN(SelectFileDialogImpl);
};
-SelectFileDialogImpl::SelectFileDialogImpl(Listener* listener,
- ui::SelectFilePolicy* policy)
+SelectFileDialogImpl::SelectFileDialogImpl(
+ Listener* listener,
+ ui::SelectFilePolicy* policy,
+ const base::Callback<bool(OPENFILENAME*)>& get_open_file_name_impl)
: SelectFileDialog(listener, policy),
BaseShellDialogImpl(),
- has_multiple_file_type_choices_(false) {
+ has_multiple_file_type_choices_(false),
+ get_open_file_name_impl_(get_open_file_name_impl) {
}
SelectFileDialogImpl::~SelectFileDialogImpl() {
@@ -786,7 +775,8 @@ bool SelectFileDialogImpl::RunOpenFileDialog(
if (!filter.empty())
ofn.Get()->lpstrFilter = filter.c_str();
- bool success = CallGetOpenFileName(ofn.Get());
+
+ bool success = get_open_file_name_impl_.Run(ofn.Get());
DisableOwner(owner);
if (success)
*path = ofn.GetSingleResult();
@@ -811,8 +801,9 @@ bool SelectFileDialogImpl::RunOpenMultiFileDialog(
base::FilePath directory;
std::vector<base::FilePath> filenames;
- if (CallGetOpenFileName(ofn.Get()))
+ if (get_open_file_name_impl_.Run(ofn.Get()))
ofn.GetResult(&directory, &filenames);
+
DisableOwner(owner);
for (std::vector<base::FilePath>::iterator it = filenames.begin();
@@ -894,8 +885,16 @@ std::wstring AppendExtensionIfNeeded(
SelectFileDialog* CreateWinSelectFileDialog(
SelectFileDialog::Listener* listener,
+ SelectFilePolicy* policy,
+ const base::Callback<bool(OPENFILENAME* ofn)>& get_open_file_name_impl) {
+ return new SelectFileDialogImpl(listener, policy, get_open_file_name_impl);
+}
+
+SelectFileDialog* CreateDefaultWinSelectFileDialog(
+ SelectFileDialog::Listener* listener,
SelectFilePolicy* policy) {
- return new SelectFileDialogImpl(listener, policy);
+ return CreateWinSelectFileDialog(
+ listener, policy, base::Bind(&CallBuiltinGetOpenFileName));
}
} // namespace ui
« ui/base/win/open_file_name_win.cc ('K') | « ui/shell_dialogs/select_file_dialog_win.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698