Fix cursor getting invisible after moving a window.
The platform cursor value was not correctly set when cursor was unlocked.
This CL fixes it and adds unittests.
BUG=150904
Review URL: https://chromiumcodereview.appspot.com/10965020
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@157924 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/ash/ash.gyp b/ash/ash.gyp
index c138b3c..44de29c 100644
--- a/ash/ash.gyp
+++ b/ash/ash.gyp
@@ -490,6 +490,8 @@
'test/ash_unittests.cc',
'test/capture_tracking_view.cc',
'test/capture_tracking_view.h',
+ 'test/cursor_manager_test_api.cc',
+ 'test/cursor_manager_test_api.h',
'test/launcher_view_test_api.cc',
'test/launcher_view_test_api.h',
'test/test_activation_delegate.cc',
@@ -505,6 +507,7 @@
'tooltips/tooltip_controller_unittest.cc',
'wm/activation_controller_unittest.cc',
'wm/base_layout_manager_unittest.cc',
+ 'wm/cursor_manager_unittest.cc',
'wm/custom_frame_view_ash_unittest.cc',
'wm/frame_painter_unittest.cc',
'wm/image_grid_unittest.cc',
diff --git a/ash/test/cursor_manager_test_api.cc b/ash/test/cursor_manager_test_api.cc
new file mode 100644
index 0000000..e992f9ca
--- /dev/null
+++ b/ash/test/cursor_manager_test_api.cc
@@ -0,0 +1,29 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/test/cursor_manager_test_api.h"
+
+#include "ash/wm/cursor_manager.h"
+#include "ash/wm/image_cursors.h"
+
+namespace ash {
+namespace test {
+
+CursorManagerTestApi::CursorManagerTestApi(CursorManager* cursor_manager)
+ : cursor_manager_(cursor_manager) {
+}
+
+CursorManagerTestApi::~CursorManagerTestApi() {
+}
+
+gfx::NativeCursor CursorManagerTestApi::GetCurrentCursor() {
+ return cursor_manager_->current_cursor_;
+}
+
+float CursorManagerTestApi::GetDeviceScaleFactor() {
+ return cursor_manager_->image_cursors_->GetDeviceScaleFactor();
+}
+
+} // namespace test
+} // namespace ash
diff --git a/ash/test/cursor_manager_test_api.h b/ash/test/cursor_manager_test_api.h
new file mode 100644
index 0000000..5cb25ad
--- /dev/null
+++ b/ash/test/cursor_manager_test_api.h
@@ -0,0 +1,35 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_TEST_CURSOR_MANAGER_TEST_API_H_
+#define ASH_TEST_CURSOR_MANAGER_TEST_API_H_
+
+#include "base/basictypes.h"
+#include "ui/gfx/native_widget_types.h"
+
+namespace ash {
+
+class CursorManager;
+
+namespace test {
+
+// Use the api in this class to test CursorManager.
+class CursorManagerTestApi {
+ public:
+ explicit CursorManagerTestApi(CursorManager* cursor_manager);
+ ~CursorManagerTestApi();
+
+ gfx::NativeCursor GetCurrentCursor();
+ float GetDeviceScaleFactor();
+
+ private:
+ CursorManager* cursor_manager_;
+
+ DISALLOW_COPY_AND_ASSIGN(CursorManagerTestApi);
+};
+
+} // namespace test
+} // namespace ash
+
+#endif // ASH_TEST_CURSOR_MANAGER_TEST_API_H_
diff --git a/ash/wm/cursor_manager.cc b/ash/wm/cursor_manager.cc
index 3afee4b..da2248e 100644
--- a/ash/wm/cursor_manager.cc
+++ b/ash/wm/cursor_manager.cc
@@ -36,7 +36,7 @@
if (did_cursor_change_) {
did_cursor_change_ = false;
if (delegate_)
- delegate_->SetCursor(cursor_to_set_on_unlock_);
+ SetCursorInternal(cursor_to_set_on_unlock_);
}
did_cursor_change_ = false;
cursor_to_set_on_unlock_ = gfx::kNullCursor;
diff --git a/ash/wm/cursor_manager.h b/ash/wm/cursor_manager.h
index f5b5548b..f2b857e8 100644
--- a/ash/wm/cursor_manager.h
+++ b/ash/wm/cursor_manager.h
@@ -5,21 +5,26 @@
#ifndef ASH_WM_CURSOR_MANAGER_H_
#define ASH_WM_CURSOR_MANAGER_H_
+#include "ash/ash_export.h"
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
-#include "ui/aura/aura_export.h"
#include "ui/aura/client/cursor_client.h"
#include "ui/gfx/native_widget_types.h"
namespace ash {
+
+namespace test {
+class CursorManagerTestApi;
+}
+
class CursorDelegate;
class ImageCursors;
// This class controls the visibility and the type of the cursor.
// The cursor type can be locked so that the type stays the same
// until it's unlocked.
-class CursorManager : public aura::client::CursorClient {
+class ASH_EXPORT CursorManager : public aura::client::CursorClient {
public:
CursorManager();
virtual ~CursorManager();
@@ -42,6 +47,8 @@
virtual void SetDeviceScaleFactor(float device_scale_factor) OVERRIDE;
private:
+ friend class test::CursorManagerTestApi;
+
void SetCursorInternal(gfx::NativeCursor cursor);
CursorDelegate* delegate_;
@@ -68,6 +75,6 @@
DISALLOW_COPY_AND_ASSIGN(CursorManager);
};
-} // namespace aura
+} // namespace ash
#endif // UI_AURA_CURSOR_MANAGER_H_
diff --git a/ash/wm/cursor_manager_unittest.cc b/ash/wm/cursor_manager_unittest.cc
new file mode 100644
index 0000000..79b2aea8
--- /dev/null
+++ b/ash/wm/cursor_manager_unittest.cc
@@ -0,0 +1,70 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/wm/cursor_manager.h"
+
+#include "ash/shell.h"
+#include "ash/test/ash_test_base.h"
+#include "ash/test/cursor_manager_test_api.h"
+#include "ash/wm/image_cursors.h"
+
+namespace ash {
+namespace test {
+
+typedef test::AshTestBase CursorManagerTest;
+
+TEST_F(CursorManagerTest, LockCursor) {
+ CursorManager* cursor_manager = Shell::GetInstance()->cursor_manager();
+ CursorManagerTestApi test_api(cursor_manager);
+
+ cursor_manager->SetCursor(ui::kCursorCopy);
+ EXPECT_EQ(ui::kCursorCopy, test_api.GetCurrentCursor().native_type());
+ cursor_manager->SetDeviceScaleFactor(2.0f);
+ EXPECT_EQ(2.0f, test_api.GetDeviceScaleFactor());
+ EXPECT_TRUE(test_api.GetCurrentCursor().platform());
+
+ cursor_manager->LockCursor();
+ EXPECT_TRUE(cursor_manager->is_cursor_locked());
+
+ // Cursor type does not change while cursor is locked.
+ cursor_manager->SetCursor(ui::kCursorPointer);
+ EXPECT_EQ(ui::kCursorCopy, test_api.GetCurrentCursor().native_type());
+
+ // Device scale factor does change even while cursor is locked.
+ cursor_manager->SetDeviceScaleFactor(1.0f);
+ EXPECT_EQ(1.0f, test_api.GetDeviceScaleFactor());
+
+ cursor_manager->UnlockCursor();
+ EXPECT_FALSE(cursor_manager->is_cursor_locked());
+
+ // Cursor type changes to the one specified while cursor is locked.
+ EXPECT_EQ(ui::kCursorPointer, test_api.GetCurrentCursor().native_type());
+ EXPECT_EQ(1.0f, test_api.GetDeviceScaleFactor());
+ EXPECT_TRUE(test_api.GetCurrentCursor().platform());
+}
+
+TEST_F(CursorManagerTest, SetCursor) {
+ CursorManager* cursor_manager = Shell::GetInstance()->cursor_manager();
+ CursorManagerTestApi test_api(cursor_manager);
+
+ cursor_manager->SetCursor(ui::kCursorCopy);
+ EXPECT_EQ(ui::kCursorCopy, test_api.GetCurrentCursor().native_type());
+ EXPECT_TRUE(test_api.GetCurrentCursor().platform());
+ cursor_manager->SetCursor(ui::kCursorPointer);
+ EXPECT_EQ(ui::kCursorPointer, test_api.GetCurrentCursor().native_type());
+ EXPECT_TRUE(test_api.GetCurrentCursor().platform());
+}
+
+TEST_F(CursorManagerTest, SetDeviceScaleFactor) {
+ CursorManager* cursor_manager = Shell::GetInstance()->cursor_manager();
+ CursorManagerTestApi test_api(cursor_manager);
+
+ cursor_manager->SetDeviceScaleFactor(2.0f);
+ EXPECT_EQ(2.0f, test_api.GetDeviceScaleFactor());
+ cursor_manager->SetDeviceScaleFactor(1.0f);
+ EXPECT_EQ(1.0f, test_api.GetDeviceScaleFactor());
+}
+
+} // namespace test
+} // namespace ash