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) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/wm/core/compound_event_filter.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/cursor_client.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/aura_test_base.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/aura/test/test_cursor_client.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_windows.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/aura/window.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h" 14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h" 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/events/test/event_generator.h" 175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/wm/core/default_activation_client.h" 18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/activation_client.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_CHROMEOS) || defined(OS_WIN) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TimeDelta GetTime() { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ui::EventTimeForNow(); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif // defined(OS_CHROMEOS) || defined(OS_WIN) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace wm { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An event filter that consumes all gesture events. 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ConsumeGestureEventFilter : public ui::EventHandler { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConsumeGestureEventFilter() {} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ConsumeGestureEventFilter() {} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from ui::EventHandler: 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGestureEvent(ui::GestureEvent* e) OVERRIDE { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) e->StopPropagation(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ConsumeGestureEventFilter); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef aura::test::AuraTestBase CompoundEventFilterTest; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_CHROMEOS) 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// A keypress only hides the cursor on ChromeOS (crbug.com/304296). 55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CompoundEventFilterTest, CursorVisibilityChange) { 56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<CompoundEventFilter> compound_filter(new CompoundEventFilter); 57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) aura::Env::GetInstance()->AddPreTargetHandler(compound_filter.get()); 58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) aura::test::TestWindowDelegate delegate; 59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(&delegate, 1234, 60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gfx::Rect(5, 5, 100, 100), root_window())); 61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) window->Show(); 62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) window->SetCapture(); 63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) aura::test::TestCursorClient cursor_client(root_window()); 65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Send key event to hide the cursor. 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::KeyEvent key('a', ui::VKEY_A, ui::EF_NONE); 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DispatchEventUsingWindowDispatcher(&key); 69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(cursor_client.IsCursorVisible()); 70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Synthesized mouse event should not show the cursor. 72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui::MouseEvent enter(ui::ET_MOUSE_ENTERED, gfx::Point(10, 10), 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Point(10, 10), 0, 0); 743240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch enter.set_flags(enter.flags() | ui::EF_IS_SYNTHESIZED); 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DispatchEventUsingWindowDispatcher(&enter); 76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(cursor_client.IsCursorVisible()); 77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui::MouseEvent move(ui::ET_MOUSE_MOVED, gfx::Point(10, 10), 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Point(10, 10), 0, 0); 803240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch move.set_flags(enter.flags() | ui::EF_IS_SYNTHESIZED); 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DispatchEventUsingWindowDispatcher(&move); 823240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_FALSE(cursor_client.IsCursorVisible()); 833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // A real mouse event should show the cursor. 853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ui::MouseEvent real_move(ui::ET_MOUSE_MOVED, gfx::Point(10, 10), 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Point(10, 10), 0, 0); 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DispatchEventUsingWindowDispatcher(&real_move); 88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(cursor_client.IsCursorVisible()); 89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Disallow hiding the cursor on keypress. 915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu cursor_client.set_should_hide_cursor_on_key_event(false); 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) key = ui::KeyEvent('a', ui::VKEY_A, ui::EF_NONE); 935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DispatchEventUsingWindowDispatcher(&key); 945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(cursor_client.IsCursorVisible()); 955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Allow hiding the cursor on keypress. 975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu cursor_client.set_should_hide_cursor_on_key_event(true); 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) key = ui::KeyEvent('a', ui::VKEY_A, ui::EF_NONE); 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DispatchEventUsingWindowDispatcher(&key); 100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(cursor_client.IsCursorVisible()); 101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1023240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Mouse synthesized exit event should not show the cursor. 103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui::MouseEvent exit(ui::ET_MOUSE_EXITED, gfx::Point(10, 10), 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Point(10, 10), 0, 0); 1053240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch exit.set_flags(enter.flags() | ui::EF_IS_SYNTHESIZED); 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DispatchEventUsingWindowDispatcher(&exit); 107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(cursor_client.IsCursorVisible()); 1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aura::Env::GetInstance()->RemovePreTargetHandler(compound_filter.get()); 110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif // defined(OS_CHROMEOS) 112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_CHROMEOS) || defined(OS_WIN) 114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Touch visually hides the cursor on ChromeOS and Windows. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CompoundEventFilterTest, TouchHidesCursor) { 1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu new wm::DefaultActivationClient(root_window()); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<CompoundEventFilter> compound_filter(new CompoundEventFilter); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Env::GetInstance()->AddPreTargetHandler(compound_filter.get()); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::test::TestWindowDelegate delegate; 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(&delegate, 1234, 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(5, 5, 100, 100), root_window())); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window->Show(); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window->SetCapture(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch aura::test::TestCursorClient cursor_client(root_window()); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent mouse0(ui::ET_MOUSE_MOVED, gfx::Point(10, 10), 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Point(10, 10), 0, 0); 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DispatchEventUsingWindowDispatcher(&mouse0); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_client.IsMouseEventsEnabled()); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This press is required for the GestureRecognizer to associate a target 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with kTouchId 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TouchEvent press0( 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ET_TOUCH_PRESSED, gfx::Point(90, 90), 1, GetTime()); 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DispatchEventUsingWindowDispatcher(&press0); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_client.IsMouseEventsEnabled()); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TouchEvent move(ui::ET_TOUCH_MOVED, gfx::Point(10, 10), 1, GetTime()); 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DispatchEventUsingWindowDispatcher(&move); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_client.IsMouseEventsEnabled()); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TouchEvent release( 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ET_TOUCH_RELEASED, gfx::Point(10, 10), 1, GetTime()); 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DispatchEventUsingWindowDispatcher(&release); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_client.IsMouseEventsEnabled()); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent mouse1(ui::ET_MOUSE_MOVED, gfx::Point(10, 10), 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Point(10, 10), 0, 0); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move the cursor again. The cursor should be visible. 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DispatchEventUsingWindowDispatcher(&mouse1); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_client.IsMouseEventsEnabled()); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now activate the window and press on it again. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TouchEvent press1( 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ET_TOUCH_PRESSED, gfx::Point(90, 90), 1, GetTime()); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::GetActivationClient( 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_window())->ActivateWindow(window.get()); 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DispatchEventUsingWindowDispatcher(&press1); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_client.IsMouseEventsEnabled()); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Env::GetInstance()->RemovePreTargetHandler(compound_filter.get()); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif // defined(OS_CHROMEOS) || defined(OS_WIN) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that if an event filter consumes a gesture, then it doesn't focus the 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// window. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CompoundEventFilterTest, FilterConsumedGesture) { 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<CompoundEventFilter> compound_filter(new CompoundEventFilter); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ui::EventHandler> gesure_handler(new ConsumeGestureEventFilter); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compound_filter->AddHandler(gesure_handler.get()); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Env::GetInstance()->AddPreTargetHandler(compound_filter.get()); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::test::TestWindowDelegate delegate; 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(root_window()); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(&delegate, 1234, 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(5, 5, 100, 100), root_window())); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window->Show(); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(window->CanFocus()); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(window->HasFocus()); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tap on the window should not focus it since the filter will be consuming 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the gestures. 1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(root_window(), gfx::Point(50, 50)); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressTouch(); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(window->HasFocus()); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compound_filter->RemoveHandler(gesure_handler.get()); 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aura::Env::GetInstance()->RemovePreTargetHandler(compound_filter.get()); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies we don't attempt to hide the mouse when the mouse is down and a 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// touch event comes in. 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(CompoundEventFilterTest, DontHideWhenMouseDown) { 1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator event_generator(root_window()); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<CompoundEventFilter> compound_filter(new CompoundEventFilter); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Env::GetInstance()->AddPreTargetHandler(compound_filter.get()); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::test::TestWindowDelegate delegate; 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(&delegate, 1234, 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(5, 5, 100, 100), root_window())); 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window->Show(); 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch aura::test::TestCursorClient cursor_client(root_window()); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move and press the mouse over the window. 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event_generator.MoveMouseTo(10, 10); 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_client.IsMouseEventsEnabled()); 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event_generator.PressLeftButton(); 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_client.IsMouseEventsEnabled()); 2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(aura::Env::GetInstance()->IsMouseButtonDown()); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Do a touch event. As the mouse button is down this should not disable mouse 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // events. 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event_generator.PressTouch(); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_client.IsMouseEventsEnabled()); 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Env::GetInstance()->RemovePreTargetHandler(compound_filter.get()); 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_WIN) 220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Windows synthesizes mouse messages for touch events. We should not be 221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// showing the cursor when we receive such messages. 222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(CompoundEventFilterTest, DontShowCursorOnMouseMovesFromTouch) { 223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<CompoundEventFilter> compound_filter(new CompoundEventFilter); 224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch aura::Env::GetInstance()->AddPreTargetHandler(compound_filter.get()); 225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch aura::test::TestWindowDelegate delegate; 226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(&delegate, 1234, 227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gfx::Rect(5, 5, 100, 100), root_window())); 228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch window->Show(); 229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch window->SetCapture(); 230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch aura::test::TestCursorClient cursor_client(root_window()); 232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch cursor_client.DisableMouseEvents(); 233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(cursor_client.IsMouseEventsEnabled()); 234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 235c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ui::MouseEvent mouse0(ui::ET_MOUSE_MOVED, gfx::Point(10, 10), 236c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gfx::Point(10, 10), 0, 0); 237c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch mouse0.set_flags(mouse0.flags() | ui::EF_FROM_TOUCH); 238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DispatchEventUsingWindowDispatcher(&mouse0); 240c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(cursor_client.IsMouseEventsEnabled()); 241c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 242c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch mouse0.set_flags(mouse0.flags() & ~ui::EF_FROM_TOUCH); 243c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DispatchEventUsingWindowDispatcher(&mouse0); 244c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(cursor_client.IsMouseEventsEnabled()); 245c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 246c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch aura::Env::GetInstance()->RemovePreTargetHandler(compound_filter.get()); 247c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 248c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 249c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace wm 251