summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormazda@chromium.org <mazda@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-09 08:02:48 +0000
committermazda@chromium.org <mazda@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-09 08:02:48 +0000
commitb216188590e8505ce620c96e4b39f444a42e901a (patch)
treef6ac79bfc13e979de8889dcacf818b1be69e1188
parent24c2d3628ddaca8c4c0b0bfc4d1435e03614ccef (diff)
downloadchromium_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.cc94
-rw-r--r--ui/views/bubble/bubble_delegate_unittest.cc37
-rw-r--r--ui/views/test/test_widget_observer.cc29
-rw-r--r--ui/views/test/test_widget_observer.h37
-rw-r--r--ui/views/views.gyp2
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',
],