12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/cursor_manager.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/aura/client/cursor_client_observer.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/native_cursor_manager.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/test/views_test_base.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestingCursorManager : public views::corewm::NativeCursorManager { 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeCursor current_cursor() { return cursor_; } 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from views::corewm::NativeCursorManager: 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetDisplay( 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Display& display, 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::corewm::NativeCursorManagerDelegate* delegate) OVERRIDE {} 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetCursor( 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeCursor cursor, 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::corewm::NativeCursorManagerDelegate* delegate) OVERRIDE { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_ = cursor; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->CommitCursor(cursor); 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetVisibility( 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool visible, 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::corewm::NativeCursorManagerDelegate* delegate) OVERRIDE { 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->CommitVisibility(visible); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetMouseEventsEnabled( 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool enabled, 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::corewm::NativeCursorManagerDelegate* delegate) OVERRIDE { 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->CommitMouseEventsEnabled(enabled); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void SetScale( 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) float scale, 4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::corewm::NativeCursorManagerDelegate* delegate) OVERRIDE { 4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delegate->CommitScale(scale); 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeCursor cursor_; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CursorManagerTest : public views::ViewsTestBase { 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CursorManagerTest() 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : delegate_(new TestingCursorManager), 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_(scoped_ptr<views::corewm::NativeCursorManager>( 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_)) { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeCursor current_cursor() { return delegate_->current_cursor(); } 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingCursorManager* delegate_; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::corewm::CursorManager cursor_manager_; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TestingCursorClientObserver : public aura::client::CursorClientObserver { 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestingCursorClientObserver() 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : cursor_visibility_(false), 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) did_visibility_change_(false) {} 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void reset() { cursor_visibility_ = did_visibility_change_ = false; } 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_cursor_visible() const { return cursor_visibility_; } 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool did_visibility_change() const { return did_visibility_change_; } 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Overridden from aura::client::CursorClientObserver: 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnCursorVisibilityChanged(bool is_visible) OVERRIDE { 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cursor_visibility_ = is_visible; 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) did_visibility_change_ = true; 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool cursor_visibility_; 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool did_visibility_change_; 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestingCursorClientObserver); 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(CursorManagerTest, ShowHideCursor) { 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.SetCursor(ui::kCursorCopy); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ui::kCursorCopy, current_cursor().native_type()); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.ShowCursor(); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsCursorVisible()); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.HideCursor(); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsCursorVisible()); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The current cursor does not change even when the cursor is not shown. 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ui::kCursorCopy, current_cursor().native_type()); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check if cursor visibility is locked. 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.LockCursor(); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsCursorVisible()); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.ShowCursor(); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsCursorVisible()); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.UnlockCursor(); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsCursorVisible()); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.LockCursor(); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsCursorVisible()); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.HideCursor(); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsCursorVisible()); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.UnlockCursor(); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsCursorVisible()); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Checks setting visiblity while cursor is locked does not affect the 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // subsequent uses of UnlockCursor. 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.LockCursor(); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.HideCursor(); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.UnlockCursor(); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsCursorVisible()); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.ShowCursor(); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.LockCursor(); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.UnlockCursor(); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsCursorVisible()); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.LockCursor(); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.ShowCursor(); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.UnlockCursor(); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsCursorVisible()); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.HideCursor(); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.LockCursor(); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.UnlockCursor(); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsCursorVisible()); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that LockCursor/UnlockCursor work correctly with 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// EnableMouseEvents and DisableMouseEvents 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(CursorManagerTest, EnableDisableMouseEvents) { 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.SetCursor(ui::kCursorCopy); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ui::kCursorCopy, current_cursor().native_type()); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.EnableMouseEvents(); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsMouseEventsEnabled()); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.DisableMouseEvents(); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsMouseEventsEnabled()); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The current cursor does not change even when the cursor is not shown. 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ui::kCursorCopy, current_cursor().native_type()); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check if cursor enable state is locked. 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.LockCursor(); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsMouseEventsEnabled()); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.EnableMouseEvents(); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsMouseEventsEnabled()); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.UnlockCursor(); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsMouseEventsEnabled()); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.LockCursor(); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsMouseEventsEnabled()); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.DisableMouseEvents(); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsMouseEventsEnabled()); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.UnlockCursor(); 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsMouseEventsEnabled()); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Checks enabling cursor while cursor is locked does not affect the 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // subsequent uses of UnlockCursor. 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.LockCursor(); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.DisableMouseEvents(); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.UnlockCursor(); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsMouseEventsEnabled()); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.EnableMouseEvents(); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.LockCursor(); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.UnlockCursor(); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsMouseEventsEnabled()); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.LockCursor(); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.EnableMouseEvents(); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.UnlockCursor(); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsMouseEventsEnabled()); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.DisableMouseEvents(); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.LockCursor(); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.UnlockCursor(); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsMouseEventsEnabled()); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(CursorManagerTest, SetScale) { 19090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(1.f, cursor_manager_.GetCurrentScale()); 19190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cursor_manager_.SetScale(2.f); 19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(2.f, cursor_manager_.GetCurrentScale()); 19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Cusror scale does change even while cursor is locked. 19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cursor_manager_.LockCursor(); 19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(2.f, cursor_manager_.GetCurrentScale()); 19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cursor_manager_.SetScale(2.5f); 19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(2.5f, cursor_manager_.GetCurrentScale()); 19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cursor_manager_.UnlockCursor(); 20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(2.5f, cursor_manager_.GetCurrentScale()); 20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cursor_manager_.SetScale(1.f); 20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(1.f, cursor_manager_.GetCurrentScale()); 20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(CursorManagerTest, IsMouseEventsEnabled) { 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.EnableMouseEvents(); 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsMouseEventsEnabled()); 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.DisableMouseEvents(); 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsMouseEventsEnabled()); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that the mouse events enable state changes correctly when 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ShowCursor/HideCursor and EnableMouseEvents/DisableMouseEvents are used 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// together. 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(CursorManagerTest, ShowAndEnable) { 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Changing the visibility of the cursor does not affect the enable state. 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.EnableMouseEvents(); 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.ShowCursor(); 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsCursorVisible()); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsMouseEventsEnabled()); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.HideCursor(); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsCursorVisible()); 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsMouseEventsEnabled()); 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.ShowCursor(); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsCursorVisible()); 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsMouseEventsEnabled()); 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When mouse events are disabled, it also gets invisible. 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsCursorVisible()); 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.DisableMouseEvents(); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsCursorVisible()); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsMouseEventsEnabled()); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When mouse events are enabled, it restores the visibility state. 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.EnableMouseEvents(); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsCursorVisible()); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsMouseEventsEnabled()); 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.ShowCursor(); 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.DisableMouseEvents(); 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsCursorVisible()); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsMouseEventsEnabled()); 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.EnableMouseEvents(); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsCursorVisible()); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsMouseEventsEnabled()); 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.HideCursor(); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.DisableMouseEvents(); 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsCursorVisible()); 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsMouseEventsEnabled()); 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.EnableMouseEvents(); 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsCursorVisible()); 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsMouseEventsEnabled()); 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When mouse events are disabled, ShowCursor is ignored. 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.DisableMouseEvents(); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsCursorVisible()); 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsMouseEventsEnabled()); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.ShowCursor(); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsCursorVisible()); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsMouseEventsEnabled()); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.DisableMouseEvents(); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsCursorVisible()); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(cursor_manager_.IsMouseEventsEnabled()); 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that calling DisableMouseEvents multiple times in a row makes no 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// difference compared with calling it once. 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This is a regression test for http://crbug.com/169404. 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(CursorManagerTest, MultipleDisableMouseEvents) { 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.DisableMouseEvents(); 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.DisableMouseEvents(); 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.EnableMouseEvents(); 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.LockCursor(); 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.UnlockCursor(); 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsCursorVisible()); 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that calling EnableMouseEvents multiple times in a row makes no 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// difference compared with calling it once. 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(CursorManagerTest, MultipleEnableMouseEvents) { 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.DisableMouseEvents(); 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.EnableMouseEvents(); 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.EnableMouseEvents(); 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.LockCursor(); 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.UnlockCursor(); 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(cursor_manager_.IsCursorVisible()); 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(CursorManagerTest, TestCursorClientObserver) { 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Add two observers. Both should have OnCursorVisibilityChanged() 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // invoked when the visibility of the cursor changes. 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestingCursorClientObserver observer_a; 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestingCursorClientObserver observer_b; 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cursor_manager_.AddObserver(&observer_a); 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cursor_manager_.AddObserver(&observer_b); 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Initial state before any events have been sent. 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_a.reset(); 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_b.reset(); 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_a.did_visibility_change()); 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_b.did_visibility_change()); 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_a.is_cursor_visible()); 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_b.is_cursor_visible()); 306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Hide the cursor using HideCursor(). 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cursor_manager_.HideCursor(); 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_a.did_visibility_change()); 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_b.did_visibility_change()); 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_a.is_cursor_visible()); 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_b.is_cursor_visible()); 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Show the cursor using ShowCursor(). 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_a.reset(); 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_b.reset(); 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cursor_manager_.ShowCursor(); 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_a.did_visibility_change()); 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_b.did_visibility_change()); 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_a.is_cursor_visible()); 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_b.is_cursor_visible()); 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Remove observer_b. Its OnCursorVisibilityChanged() should 324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // not be invoked past this point. 325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cursor_manager_.RemoveObserver(&observer_b); 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Hide the cursor using HideCursor(). 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_a.reset(); 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_b.reset(); 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cursor_manager_.HideCursor(); 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_a.did_visibility_change()); 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_b.did_visibility_change()); 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_a.is_cursor_visible()); 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Show the cursor using ShowCursor(). 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_a.reset(); 337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_b.reset(); 338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cursor_manager_.ShowCursor(); 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_a.did_visibility_change()); 340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(observer_b.did_visibility_change()); 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(observer_a.is_cursor_visible()); 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 343