| Index: chrome/browser/ui/views/constrained_window_views_browsertest.cc
|
| diff --git a/chrome/browser/ui/views/constrained_window_views_browsertest.cc b/chrome/browser/ui/views/constrained_window_views_browsertest.cc
|
| index 9c774b2a78281cca74c9e5292bdbf00aba4b6cd0..0ecaa7549e2d59e5442caea74da552da81df37aa 100644
|
| --- a/chrome/browser/ui/views/constrained_window_views_browsertest.cc
|
| +++ b/chrome/browser/ui/views/constrained_window_views_browsertest.cc
|
| @@ -2,35 +2,105 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "base/memory/scoped_ptr.h"
|
| +#include "base/memory/weak_ptr.h"
|
| +#include "chrome/browser/platform_util.h"
|
| +#include "chrome/browser/profiles/profile.h"
|
| +#include "chrome/browser/search/search.h"
|
| #include "chrome/browser/ui/browser.h"
|
| #include "chrome/browser/ui/browser_commands.h"
|
| -#include "chrome/browser/ui/host_desktop.h"
|
| #include "chrome/browser/ui/tabs/tab_strip_model.h"
|
| -#include "chrome/browser/ui/views/tab_modal_confirm_dialog_views.h"
|
| +#include "chrome/browser/ui/views/constrained_window_views.h"
|
| +#include "chrome/browser/ui/views/frame/browser_view.h"
|
| +#include "chrome/browser/ui/webui/constrained_web_dialog_ui.h"
|
| #include "chrome/common/url_constants.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 "components/web_modal/web_contents_modal_dialog_host.h"
|
| #include "components/web_modal/web_contents_modal_dialog_manager.h"
|
| #include "components/web_modal/web_contents_modal_dialog_manager_delegate.h"
|
| +#include "content/public/browser/native_web_keyboard_event.h"
|
| +#include "content/public/browser/navigation_controller.h"
|
| +#include "content/public/browser/notification_types.h"
|
| +#include "content/public/browser/render_view_host.h"
|
| #include "content/public/browser/web_contents.h"
|
| -#include "content/public/test/browser_test_utils.h"
|
| +#include "ipc/ipc_message.h"
|
| #include "ui/base/accelerators/accelerator.h"
|
| +#include "ui/views/controls/textfield/textfield.h"
|
| #include "ui/views/focus/focus_manager.h"
|
| -#include "ui/views/widget/widget.h"
|
| +#include "ui/views/layout/fill_layout.h"
|
| +#include "ui/views/test/test_widget_observer.h"
|
| +#include "ui/views/window/dialog_delegate.h"
|
| +#include "ui/web_dialogs/test/test_web_dialog_delegate.h"
|
| +
|
| +#if defined(USE_AURA) && defined(USE_X11)
|
| +#include <X11/Xlib.h>
|
| +#include "ui/events/test/events_test_utils_x11.h"
|
| +#endif
|
| +
|
| +using web_modal::WebContentsModalDialogManager;
|
| +using web_modal::WebContentsModalDialogManagerDelegate;
|
|
|
| namespace {
|
|
|
| -class TestDialog : public views::DialogDelegateView {
|
| +class TestConstrainedDialogContentsView
|
| + : public views::View,
|
| + public base::SupportsWeakPtr<TestConstrainedDialogContentsView> {
|
| public:
|
| - TestDialog() { SetFocusable(true); }
|
| - virtual ~TestDialog() {}
|
| -
|
| - virtual views::View* GetInitiallyFocusedView() OVERRIDE { return this; }
|
| - // Don't delete the delegate yet. Keep it around for inspection later.
|
| - virtual void DeleteDelegate() OVERRIDE {}
|
| + TestConstrainedDialogContentsView()
|
| + : text_field_(new views::Textfield) {
|
| + SetLayoutManager(new views::FillLayout);
|
| + AddChildView(text_field_);
|
| + }
|
| +
|
| + views::View* GetInitiallyFocusedView() {
|
| + return text_field_;
|
| + }
|
| +
|
| + private:
|
| + views::Textfield* text_field_;
|
| + DISALLOW_COPY_AND_ASSIGN(TestConstrainedDialogContentsView);
|
| +};
|
| +
|
| +class TestConstrainedDialog : public views::DialogDelegate {
|
| + public:
|
| + TestConstrainedDialog()
|
| + : contents_((new TestConstrainedDialogContentsView())->AsWeakPtr()),
|
| + done_(false) {
|
| + }
|
| +
|
| + virtual ~TestConstrainedDialog() {}
|
| +
|
| + virtual views::View* GetInitiallyFocusedView() OVERRIDE {
|
| + return contents_ ? contents_->GetInitiallyFocusedView() : NULL;
|
| + }
|
| +
|
| + virtual views::View* GetContentsView() OVERRIDE {
|
| + return contents_.get();
|
| + }
|
| +
|
| + virtual views::Widget* GetWidget() OVERRIDE {
|
| + return contents_ ? contents_->GetWidget() : NULL;
|
| + }
|
| +
|
| + virtual const views::Widget* GetWidget() const OVERRIDE {
|
| + return contents_ ? contents_->GetWidget() : NULL;
|
| + }
|
| +
|
| + virtual void DeleteDelegate() OVERRIDE {
|
| + // Don't delete the delegate yet. We need to keep it around for inspection
|
| + // later.
|
| + EXPECT_TRUE(done_);
|
| + }
|
| +
|
| + virtual bool Accept() OVERRIDE {
|
| + done_ = true;
|
| + return true;
|
| + }
|
| +
|
| + virtual bool Cancel() OVERRIDE {
|
| + done_ = true;
|
| + return true;
|
| + }
|
|
|
| virtual ui::ModalType GetModalType() const OVERRIDE {
|
| #if defined(USE_ASH)
|
| @@ -40,168 +110,363 @@
|
| #endif
|
| }
|
|
|
| + bool done() {
|
| + return done_;
|
| + }
|
| +
|
| private:
|
| - DISALLOW_COPY_AND_ASSIGN(TestDialog);
|
| + // contents_ will be freed when the View goes away.
|
| + base::WeakPtr<TestConstrainedDialogContentsView> contents_;
|
| + bool done_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TestConstrainedDialog);
|
| };
|
|
|
| -// A helper function to create and show a web contents modal dialog.
|
| -scoped_ptr<TestDialog> ShowModalDialog(content::WebContents* web_contents) {
|
| - scoped_ptr<TestDialog> dialog(new TestDialog());
|
| - views::Widget* window = views::Widget::CreateWindowAsFramelessChild(
|
| - dialog.get(), web_contents->GetNativeView());
|
| - web_modal::WebContentsModalDialogManager::FromWebContents(web_contents)->
|
| - ShowModalDialog(window->GetNativeView());
|
| - return dialog.Pass();
|
| -}
|
| -
|
| } // namespace
|
|
|
| -typedef InProcessBrowserTest ConstrainedWindowViewTest;
|
| -
|
| -// Tests the intial focus of tab-modal dialogs, the restoration of focus to the
|
| -// browser when they close, and that queued dialogs don't register themselves as
|
| -// accelerator targets until they are displayed.
|
| -IN_PROC_BROWSER_TEST_F(ConstrainedWindowViewTest, FocusTest) {
|
| +class ConstrainedWindowViewTest : public InProcessBrowserTest {
|
| + public:
|
| + ConstrainedWindowViewTest() {
|
| + }
|
| +};
|
| +
|
| +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
|
| +// TODO(erg): linux_aura bringup: http://crbug.com/163931
|
| +#define MAYBE_FocusTest DISABLED_FocusTest
|
| +#else
|
| +#define MAYBE_FocusTest FocusTest
|
| +#endif
|
| +
|
| +// Tests the following:
|
| +//
|
| +// *) Initially focused view in a constrained dialog receives focus reliably.
|
| +//
|
| +// *) Constrained windows that are queued don't register themselves as
|
| +// accelerator targets until they are displayed.
|
| +IN_PROC_BROWSER_TEST_F(ConstrainedWindowViewTest, MAYBE_FocusTest) {
|
| content::WebContents* web_contents =
|
| browser()->tab_strip_model()->GetActiveWebContents();
|
| - EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
|
| - scoped_ptr<TestDialog> dialog1 = ShowModalDialog(web_contents);
|
| -
|
| - // |dialog1| should be active and focused.
|
| - EXPECT_TRUE(dialog1->GetWidget()->IsVisible());
|
| - views::FocusManager* focus_manager = dialog1->GetWidget()->GetFocusManager();
|
| - EXPECT_EQ(dialog1->GetContentsView(), focus_manager->GetFocusedView());
|
| -
|
| - // Create a second dialog. This will also be modal to |web_contents|, but will
|
| - // remain hidden since the |dialog1| is still showing.
|
| - scoped_ptr<TestDialog> dialog2 = ShowModalDialog(web_contents);
|
| - EXPECT_FALSE(dialog2->GetWidget()->IsVisible());
|
| - EXPECT_TRUE(dialog1->GetWidget()->IsVisible());
|
| - EXPECT_EQ(focus_manager, dialog2->GetWidget()->GetFocusManager());
|
| - EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
|
| - EXPECT_EQ(dialog1->GetContentsView(), focus_manager->GetFocusedView());
|
| -
|
| - // Pressing return should close |dialog1|.
|
| + ASSERT_TRUE(web_contents != NULL);
|
| + WebContentsModalDialogManager* web_contents_modal_dialog_manager =
|
| + WebContentsModalDialogManager::FromWebContents(web_contents);
|
| + ASSERT_TRUE(web_contents_modal_dialog_manager != NULL);
|
| + WebContentsModalDialogManagerDelegate* modal_delegate =
|
| + web_contents_modal_dialog_manager->delegate();
|
| + ASSERT_TRUE(modal_delegate != NULL);
|
| +
|
| + // Create a constrained dialog. It will attach itself to web_contents.
|
| + scoped_ptr<TestConstrainedDialog> test_dialog1(new TestConstrainedDialog);
|
| + views::Widget* window1 = views::Widget::CreateWindowAsFramelessChild(
|
| + test_dialog1.get(),
|
| + modal_delegate->GetWebContentsModalDialogHost()->GetHostView());
|
| + web_contents_modal_dialog_manager->ShowModalDialog(window1->GetNativeView());
|
| +
|
| + views::FocusManager* focus_manager = window1->GetFocusManager();
|
| + ASSERT_TRUE(focus_manager);
|
| +
|
| + // test_dialog1's text field should be focused.
|
| + EXPECT_EQ(test_dialog1->GetInitiallyFocusedView(),
|
| + focus_manager->GetFocusedView());
|
| +
|
| + // Now create a second constrained dialog. This will also be attached to
|
| + // web_contents, but will remain hidden since the test_dialog1 is still
|
| + // showing.
|
| + scoped_ptr<TestConstrainedDialog> test_dialog2(new TestConstrainedDialog);
|
| + views::Widget* window2 = views::Widget::CreateWindowAsFramelessChild(
|
| + test_dialog2.get(),
|
| + modal_delegate->GetWebContentsModalDialogHost()->GetHostView());
|
| + web_contents_modal_dialog_manager->ShowModalDialog(window2->GetNativeView());
|
| + // Should be the same focus_manager.
|
| + ASSERT_EQ(focus_manager, window2->GetFocusManager());
|
| +
|
| + // test_dialog1's text field should still be the view that has focus.
|
| + EXPECT_EQ(test_dialog1->GetInitiallyFocusedView(),
|
| + focus_manager->GetFocusedView());
|
| + ASSERT_TRUE(web_contents_modal_dialog_manager->IsDialogActive());
|
| +
|
| + // Now send a VKEY_RETURN to the browser. This should result in closing
|
| + // test_dialog1.
|
| EXPECT_TRUE(focus_manager->ProcessAccelerator(
|
| ui::Accelerator(ui::VKEY_RETURN, ui::EF_NONE)));
|
| content::RunAllPendingInMessageLoop();
|
| - EXPECT_EQ(NULL, dialog1->GetWidget());
|
| -
|
| - // |dialog2| should be visible and focused.
|
| - EXPECT_TRUE(dialog2->GetWidget()->IsVisible());
|
| - EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
|
| - EXPECT_EQ(dialog2->GetContentsView(), focus_manager->GetFocusedView());
|
| -
|
| - // Creating a new tab should take focus away from the other tab's dialog.
|
| - const int tab_with_dialog = browser()->tab_strip_model()->active_index();
|
| +
|
| + EXPECT_TRUE(test_dialog1->done());
|
| + EXPECT_FALSE(test_dialog2->done());
|
| + EXPECT_TRUE(web_contents_modal_dialog_manager->IsDialogActive());
|
| +
|
| + // test_dialog2 will be shown. Focus should be on test_dialog2's text field.
|
| + EXPECT_EQ(test_dialog2->GetInitiallyFocusedView(),
|
| + focus_manager->GetFocusedView());
|
| +
|
| + int tab_with_constrained_window =
|
| + browser()->tab_strip_model()->active_index();
|
| +
|
| + // Create a new tab.
|
| chrome::NewTab(browser());
|
| - EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
|
| - EXPECT_NE(dialog2->GetContentsView(), focus_manager->GetFocusedView());
|
| -
|
| - // Activating the previous tab should bring focus to the dialog.
|
| - browser()->tab_strip_model()->ActivateTabAt(tab_with_dialog, false);
|
| - EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
|
| - EXPECT_EQ(dialog2->GetContentsView(), focus_manager->GetFocusedView());
|
| -
|
| - // Pressing enter again should close |dialog2|.
|
| +
|
| + // The constrained dialog should no longer be selected.
|
| + EXPECT_NE(test_dialog2->GetInitiallyFocusedView(),
|
| + focus_manager->GetFocusedView());
|
| +
|
| + browser()->tab_strip_model()->ActivateTabAt(tab_with_constrained_window,
|
| + false);
|
| +
|
| + // Activating the previous tab should bring focus to the constrained window.
|
| + EXPECT_EQ(test_dialog2->GetInitiallyFocusedView(),
|
| + focus_manager->GetFocusedView());
|
| +
|
| + // Send another VKEY_RETURN, closing test_dialog2
|
| EXPECT_TRUE(focus_manager->ProcessAccelerator(
|
| ui::Accelerator(ui::VKEY_RETURN, ui::EF_NONE)));
|
| content::RunAllPendingInMessageLoop();
|
| - EXPECT_EQ(NULL, dialog2->GetWidget());
|
| - EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_TAB_CONTAINER));
|
| -}
|
| -
|
| -// Tests that the tab-modal window is closed properly when its tab is closed.
|
| -IN_PROC_BROWSER_TEST_F(ConstrainedWindowViewTest, TabCloseTest) {
|
| - scoped_ptr<TestDialog> dialog = ShowModalDialog(
|
| - browser()->tab_strip_model()->GetActiveWebContents());
|
| - EXPECT_TRUE(dialog->GetWidget()->IsVisible());
|
| - chrome::CloseTab(browser());
|
| - content::RunAllPendingInMessageLoop();
|
| - EXPECT_EQ(NULL, dialog->GetWidget());
|
| -}
|
| -
|
| -// Tests that the tab-modal window is hidden when an other tab is selected and
|
| -// shown when its tab is selected again.
|
| -IN_PROC_BROWSER_TEST_F(ConstrainedWindowViewTest, TabSwitchTest) {
|
| - scoped_ptr<TestDialog> dialog = ShowModalDialog(
|
| - browser()->tab_strip_model()->GetActiveWebContents());
|
| - EXPECT_TRUE(dialog->GetWidget()->IsVisible());
|
| -
|
| - // Open a new tab. The tab-modal window should hide itself.
|
| - chrome::NewTab(browser());
|
| - EXPECT_FALSE(dialog->GetWidget()->IsVisible());
|
| -
|
| - // Close the new tab. The tab-modal window should show itself again.
|
| - chrome::CloseTab(browser());
|
| - EXPECT_TRUE(dialog->GetWidget()->IsVisible());
|
| -
|
| - // Close the original tab.
|
| - chrome::CloseTab(browser());
|
| - content::RunAllPendingInMessageLoop();
|
| - EXPECT_EQ(NULL, dialog->GetWidget());
|
| -}
|
| -
|
| -// Tests that tab-modal dialogs follow tabs dragged between browser windows.
|
| -IN_PROC_BROWSER_TEST_F(ConstrainedWindowViewTest, TabMoveTest) {
|
| + EXPECT_TRUE(test_dialog2->done());
|
| + EXPECT_FALSE(web_contents_modal_dialog_manager->IsDialogActive());
|
| +}
|
| +
|
| +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
|
| +// TODO(erg): linux_aura bringup: http://crbug.com/163931
|
| +#define MAYBE_TabCloseTest DISABLED_TabCloseTest
|
| +#else
|
| +#define MAYBE_TabCloseTest TabCloseTest
|
| +#endif
|
| +
|
| +// Tests that the constrained window is closed properly when its tab is
|
| +// closed.
|
| +IN_PROC_BROWSER_TEST_F(ConstrainedWindowViewTest, MAYBE_TabCloseTest) {
|
| content::WebContents* web_contents =
|
| browser()->tab_strip_model()->GetActiveWebContents();
|
| - scoped_ptr<TestDialog> dialog = ShowModalDialog(web_contents);
|
| - EXPECT_TRUE(dialog->GetWidget()->IsVisible());
|
| -
|
| - // Move the tab to a second browser window; but first create another tab.
|
| - // That prevents the first browser window from closing when its tab is moved.
|
| - chrome::NewTab(browser());
|
| - browser()->tab_strip_model()->DetachWebContentsAt(
|
| - browser()->tab_strip_model()->GetIndexOfWebContents(web_contents));
|
| - Browser* browser2 = CreateBrowser(browser()->profile());
|
| - browser2->tab_strip_model()->AppendWebContents(web_contents, true);
|
| - EXPECT_TRUE(dialog->GetWidget()->IsVisible());
|
| -
|
| - // Close the first browser.
|
| - chrome::CloseWindow(browser());
|
| - content::RunAllPendingInMessageLoop();
|
| - EXPECT_TRUE(dialog->GetWidget()->IsVisible());
|
| -
|
| - // Close the dialog's browser window.
|
| - chrome::CloseTab(browser2);
|
| - content::RunAllPendingInMessageLoop();
|
| - EXPECT_EQ(NULL, dialog->GetWidget());
|
| -}
|
| -
|
| -// Tests that the web contents navigates when backspace is pressed.
|
| -IN_PROC_BROWSER_TEST_F(ConstrainedWindowViewTest, NavigationOnBackspace) {
|
| + ASSERT_TRUE(web_contents != NULL);
|
| + WebContentsModalDialogManager* web_contents_modal_dialog_manager =
|
| + WebContentsModalDialogManager::FromWebContents(web_contents);
|
| + ASSERT_TRUE(web_contents_modal_dialog_manager != NULL);
|
| + WebContentsModalDialogManagerDelegate* modal_delegate =
|
| + web_contents_modal_dialog_manager->delegate();
|
| + ASSERT_TRUE(modal_delegate != NULL);
|
| +
|
| + // Create a constrained dialog. It will attach itself to web_contents.
|
| + scoped_ptr<TestConstrainedDialog> test_dialog(new TestConstrainedDialog);
|
| + views::Widget* window = views::Widget::CreateWindowAsFramelessChild(
|
| + test_dialog.get(),
|
| + modal_delegate->GetWebContentsModalDialogHost()->GetHostView());
|
| + web_contents_modal_dialog_manager->ShowModalDialog(window->GetNativeView());
|
| +
|
| + bool closed =
|
| + browser()->tab_strip_model()->CloseWebContentsAt(
|
| + browser()->tab_strip_model()->active_index(),
|
| + TabStripModel::CLOSE_NONE);
|
| + EXPECT_TRUE(closed);
|
| + content::RunAllPendingInMessageLoop();
|
| + EXPECT_TRUE(test_dialog->done());
|
| +}
|
| +
|
| +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
|
| +// TODO(erg): linux_aura bringup: http://crbug.com/163931
|
| +#define MAYBE_TabSwitchTest DISABLED_TabSwitchTest
|
| +#else
|
| +#define MAYBE_TabSwitchTest TabSwitchTest
|
| +#endif
|
| +
|
| +// Tests that the constrained window is hidden when an other tab is selected and
|
| +// shown when its tab is selected again.
|
| +IN_PROC_BROWSER_TEST_F(ConstrainedWindowViewTest, MAYBE_TabSwitchTest) {
|
| content::WebContents* web_contents =
|
| browser()->tab_strip_model()->GetActiveWebContents();
|
| - content::WaitForLoadStop(web_contents);
|
| - const GURL original_url = web_contents->GetURL();
|
| - EXPECT_NE(GURL(chrome::kChromeUIVersionURL), original_url);
|
| - ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIVersionURL));
|
| - content::WaitForLoadStop(web_contents);
|
| - EXPECT_EQ(GURL(chrome::kChromeUIVersionURL), web_contents->GetURL());
|
| -
|
| - scoped_ptr<TestDialog> dialog = ShowModalDialog(web_contents);
|
| - EXPECT_TRUE(dialog->GetWidget()->IsVisible());
|
| - EXPECT_EQ(dialog->GetContentsView(),
|
| - dialog->GetWidget()->GetFocusManager()->GetFocusedView());
|
| -
|
| - // Pressing backspace should navigate back and close the dialog.
|
| - EXPECT_TRUE(chrome::CanGoBack(browser()));
|
| - EXPECT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_BACK,
|
| - false, false, false, false));
|
| - content::RunAllPendingInMessageLoop();
|
| - content::WaitForLoadStop(web_contents);
|
| - EXPECT_EQ(NULL, dialog->GetWidget());
|
| - EXPECT_EQ(original_url, web_contents->GetURL());
|
| -}
|
| -
|
| -// Tests that the dialog closes when the escape key is pressed.
|
| -IN_PROC_BROWSER_TEST_F(ConstrainedWindowViewTest, ClosesOnEscape) {
|
| - scoped_ptr<TestDialog> dialog = ShowModalDialog(
|
| - browser()->tab_strip_model()->GetActiveWebContents());
|
| - EXPECT_TRUE(dialog->GetWidget()->IsVisible());
|
| - EXPECT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_ESCAPE,
|
| - false, false, false, false));
|
| - content::RunAllPendingInMessageLoop();
|
| - EXPECT_EQ(NULL, dialog->GetWidget());
|
| -}
|
| + ASSERT_TRUE(web_contents != NULL);
|
| +
|
| + // Create a constrained dialog. It will attach itself to web_contents.
|
| + scoped_ptr<TestConstrainedDialog> test_dialog(new TestConstrainedDialog);
|
| + WebContentsModalDialogManager* web_contents_modal_dialog_manager =
|
| + WebContentsModalDialogManager::FromWebContents(web_contents);
|
| + WebContentsModalDialogManagerDelegate* modal_delegate =
|
| + web_contents_modal_dialog_manager->delegate();
|
| + ASSERT_TRUE(modal_delegate != NULL);
|
| + views::Widget* window = views::Widget::CreateWindowAsFramelessChild(
|
| + test_dialog.get(),
|
| + modal_delegate->GetWebContentsModalDialogHost()->GetHostView());
|
| + web_contents_modal_dialog_manager->ShowModalDialog(window->GetNativeView());
|
| + EXPECT_TRUE(window->IsVisible());
|
| +
|
| + // Open a new tab. The constrained window should hide itself.
|
| + browser()->tab_strip_model()->AppendWebContents(
|
| + content::WebContents::Create(
|
| + content::WebContents::CreateParams(browser()->profile())),
|
| + true);
|
| + EXPECT_FALSE(window->IsVisible());
|
| +
|
| + // Close the new tab. The constrained window should show itself again.
|
| + bool closed =
|
| + browser()->tab_strip_model()->CloseWebContentsAt(
|
| + browser()->tab_strip_model()->active_index(),
|
| + TabStripModel::CLOSE_NONE);
|
| + EXPECT_TRUE(closed);
|
| + EXPECT_TRUE(window->IsVisible());
|
| +
|
| + // Close the original tab.
|
| + browser()->tab_strip_model()->CloseWebContentsAt(
|
| + browser()->tab_strip_model()->active_index(),
|
| + TabStripModel::CLOSE_NONE);
|
| + content::RunAllPendingInMessageLoop();
|
| + EXPECT_TRUE(test_dialog->done());
|
| +}
|
| +
|
| +// Tests that the constrained window behaves properly when moving its tab
|
| +// between browser windows.
|
| +IN_PROC_BROWSER_TEST_F(ConstrainedWindowViewTest, TabMoveTest) {
|
| + // Open a second browser.
|
| + Browser* browser2 = CreateBrowser(browser()->profile());
|
| +
|
| + // Create a second WebContents in the second browser, so that moving the
|
| + // WebContents does not trigger the browser to close immediately. This mimics
|
| + // the behavior when a user drags tabs between browsers.
|
| + content::WebContents* web_contents = content::WebContents::Create(
|
| + content::WebContents::CreateParams(browser()->profile()));
|
| + browser2->tab_strip_model()->AppendWebContents(web_contents, true);
|
| + ASSERT_EQ(web_contents, browser2->tab_strip_model()->GetActiveWebContents());
|
| +
|
| + // Create a constrained dialog. It will attach itself to web_contents.
|
| + scoped_ptr<TestConstrainedDialog> test_dialog(new TestConstrainedDialog);
|
| + WebContentsModalDialogManager* web_contents_modal_dialog_manager =
|
| + WebContentsModalDialogManager::FromWebContents(web_contents);
|
| + WebContentsModalDialogManagerDelegate* modal_delegate =
|
| + web_contents_modal_dialog_manager->delegate();
|
| + ASSERT_TRUE(modal_delegate != NULL);
|
| + views::Widget* window = views::Widget::CreateWindowAsFramelessChild(
|
| + test_dialog.get(),
|
| + modal_delegate->GetWebContentsModalDialogHost()->GetHostView());
|
| + web_contents_modal_dialog_manager->ShowModalDialog(window->GetNativeView());
|
| + EXPECT_TRUE(window->IsVisible());
|
| +
|
| + // Detach the web contents from the second browser's tab strip.
|
| + browser2->tab_strip_model()->DetachWebContentsAt(
|
| + browser2->tab_strip_model()->GetIndexOfWebContents(web_contents));
|
| +
|
| + // Append the web contents to the first browser.
|
| + browser()->tab_strip_model()->AppendWebContents(web_contents, true);
|
| + EXPECT_TRUE(window->IsVisible());
|
| +
|
| + // Close the second browser.
|
| + browser2->tab_strip_model()->CloseAllTabs();
|
| + content::RunAllPendingInMessageLoop();
|
| + EXPECT_TRUE(window->IsVisible());
|
| +
|
| + // Close the dialog's tab.
|
| + bool closed =
|
| + browser()->tab_strip_model()->CloseWebContentsAt(
|
| + browser()->tab_strip_model()->GetIndexOfWebContents(web_contents),
|
| + TabStripModel::CLOSE_NONE);
|
| + EXPECT_TRUE(closed);
|
| + content::RunAllPendingInMessageLoop();
|
| + EXPECT_TRUE(test_dialog->done());
|
| +}
|
| +
|
| +#if defined(OS_WIN) || (defined(USE_AURA) && defined(USE_X11))
|
| +
|
| +// Forwards the key event which has |key_code| to the renderer.
|
| +void ForwardKeyEvent(content::RenderViewHost* host, ui::KeyboardCode key_code) {
|
| +#if defined(OS_WIN)
|
| + MSG native_key_event = { NULL, WM_KEYDOWN, key_code, 0 };
|
| +#elif defined(USE_X11)
|
| + ui::ScopedXI2Event x_event;
|
| + x_event.InitKeyEvent(ui::ET_KEY_PRESSED, key_code, ui::EF_NONE);
|
| + XEvent* native_key_event = x_event;
|
| +#endif
|
| +
|
| +#if defined(USE_AURA)
|
| + ui::KeyEvent key(native_key_event, false);
|
| + ui::KeyEvent* native_ui_key_event = &key;
|
| +#elif defined(OS_WIN)
|
| + MSG native_ui_key_event = native_key_event;
|
| +#endif
|
| +
|
| + host->ForwardKeyboardEvent(
|
| + content::NativeWebKeyboardEvent(native_ui_key_event));
|
| +}
|
| +
|
| +// Tests that backspace is not processed before it's sent to the web contents.
|
| +// Flaky on Win Aura and Linux ChromiumOS. See http://crbug.com/170331
|
| +#if defined(USE_AURA)
|
| +#define MAYBE_BackspaceSentToWebContent DISABLED_BackspaceSentToWebContent
|
| +#else
|
| +#define MAYBE_BackspaceSentToWebContent BackspaceSentToWebContent
|
| +#endif
|
| +IN_PROC_BROWSER_TEST_F(ConstrainedWindowViewTest,
|
| + MAYBE_BackspaceSentToWebContent) {
|
| + content::WebContents* web_contents =
|
| + browser()->tab_strip_model()->GetActiveWebContents();
|
| + ASSERT_TRUE(web_contents != NULL);
|
| +
|
| + GURL new_tab_url(chrome::kChromeUINewTabURL);
|
| + ui_test_utils::NavigateToURL(browser(), new_tab_url);
|
| + GURL about_url(chrome::kChromeUIAboutURL);
|
| + ui_test_utils::NavigateToURL(browser(), about_url);
|
| +
|
| + ConstrainedWebDialogDelegate* cwdd = CreateConstrainedWebDialog(
|
| + browser()->profile(),
|
| + new ui::test::TestWebDialogDelegate(about_url),
|
| + NULL,
|
| + web_contents);
|
| +
|
| + content::WindowedNotificationObserver back_observer(
|
| + content::NOTIFICATION_LOAD_STOP,
|
| + content::Source<content::NavigationController>(
|
| + &web_contents->GetController()));
|
| + content::RenderViewHost* render_view_host =
|
| + cwdd->GetWebContents()->GetRenderViewHost();
|
| + ForwardKeyEvent(render_view_host, ui::VKEY_BACK);
|
| +
|
| + // Backspace is not processed as accelerator before it's sent to web contents.
|
| + EXPECT_FALSE(web_contents->GetController().GetPendingEntry());
|
| + EXPECT_EQ(about_url.spec(), web_contents->GetURL().spec());
|
| +
|
| + // Backspace is processed as accelerator after it's sent to web contents.
|
| + content::RunAllPendingInMessageLoop();
|
| + EXPECT_TRUE(web_contents->GetController().GetPendingEntry());
|
| +
|
| + // Wait for the navigation to commit, since the URL will not be visible
|
| + // until then.
|
| + back_observer.Wait();
|
| + EXPECT_TRUE(chrome::IsNTPURL(web_contents->GetURL(), browser()->profile()));
|
| +}
|
| +
|
| +// Fails flakily (once per 10-20 runs) on Win Aura only. http://crbug.com/177482
|
| +// Also fails on CrOS.
|
| +// Also fails on linux_aura (http://crbug.com/163931)
|
| +#if defined(TOOLKIT_VIEWS)
|
| +#define MAYBE_EscapeCloseConstrainedWindow DISABLED_EscapeCloseConstrainedWindow
|
| +#else
|
| +#define MAYBE_EscapeCloseConstrainedWindow EscapeCloseConstrainedWindow
|
| +#endif
|
| +
|
| +// Tests that escape closes the constrained window.
|
| +IN_PROC_BROWSER_TEST_F(ConstrainedWindowViewTest,
|
| + MAYBE_EscapeCloseConstrainedWindow) {
|
| + content::WebContents* web_contents =
|
| + browser()->tab_strip_model()->GetActiveWebContents();
|
| + ASSERT_TRUE(web_contents != NULL);
|
| +
|
| + GURL new_tab_url(chrome::kChromeUINewTabURL);
|
| + ui_test_utils::NavigateToURL(browser(), new_tab_url);
|
| + ConstrainedWebDialogDelegate* cwdd = CreateConstrainedWebDialog(
|
| + browser()->profile(),
|
| + new ui::test::TestWebDialogDelegate(new_tab_url),
|
| + NULL,
|
| + web_contents);
|
| +
|
| + views::Widget* widget =
|
| + views::Widget::GetWidgetForNativeView(cwdd->GetNativeDialog());
|
| + views::test::TestWidgetObserver observer(widget);
|
| +
|
| + content::RenderViewHost* render_view_host =
|
| + cwdd->GetWebContents()->GetRenderViewHost();
|
| + ForwardKeyEvent(render_view_host, ui::VKEY_ESCAPE);
|
| +
|
| + // Escape is not processed as accelerator before it's sent to web contents.
|
| + EXPECT_FALSE(observer.widget_closed());
|
| +
|
| + content::RunAllPendingInMessageLoop();
|
| +
|
| + // Escape is processed as accelerator after it's sent to web contents.
|
| + EXPECT_TRUE(observer.widget_closed());
|
| +}
|
| +
|
| +#endif // defined(OS_WIN) || (defined(USE_AURA) && defined(USE_X11))
|
|
|