blob: db3a101256e8187080f8247a5664efb770ee358b [file] [log] [blame]
// Copyright 2015 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 "base/macros.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/chrome_select_file_policy.h"
#include "chrome/browser/ui/libgtkui/select_file_dialog_impl_gtk.h"
#include "chrome/browser/ui/view_ids.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/interactive_test_utils.h"
#include "chrome/test/base/ui_test_utils.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "ui/shell_dialogs/select_file_dialog.h"
#include "ui/views/test/widget_test.h"
#include "ui/views/widget/widget.h"
using BrowserSelectFileDialogTest = InProcessBrowserTest;
namespace libgtkui {
// FilePicker opens a GtkFileChooser.
class FilePicker : public ui::SelectFileDialog::Listener {
public:
explicit FilePicker(BrowserWindow* window) {
select_file_dialog_ = ui::SelectFileDialog::Create(
this, std::make_unique<ChromeSelectFilePolicy>(nullptr));
gfx::NativeWindow parent_window = window->GetNativeWindow();
ui::SelectFileDialog::FileTypeInfo file_types;
file_types.allowed_paths = ui::SelectFileDialog::FileTypeInfo::ANY_PATH;
const base::FilePath file_path;
select_file_dialog_->SelectFile(ui::SelectFileDialog::SELECT_OPEN_FILE,
base::string16(),
file_path,
&file_types,
0,
base::FilePath::StringType(),
parent_window,
nullptr);
}
~FilePicker() override {
select_file_dialog_->ListenerDestroyed();
}
void Close() {
SelectFileDialogImplGTK* file_dialog =
static_cast<SelectFileDialogImplGTK*>(select_file_dialog_.get());
while (!file_dialog->dialogs_.empty())
gtk_widget_destroy(file_dialog->dialogs_.begin()->first);
}
// SelectFileDialog::Listener implementation.
void FileSelected(const base::FilePath& path,
int index,
void* params) override {}
private:
// Dialog box used for opening and saving files.
scoped_refptr<ui::SelectFileDialog> select_file_dialog_;
DISALLOW_COPY_AND_ASSIGN(FilePicker);
};
} // namespace libgtkui
// Leaks in GtkFileChooserDialog. http://crbug.com/537468
// Flaky on Linux. http://crbug.com/700134
#if defined(ADDRESS_SANITIZER) || defined(OS_LINUX)
#define MAYBE_ModalTest DISABLED_ModalTest
#else
#define MAYBE_ModalTest ModalTest
#endif
// Test that the file-picker is modal.
IN_PROC_BROWSER_TEST_F(BrowserSelectFileDialogTest, MAYBE_ModalTest) {
// Bring the native window to the foreground. Returns true on success.
ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
ASSERT_TRUE(browser()->window()->IsActive());
libgtkui::FilePicker file_picker(browser()->window());
gfx::NativeWindow window = browser()->window()->GetNativeWindow();
views::Widget* widget = views::Widget::GetWidgetForNativeWindow(window);
ASSERT_NE(nullptr, widget);
// Run a nested loop until the browser window becomes inactive
// so that the file-picker can be active.
views::test::WidgetActivationWaiter waiter_inactive(widget, false);
waiter_inactive.Wait();
EXPECT_FALSE(browser()->window()->IsActive());
ui_test_utils::ClickOnView(browser(), VIEW_ID_TAB_CONTAINER);
// The window should not get focus due to modal dialog.
EXPECT_FALSE(browser()->window()->IsActive());
ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
EXPECT_FALSE(browser()->window()->IsActive());
ASSERT_TRUE(ui_test_utils::ShowAndFocusNativeWindow(window));
EXPECT_FALSE(browser()->window()->IsActive());
ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
browser(), ui::VKEY_TAB, false, false, true, false));
EXPECT_FALSE(browser()->window()->IsActive());
file_picker.Close();
// Run a nested loop until the browser window becomes active.
views::test::WidgetActivationWaiter wait_active(widget, true);
wait_active.Wait();
ui_test_utils::ClickOnView(browser(), VIEW_ID_TAB_CONTAINER);
EXPECT_TRUE(browser()->window()->IsActive());
}