Index: chrome/browser/ui/views/file_manager_dialog_browsertest.cc |
diff --git a/chrome/browser/ui/views/file_manager_dialog_browsertest.cc b/chrome/browser/ui/views/file_manager_dialog_browsertest.cc |
index 38146c11aafaeb86d823eb85a59f92c785c1ac30..9e8a98eea28c6cc3b4424ed543e3af7b26053de3 100644 |
--- a/chrome/browser/ui/views/file_manager_dialog_browsertest.cc |
+++ b/chrome/browser/ui/views/file_manager_dialog_browsertest.cc |
@@ -66,10 +66,16 @@ class MockSelectFileDialogListener : public SelectFileDialog::Listener { |
class FileManagerDialogBrowserTest : public ExtensionBrowserTest { |
public: |
+ enum DialogButtonType { |
+ DIALOG_BTN_OK, |
+ DIALOG_BTN_CANCEL |
+ }; |
+ |
virtual void SetUp() OVERRIDE { |
// Create the dialog wrapper object, but don't show it yet. |
listener_.reset(new MockSelectFileDialogListener()); |
dialog_ = new FileManagerDialog(listener_.get()); |
+ |
// Must run after our setup because it actually runs the test. |
ExtensionBrowserTest::SetUp(); |
} |
@@ -79,6 +85,9 @@ class FileManagerDialogBrowserTest : public ExtensionBrowserTest { |
// Delete the dialog first, as it holds a pointer to the listener. |
dialog_ = NULL; |
listener_.reset(); |
+ |
+ second_dialog_ = NULL; |
+ second_listener_.reset(); |
} |
// Creates a file system mount point for a directory. |
@@ -90,8 +99,92 @@ class FileManagerDialogBrowserTest : public ExtensionBrowserTest { |
provider->AddMountPoint(path); |
} |
+ void OpenDialog(SelectFileDialog::Type dialog_type, |
+ const FilePath& file_path, |
+ const gfx::NativeWindow& owning_window, |
+ const std::string& additional_message) { |
+ // Spawn a dialog to open a file. The dialog will signal that it is ready |
+ // via chrome.test.sendMessage() in the extension JavaScript. |
+ ExtensionTestMessageListener init_listener("worker-initialized", |
+ false /* will_reply */); |
+ |
+ scoped_ptr<ExtensionTestMessageListener> additional_listener; |
+ if (!additional_message.empty()) { |
+ additional_listener.reset( |
+ new ExtensionTestMessageListener(additional_message, false)); |
+ } |
+ |
+ dialog_->SelectFile(dialog_type, |
+ string16() /* title */, |
+ file_path, |
+ NULL /* file_types */, |
+ 0 /* file_type_index */, |
+ FILE_PATH_LITERAL("") /* default_extension */, |
+ NULL /* source_contents */, |
+ owning_window, |
+ this /* params */); |
+ |
+ LOG(INFO) << "Waiting for JavaScript ready message."; |
+ ASSERT_TRUE(init_listener.WaitUntilSatisfied()); |
+ |
+ if (additional_listener.get()) { |
+ LOG(INFO) << "Waiting for JavaScript " << additional_message |
+ << " message."; |
+ ASSERT_TRUE(additional_listener->WaitUntilSatisfied()); |
+ } |
+ |
+ // Dialog should be running now. |
+ ASSERT_TRUE(dialog_->IsRunning(owning_window)); |
+ } |
+ |
+ void TryOpeningSecondDialog(const gfx::NativeWindow& owning_window) { |
+ second_listener_.reset(new MockSelectFileDialogListener()); |
+ second_dialog_ = new FileManagerDialog(second_listener_.get()); |
+ |
+ // At the moment we don't really care about dialog type, but we have to put |
+ // some dialog type. |
+ second_dialog_->SelectFile(SelectFileDialog::SELECT_OPEN_FILE, |
+ string16() /* title */, |
+ FilePath() /* default_path */, |
+ NULL /* file_types */, |
+ 0 /* file_type_index */, |
+ FILE_PATH_LITERAL("") /* default_extension */, |
+ NULL /* source_contents */, |
+ owning_window, |
+ this /* params */); |
+ |
+ |
+ } |
+ |
+ void CloseDialog(DialogButtonType button_type, |
+ const gfx::NativeWindow& owning_window) { |
+ // Inject JavaScript to click the cancel button and wait for notification |
+ // that the window has closed. |
+ ui_test_utils::WindowedNotificationObserver host_destroyed( |
+ content::NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, |
+ content::NotificationService::AllSources()); |
+ RenderViewHost* host = dialog_->GetRenderViewHost(); |
+ string16 main_frame; |
+ std::string button_class = |
+ (button_type == DIALOG_BTN_OK) ? ".ok" : ".cancel"; |
+ string16 script = ASCIIToUTF16( |
+ "console.log(\'Test JavaScript injected.\');" |
+ "document.querySelector(\'" + button_class + "\').click();"); |
+ // The file selection handler closes the dialog and does not return control |
+ // to JavaScript, so do not wait for return values. |
+ host->ExecuteJavascriptInWebFrame(main_frame, script); |
+ LOG(INFO) << "Waiting for window close notification."; |
+ host_destroyed.Wait(); |
+ |
+ // Dialog no longer believes it is running. |
+ ASSERT_FALSE(dialog_->IsRunning(owning_window)); |
+ } |
+ |
scoped_ptr<MockSelectFileDialogListener> listener_; |
scoped_refptr<FileManagerDialog> dialog_; |
+ |
+ scoped_ptr<MockSelectFileDialogListener> second_listener_; |
+ scoped_refptr<FileManagerDialog> second_dialog_; |
}; |
IN_PROC_BROWSER_TEST_F(FileManagerDialogBrowserTest, CreateAndDestroy) { |
@@ -120,44 +213,13 @@ IN_PROC_BROWSER_TEST_F(FileManagerDialogBrowserTest, SelectFileAndCancel) { |
FilePath tmp_dir("/tmp"); |
AddMountPoint(tmp_dir); |
- // Spawn a dialog to open a file. The dialog will signal that it is ready |
- // via chrome.test.sendMessage() in the extension JavaScript. |
- ExtensionTestMessageListener init_listener("worker-initialized", |
- false /* will_reply */); |
gfx::NativeWindow owning_window = browser()->window()->GetNativeHandle(); |
- dialog_->SelectFile(SelectFileDialog::SELECT_OPEN_FILE, |
- string16() /* title */, |
- FilePath() /* default_path */, |
- NULL /* file_types */, |
- 0 /* file_type_index */, |
- FILE_PATH_LITERAL("") /* default_extension */, |
- NULL /* source_contents */, |
- owning_window, |
- this /* params */); |
- LOG(INFO) << "Waiting for JavaScript ready message."; |
- ASSERT_TRUE(init_listener.WaitUntilSatisfied()); |
- |
- // Dialog should be running now. |
- ASSERT_TRUE(dialog_->IsRunning(owning_window)); |
- |
- // Inject JavaScript to click the cancel button and wait for notification |
- // that the window has closed. |
- ui_test_utils::WindowedNotificationObserver host_destroyed( |
- content::NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, |
- content::NotificationService::AllSources()); |
- RenderViewHost* host = dialog_->GetRenderViewHost(); |
- string16 main_frame; |
- string16 script = ASCIIToUTF16( |
- "console.log(\'Test JavaScript injected.\');" |
- "document.querySelector(\'.cancel\').click();"); |
- // The file selection handler closes the dialog and does not return control |
- // to JavaScript, so do not wait for return values. |
- host->ExecuteJavascriptInWebFrame(main_frame, script); |
- LOG(INFO) << "Waiting for window close notification."; |
- host_destroyed.Wait(); |
- |
- // Dialog no longer believes it is running. |
- ASSERT_FALSE(dialog_->IsRunning(owning_window)); |
+ |
+ // FilePath() for default path. |
+ OpenDialog(SelectFileDialog::SELECT_OPEN_FILE, FilePath(), owning_window, ""); |
+ |
+ // Press cancel button. |
+ CloseDialog(DIALOG_BTN_CANCEL, owning_window); |
// Listener should have been informed of the cancellation. |
ASSERT_FALSE(listener_->file_selected()); |
@@ -183,51 +245,18 @@ IN_PROC_BROWSER_TEST_F(FileManagerDialogBrowserTest, SelectFileAndOpen) { |
ASSERT_TRUE(fp != NULL); |
ASSERT_TRUE(file_util::CloseFile(fp)); |
+ gfx::NativeWindow owning_window = browser()->window()->GetNativeHandle(); |
+ |
// Spawn a dialog to open a file. Provide the path to the file so the dialog |
// will automatically select it. Ensure that the OK button is enabled by |
// waiting for chrome.test.sendMessage('selection-change-complete'). |
// The extension starts a Web Worker to read file metadata, so it may send |
// 'selection-change-complete' before 'worker-initialized'. This is OK. |
- ExtensionTestMessageListener init_listener("worker-initialized", |
- false /* will_reply */); |
- ExtensionTestMessageListener selection_listener("selection-change-complete", |
- false /* will_reply */); |
- gfx::NativeWindow owning_window = browser()->window()->GetNativeHandle(); |
- dialog_->SelectFile(SelectFileDialog::SELECT_OPEN_FILE, |
- string16() /* title */, |
- test_file, |
- NULL /* file_types */, |
- 0 /* file_type_index */, |
- FILE_PATH_LITERAL("") /* default_extension */, |
- NULL /* source_contents */, |
- owning_window, |
- this /* params */); |
- LOG(INFO) << "Waiting for JavaScript initialized message."; |
- ASSERT_TRUE(init_listener.WaitUntilSatisfied()); |
- LOG(INFO) << "Waiting for JavaScript selection-change-complete message."; |
- ASSERT_TRUE(selection_listener.WaitUntilSatisfied()); |
- |
- // Dialog should be running now. |
- ASSERT_TRUE(dialog_->IsRunning(owning_window)); |
- |
- // Inject JavaScript to click the open button and wait for notification |
- // that the window has closed. |
- ui_test_utils::WindowedNotificationObserver host_destroyed( |
- content::NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, |
- content::NotificationService::AllSources()); |
- RenderViewHost* host = dialog_->GetRenderViewHost(); |
- string16 main_frame; |
- string16 script = ASCIIToUTF16( |
- "console.log(\'Test JavaScript injected.\');" |
- "document.querySelector('.ok').click();"); |
- // The file selection handler closes the dialog and does not return control |
- // to JavaScript, so do not wait for return values. |
- host->ExecuteJavascriptInWebFrame(main_frame, script); |
- LOG(INFO) << "Waiting for window close notification."; |
- host_destroyed.Wait(); |
- |
- // Dialog no longer believes it is running. |
- ASSERT_FALSE(dialog_->IsRunning(owning_window)); |
+ OpenDialog(SelectFileDialog::SELECT_OPEN_FILE, test_file, owning_window, |
+ "selection-change-complete"); |
+ |
+ // Click open button. |
+ CloseDialog(DIALOG_BTN_OK, owning_window); |
// Listener should have been informed that the file was opened. |
ASSERT_TRUE(listener_->file_selected()); |
@@ -249,51 +278,18 @@ IN_PROC_BROWSER_TEST_F(FileManagerDialogBrowserTest, SelectFileAndSave) { |
FilePath temp_dir = scoped_temp_dir.path(); |
FilePath test_file = temp_dir.AppendASCII("file_manager_test.html"); |
+ gfx::NativeWindow owning_window = browser()->window()->GetNativeHandle(); |
+ |
// Spawn a dialog to save a file, providing a suggested path. |
// Ensure "Save" button is enabled by waiting for notification from |
// chrome.test.sendMessage(). |
// The extension starts a Web Worker to read file metadata, so it may send |
// 'directory-change-complete' before 'worker-initialized'. This is OK. |
- ExtensionTestMessageListener init_listener("worker-initialized", |
- false /* will_reply */); |
- ExtensionTestMessageListener dir_change_listener("directory-change-complete", |
- false /* will_reply */); |
- gfx::NativeWindow owning_window = browser()->window()->GetNativeHandle(); |
- dialog_->SelectFile(SelectFileDialog::SELECT_SAVEAS_FILE, |
- string16() /* title */, |
- test_file, |
- NULL /* file_types */, |
- 0 /* file_type_index */, |
- FILE_PATH_LITERAL("") /* default_extension */, |
- NULL /* source_contents */, |
- owning_window, |
- this /* params */); |
- LOG(INFO) << "Waiting for JavaScript initialized message."; |
- ASSERT_TRUE(init_listener.WaitUntilSatisfied()); |
- LOG(INFO) << "Waiting for JavaScript directory-change-complete message."; |
- ASSERT_TRUE(dir_change_listener.WaitUntilSatisfied()); |
- |
- // Dialog should be running now. |
- ASSERT_TRUE(dialog_->IsRunning(owning_window)); |
- |
- // Inject JavaScript to click the save button and wait for notification |
- // that the window has closed. |
- ui_test_utils::WindowedNotificationObserver host_destroyed( |
- content::NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, |
- content::NotificationService::AllSources()); |
- RenderViewHost* host = dialog_->GetRenderViewHost(); |
- string16 main_frame; |
- string16 script = ASCIIToUTF16( |
- "console.log(\'Test JavaScript injected.\');" |
- "document.querySelector('.ok').click();"); |
- // The file selection handler closes the dialog and does not return control |
- // to JavaScript, so do not wait for return values. |
- host->ExecuteJavascriptInWebFrame(main_frame, script); |
- LOG(INFO) << "Waiting for window close notification."; |
- host_destroyed.Wait(); |
- |
- // Dialog no longer believes it is running. |
- ASSERT_FALSE(dialog_->IsRunning(owning_window)); |
+ OpenDialog(SelectFileDialog::SELECT_SAVEAS_FILE, test_file, owning_window, |
+ "directory-change-complete"); |
+ |
+ // Click save button. |
+ CloseDialog(DIALOG_BTN_OK, owning_window); |
// Listener should have been informed that the file was selected. |
ASSERT_TRUE(listener_->file_selected()); |
@@ -310,25 +306,9 @@ IN_PROC_BROWSER_TEST_F(FileManagerDialogBrowserTest, |
FilePath tmp_dir("/tmp"); |
AddMountPoint(tmp_dir); |
- // Spawn a dialog to open a file. The dialog will signal that it is ready |
- // via chrome.test.sendMessage() in the extension JavaScript. |
- ExtensionTestMessageListener init_listener("worker-initialized", |
- false /* will_reply */); |
gfx::NativeWindow owning_window = browser()->window()->GetNativeHandle(); |
- dialog_->SelectFile(SelectFileDialog::SELECT_OPEN_FILE, |
- string16() /* title */, |
- FilePath() /* default_path */, |
- NULL /* file_types */, |
- 0 /* file_type_index */, |
- FILE_PATH_LITERAL("") /* default_extension */, |
- NULL /* source_contents */, |
- owning_window, |
- this /* params */); |
- LOG(INFO) << "Waiting for JavaScript ready message."; |
- ASSERT_TRUE(init_listener.WaitUntilSatisfied()); |
- |
- // Dialog should be running now. |
- ASSERT_TRUE(dialog_->IsRunning(owning_window)); |
+ |
+ OpenDialog(SelectFileDialog::SELECT_OPEN_FILE, FilePath(), owning_window, ""); |
// Open a singleton tab in background. |
browser::NavigateParams p(browser(), GURL("www.google.com"), |
@@ -337,24 +317,33 @@ IN_PROC_BROWSER_TEST_F(FileManagerDialogBrowserTest, |
p.disposition = SINGLETON_TAB; |
browser::Navigate(&p); |
- // Inject JavaScript to click the cancel button and wait for notification |
- // that the window has closed. |
- ui_test_utils::WindowedNotificationObserver host_destroyed( |
- content::NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, |
- content::NotificationService::AllSources()); |
- RenderViewHost* host = dialog_->GetRenderViewHost(); |
- string16 main_frame; |
- string16 script = ASCIIToUTF16( |
- "console.log(\'Test JavaScript injected.\');" |
- "document.querySelector(\'.cancel\').click();"); |
- // The file selection handler closes the dialog and does not return control |
- // to JavaScript, so do not wait for return values. |
- host->ExecuteJavascriptInWebFrame(main_frame, script); |
- LOG(INFO) << "Waiting for window close notification."; |
- host_destroyed.Wait(); |
- |
- // Dialog no longer believes it is running. |
- ASSERT_FALSE(dialog_->IsRunning(owning_window)); |
+ // Press cancel button. |
+ CloseDialog(DIALOG_BTN_CANCEL, owning_window); |
+ |
+ // Listener should have been informed of the cancellation. |
+ ASSERT_FALSE(listener_->file_selected()); |
+ ASSERT_TRUE(listener_->canceled()); |
+ ASSERT_EQ(this, listener_->params()); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(FileManagerDialogBrowserTest, OpenTwoDialogs) { |
+ // Add tmp mount point even though this test won't use it directly. |
+ // We need this to make sure that at least one top-level directory exists |
+ // in the file browser. |
+ FilePath tmp_dir("/tmp"); |
+ AddMountPoint(tmp_dir); |
+ |
+ gfx::NativeWindow owning_window = browser()->window()->GetNativeHandle(); |
+ |
+ OpenDialog(SelectFileDialog::SELECT_OPEN_FILE, FilePath(), owning_window, ""); |
+ |
+ TryOpeningSecondDialog(owning_window); |
+ |
+ // Second dialog should not be running. |
+ ASSERT_FALSE(second_dialog_->IsRunning(owning_window)); |
+ |
+ // Click cancel button. |
+ CloseDialog(DIALOG_BTN_CANCEL, owning_window); |
// Listener should have been informed of the cancellation. |
ASSERT_FALSE(listener_->file_selected()); |