• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "base/file_path.h"
6 #include "base/file_util.h"
7 #include "base/string16.h"
8 #include "base/values.h"
9 #include "chrome/browser/prefs/pref_service.h"
10 #include "chrome/browser/prefs/browser_prefs.h"
11 #include "chrome/browser/ui/browser.h"
12 #include "chrome/browser/ui/shell_dialogs.h"
13 #include "chrome/test/testing_browser_process_test.h"
14 #include "chrome/test/testing_pref_service.h"
15 #include "chrome/common/pref_names.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17 
18 class FileSelectionUser : public SelectFileDialog::Listener {
19  public:
FileSelectionUser()20   FileSelectionUser()
21       : file_selection_initialisation_in_progress(false) {
22   }
23 
~FileSelectionUser()24   ~FileSelectionUser() {
25     if (select_file_dialog_.get())
26       select_file_dialog_->ListenerDestroyed();
27   }
28 
StartFileSelection()29   void StartFileSelection() {
30     CHECK(!select_file_dialog_.get());
31     select_file_dialog_ = SelectFileDialog::Create(this);
32 
33     const FilePath file_path;
34     const string16 title=string16();
35 
36     file_selection_initialisation_in_progress = true;
37     select_file_dialog_->SelectFile(SelectFileDialog::SELECT_OPEN_FILE,
38                                     title,
39                                     file_path,
40                                     NULL,
41                                     0,
42                                     FILE_PATH_LITERAL(""),
43                                     NULL,
44                                     NULL,
45                                     NULL);
46     file_selection_initialisation_in_progress = false;
47   }
48 
49   // SelectFileDialog::Listener implementation.
FileSelected(const FilePath & path,int index,void * params)50   virtual void FileSelected(const FilePath& path,
51                             int index, void* params){
52     ASSERT_FALSE(file_selection_initialisation_in_progress);
53   }
MultiFilesSelected(const std::vector<FilePath> & files,void * params)54   virtual void MultiFilesSelected(
55       const std::vector<FilePath>& files,
56       void* params) {
57     ASSERT_FALSE(file_selection_initialisation_in_progress);
58   }
FileSelectionCanceled(void * params)59   virtual void FileSelectionCanceled(void* params) {
60     ASSERT_FALSE(file_selection_initialisation_in_progress);
61   }
62 
63  private:
64   scoped_refptr<SelectFileDialog> select_file_dialog_;
65 
66   bool file_selection_initialisation_in_progress;
67 };
68 
69 typedef TestingBrowserProcessTest FileSelectionDialogTest;
70 
71 // Tests if SelectFileDialog::SelectFile returns asynchronously with
72 // file-selection dialogs disabled by policy.
TEST_F(FileSelectionDialogTest,ExpectAsynchronousListenerCall)73 TEST_F(FileSelectionDialogTest, ExpectAsynchronousListenerCall) {
74   MessageLoopForUI message_loop;
75   BrowserThread ui_thread(BrowserThread::UI, &message_loop);
76 
77   TestingPrefService test_local_state;
78   browser::RegisterLocalState(&test_local_state);
79   static_cast<TestingBrowserProcess*>(g_browser_process)->
80       SetPrefService(&test_local_state);
81 
82   FileSelectionUser*  file_selection_user;
83 
84   // Disallow file-selection dialogs.
85   test_local_state.SetManagedPref(
86       prefs::kAllowFileSelectionDialogs,
87       Value::CreateBooleanValue(false));
88 
89   file_selection_user = new FileSelectionUser();
90   file_selection_user->StartFileSelection();
91   delete file_selection_user;
92 
93   static_cast<TestingBrowserProcess*>(g_browser_process)->
94       SetPrefService(NULL);
95 }
96