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