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/event_generator.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_window_delegate.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_windows.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/cursor/cursor.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h" 20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/events/event_processor.h" 22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.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. 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w121.get()); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.ClickLeftButton(); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::FocusClient* focus_client = 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetFocusClient(w121.get()); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w121.get(), focus_client->GetFocusedWindow()); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::EventProcessor* dispatcher = root_window->GetHost()->event_processor(); 1861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The key press should be sent to the focused sub-window. 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::KeyEvent keyev(ui::ET_KEY_PRESSED, ui::VKEY_E, 0, false); 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&keyev); 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::VKEY_E, w121delegate->last_key_code()); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Touch on a sub-window (w122) to focus it. 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point click_point = w122->bounds().CenterPoint(); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window::ConvertPointToTarget(w122->parent(), root_window, &click_point); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TouchEvent touchev(ui::ET_TOUCH_PRESSED, click_point, 0, getTime()); 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&touchev); 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) focus_client = aura::client::GetFocusClient(w122.get()); 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w122.get(), focus_client->GetFocusedWindow()); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The key press should be sent to the focused sub-window. 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()); 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&keyev); 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(keyev.handled() || details.dispatcher_destroyed); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the focus back to w123 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::SetActivationDelegate(w1.get(), NULL); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w123->Show(); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w123->Focus(); 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w123.get(), 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetFocusClient(w12.get())->GetFocusedWindow()); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::SetActivationDelegate(w1.get(), &activation_delegate); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removing the focused window will set the focus to NULL because 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // parent window is not focusable. 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w12->RemoveChild(w123.get()); 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(NULL, aura::client::GetFocusClient(w123.get())); 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&keyev); 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(keyev.handled() || details.dispatcher_destroyed); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Various assertion testing for activating windows. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowManagerTest, ActivateOnMouse) { 2621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = Shell::GetPrimaryRootWindow(); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test::TestActivationDelegate d1; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::TestWindowDelegate wd; 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> w1(CreateTestWindowInShellWithDelegate( 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &wd, -1, gfx::Rect(10, 10, 50, 50))); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.SetWindow(w1.get()); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test::TestActivationDelegate d2; 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> w2(CreateTestWindowInShellWithDelegate( 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &wd, -2, gfx::Rect(70, 70, 50, 50))); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d2.SetWindow(w2.get()); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::FocusClient* focus_client = 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetFocusClient(w1.get()); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.Clear(); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d2.Clear(); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Activate window1. 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::ActivateWindow(w1.get()); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(w1.get())); 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w1.get(), focus_client->GetFocusedWindow()); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d1.activated_count()); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d1.lost_active_count()); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.Clear(); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Click on window2. 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w2.get()); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.ClickLeftButton(); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Window2 should have become active. 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(w2.get())); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w2.get(), focus_client->GetFocusedWindow()); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d1.activated_count()); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d1.lost_active_count()); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d2.activated_count()); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d2.lost_active_count()); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.Clear(); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d2.Clear(); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Click back on window1, but set it up so w1 doesn't activate on click. 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 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())); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (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))); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w2.get()); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.ClickLeftButton(); 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w2.get(), focus_client->GetFocusedWindow()); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(w11->CanFocus()); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Click on |w11|. This should focus w1. 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseToCenterOf(w11.get()); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.ClickLeftButton(); 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w1.get(), focus_client->GetFocusedWindow()); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(WindowManagerTest, PanelActivation) { 378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::test::TestWindowDelegate wd; 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<aura::Window> w1(CreateTestWindowInShellWithDelegate( 380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &wd, -1, gfx::Rect(10, 10, 50, 50))); 381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::test::TestWindowDelegate pd; 382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<aura::Window> p1(CreateTestWindowInShellWithDelegateAndType( 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &pd, ui::wm::WINDOW_TYPE_PANEL, -1, gfx::Rect(10, 10, 50, 50))); 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::client::FocusClient* focus_client = 385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::client::GetFocusClient(w1.get()); 386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Activate w1. 388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wm::ActivateWindow(w1.get()); 389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(w1.get())); 390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Activate p1. 392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wm::ActivateWindow(p1.get()); 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(p1.get())); 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(p1.get(), focus_client->GetFocusedWindow()); 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Activate w1. 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wm::ActivateWindow(w1.get()); 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(w1.get())); 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(w1.get(), focus_client->GetFocusedWindow()); 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Clicking on a non-activatable window should not change the active window. 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NonFocusableDelegate nfd; 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<aura::Window> w3(CreateTestWindowInShellWithDelegate( 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &nfd, -1, gfx::Rect(70, 70, 50, 50))); 406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::test::EventGenerator generator3(Shell::GetPrimaryRootWindow(), 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) w3.get()); 408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wm::ActivateWindow(p1.get()); 409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(p1.get())); 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator3.ClickLeftButton(); 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(p1.get())); 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Essentially the same as ActivateOnMouse, but for touch events. 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowManagerTest, ActivateOnTouch) { 4171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = Shell::GetPrimaryRootWindow(); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test::TestActivationDelegate d1; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::TestWindowDelegate wd; 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> w1(CreateTestWindowInShellWithDelegate( 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &wd, -1, gfx::Rect(10, 10, 50, 50))); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.SetWindow(w1.get()); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test::TestActivationDelegate d2; 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> w2(CreateTestWindowInShellWithDelegate( 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &wd, -2, gfx::Rect(70, 70, 50, 50))); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d2.SetWindow(w2.get()); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::FocusClient* focus_client = 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetFocusClient(w1.get()); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.Clear(); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d2.Clear(); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Activate window1. 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::ActivateWindow(w1.get()); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(w1.get())); 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w1.get(), focus_client->GetFocusedWindow()); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d1.activated_count()); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d1.lost_active_count()); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.Clear(); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Touch window2. 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point press_point = w2->bounds().CenterPoint(); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window::ConvertPointToTarget(w2->parent(), root_window, &press_point); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TouchEvent touchev1(ui::ET_TOUCH_PRESSED, press_point, 0, getTime()); 4471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 448a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::EventProcessor* dispatcher = root_window->GetHost()->event_processor(); 4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&touchev1); 4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Window2 should have become active. 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(w2.get())); 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w2.get(), focus_client->GetFocusedWindow()); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d1.activated_count()); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d1.lost_active_count()); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d2.activated_count()); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d2.lost_active_count()); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.Clear(); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d2.Clear(); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Touch window1, but set it up so w1 doesn't activate on touch. 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) press_point = w1->bounds().CenterPoint(); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window::ConvertPointToTarget(w1->parent(), root_window, &press_point); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.set_activate(false); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TouchEvent touchev2(ui::ET_TOUCH_PRESSED, press_point, 1, getTime()); 4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&touchev2); 4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Window2 should still be active and focused. 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(w2.get())); 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w2.get(), focus_client->GetFocusedWindow()); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d1.activated_count()); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d1.lost_active_count()); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d2.activated_count()); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d2.lost_active_count()); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.Clear(); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d2.Clear(); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroy window2, this should make window1 active. 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.set_activate(true); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w2.reset(); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d2.activated_count()); 48458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, d2.lost_active_count()); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(w1.get())); 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w1.get(), focus_client->GetFocusedWindow()); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d1.activated_count()); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d1.lost_active_count()); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowManagerTest, MouseEventCursors) { 4921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = Shell::GetPrimaryRootWindow(); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a window. 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kWindowLeft = 123; 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kWindowTop = 45; 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HitTestWindowDelegate window_delegate; 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> window(CreateTestWindowInShellWithDelegate( 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &window_delegate, 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -1, 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(kWindowLeft, kWindowTop, 640, 480))); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create two mouse movement events we can switch between. 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point1(kWindowLeft, kWindowTop); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window::ConvertPointToTarget(window->parent(), root_window, &point1); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point2(kWindowLeft + 1, kWindowTop + 1); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window::ConvertPointToTarget(window->parent(), root_window, &point2); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 510a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) aura::WindowTreeHost* host = root_window->GetHost(); 511a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::EventProcessor* dispatcher = host->event_processor(); 5121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cursor starts as a pointer (set during Shell::Init()). 514a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ui::kCursorPointer, host->last_cursor().native_type()); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resize edges and corners show proper cursors. 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate.set_hittest_code(HTBOTTOM); 5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent move1(ui::ET_MOUSE_MOVED, point1, point1, 0, 0); 5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move1); 5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 522a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ui::kCursorSouthResize, host->last_cursor().native_type()); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate.set_hittest_code(HTBOTTOMLEFT); 5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent move2(ui::ET_MOUSE_MOVED, point2, point2, 0, 0); 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move2); 5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 530a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ui::kCursorSouthWestResize, host->last_cursor().native_type()); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate.set_hittest_code(HTBOTTOMRIGHT); 5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent move1(ui::ET_MOUSE_MOVED, point1, point1, 0, 0); 5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move1); 5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 538a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ui::kCursorSouthEastResize, host->last_cursor().native_type()); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate.set_hittest_code(HTLEFT); 5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent move2(ui::ET_MOUSE_MOVED, point2, point2, 0, 0); 5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move2); 5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 546a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ui::kCursorWestResize, host->last_cursor().native_type()); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate.set_hittest_code(HTRIGHT); 5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent move1(ui::ET_MOUSE_MOVED, point1, point1, 0, 0); 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move1); 5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 554a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ui::kCursorEastResize, host->last_cursor().native_type()); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate.set_hittest_code(HTTOP); 5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent move2(ui::ET_MOUSE_MOVED, point2, point2, 0, 0); 5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move2); 5615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ui::kCursorNorthResize, host->last_cursor().native_type()); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate.set_hittest_code(HTTOPLEFT); 5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent move1(ui::ET_MOUSE_MOVED, point1, point1, 0, 0); 5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move1); 5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ui::kCursorNorthWestResize, host->last_cursor().native_type()); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate.set_hittest_code(HTTOPRIGHT); 5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent move2(ui::ET_MOUSE_MOVED, point2, point2, 0, 0); 5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move2); 5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 578a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ui::kCursorNorthEastResize, host->last_cursor().native_type()); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Client area uses null cursor. 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_delegate.set_hittest_code(HTCLIENT); 5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent move1(ui::ET_MOUSE_MOVED, point1, point1, 0, 0); 5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move1); 5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 587a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ui::kCursorNull, host->last_cursor().native_type()); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 591d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_WIN) 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TransformActivate DISABLED_TransformActivate 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TransformActivate TransformActivate 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowManagerTest, MAYBE_TransformActivate) { 5971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = Shell::GetPrimaryRootWindow(); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size = root_window->bounds().size(); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(gfx::Rect(size).ToString(), 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetScreen()->GetDisplayNearestPoint( 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point()).bounds().ToString()); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Rotate it clock-wise 90 degrees. 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform transform; 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Translate(size.width(), 0); 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Rotate(90.0f); 607a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch root_window->GetHost()->SetRootTransform(transform); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test::TestActivationDelegate d1; 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::test::TestWindowDelegate wd; 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::Window> w1( 6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateTestWindowInShellWithDelegate(&wd, 1, gfx::Rect(0, 15, 50, 50))); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d1.SetWindow(w1.get()); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w1->Show(); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point miss_point(5, 5); 617d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) transform.TransformPoint(&miss_point); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent mouseev1(ui::ET_MOUSE_PRESSED, 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) miss_point, 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) miss_point, 6215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 623a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::EventProcessor* dispatcher = root_window->GetHost()->event_processor(); 6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&mouseev1); 6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(NULL, aura::client::GetFocusClient(w1.get())->GetFocusedWindow()); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent mouseup(ui::ET_MOUSE_RELEASED, 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) miss_point, 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) miss_point, 6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&mouseup); 6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point hit_point(5, 15); 636d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) transform.TransformPoint(&hit_point); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent mouseev2(ui::ET_MOUSE_PRESSED, 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hit_point, 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hit_point, 6405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&mouseev2); 6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(wm::IsActiveWindow(w1.get())); 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(w1.get(), 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetFocusClient(w1.get())->GetFocusedWindow()); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowManagerTest, AdditionalFilters) { 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The IME event filter interferes with the basic key event propagation we 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attempt to do here, so we remove it. 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test::ShellTestApi shell_test(Shell::GetInstance()); 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->RemovePreTargetHandler( 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell_test.input_method_event_filter()); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = Shell::GetPrimaryRootWindow(); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a window and make it active 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> w1(CreateTestWindowInShell( 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SK_ColorWHITE, -1, gfx::Rect(0, 0, 100, 100))); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::ActivateWindow(w1.get()); 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates two addition filters 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<CustomEventHandler> f1(new CustomEventHandler); 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<CustomEventHandler> f2(new CustomEventHandler); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds them to root window event filter. 668a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ::wm::CompoundEventFilter* env_filter = 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->env_filter(); 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env_filter->AddHandler(f1.get()); 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env_filter->AddHandler(f2.get()); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dispatches mouse and keyboard events. 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::KeyEvent key_event(ui::ET_KEY_PRESSED, ui::VKEY_A, 0, false); 675a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::EventProcessor* dispatcher = root_window->GetHost()->event_processor(); 6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&key_event); 6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent mouse_pressed( 6795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::ET_MOUSE_PRESSED, gfx::Point(0, 0), gfx::Point(0, 0), 0, 0); 6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&mouse_pressed); 6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Both filters should get the events. 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, f1->num_key_events()); 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, f1->num_mouse_events()); 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, f2->num_key_events()); 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, f2->num_mouse_events()); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) f1->Reset(); 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) f2->Reset(); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Makes f1 consume events. 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f1->set_key_event_handling_result(ui::ER_CONSUMED); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f1->set_mouse_event_handling_result(ui::ER_CONSUMED); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dispatches events. 6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&key_event); 6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent mouse_released( 7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::ET_MOUSE_RELEASED, gfx::Point(0, 0), gfx::Point(0, 0), 0, 0); 7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&mouse_released); 7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // f1 should still get the events but f2 no longer gets them. 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, f1->num_key_events()); 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, f1->num_mouse_events()); 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, f2->num_key_events()); 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, f2->num_mouse_events()); 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) f1->Reset(); 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) f2->Reset(); 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove f1 from additonal filters list. 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env_filter->RemoveHandler(f1.get()); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dispatches events. 7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&key_event); 7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&mouse_pressed); 7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // f1 should get no events since it's out and f2 should get them. 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, f1->num_key_events()); 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, f1->num_mouse_events()); 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, f2->num_key_events()); 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, f2->num_mouse_events()); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env_filter->RemoveHandler(f2.get()); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 731c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_CHROMEOS) || defined(OS_WIN) 732c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Touch visually hides the cursor on ChromeOS and Windows 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WindowManagerTest, UpdateCursorVisibility) { 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::test::EventGenerator& generator = GetEventGenerator(); 735a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ::wm::CursorManager* cursor_manager = 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::Shell::GetInstance()->cursor_manager(); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.MoveMouseTo(gfx::Point(0, 0)); 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsCursorVisible()); 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsMouseEventsEnabled()); 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.PressTouch(); 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager->IsCursorVisible()); 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager->IsMouseEventsEnabled()); 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.MoveMouseTo(gfx::Point(0, 0)); 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsCursorVisible()); 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsMouseEventsEnabled()); 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.ReleaseTouch(); 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsCursorVisible()); 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsMouseEventsEnabled()); 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 751c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif // defined(OS_CHROMEOS) || defined(OS_WIN) 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 753c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_CHROMEOS) 7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// ChromeOS is the only platform for which the cursor is hidden on keypress 7555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// (crbug.com/304296). 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(WindowManagerTest, UpdateCursorVisibilityOnKeyEvent) { 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::test::EventGenerator& generator = GetEventGenerator(); 758a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ::wm::CursorManager* cursor_manager = 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::Shell::GetInstance()->cursor_manager(); 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Pressing a key hides the cursor but does not disable mouse events. 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.PressKey(ui::VKEY_A, ui::EF_NONE); 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager->IsCursorVisible()); 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsMouseEventsEnabled()); 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Moving mouse shows the cursor. 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.MoveMouseTo(gfx::Point(0, 0)); 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsCursorVisible()); 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsMouseEventsEnabled()); 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Releasing a key also hides the cursor but does not disable mouse events. 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.ReleaseKey(ui::VKEY_A, ui::EF_NONE); 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager->IsCursorVisible()); 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsMouseEventsEnabled()); 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Moving mouse shows the cursor again. 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.MoveMouseTo(gfx::Point(0, 0)); 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsCursorVisible()); 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager->IsMouseEventsEnabled()); 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(WindowManagerTest, TestCursorClientObserver) { 780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::test::EventGenerator& generator = GetEventGenerator(); 781a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ::wm::CursorManager* cursor_manager = 782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::Shell::GetInstance()->cursor_manager(); 783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<aura::Window> w1(CreateTestWindowInShell( 785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SK_ColorWHITE, -1, gfx::Rect(0, 0, 100, 100))); 786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wm::ActivateWindow(w1.get()); 787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Add two observers. Both should have OnCursorVisibilityChanged() 789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // invoked when an event changes the visibility of the cursor. 790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestingCursorClientObserver observer_a; 791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestingCursorClientObserver observer_b; 792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cursor_manager->AddObserver(&observer_a); 793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cursor_manager->AddObserver(&observer_b); 794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Initial state before any events have been sent. 796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_a.reset(); 797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_b.reset(); 798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_a.did_visibility_change()); 799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_b.did_visibility_change()); 800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_a.is_cursor_visible()); 801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_b.is_cursor_visible()); 802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Keypress should hide the cursor. 804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.PressKey(ui::VKEY_A, ui::EF_NONE); 805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_a.did_visibility_change()); 806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_b.did_visibility_change()); 807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_a.is_cursor_visible()); 808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_b.is_cursor_visible()); 809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Mouse move should show the cursor. 811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_a.reset(); 812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_b.reset(); 813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.MoveMouseTo(50, 50); 814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_a.did_visibility_change()); 815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_b.did_visibility_change()); 816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_a.is_cursor_visible()); 817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_b.is_cursor_visible()); 818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Remove observer_b. Its OnCursorVisibilityChanged() should 820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // not be invoked past this point. 821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cursor_manager->RemoveObserver(&observer_b); 822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Gesture tap should hide the cursor. 824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_a.reset(); 825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_b.reset(); 826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.GestureTapAt(gfx::Point(25, 25)); 827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_a.did_visibility_change()); 828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_b.did_visibility_change()); 829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_a.is_cursor_visible()); 830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Mouse move should show the cursor. 832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_a.reset(); 833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_b.reset(); 834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.MoveMouseTo(50, 50); 835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_a.did_visibility_change()); 836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_b.did_visibility_change()); 837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_a.is_cursor_visible()); 838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 8395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 842