15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/chrome_select_file_policy.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/browser_prefs.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/scoped_testing_local_state.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/shell_dialogs/select_file_dialog.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/105200
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ExpectAsynchronousListenerCall DISABLED_ExpectAsynchronousListenerCall
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ExpectAsynchronousListenerCall ExpectAsynchronousListenerCall
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileSelectionUser : public ui::SelectFileDialog::Listener {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileSelectionUser()
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : file_selection_initialisation_in_progress(false) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~FileSelectionUser() {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (select_file_dialog_.get())
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      select_file_dialog_->ListenerDestroyed();
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartFileSelection() {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CHECK(!select_file_dialog_.get());
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    select_file_dialog_ = ui::SelectFileDialog::Create(
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this, new ChromeSelectFilePolicy(NULL));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath file_path;
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16 title = base::string16();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_selection_initialisation_in_progress = true;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    select_file_dialog_->SelectFile(ui::SelectFileDialog::SELECT_OPEN_FILE,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    title,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    file_path,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    NULL,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    0,
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    base::FilePath::StringType(),
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    NULL,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    NULL);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_selection_initialisation_in_progress = false;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ui::SelectFileDialog::Listener implementation.
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void FileSelected(const base::FilePath& path,
66a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                            int index, void* params) OVERRIDE {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(file_selection_initialisation_in_progress);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void MultiFilesSelected(
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::vector<base::FilePath>& files,
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      void* params) OVERRIDE {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(file_selection_initialisation_in_progress);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void FileSelectionCanceled(void* params) OVERRIDE {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(file_selection_initialisation_in_progress);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ui::SelectFileDialog> select_file_dialog_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool file_selection_initialisation_in_progress;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef testing::Test ChromeSelectFilePolicyTest;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests if SelectFileDialog::SelectFile returns asynchronously with
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// file-selection dialogs disabled by policy.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeSelectFilePolicyTest, MAYBE_ExpectAsynchronousListenerCall) {
91b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoopForUI message_loop;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedTestingLocalState local_state(
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TestingBrowserProcess::GetGlobal());
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileSelectionUser> file_selection_user(new FileSelectionUser());
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disallow file-selection dialogs.
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  local_state.Get()->SetManagedPref(prefs::kAllowFileSelectionDialogs,
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    new base::FundamentalValue(false));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_selection_user->StartFileSelection();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
105