15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_window_ids.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/test/shell_test_api.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/test_activation_delegate.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/aura/client/cursor_client_observer.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/focus_client.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/aura_test_base.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_window_delegate.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_windows.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/cursor/cursor.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h" 19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/events/event_processor.h" 21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h" 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/events/test/event_generator.h" 2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/events/test/test_event_handler.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/wm/core/compound_event_filter.h" 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/wm/core/input_method_event_filter.h" 27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/activation_client.h" 28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/activation_delegate.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TestingCursorClientObserver : public aura::client::CursorClientObserver { 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestingCursorClientObserver() 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : cursor_visibility_(false), 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) did_visibility_change_(false) {} 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void reset() { cursor_visibility_ = did_visibility_change_ = false; } 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_cursor_visible() const { return cursor_visibility_; } 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool did_visibility_change() const { return did_visibility_change_; } 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Overridden from aura::client::CursorClientObserver: 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnCursorVisibilityChanged(bool is_visible) OVERRIDE { 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cursor_visibility_ = is_visible; 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) did_visibility_change_ = true; 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool cursor_visibility_; 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool did_visibility_change_; 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestingCursorClientObserver); 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TimeDelta getTime() { 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ui::EventTimeForNow(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A slightly changed TestEventHandler which can be configured to return a 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// specified value for key/mouse event handling. 6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class CustomEventHandler : public ui::test::TestEventHandler { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CustomEventHandler() 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : key_result_(ui::ER_UNHANDLED), 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse_result_(ui::ER_UNHANDLED) { 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~CustomEventHandler() {} 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_key_event_handling_result(ui::EventResult result) { 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key_result_ = result; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_mouse_event_handling_result(ui::EventResult result) { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse_result_ = result; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from ui::EventHandler: 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE { 7923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ui::test::TestEventHandler::OnKeyEvent(event); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key_result_ & ui::ER_HANDLED) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->SetHandled(); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key_result_ & ui::ER_CONSUMED) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->StopPropagation(); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE { 8723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ui::test::TestEventHandler::OnMouseEvent(event); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mouse_result_ & ui::ER_HANDLED) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->SetHandled(); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mouse_result_ & ui::ER_CONSUMED) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->StopPropagation(); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::EventResult key_result_; 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::EventResult mouse_result_; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CustomEventHandler); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef test::AshTestBase WindowManagerTest; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NonFocusableDelegate : public aura::test::TestWindowDelegate { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NonFocusableDelegate() {} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CanFocus() OVERRIDE { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NonFocusableDelegate); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HitTestWindowDelegate : public aura::test::TestWindowDelegate { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HitTestWindowDelegate() 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : hittest_code_(HTNOWHERE) { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~HitTestWindowDelegate() {} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_hittest_code(int hittest_code) { hittest_code_ = hittest_code; } 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from TestWindowDelegate: 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetNonClientComponent(const gfx::Point& point) const OVERRIDE { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hittest_code_; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int hittest_code_; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(HitTestWindowDelegate); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowManagerTest, Focus) { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The IME event filter interferes with the basic key event propagation we 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attempt to do here, so we remove it. 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test::ShellTestApi shell_test(Shell::GetInstance()); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->RemovePreTargetHandler( 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell_test.input_method_event_filter()); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = Shell::GetPrimaryRootWindow(); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_window->SetBounds(gfx::Rect(0, 0, 510, 510)); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Supplied ids are negative so as not to collide with shell ids. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(beng): maybe introduce a MAKE_SHELL_ID() macro that generates a safe 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // id beyond shell id max? 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> w1(CreateTestWindowInShell( 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SK_ColorWHITE, -1, gfx::Rect(10, 10, 500, 500))); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w11(aura::test::CreateTestWindow( 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SK_ColorGREEN, -11, gfx::Rect(5, 5, 100, 100), w1.get())); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w111(aura::test::CreateTestWindow( 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SK_ColorCYAN, -111, gfx::Rect(5, 5, 75, 75), w11.get())); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1111(aura::test::CreateTestWindow( 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SK_ColorRED, -1111, gfx::Rect(5, 5, 50, 50), w111.get())); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w12(aura::test::CreateTestWindow( 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SK_ColorMAGENTA, -12, gfx::Rect(10, 420, 25, 25), w1.get())); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::ColorTestWindowDelegate* w121delegate = 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new aura::test::ColorTestWindowDelegate(SK_ColorYELLOW); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w121(aura::test::CreateTestWindowWithDelegate( 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w121delegate, -121, gfx::Rect(5, 5, 5, 5), w12.get())); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::ColorTestWindowDelegate* w122delegate = 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new aura::test::ColorTestWindowDelegate(SK_ColorRED); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w122(aura::test::CreateTestWindowWithDelegate( 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w122delegate, -122, gfx::Rect(10, 5, 5, 5), w12.get())); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::ColorTestWindowDelegate* w123delegate = 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new aura::test::ColorTestWindowDelegate(SK_ColorRED); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w123(aura::test::CreateTestWindowWithDelegate( 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w123delegate, -123, gfx::Rect(15, 5, 5, 5), w12.get())); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w13(aura::test::CreateTestWindow( 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SK_ColorGRAY, -13, gfx::Rect(5, 470, 50, 50), w1.get())); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Click on a sub-window (w121) to focus it. 1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), w121.get()); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.ClickLeftButton(); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::FocusClient* focus_client = 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetFocusClient(w121.get()); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w121.get(), focus_client->GetFocusedWindow()); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::EventProcessor* dispatcher = root_window->GetHost()->event_processor(); 1851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The key press should be sent to the focused sub-window. 1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::KeyEvent keyev(ui::ET_KEY_PRESSED, ui::VKEY_E, ui::EF_NONE); 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&keyev); 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::VKEY_E, w121delegate->last_key_code()); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Touch on a sub-window (w122) to focus it. 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point click_point = w122->bounds().CenterPoint(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window::ConvertPointToTarget(w122->parent(), root_window, &click_point); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TouchEvent touchev(ui::ET_TOUCH_PRESSED, click_point, 0, getTime()); 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&touchev); 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) focus_client = aura::client::GetFocusClient(w122.get()); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w122.get(), focus_client->GetFocusedWindow()); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The key press should be sent to the focused sub-window. 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci keyev = ui::KeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_E, ui::EF_NONE); 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&keyev); 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::VKEY_E, w122delegate->last_key_code()); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hiding the focused window will set the focus to its parent if 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it's focusable. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w122->Hide(); 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(aura::client::GetFocusClient(w12.get()), 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetFocusClient(w122.get())); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w12.get(), 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetFocusClient(w12.get())->GetFocusedWindow()); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the focus back to w122. 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w122->Show(); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w122->Focus(); 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w122.get(), 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetFocusClient(w12.get())->GetFocusedWindow()); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removing the focused window from parent should set the focus to 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // its parent if it's focusable. 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w12->RemoveChild(w122.get()); 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(NULL, aura::client::GetFocusClient(w122.get())); 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w12.get(), 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetFocusClient(w12.get())->GetFocusedWindow()); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the focus to w123, but make the w1 not activatable. 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test::TestActivationDelegate activation_delegate(false); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w123->Focus(); 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w123.get(), 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetFocusClient(w12.get())->GetFocusedWindow()); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::SetActivationDelegate(w1.get(), &activation_delegate); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hiding the focused window will set the focus to NULL because 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // parent window is not focusable. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w123->Hide(); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(aura::client::GetFocusClient(w12.get()), 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetFocusClient(w123.get())); 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(NULL, aura::client::GetFocusClient(w12.get())->GetFocusedWindow()); 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci keyev = ui::KeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_E, ui::EF_NONE); 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&keyev); 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(keyev.handled() || details.dispatcher_destroyed); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the focus back to w123 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::SetActivationDelegate(w1.get(), NULL); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w123->Show(); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w123->Focus(); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w123.get(), 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetFocusClient(w12.get())->GetFocusedWindow()); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::SetActivationDelegate(w1.get(), &activation_delegate); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removing the focused window will set the focus to NULL because 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // parent window is not focusable. 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w12->RemoveChild(w123.get()); 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(NULL, aura::client::GetFocusClient(w123.get())); 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci keyev = ui::KeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_E, ui::EF_NONE); 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&keyev); 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(keyev.handled() || details.dispatcher_destroyed); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Various assertion testing for activating windows. 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowManagerTest, ActivateOnMouse) { 2641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = Shell::GetPrimaryRootWindow(); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test::TestActivationDelegate d1; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::TestWindowDelegate wd; 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> w1(CreateTestWindowInShellWithDelegate( 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &wd, -1, gfx::Rect(10, 10, 50, 50))); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.SetWindow(w1.get()); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test::TestActivationDelegate d2; 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> w2(CreateTestWindowInShellWithDelegate( 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &wd, -2, gfx::Rect(70, 70, 50, 50))); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d2.SetWindow(w2.get()); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::FocusClient* focus_client = 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetFocusClient(w1.get()); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.Clear(); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d2.Clear(); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Activate window1. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::ActivateWindow(w1.get()); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(w1.get())); 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w1.get(), focus_client->GetFocusedWindow()); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d1.activated_count()); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d1.lost_active_count()); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.Clear(); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Click on window2. 2925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), w2.get()); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.ClickLeftButton(); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Window2 should have become active. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(w2.get())); 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w2.get(), focus_client->GetFocusedWindow()); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d1.activated_count()); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d1.lost_active_count()); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d2.activated_count()); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d2.lost_active_count()); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.Clear(); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d2.Clear(); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Click back on window1, but set it up so w1 doesn't activate on click. 3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), w1.get()); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.set_activate(false); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.ClickLeftButton(); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Window2 should still be active and focused. 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(w2.get())); 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w2.get(), focus_client->GetFocusedWindow()); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d1.activated_count()); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d1.lost_active_count()); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d2.activated_count()); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d2.lost_active_count()); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.Clear(); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d2.Clear(); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroy window2, this should make window1 active. 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.set_activate(true); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w2.reset(); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d2.activated_count()); 32758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, d2.lost_active_count()); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(w1.get())); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w1.get(), focus_client->GetFocusedWindow()); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d1.activated_count()); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d1.lost_active_count()); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clicking an active window with a child shouldn't steal the 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // focus from the child. 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w11(CreateTestWindowWithDelegate( 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &wd, -11, gfx::Rect(10, 10, 10, 10), w1.get())); 3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) w11.get()); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First set the focus to the child |w11|. 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.ClickLeftButton(); 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w11.get(), focus_client->GetFocusedWindow()); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(w1.get(), wm::GetActiveWindow()); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Then click the parent active window. The focus shouldn't move. 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point left_top = w1->bounds().origin(); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window::ConvertPointToTarget(w1->parent(), root_window, &left_top); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) left_top.Offset(1, 1); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseTo(left_top); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.ClickLeftButton(); 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w11.get(), focus_client->GetFocusedWindow()); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(w1.get(), wm::GetActiveWindow()); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clicking on a non-focusable window inside a background window should still 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // give focus to the background window. 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NonFocusableDelegate nfd; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w11(CreateTestWindowWithDelegate( 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &nfd, -1, gfx::Rect(10, 10, 10, 10), w1.get())); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move focus to |w2| first. 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> w2(CreateTestWindowInShellWithDelegate( 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &wd, -1, gfx::Rect(70, 70, 50, 50))); 3645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), w2.get()); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.ClickLeftButton(); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w2.get(), focus_client->GetFocusedWindow()); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(w11->CanFocus()); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Click on |w11|. This should focus w1. 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseToCenterOf(w11.get()); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.ClickLeftButton(); 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w1.get(), focus_client->GetFocusedWindow()); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(WindowManagerTest, PanelActivation) { 377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::test::TestWindowDelegate wd; 378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<aura::Window> w1(CreateTestWindowInShellWithDelegate( 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &wd, -1, gfx::Rect(10, 10, 50, 50))); 380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::test::TestWindowDelegate pd; 381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<aura::Window> p1(CreateTestWindowInShellWithDelegateAndType( 3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &pd, ui::wm::WINDOW_TYPE_PANEL, -1, gfx::Rect(10, 10, 50, 50))); 383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::client::FocusClient* focus_client = 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::client::GetFocusClient(w1.get()); 385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Activate w1. 387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wm::ActivateWindow(w1.get()); 388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(w1.get())); 389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Activate p1. 391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wm::ActivateWindow(p1.get()); 392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(p1.get())); 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p1.get(), focus_client->GetFocusedWindow()); 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Activate w1. 396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wm::ActivateWindow(w1.get()); 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(w1.get())); 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(w1.get(), focus_client->GetFocusedWindow()); 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Clicking on a non-activatable window should not change the active window. 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NonFocusableDelegate nfd; 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<aura::Window> w3(CreateTestWindowInShellWithDelegate( 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &nfd, -1, gfx::Rect(70, 70, 50, 50))); 4055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator3(Shell::GetPrimaryRootWindow(), 4065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) w3.get()); 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wm::ActivateWindow(p1.get()); 408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(p1.get())); 409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator3.ClickLeftButton(); 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(p1.get())); 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Essentially the same as ActivateOnMouse, but for touch events. 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowManagerTest, ActivateOnTouch) { 4161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = Shell::GetPrimaryRootWindow(); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test::TestActivationDelegate d1; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::TestWindowDelegate wd; 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> w1(CreateTestWindowInShellWithDelegate( 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &wd, -1, gfx::Rect(10, 10, 50, 50))); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.SetWindow(w1.get()); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test::TestActivationDelegate d2; 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> w2(CreateTestWindowInShellWithDelegate( 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &wd, -2, gfx::Rect(70, 70, 50, 50))); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d2.SetWindow(w2.get()); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::FocusClient* focus_client = 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetFocusClient(w1.get()); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.Clear(); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d2.Clear(); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Activate window1. 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::ActivateWindow(w1.get()); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(w1.get())); 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w1.get(), focus_client->GetFocusedWindow()); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d1.activated_count()); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d1.lost_active_count()); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.Clear(); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Touch window2. 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point press_point = w2->bounds().CenterPoint(); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window::ConvertPointToTarget(w2->parent(), root_window, &press_point); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TouchEvent touchev1(ui::ET_TOUCH_PRESSED, press_point, 0, getTime()); 4461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 447a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::EventProcessor* dispatcher = root_window->GetHost()->event_processor(); 4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&touchev1); 4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Window2 should have become active. 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(w2.get())); 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w2.get(), focus_client->GetFocusedWindow()); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d1.activated_count()); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d1.lost_active_count()); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d2.activated_count()); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d2.lost_active_count()); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.Clear(); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d2.Clear(); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Touch window1, but set it up so w1 doesn't activate on touch. 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) press_point = w1->bounds().CenterPoint(); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window::ConvertPointToTarget(w1->parent(), root_window, &press_point); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.set_activate(false); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TouchEvent touchev2(ui::ET_TOUCH_PRESSED, press_point, 1, getTime()); 4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&touchev2); 4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Window2 should still be active and focused. 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(w2.get())); 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w2.get(), focus_client->GetFocusedWindow()); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d1.activated_count()); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d1.lost_active_count()); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d2.activated_count()); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d2.lost_active_count()); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.Clear(); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d2.Clear(); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroy window2, this should make window1 active. 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.set_activate(true); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w2.reset(); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d2.activated_count()); 48358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, d2.lost_active_count()); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(w1.get())); 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w1.get(), focus_client->GetFocusedWindow()); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d1.activated_count()); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d1.lost_active_count()); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowManagerTest, MouseEventCursors) { 4911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = Shell::GetPrimaryRootWindow(); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a window. 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kWindowLeft = 123; 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kWindowTop = 45; 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HitTestWindowDelegate window_delegate; 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> window(CreateTestWindowInShellWithDelegate( 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &window_delegate, 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -1, 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(kWindowLeft, kWindowTop, 640, 480))); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create two mouse movement events we can switch between. 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point1(kWindowLeft, kWindowTop); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window::ConvertPointToTarget(window->parent(), root_window, &point1); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point2(kWindowLeft + 1, kWindowTop + 1); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window::ConvertPointToTarget(window->parent(), root_window, &point2); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 509a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) aura::WindowTreeHost* host = root_window->GetHost(); 510a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::EventProcessor* dispatcher = host->event_processor(); 5111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cursor starts as a pointer (set during Shell::Init()). 513a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ui::kCursorPointer, host->last_cursor().native_type()); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resize edges and corners show proper cursors. 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate.set_hittest_code(HTBOTTOM); 5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent move1(ui::ET_MOUSE_MOVED, point1, point1, 0, 0); 5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move1); 5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 521a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ui::kCursorSouthResize, host->last_cursor().native_type()); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate.set_hittest_code(HTBOTTOMLEFT); 5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent move2(ui::ET_MOUSE_MOVED, point2, point2, 0, 0); 5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move2); 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 529a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ui::kCursorSouthWestResize, host->last_cursor().native_type()); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate.set_hittest_code(HTBOTTOMRIGHT); 5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent move1(ui::ET_MOUSE_MOVED, point1, point1, 0, 0); 5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move1); 5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 537a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ui::kCursorSouthEastResize, host->last_cursor().native_type()); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate.set_hittest_code(HTLEFT); 5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent move2(ui::ET_MOUSE_MOVED, point2, point2, 0, 0); 5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move2); 5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 545a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ui::kCursorWestResize, host->last_cursor().native_type()); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate.set_hittest_code(HTRIGHT); 5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent move1(ui::ET_MOUSE_MOVED, point1, point1, 0, 0); 5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move1); 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 553a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ui::kCursorEastResize, host->last_cursor().native_type()); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate.set_hittest_code(HTTOP); 5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent move2(ui::ET_MOUSE_MOVED, point2, point2, 0, 0); 5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move2); 5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ui::kCursorNorthResize, host->last_cursor().native_type()); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate.set_hittest_code(HTTOPLEFT); 5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent move1(ui::ET_MOUSE_MOVED, point1, point1, 0, 0); 5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move1); 5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ui::kCursorNorthWestResize, host->last_cursor().native_type()); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate.set_hittest_code(HTTOPRIGHT); 5745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent move2(ui::ET_MOUSE_MOVED, point2, point2, 0, 0); 5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move2); 5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 577a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ui::kCursorNorthEastResize, host->last_cursor().native_type()); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Client area uses null cursor. 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate.set_hittest_code(HTCLIENT); 5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent move1(ui::ET_MOUSE_MOVED, point1, point1, 0, 0); 5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move1); 5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 586a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ui::kCursorNull, host->last_cursor().native_type()); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 590d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_WIN) 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TransformActivate DISABLED_TransformActivate 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TransformActivate TransformActivate 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowManagerTest, MAYBE_TransformActivate) { 5961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = Shell::GetPrimaryRootWindow(); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size = root_window->bounds().size(); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(size).ToString(), 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetScreen()->GetDisplayNearestPoint( 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point()).bounds().ToString()); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rotate it clock-wise 90 degrees. 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform transform; 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Translate(size.width(), 0); 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Rotate(90.0f); 606a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch root_window->GetHost()->SetRootTransform(transform); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test::TestActivationDelegate d1; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::TestWindowDelegate wd; 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1( 6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateTestWindowInShellWithDelegate(&wd, 1, gfx::Rect(0, 15, 50, 50))); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.SetWindow(w1.get()); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w1->Show(); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point miss_point(5, 5); 616d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) transform.TransformPoint(&miss_point); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent mouseev1(ui::ET_MOUSE_PRESSED, 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) miss_point, 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) miss_point, 6205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 622a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::EventProcessor* dispatcher = root_window->GetHost()->event_processor(); 6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&mouseev1); 6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(NULL, aura::client::GetFocusClient(w1.get())->GetFocusedWindow()); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent mouseup(ui::ET_MOUSE_RELEASED, 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) miss_point, 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) miss_point, 6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&mouseup); 6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point hit_point(5, 15); 635d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) transform.TransformPoint(&hit_point); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent mouseev2(ui::ET_MOUSE_PRESSED, 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hit_point, 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hit_point, 6395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 6415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&mouseev2); 6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(w1.get())); 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w1.get(), 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetFocusClient(w1.get())->GetFocusedWindow()); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowManagerTest, AdditionalFilters) { 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The IME event filter interferes with the basic key event propagation we 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attempt to do here, so we remove it. 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test::ShellTestApi shell_test(Shell::GetInstance()); 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->RemovePreTargetHandler( 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell_test.input_method_event_filter()); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = Shell::GetPrimaryRootWindow(); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a window and make it active 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> w1(CreateTestWindowInShell( 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SK_ColorWHITE, -1, gfx::Rect(0, 0, 100, 100))); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::ActivateWindow(w1.get()); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates two addition filters 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<CustomEventHandler> f1(new CustomEventHandler); 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<CustomEventHandler> f2(new CustomEventHandler); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds them to root window event filter. 667a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ::wm::CompoundEventFilter* env_filter = 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->env_filter(); 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env_filter->AddHandler(f1.get()); 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env_filter->AddHandler(f2.get()); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dispatches mouse and keyboard events. 6735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::KeyEvent key_event(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::EF_NONE); 674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::EventProcessor* dispatcher = root_window->GetHost()->event_processor(); 6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&key_event); 6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent mouse_pressed( 6785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::ET_MOUSE_PRESSED, gfx::Point(0, 0), gfx::Point(0, 0), 0, 0); 6795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&mouse_pressed); 6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Both filters should get the events. 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, f1->num_key_events()); 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, f1->num_mouse_events()); 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, f2->num_key_events()); 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, f2->num_mouse_events()); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) f1->Reset(); 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) f2->Reset(); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Makes f1 consume events. 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f1->set_key_event_handling_result(ui::ER_CONSUMED); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f1->set_mouse_event_handling_result(ui::ER_CONSUMED); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dispatches events. 6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&key_event); 6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent mouse_released( 6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::ET_MOUSE_RELEASED, gfx::Point(0, 0), gfx::Point(0, 0), 0, 0); 7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&mouse_released); 7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // f1 should still get the events but f2 no longer gets them. 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, f1->num_key_events()); 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, f1->num_mouse_events()); 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, f2->num_key_events()); 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, f2->num_mouse_events()); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) f1->Reset(); 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) f2->Reset(); 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove f1 from additonal filters list. 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env_filter->RemoveHandler(f1.get()); 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dispatches events. 7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&key_event); 7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&mouse_pressed); 7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // f1 should get no events since it's out and f2 should get them. 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, f1->num_key_events()); 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, f1->num_mouse_events()); 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, f2->num_key_events()); 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, f2->num_mouse_events()); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env_filter->RemoveHandler(f2.get()); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 730c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_CHROMEOS) || defined(OS_WIN) 731c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Touch visually hides the cursor on ChromeOS and Windows 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowManagerTest, UpdateCursorVisibility) { 7335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator& generator = GetEventGenerator(); 734a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ::wm::CursorManager* cursor_manager = 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::Shell::GetInstance()->cursor_manager(); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.MoveMouseTo(gfx::Point(0, 0)); 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsCursorVisible()); 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsMouseEventsEnabled()); 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.PressTouch(); 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager->IsCursorVisible()); 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager->IsMouseEventsEnabled()); 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.MoveMouseTo(gfx::Point(0, 0)); 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsCursorVisible()); 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsMouseEventsEnabled()); 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.ReleaseTouch(); 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsCursorVisible()); 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsMouseEventsEnabled()); 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 750c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif // defined(OS_CHROMEOS) || defined(OS_WIN) 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_CHROMEOS) 7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// ChromeOS is the only platform for which the cursor is hidden on keypress 7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// (crbug.com/304296). 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WindowManagerTest, UpdateCursorVisibilityOnKeyEvent) { 7565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator& generator = GetEventGenerator(); 757a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ::wm::CursorManager* cursor_manager = 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::Shell::GetInstance()->cursor_manager(); 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Pressing a key hides the cursor but does not disable mouse events. 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.PressKey(ui::VKEY_A, ui::EF_NONE); 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager->IsCursorVisible()); 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsMouseEventsEnabled()); 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Moving mouse shows the cursor. 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.MoveMouseTo(gfx::Point(0, 0)); 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsCursorVisible()); 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsMouseEventsEnabled()); 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Releasing a key also hides the cursor but does not disable mouse events. 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.ReleaseKey(ui::VKEY_A, ui::EF_NONE); 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager->IsCursorVisible()); 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsMouseEventsEnabled()); 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Moving mouse shows the cursor again. 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.MoveMouseTo(gfx::Point(0, 0)); 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsCursorVisible()); 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsMouseEventsEnabled()); 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(WindowManagerTest, TestCursorClientObserver) { 7795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator& generator = GetEventGenerator(); 780a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ::wm::CursorManager* cursor_manager = 781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::Shell::GetInstance()->cursor_manager(); 782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<aura::Window> w1(CreateTestWindowInShell( 784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SK_ColorWHITE, -1, gfx::Rect(0, 0, 100, 100))); 785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wm::ActivateWindow(w1.get()); 786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Add two observers. Both should have OnCursorVisibilityChanged() 788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // invoked when an event changes the visibility of the cursor. 789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestingCursorClientObserver observer_a; 790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestingCursorClientObserver observer_b; 791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cursor_manager->AddObserver(&observer_a); 792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cursor_manager->AddObserver(&observer_b); 793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Initial state before any events have been sent. 795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_a.reset(); 796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_b.reset(); 797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_a.did_visibility_change()); 798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_b.did_visibility_change()); 799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_a.is_cursor_visible()); 800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_b.is_cursor_visible()); 801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Keypress should hide the cursor. 803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.PressKey(ui::VKEY_A, ui::EF_NONE); 804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_a.did_visibility_change()); 805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_b.did_visibility_change()); 806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_a.is_cursor_visible()); 807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_b.is_cursor_visible()); 808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Mouse move should show the cursor. 810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_a.reset(); 811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_b.reset(); 812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.MoveMouseTo(50, 50); 813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_a.did_visibility_change()); 814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_b.did_visibility_change()); 815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_a.is_cursor_visible()); 816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_b.is_cursor_visible()); 817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Remove observer_b. Its OnCursorVisibilityChanged() should 819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // not be invoked past this point. 820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cursor_manager->RemoveObserver(&observer_b); 821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Gesture tap should hide the cursor. 823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_a.reset(); 824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_b.reset(); 825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.GestureTapAt(gfx::Point(25, 25)); 826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_a.did_visibility_change()); 827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_b.did_visibility_change()); 828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_a.is_cursor_visible()); 829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Mouse move should show the cursor. 831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_a.reset(); 832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_b.reset(); 833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.MoveMouseTo(50, 50); 834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_a.did_visibility_change()); 835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_b.did_visibility_change()); 836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_a.is_cursor_visible()); 837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 8385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 841