Home | History | Annotate | Download | only in ui
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/ui/shell_dialogs.h"
      6 
      7 #include "base/logging.h"
      8 #include "chrome/browser/browser_process.h"
      9 #include "chrome/browser/prefs/pref_service.h"
     10 #include "chrome/browser/tab_contents/simple_alert_infobar_delegate.h"
     11 #include "chrome/common/pref_names.h"
     12 #include "content/browser/tab_contents/tab_contents.h"
     13 #include "grit/generated_resources.h"
     14 #include "ui/base/l10n/l10n_util.h"
     15 
     16 SelectFileDialog::FileTypeInfo::FileTypeInfo() : include_all_files(false) {}
     17 
     18 SelectFileDialog::FileTypeInfo::~FileTypeInfo() {}
     19 
     20 SelectFileDialog::SelectFileDialog(Listener* listener)
     21     : listener_(listener) {
     22   DCHECK(listener_);
     23 }
     24 
     25 SelectFileDialog::~SelectFileDialog() {}
     26 
     27 bool SelectFileDialog::CanOpenSelectFileDialog() {
     28   DCHECK(g_browser_process);
     29 
     30   // local_state() can return NULL for tests.
     31   if (!g_browser_process->local_state())
     32     return false;
     33 
     34   return !g_browser_process->local_state()->FindPreference(
     35              prefs::kAllowFileSelectionDialogs) ||
     36          g_browser_process->local_state()->GetBoolean(
     37              prefs::kAllowFileSelectionDialogs);
     38 }
     39 
     40 void SelectFileDialog::SelectFile(Type type,
     41                                   const string16& title,
     42                                   const FilePath& default_path,
     43                                   const FileTypeInfo* file_types,
     44                                   int file_type_index,
     45                                   const FilePath::StringType& default_extension,
     46                                   TabContents* source_contents,
     47                                   gfx::NativeWindow owning_window,
     48                                   void* params) {
     49   DCHECK(listener_);
     50 
     51   if (!CanOpenSelectFileDialog()) {
     52     // Show the InfoBar saying that file-selection dialogs are disabled.
     53     if (source_contents) {
     54       source_contents->AddInfoBar(new SimpleAlertInfoBarDelegate(
     55           source_contents,
     56           NULL,
     57           l10n_util::GetStringUTF16(IDS_FILE_SELECTION_DIALOG_INFOBAR),
     58           true));
     59     } else {
     60       LOG(WARNING) << "File-selection dialogs are disabled but no TabContents "
     61                    << "is given to display the InfoBar.";
     62     }
     63 
     64     // Inform the listener that no file was selected.
     65     // Post a task rather than calling FileSelectionCanceled directly to ensure
     66     // that the listener is called asynchronously.
     67     MessageLoop::current()->PostTask(FROM_HERE,
     68                                      NewRunnableMethod(
     69                                          this,
     70                                          &SelectFileDialog::CancelFileSelection,
     71                                          params));
     72     return;
     73   }
     74   // Call the platform specific implementation of the file selection dialog.
     75   SelectFileImpl(type, title, default_path, file_types, file_type_index,
     76                  default_extension, owning_window, params);
     77 }
     78 
     79 void SelectFileDialog::CancelFileSelection(void* params) {
     80   if (listener_)
     81     listener_->FileSelectionCanceled(params);
     82 }
     83