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 ¶ms) { 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