| 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 00a1f7e116815b721fffde962d0944d3792a35f2..73aacf6ced4374d5f135d04694e0ff1d7379134e 100644 | 
| --- a/ui/shell_dialogs/select_file_dialog_win.cc | 
| +++ b/ui/shell_dialogs/select_file_dialog_win.cc | 
| @@ -30,6 +30,7 @@ | 
| #include "ui/aura/window_event_dispatcher.h" | 
| #include "ui/aura/window_tree_host.h" | 
| #include "ui/base/l10n/l10n_util.h" | 
| +#include "ui/base/win/open_file_name_win.h" | 
| #include "ui/gfx/native_widget_types.h" | 
| #include "ui/shell_dialogs/base_shell_dialog_win.h" | 
| #include "ui/shell_dialogs/shell_dialogs_delegate.h" | 
| @@ -773,47 +774,22 @@ bool SelectFileDialogImpl::RunOpenFileDialog( | 
| const std::wstring& filter, | 
| HWND owner, | 
| base::FilePath* path) { | 
| -  OPENFILENAME ofn; | 
| -  // We must do this otherwise the ofn's FlagsEx may be initialized to random | 
| -  // junk in release builds which can cause the Places Bar not to show up! | 
| -  ZeroMemory(&ofn, sizeof(ofn)); | 
| -  ofn.lStructSize = sizeof(ofn); | 
| -  ofn.hwndOwner = owner; | 
| - | 
| -  wchar_t filename[MAX_PATH]; | 
| -  // According to http://support.microsoft.com/?scid=kb;en-us;222003&x=8&y=12, | 
| -  // The lpstrFile Buffer MUST be NULL Terminated. | 
| -  filename[0] = 0; | 
| -  // Define the dir in here to keep the string buffer pointer pointed to | 
| -  // ofn.lpstrInitialDir available during the period of running the | 
| -  // GetOpenFileName. | 
| -  base::FilePath dir; | 
| -  // Use lpstrInitialDir to specify the initial directory | 
| -  if (!path->empty()) { | 
| -    if (IsDirectory(*path)) { | 
| -      ofn.lpstrInitialDir = path->value().c_str(); | 
| -    } else { | 
| -      dir = path->DirName(); | 
| -      ofn.lpstrInitialDir = dir.value().c_str(); | 
| -      // Only pure filename can be put in lpstrFile field. | 
| -      base::wcslcpy(filename, path->BaseName().value().c_str(), | 
| -                    arraysize(filename)); | 
| -    } | 
| -  } | 
| - | 
| -  ofn.lpstrFile = filename; | 
| -  ofn.nMaxFile = MAX_PATH; | 
| - | 
| // We use OFN_NOCHANGEDIR so that the user can rename or delete the directory | 
| // without having to close Chrome first. | 
| -  ofn.Flags = OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR; | 
| +  ui::win::OpenFileName ofn(owner, OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR); | 
| +  if (!path->empty()) { | 
| +    if (IsDirectory(*path)) | 
| +      ofn.SetInitialSelection(*path, base::FilePath()); | 
| +    else | 
| +      ofn.SetInitialSelection(path->DirName(), path->BaseName()); | 
| +  } | 
|  | 
| if (!filter.empty()) | 
| -    ofn.lpstrFilter = filter.c_str(); | 
| -  bool success = CallGetOpenFileName(&ofn); | 
| +    ofn.GetOPENFILENAME()->lpstrFilter = filter.c_str(); | 
| +  bool success = CallGetOpenFileName(ofn.GetOPENFILENAME()); | 
| DisableOwner(owner); | 
| if (success) | 
| -    *path = base::FilePath(filename); | 
| +    *path = ofn.GetSingleResult(); | 
| return success; | 
| } | 
|  | 
| @@ -822,53 +798,30 @@ bool SelectFileDialogImpl::RunOpenMultiFileDialog( | 
| const std::wstring& filter, | 
| HWND owner, | 
| std::vector<base::FilePath>* paths) { | 
| -  OPENFILENAME ofn; | 
| -  // We must do this otherwise the ofn's FlagsEx may be initialized to random | 
| -  // junk in release builds which can cause the Places Bar not to show up! | 
| -  ZeroMemory(&ofn, sizeof(ofn)); | 
| -  ofn.lStructSize = sizeof(ofn); | 
| -  ofn.hwndOwner = owner; | 
| - | 
| -  scoped_ptr<wchar_t[]> filename(new wchar_t[UNICODE_STRING_MAX_CHARS]); | 
| -  filename[0] = 0; | 
| - | 
| -  ofn.lpstrFile = filename.get(); | 
| -  ofn.nMaxFile = UNICODE_STRING_MAX_CHARS; | 
| // We use OFN_NOCHANGEDIR so that the user can rename or delete the directory | 
| // without having to close Chrome first. | 
| -  ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER | 
| -               | OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT | OFN_NOCHANGEDIR; | 
| +  ui::win::OpenFileName ofn(owner, | 
| +                            OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | | 
| +                                OFN_EXPLORER | OFN_HIDEREADONLY | | 
| +                                OFN_ALLOWMULTISELECT | OFN_NOCHANGEDIR); | 
|  | 
| -  if (!filter.empty()) { | 
| -    ofn.lpstrFilter = filter.c_str(); | 
| -  } | 
| +  if (!filter.empty()) | 
| +    ofn.GetOPENFILENAME()->lpstrFilter = filter.c_str(); | 
|  | 
| -  bool success = CallGetOpenFileName(&ofn); | 
| +  base::FilePath directory; | 
| +  std::vector<base::FilePath> filenames; | 
| + | 
| +  if (CallGetOpenFileName(ofn.GetOPENFILENAME())) | 
| +    ofn.GetResult(&directory, &filenames); | 
| DisableOwner(owner); | 
| -  if (success) { | 
| -    std::vector<base::FilePath> files; | 
| -    const wchar_t* selection = ofn.lpstrFile; | 
| -    while (*selection) {  // Empty string indicates end of list. | 
| -      files.push_back(base::FilePath(selection)); | 
| -      // Skip over filename and null-terminator. | 
| -      selection += files.back().value().length() + 1; | 
| -    } | 
| -    if (files.empty()) { | 
| -      success = false; | 
| -    } else if (files.size() == 1) { | 
| -      // When there is one file, it contains the path and filename. | 
| -      paths->swap(files); | 
| -    } else { | 
| -      // Otherwise, the first string is the path, and the remainder are | 
| -      // filenames. | 
| -      std::vector<base::FilePath>::iterator path = files.begin(); | 
| -      for (std::vector<base::FilePath>::iterator file = path + 1; | 
| -           file != files.end(); ++file) { | 
| -        paths->push_back(path->Append(*file)); | 
| -      } | 
| -    } | 
| + | 
| +  for (std::vector<base::FilePath>::iterator it = filenames.begin(); | 
| +       it != filenames.end(); | 
| +       ++it) { | 
| +    paths->push_back(directory.Append(*it)); | 
| } | 
| -  return success; | 
| + | 
| +  return !paths->empty(); | 
| } | 
|  | 
| base::string16 SelectFileDialogImpl::GetFilterForFileTypes( | 
|  |