Chromium Code Reviews| 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..a565272d2849d16d7b545c965e95500ae51cba02 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 */, |
|
achuithb
2011/11/10 23:30:03
Do you like this commenting style? Have you consid
tbarzic
2011/11/11 03:26:24
Usually not, but when commenting function args I p
|
| + 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."; |
|
achuithb
2011/11/10 23:30:03
Is this logging necessary?
tbarzic
2011/11/11 03:26:24
not necessary, but useful
|
| + 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. |
|
James Cook
2011/11/10 23:17:18
nit: remove extra space at start of comment
tbarzic
2011/11/11 03:26:24
Done.
|
| + 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()); |