file_select_helper.cc revision 201ade2fbba22bfb27ae029f4d23fca6ded109a0
13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved.
23345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Use of this source code is governed by a BSD-style license that can be
33345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// found in the LICENSE file.
43345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
53345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/file_select_helper.h"
63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "app/l10n_util.h"
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/file_util.h"
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_split.h"
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_util.h"
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/base/mime_util.h"
133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/platform_util.h"
143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/profile.h"
153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/renderer_host/render_view_host.h"
163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/renderer_host/render_widget_host_view.h"
173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/shell_dialogs.h"
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/tab_contents/tab_contents.h"
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/tab_contents/tab_contents_view.h"
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/common/notification_details.h"
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/common/notification_source.h"
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/common/render_messages_params.h"
233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "grit/generated_resources.h"
243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickFileSelectHelper::FileSelectHelper(Profile* profile)
263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    : profile_(profile),
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      render_view_host_(NULL),
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      select_file_dialog_(),
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      dialog_type_(SelectFileDialog::SELECT_OPEN_FILE) {
303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickFileSelectHelper::~FileSelectHelper() {
333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // There may be pending file dialogs, we need to tell them that we've gone
343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // away so they don't try and call back to us.
353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (select_file_dialog_.get())
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    select_file_dialog_->ListenerDestroyed();
373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Stop any pending directory enumeration and prevent a callback.
393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (directory_lister_.get()) {
403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    directory_lister_->set_delegate(NULL);
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    directory_lister_->Cancel();
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid FileSelectHelper::FileSelected(const FilePath& path,
463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                    int index, void* params) {
473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!render_view_host_)
483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  profile_->set_last_selected_directory(path.DirName());
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (dialog_type_ == SelectFileDialog::SELECT_FOLDER) {
533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    DirectorySelected(path);
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::vector<FilePath> files;
583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  files.push_back(path);
593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  render_view_host_->FilesSelectedInChooser(files);
603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // We are done with this showing of the dialog.
613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  render_view_host_ = NULL;
623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid FileSelectHelper::MultiFilesSelected(const std::vector<FilePath>& files,
653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                          void* params) {
663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!files.empty())
673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    profile_->set_last_selected_directory(files[0].DirName());
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!render_view_host_)
693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  render_view_host_->FilesSelectedInChooser(files);
723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // We are done with this showing of the dialog.
733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  render_view_host_ = NULL;
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid FileSelectHelper::FileSelectionCanceled(void* params) {
773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!render_view_host_)
783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // If the user cancels choosing a file to upload we pass back an
813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // empty vector.
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  render_view_host_->FilesSelectedInChooser(std::vector<FilePath>());
833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // We are done with this showing of the dialog.
853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  render_view_host_ = NULL;
863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid FileSelectHelper::DirectorySelected(const FilePath& path) {
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  directory_lister_ = new net::DirectoryLister(path,
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                               true,
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                               net::DirectoryLister::NO_SORT,
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                               this);
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!directory_lister_->Start())
943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    FileSelectionCanceled(NULL);
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid FileSelectHelper::OnListFile(
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const net::DirectoryLister::DirectoryListerData& data) {
993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Directory upload only cares about files.  This util call just checks
1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // the flags in the structure; there's no file I/O going on.
1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (file_util::FileEnumerator::IsDirectory(data.info))
1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  directory_lister_results_.push_back(data.path);
1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid FileSelectHelper::OnListDone(int error) {
1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!render_view_host_)
1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (error) {
1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    FileSelectionCanceled(NULL);
1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  render_view_host_->FilesSelectedInChooser(directory_lister_results_);
1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  render_view_host_ = NULL;
1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  directory_lister_ = NULL;
1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  directory_lister_results_.clear();
1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickSelectFileDialog::FileTypeInfo* FileSelectHelper::GetFileTypesFromAcceptType(
1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const string16& accept_types) {
1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (accept_types.empty())
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return NULL;
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Split the accept-type string on commas.
1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::vector<string16> mime_types;
1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::SplitStringUsingSubstr(accept_types, ASCIIToUTF16(","), &mime_types);
1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (mime_types.empty())
1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return NULL;
1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Create FileTypeInfo and pre-allocate for the first extension list.
1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_ptr<SelectFileDialog::FileTypeInfo> file_type(
1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      new SelectFileDialog::FileTypeInfo());
1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  file_type->include_all_files = true;
1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  file_type->extensions.resize(1);
1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::vector<FilePath::StringType>* extensions = &file_type->extensions.back();
1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Find the correspondinge extensions.
1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int valid_type_count = 0;
1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int description_id = 0;
1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (size_t i = 0; i < mime_types.size(); ++i) {
1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    string16 mime_type = mime_types[i];
1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    std::string ascii_mime_type = StringToLowerASCII(UTF16ToASCII(mime_type));
1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    TrimWhitespace(ascii_mime_type, TRIM_ALL, &ascii_mime_type);
1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (ascii_mime_type.empty())
1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      continue;
1503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    size_t old_extension_size = extensions->size();
1523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (ascii_mime_type == "image/*") {
1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      description_id = IDS_IMAGE_FILES;
1543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      net::GetImageExtensions(extensions);
1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    } else if (ascii_mime_type == "audio/*") {
1563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      description_id = IDS_AUDIO_FILES;
1573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      net::GetAudioExtensions(extensions);
1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    } else if (ascii_mime_type == "video/*") {
1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      description_id = IDS_VIDEO_FILES;
1603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      net::GetVideoExtensions(extensions);
1613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    } else {
1623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      net::GetExtensionsForMimeType(ascii_mime_type, extensions);
1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
1643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (extensions->size() > old_extension_size)
1663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      valid_type_count++;
1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
169201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // If no valid extension is added, bail out.
170201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (valid_type_count == 0)
171201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return NULL;
172201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Use a generic description "Custom Files" if either of the following is
1743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // true:
1753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // 1) There're multiple types specified, like "audio/*,video/*"
1763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // 2) There're multiple extensions for a MIME type without parameter, like
1773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  //    "ehtml,shtml,htm,html" for "text/html". On Windows, the select file
1783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  //    dialog uses the first extension in the list to form the description,
1793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  //    like "EHTML Files". This is not what we want.
1803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (valid_type_count > 1 ||
1813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      (valid_type_count == 1 && description_id == 0 && extensions->size() > 1))
1823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    description_id = IDS_CUSTOM_FILES;
1833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (description_id) {
1853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    file_type->extension_description_overrides.push_back(
1863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        l10n_util::GetStringUTF16(description_id));
1873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return file_type.release();
1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid FileSelectHelper::RunFileChooser(
1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    RenderViewHost* render_view_host,
1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const ViewHostMsg_RunFileChooser_Params &params) {
1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DCHECK(!render_view_host_);
1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  render_view_host_ = render_view_host;
1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  notification_registrar_.RemoveAll();
1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  notification_registrar_.Add(this,
1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              NotificationType::RENDER_WIDGET_HOST_DESTROYED,
2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              Source<RenderViewHost>(render_view_host));
2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!select_file_dialog_.get())
2033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    select_file_dialog_ = SelectFileDialog::Create(this);
2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  switch (params.mode) {
2063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    case ViewHostMsg_RunFileChooser_Params::Open:
2073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      dialog_type_ = SelectFileDialog::SELECT_OPEN_FILE;
2083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      break;
2093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    case ViewHostMsg_RunFileChooser_Params::OpenMultiple:
2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      dialog_type_ = SelectFileDialog::SELECT_OPEN_MULTI_FILE;
2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      break;
2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    case ViewHostMsg_RunFileChooser_Params::OpenFolder:
2133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      dialog_type_ = SelectFileDialog::SELECT_FOLDER;
2143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      break;
2153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    case ViewHostMsg_RunFileChooser_Params::Save:
2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      dialog_type_ = SelectFileDialog::SELECT_SAVEAS_FILE;
2173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      break;
2183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    default:
2193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      dialog_type_ = SelectFileDialog::SELECT_OPEN_FILE;  // Prevent warning.
2203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      NOTREACHED();
2213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_ptr<SelectFileDialog::FileTypeInfo> file_types(
2233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      GetFileTypesFromAcceptType(params.accept_types));
2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath default_file_name = params.default_file_name;
2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (default_file_name.empty())
2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    default_file_name = profile_->last_selected_directory();
2273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  gfx::NativeWindow owning_window =
2293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      platform_util::GetTopLevel(render_view_host_->view()->GetNativeView());
2303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  select_file_dialog_->SelectFile(dialog_type_,
2313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  params.title,
2323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  default_file_name,
2333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  file_types.get(),
234201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                  file_types.get() ? 1 : 0,  // 1-based index.
2353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  FILE_PATH_LITERAL(""),
2363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  owning_window,
2373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  NULL);
2383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid FileSelectHelper::Observe(NotificationType type,
2413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                               const NotificationSource& source,
2423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                               const NotificationDetails& details) {
2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DCHECK(type == NotificationType::RENDER_WIDGET_HOST_DESTROYED);
2443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DCHECK(Details<RenderViewHost>(details).ptr() == render_view_host_);
2453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  render_view_host_ = NULL;
2463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
247