diff options
author | mazda@chromium.org <mazda@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-09 08:02:48 +0000 |
---|---|---|
committer | mazda@chromium.org <mazda@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-09 08:02:48 +0000 |
commit | b216188590e8505ce620c96e4b39f444a42e901a (patch) | |
tree | f6ac79bfc13e979de8889dcacf818b1be69e1188 | |
parent | 24c2d3628ddaca8c4c0b0bfc4d1435e03614ccef (diff) | |
download | chromium_src-b216188590e8505ce620c96e4b39f444a42e901a.zip chromium_src-b216188590e8505ce620c96e4b39f444a42e901a.tar.gz chromium_src-b216188590e8505ce620c96e4b39f444a42e901a.tar.bz2 |
Add tests to verify accelerators properly work on constrained window.
- Add ConstrainedWindowViewTest.BackspaceSentToWebContent for Aura.
- Add ConstrainedWindowViewTest.EscapeCloseConstrainedWindow, which verifies that escape key closes the constrained window.
- Extract TestWindowObserver to ui/views/test from bubble_delegate_unittest.cc
BUG=156437
Review URL: https://codereview.chromium.org/11639012
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@175739 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/ui/views/constrained_window_views_browsertest.cc | 94 | ||||
-rw-r--r-- | ui/views/bubble/bubble_delegate_unittest.cc | 37 | ||||
-rw-r--r-- | ui/views/test/test_widget_observer.cc | 29 | ||||
-rw-r--r-- | ui/views/test/test_widget_observer.h | 37 | ||||
-rw-r--r-- | ui/views/views.gyp | 2 |
5 files changed, 151 insertions, 48 deletions
diff --git a/chrome/browser/ui/views/constrained_window_views_browsertest.cc b/chrome/browser/ui/views/constrained_window_views_browsertest.cc index 5b9740a..395cab4 100644 --- a/chrome/browser/ui/views/constrained_window_views_browsertest.cc +++ b/chrome/browser/ui/views/constrained_window_views_browsertest.cc @@ -14,14 +14,22 @@ #include "chrome/common/url_constants.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" +#include "content/public/browser/native_web_keyboard_event.h" +#include "content/public/browser/render_view_host.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/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/base/x/x11_util.h" +#endif + namespace { class TestConstrainedDialogContentsView @@ -250,36 +258,92 @@ IN_PROC_BROWSER_TEST_F(ConstrainedWindowViewTest, TabSwitchTest) { EXPECT_TRUE(test_dialog->done()); } -#if defined(OS_WIN) && !defined(USE_AURA) +#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) + XEvent x_event; + ui::InitXKeyEventForTesting( + ui::ET_KEY_PRESSED, key_code, ui::EF_NONE, &x_event); + 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. -// We do not run this test on Aura because key events are sent to the web -// contents through a different code path that does not call -// views::FocusManager::OnKeyEvent when WebContentsModalDialog is focused. IN_PROC_BROWSER_TEST_F(ConstrainedWindowViewTest, BackspaceSentToWebContent) { content::WebContents* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); ASSERT_TRUE(web_contents != NULL); - GURL url(chrome::kChromeUINewTabURL); - ui_test_utils::NavigateToURL(browser(), url); + 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(url), + new ui::test::TestWebDialogDelegate(about_url), + NULL, + web_contents); + + 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_EQ(about_url.spec(), web_contents->GetURL().spec()); + + content::RunAllPendingInMessageLoop(); + + // Backspace is processed as accelerator after it's sent to web contents. + EXPECT_EQ(new_tab_url.spec(), web_contents->GetURL().spec()); +} + +// Tests that escape closes the constrained window. +IN_PROC_BROWSER_TEST_F(ConstrainedWindowViewTest, + 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); ConstrainedWindowViews* cwv = static_cast<ConstrainedWindowViews*>(cwdd->GetWindow()); + views::test::TestWidgetObserver observer(cwv); cwv->FocusWebContentsModalDialog(); - BrowserView* browser_view = static_cast<BrowserView*>(browser()->window()); - ui::KeyEvent key_event(ui::ET_KEY_PRESSED, - ui::VKEY_BACK, - ui::EF_NONE, - false); - bool not_consumed = browser_view->GetFocusManager()->OnKeyEvent(key_event); - EXPECT_TRUE(not_consumed); + 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) + +#endif // defined(OS_WIN) || (defined(USE_AURA) && defined(USE_X11)) diff --git a/ui/views/bubble/bubble_delegate_unittest.cc b/ui/views/bubble/bubble_delegate_unittest.cc index aaabc9f..9191666 100644 --- a/ui/views/bubble/bubble_delegate_unittest.cc +++ b/ui/views/bubble/bubble_delegate_unittest.cc @@ -4,6 +4,7 @@ #include "ui/views/bubble/bubble_delegate.h" #include "ui/views/bubble/bubble_frame_view.h" +#include "ui/views/test/test_widget_observer.h" #include "ui/views/test/views_test_base.h" #include "ui/views/widget/widget.h" @@ -11,36 +12,6 @@ namespace views { namespace { -// A Widget observer class used in the tests below to observe bubbles closing. -class TestWidgetObserver : public WidgetObserver { - public: - explicit TestWidgetObserver(Widget* widget); - virtual ~TestWidgetObserver(); - - // WidgetObserver overrides: - virtual void OnWidgetClosing(Widget* widget) OVERRIDE; - - bool widget_closed() const { return widget_ == NULL; } - - private: - Widget* widget_; -}; - -TestWidgetObserver::TestWidgetObserver(Widget* widget) - : widget_(widget) { - widget_->AddObserver(this); -} - -TestWidgetObserver::~TestWidgetObserver() { - if (widget_) - widget_->RemoveObserver(this); -} - -void TestWidgetObserver::OnWidgetClosing(Widget* widget) { - DCHECK_EQ(widget_, widget); - widget_ = NULL; -} - class TestBubbleDelegateView : public BubbleDelegateView { public: TestBubbleDelegateView(View* anchor_view); @@ -85,7 +56,7 @@ TEST_F(BubbleDelegateTest, CreateDelegate) { BubbleDelegateView::CreateBubble(bubble_delegate)); EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); - TestWidgetObserver bubble_observer(bubble_widget); + test::TestWidgetObserver bubble_observer(bubble_widget); EXPECT_FALSE(bubble_observer.widget_closed()); BubbleBorder* border = @@ -114,7 +85,7 @@ TEST_F(BubbleDelegateTest, CloseAnchorWidget) { EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); - TestWidgetObserver bubble_observer(bubble_widget); + test::TestWidgetObserver bubble_observer(bubble_widget); EXPECT_FALSE(bubble_observer.widget_closed()); bubble_widget->Show(); @@ -159,7 +130,7 @@ TEST_F(BubbleDelegateTest, ResetAnchorWidget) { EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); - TestWidgetObserver bubble_observer(bubble_widget); + test::TestWidgetObserver bubble_observer(bubble_widget); EXPECT_FALSE(bubble_observer.widget_closed()); // Showing and hiding the bubble widget should have no effect on its anchor. diff --git a/ui/views/test/test_widget_observer.cc b/ui/views/test/test_widget_observer.cc new file mode 100644 index 0000000..7d7abb6 --- /dev/null +++ b/ui/views/test/test_widget_observer.cc @@ -0,0 +1,29 @@ +// Copyright (c) 2012 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 "ui/views/test/test_widget_observer.h" + +#include "base/logging.h" +#include "ui/views/widget/widget.h" + +namespace views { +namespace test { + +TestWidgetObserver::TestWidgetObserver(Widget* widget) + : widget_(widget) { + widget_->AddObserver(this); +} + +TestWidgetObserver::~TestWidgetObserver() { + if (widget_) + widget_->RemoveObserver(this); +} + +void TestWidgetObserver::OnWidgetClosing(Widget* widget) { + DCHECK_EQ(widget_, widget); + widget_ = NULL; +} + +} // namespace test +} // namespace views diff --git a/ui/views/test/test_widget_observer.h b/ui/views/test/test_widget_observer.h new file mode 100644 index 0000000..51bf3d3 --- /dev/null +++ b/ui/views/test/test_widget_observer.h @@ -0,0 +1,37 @@ +// Copyright (c) 2012 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. + +#ifndef UI_VIEWS_TEST_TEST_WIDGET_OBSERVER_H_ +#define UI_VIEWS_TEST_TEST_WIDGET_OBSERVER_H_ + +#include <stddef.h> + +#include "base/basictypes.h" +#include "base/compiler_specific.h" +#include "ui/views/widget/widget_observer.h" + +namespace views { +namespace test { + +// A Widget observer class used in the tests below to observe bubbles closing. +class TestWidgetObserver : public WidgetObserver { + public: + explicit TestWidgetObserver(Widget* widget); + virtual ~TestWidgetObserver(); + + bool widget_closed() const { return widget_ == NULL; } + + private: + // WidgetObserver overrides: + virtual void OnWidgetClosing(Widget* widget) OVERRIDE; + + Widget* widget_; + + DISALLOW_COPY_AND_ASSIGN(TestWidgetObserver); +}; + +} // namespace test +} // namespace views + +#endif // UI_VIEWS_TEST_TEST_WIDGET_OBSERVER_H_ diff --git a/ui/views/views.gyp b/ui/views/views.gyp index dd0fa93..6879112 100644 --- a/ui/views/views.gyp +++ b/ui/views/views.gyp @@ -587,6 +587,8 @@ 'test/desktop_test_views_delegate.h', 'test/test_views_delegate.cc', 'test/test_views_delegate.h', + 'test/test_widget_observer.cc', + 'test/test_widget_observer.h', 'test/views_test_base.cc', 'test/views_test_base.h', ], |