| Index: chrome/browser/views/shell_dialogs_win.cc
 | 
| ===================================================================
 | 
| --- chrome/browser/views/shell_dialogs_win.cc	(revision 13572)
 | 
| +++ chrome/browser/views/shell_dialogs_win.cc	(working copy)
 | 
| @@ -22,6 +22,9 @@
 | 
|  #include "chrome/common/win_util.h"
 | 
|  #include "grit/generated_resources.h"
 | 
|  
 | 
| +// Helpers to show certain types of Windows shell dialogs in a way that doesn't
 | 
| +// block the UI of the entire app.
 | 
| +
 | 
|  class ShellDialogThread : public base::Thread {
 | 
|   public:
 | 
|    ShellDialogThread() : base::Thread("Chrome_ShellDialogThread") { }
 | 
| @@ -192,12 +195,13 @@
 | 
|    virtual ~SelectFileDialogImpl();
 | 
|  
 | 
|    // SelectFileDialog implementation:
 | 
| -  virtual void SelectFile(Type type, const string16& title,
 | 
| +  virtual void SelectFile(Type type,
 | 
| +                          const string16& title,
 | 
|                            const FilePath& default_path,
 | 
| -                          const std::wstring& filter,
 | 
| -                          int filter_index,
 | 
| +                          const FileTypeInfo* file_types,
 | 
| +                          int file_type_index,
 | 
|                            const FilePath::StringType& default_extension,
 | 
| -                          HWND owning_hwnd,
 | 
| +                          gfx::NativeWindow owning_window,
 | 
|                            void* params);
 | 
|    virtual bool IsRunning(HWND owning_hwnd) const;
 | 
|    virtual void ListenerDestroyed();
 | 
| @@ -208,21 +212,31 @@
 | 
|      ExecuteSelectParams(Type type,
 | 
|                          const std::wstring& title,
 | 
|                          const FilePath& default_path,
 | 
| -                        const std::wstring& filter,
 | 
| -                        int filter_index,
 | 
| +                        const FileTypeInfo* file_types,
 | 
| +                        int file_type_index,
 | 
|                          const std::wstring& default_extension,
 | 
|                          RunState run_state,
 | 
|                          HWND owner,
 | 
|                          void* params)
 | 
| -        : type(type), title(title), default_path(default_path), filter(filter),
 | 
| -          filter_index(filter_index), default_extension(default_extension),
 | 
| -          run_state(run_state), owner(owner), params(params) {
 | 
| +        : type(type),
 | 
| +          title(title),
 | 
| +          default_path(default_path),
 | 
| +          file_type_index(file_type_index),
 | 
| +          default_extension(default_extension),
 | 
| +          run_state(run_state),
 | 
| +          owner(owner),
 | 
| +          params(params) {
 | 
| +      if (file_types) {
 | 
| +        this->file_types = *file_types;
 | 
| +      } else {
 | 
| +        this->file_types.include_all_files = true;
 | 
| +      }
 | 
|      }
 | 
|      SelectFileDialog::Type type;
 | 
|      std::wstring title;
 | 
|      FilePath default_path;
 | 
| -    std::wstring filter;
 | 
| -    int filter_index;
 | 
| +    FileTypeInfo file_types;
 | 
| +    int file_type_index;
 | 
|      std::wstring default_extension;
 | 
|      RunState run_state;
 | 
|      HWND owner;
 | 
| @@ -291,14 +305,15 @@
 | 
|      Type type,
 | 
|      const string16& title,
 | 
|      const FilePath& default_path,
 | 
| -    const std::wstring& filter,
 | 
| -    int filter_index,
 | 
| +    const FileTypeInfo* file_types,
 | 
| +    int file_type_index,
 | 
|      const FilePath::StringType& default_extension,
 | 
| -    HWND owner,
 | 
| +    gfx::NativeWindow owning_window,
 | 
|      void* params) {
 | 
|    ExecuteSelectParams execute_params(type, UTF16ToWide(title), default_path,
 | 
| -                                     filter, filter_index, default_extension,
 | 
| -                                     BeginRun(owner), owner, params);
 | 
| +                                     file_types, file_type_index,
 | 
| +                                     default_extension, BeginRun(owning_window),
 | 
| +                                     owning_window, params);
 | 
|    execute_params.run_state.dialog_thread->message_loop()->PostTask(FROM_HERE,
 | 
|        NewRunnableMethod(this, &SelectFileDialogImpl::ExecuteSelectFile,
 | 
|                          execute_params));
 | 
| @@ -316,9 +331,27 @@
 | 
|  
 | 
|  void SelectFileDialogImpl::ExecuteSelectFile(
 | 
|      const ExecuteSelectParams& params) {
 | 
| +  std::vector<std::wstring> exts;
 | 
| +  for (size_t i=0; i<params.file_types.extensions.size(); ++i) {
 | 
| +    const std::vector<std::wstring>& inner_exts =
 | 
| +        params.file_types.extensions[i];
 | 
| +    std::wstring ext_string;
 | 
| +    for (size_t j=0; j<inner_exts.size(); ++j) {
 | 
| +      if (!ext_string.empty())
 | 
| +        ext_string.push_back(L';');
 | 
| +      ext_string.push_back(L'.');
 | 
| +      ext_string.append(inner_exts[j]);
 | 
| +    }
 | 
| +    exts.push_back(ext_string);
 | 
| +  }
 | 
| +  std::wstring filter = win_util::FormatFilterForExtensions(
 | 
| +      exts,
 | 
| +      params.file_types.extension_description_overrides,
 | 
| +      params.file_types.include_all_files);
 | 
| +
 | 
|    FilePath path = params.default_path;
 | 
|    bool success = false;
 | 
| -  unsigned filter_index = params.filter_index;
 | 
| +  unsigned filter_index = params.file_type_index;
 | 
|    if (params.type == SELECT_FOLDER) {
 | 
|      success = RunSelectFolderDialog(params.title,
 | 
|                                      params.run_state.owner,
 | 
| @@ -326,18 +359,18 @@
 | 
|    } else if (params.type == SELECT_SAVEAS_FILE) {
 | 
|      std::wstring path_as_wstring = path.ToWStringHack();
 | 
|      success = win_util::SaveFileAsWithFilter(params.run_state.owner,
 | 
| -        params.default_path.ToWStringHack(), params.filter,
 | 
| +        params.default_path.ToWStringHack(), filter,
 | 
|          params.default_extension, false, &filter_index, &path_as_wstring);
 | 
|      if(success) {
 | 
|        path = FilePath::FromWStringHack(path_as_wstring);
 | 
|      }
 | 
|      DisableOwner(params.run_state.owner);
 | 
|    } else if (params.type == SELECT_OPEN_FILE) {
 | 
| -    success = RunOpenFileDialog(params.title, params.filter,
 | 
| +    success = RunOpenFileDialog(params.title, filter,
 | 
|                                  params.run_state.owner, &path);
 | 
|    } else if (params.type == SELECT_OPEN_MULTI_FILE) {
 | 
|      std::vector<FilePath> paths;
 | 
| -    if (RunOpenMultiFileDialog(params.title, params.filter,
 | 
| +    if (RunOpenMultiFileDialog(params.title, filter,
 | 
|                                 params.run_state.owner, &paths)) {
 | 
|        ui_loop_->PostTask(FROM_HERE, NewRunnableMethod(this,
 | 
|            &SelectFileDialogImpl::MultiFilesSelected,
 | 
| @@ -425,7 +458,7 @@
 | 
|        HRESULT hr = shell_folder->GetDisplayNameOf(list, SHGDN_FORPARSING,
 | 
|                                                   &out_dir_buffer);
 | 
|        if (SUCCEEDED(hr) && out_dir_buffer.uType == STRRET_WSTR) {
 | 
| -        *path = FilePath::FromWStringHack(out_dir_buffer.pOleStr);
 | 
| +        *path = FilePath(out_dir_buffer.pOleStr);
 | 
|          CoTaskMemFree(out_dir_buffer.pOleStr);
 | 
|          result = true;
 | 
|        }
 | 
| @@ -433,7 +466,7 @@
 | 
|          // Use old way if we don't get what we want.
 | 
|          wchar_t old_out_dir_buffer[MAX_PATH + 1];
 | 
|          if (SHGetPathFromIDList(list, old_out_dir_buffer)) {
 | 
| -          *path = FilePath::FromWStringHack(old_out_dir_buffer);
 | 
| +          *path = FilePath(old_out_dir_buffer);
 | 
|            result = true;
 | 
|          }
 | 
|        }
 | 
| 
 |