Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(476)

Unified Diff: ui/keyboard/keyboard_controller_unittest.cc

Issue 13726015: keyboard: Add a window delegate to the keyboard window container. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: self-nits Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« ui/keyboard/keyboard_controller.cc ('K') | « ui/keyboard/keyboard_controller.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/keyboard/keyboard_controller_unittest.cc
diff --git a/ui/keyboard/keyboard_controller_unittest.cc b/ui/keyboard/keyboard_controller_unittest.cc
index 3da30d212dd785c0ff61d4f7ef6e07452e5c8347..86f81ba19b53d140672f29a776bbc55a51be305f 100644
--- a/ui/keyboard/keyboard_controller_unittest.cc
+++ b/ui/keyboard/keyboard_controller_unittest.cc
@@ -5,7 +5,11 @@
#include "base/memory/scoped_ptr.h"
#include "base/message_loop.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/aura/client/focus_client.h"
+#include "ui/aura/root_window.h"
#include "ui/aura/test/aura_test_helper.h"
+#include "ui/aura/test/event_generator.h"
+#include "ui/aura/test/test_window_delegate.h"
#include "ui/aura/window.h"
#include "ui/compositor/layer_type.h"
#include "ui/gfx/rect.h"
@@ -15,6 +19,33 @@
namespace keyboard {
namespace {
+// An event handler that focuses a window when it is clicked/touched on. This is
+// used to match the focus manger behaviour in ash and views.
+class TestFocusController : public ui::EventHandler {
+ public:
+ explicit TestFocusController(aura::RootWindow* root)
+ : root_(root) {
+ root_->AddPreTargetHandler(this);
+ }
+
+ virtual ~TestFocusController() {
+ root_->RemovePreTargetHandler(this);
+ }
+
+ private:
+ // Overridden from ui::EventHandler:
+ virtual void OnEvent(ui::Event* event) OVERRIDE {
+ aura::Window* target = static_cast<aura::Window*>(event->target());
+ if (event->type() == ui::ET_MOUSE_PRESSED ||
+ event->type() == ui::ET_TOUCH_PRESSED) {
+ aura::client::GetFocusClient(target)->FocusWindow(target);
+ }
+ }
+
+ aura::Window* root_;
+ DISALLOW_COPY_AND_ASSIGN(TestFocusController);
+};
+
class KeyboardControllerTest : public testing::Test {
public:
KeyboardControllerTest() {}
@@ -23,15 +54,19 @@ class KeyboardControllerTest : public testing::Test {
virtual void SetUp() OVERRIDE {
aura_test_helper_.reset(new aura::test::AuraTestHelper(&message_loop_));
aura_test_helper_->SetUp();
+ focus_controller_.reset(new TestFocusController(root_window()));
}
virtual void TearDown() OVERRIDE {
aura_test_helper_->TearDown();
}
+ aura::RootWindow* root_window() { return aura_test_helper_->root_window(); }
+
protected:
base::MessageLoopForUI message_loop_;
scoped_ptr<aura::test::AuraTestHelper> aura_test_helper_;
+ scoped_ptr<TestFocusController> focus_controller_;
private:
DISALLOW_COPY_AND_ASSIGN(KeyboardControllerTest);
@@ -39,18 +74,47 @@ class KeyboardControllerTest : public testing::Test {
class TestKeyboardControllerProxy : public KeyboardControllerProxy {
public:
- TestKeyboardControllerProxy() : window_(new aura::Window(NULL)) {
+ TestKeyboardControllerProxy() : window_(new aura::Window(&delegate_)) {
window_->Init(ui::LAYER_NOT_DRAWN);
window_->set_owned_by_parent(false);
}
- virtual ~TestKeyboardControllerProxy() {}
+
+ virtual ~TestKeyboardControllerProxy() {
+ // Destroy the window before the delegate.
+ window_.reset();
+ }
+
+ // Overridden from KeyboardControllerProxy:
virtual aura::Window* GetKeyboardWindow() OVERRIDE { return window_.get(); }
private:
scoped_ptr<aura::Window> window_;
+ aura::test::TestWindowDelegate delegate_;
+
DISALLOW_COPY_AND_ASSIGN(TestKeyboardControllerProxy);
};
+// Keeps a count of all the events a window receives.
+class EventObserver : public ui::EventHandler {
+ public:
+ EventObserver() {}
+ virtual ~EventObserver() {}
+
+ int GetEventCount(ui::EventType type) {
+ return event_counts_[type];
+ }
+
+ private:
+ // Overridden from ui::EventHandler:
+ virtual void OnEvent(ui::Event* event) OVERRIDE {
+ ui::EventHandler::OnEvent(event);
+ event_counts_[event->type()]++;
+ }
+
+ std::map<ui::EventType, int> event_counts_;
+ DISALLOW_COPY_AND_ASSIGN(EventObserver);
+};
+
} // namespace
TEST_F(KeyboardControllerTest, KeyboardSize) {
@@ -71,4 +135,50 @@ TEST_F(KeyboardControllerTest, KeyboardSize) {
ASSERT_EQ(before_bounds, proxy->GetKeyboardWindow()->bounds());
}
+// Tests that tapping/clicking inside the keyboard does not give it focus.
+TEST_F(KeyboardControllerTest, ClickDoesNotFocusKeyboard) {
+ const gfx::Rect& root_bounds = root_window()->bounds();
+ aura::test::EventCountDelegate delegate;
+ scoped_ptr<aura::Window> window(new aura::Window(&delegate));
+ window->Init(ui::LAYER_NOT_DRAWN);
+ window->SetBounds(root_bounds);
+ root_window()->AddChild(window.get());
+ window->Show();
+ window->Focus();
+
+ KeyboardControllerProxy* proxy = new TestKeyboardControllerProxy();
+ KeyboardController controller(proxy);
+
+ scoped_ptr<aura::Window> keyboard_container(controller.GetContainerWindow());
+ keyboard_container->SetBounds(root_bounds);
+
+ root_window()->AddChild(keyboard_container.get());
+ keyboard_container->Show();
+
+ root_window()->StackChildAtTop(keyboard_container.get());
+ EXPECT_TRUE(window->IsVisible());
+ EXPECT_TRUE(keyboard_container->IsVisible());
+ EXPECT_TRUE(window->HasFocus());
+ EXPECT_FALSE(keyboard_container->HasFocus());
+
+ // Click on the keyboard. Make sure the keyboard receives the event, but does
+ // not get focus.
+ EventObserver observer;
+ keyboard_container->AddPreTargetHandler(&observer);
+
+ aura::test::EventGenerator generator(root_window());
+ generator.MoveMouseTo(proxy->GetKeyboardWindow()->bounds().CenterPoint());
+ generator.ClickLeftButton();
+ EXPECT_TRUE(window->HasFocus());
+ EXPECT_FALSE(keyboard_container->HasFocus());
+ EXPECT_EQ("0 0", delegate.GetMouseButtonCountsAndReset());
+ EXPECT_EQ(1, observer.GetEventCount(ui::ET_MOUSE_PRESSED));
+ EXPECT_EQ(1, observer.GetEventCount(ui::ET_MOUSE_RELEASED));
+
+ // Click outside of the keyboard. It should reach the window behind.
+ generator.MoveMouseTo(gfx::Point());
+ generator.ClickLeftButton();
+ EXPECT_EQ("1 1", delegate.GetMouseButtonCountsAndReset());
+}
+
} // namespace keyboard
« ui/keyboard/keyboard_controller.cc ('K') | « ui/keyboard/keyboard_controller.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698