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