// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/ui/shell_dialogs.h" #include "base/logging.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/prefs/pref_service.h" #include "chrome/browser/tab_contents/simple_alert_infobar_delegate.h" #include "chrome/common/pref_names.h" #include "content/browser/tab_contents/tab_contents.h" #include "grit/generated_resources.h" #include "ui/base/l10n/l10n_util.h" SelectFileDialog::FileTypeInfo::FileTypeInfo() : include_all_files(false) {} SelectFileDialog::FileTypeInfo::~FileTypeInfo() {} SelectFileDialog::SelectFileDialog(Listener* listener) : listener_(listener) { DCHECK(listener_); } SelectFileDialog::~SelectFileDialog() {} bool SelectFileDialog::CanOpenSelectFileDialog() { DCHECK(g_browser_process); // local_state() can return NULL for tests. if (!g_browser_process->local_state()) return false; return !g_browser_process->local_state()->FindPreference( prefs::kAllowFileSelectionDialogs) || g_browser_process->local_state()->GetBoolean( prefs::kAllowFileSelectionDialogs); } void SelectFileDialog::SelectFile(Type type, const string16& title, const FilePath& default_path, const FileTypeInfo* file_types, int file_type_index, const FilePath::StringType& default_extension, TabContents* source_contents, gfx::NativeWindow owning_window, void* params) { DCHECK(listener_); if (!CanOpenSelectFileDialog()) { // Show the InfoBar saying that file-selection dialogs are disabled. if (source_contents) { source_contents->AddInfoBar(new SimpleAlertInfoBarDelegate( source_contents, NULL, l10n_util::GetStringUTF16(IDS_FILE_SELECTION_DIALOG_INFOBAR), true)); } else { LOG(WARNING) << "File-selection dialogs are disabled but no TabContents " << "is given to display the InfoBar."; } // Inform the listener that no file was selected. // Post a task rather than calling FileSelectionCanceled directly to ensure // that the listener is called asynchronously. MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod( this, &SelectFileDialog::CancelFileSelection, params)); return; } // Call the platform specific implementation of the file selection dialog. SelectFileImpl(type, title, default_path, file_types, file_type_index, default_extension, owning_window, params); } void SelectFileDialog::CancelFileSelection(void* params) { if (listener_) listener_->FileSelectionCanceled(params); }