touch_devices_controller_unittest.cc 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ash/touch/touch_devices_controller.h"
  5. #include "ash/accelerators/debug_commands.h"
  6. #include "ash/constants/ash_pref_names.h"
  7. #include "ash/constants/ash_switches.h"
  8. #include "ash/public/cpp/ash_prefs.h"
  9. #include "ash/session/session_controller_impl.h"
  10. #include "ash/session/test_session_controller_client.h"
  11. #include "ash/shell.h"
  12. #include "ash/test/ash_test_base.h"
  13. #include "base/command_line.h"
  14. #include "base/test/metrics/histogram_tester.h"
  15. #include "components/prefs/pref_service.h"
  16. #include "components/prefs/testing_pref_service.h"
  17. namespace ash {
  18. namespace {
  19. constexpr char kUser1Email[] = "user1@test.com";
  20. constexpr char kUser2Email[] = "user2@test.com";
  21. bool GetUserPrefTouchpadEnabled() {
  22. PrefService* prefs =
  23. Shell::Get()->session_controller()->GetLastActiveUserPrefService();
  24. return prefs && prefs->GetBoolean(prefs::kTouchpadEnabled);
  25. }
  26. bool GetGlobalTouchpadEnabled() {
  27. return Shell::Get()->touch_devices_controller()->GetTouchpadEnabled(
  28. TouchDeviceEnabledSource::GLOBAL);
  29. }
  30. bool GetUserPrefTouchscreenEnabled() {
  31. return Shell::Get()->touch_devices_controller()->GetTouchscreenEnabled(
  32. TouchDeviceEnabledSource::USER_PREF);
  33. }
  34. bool GetGlobalTouchscreenEnabled() {
  35. return Shell::Get()->touch_devices_controller()->GetTouchscreenEnabled(
  36. TouchDeviceEnabledSource::GLOBAL);
  37. }
  38. void SetTapDraggingEnabled(bool enabled) {
  39. PrefService* prefs =
  40. Shell::Get()->session_controller()->GetLastActiveUserPrefService();
  41. prefs->SetBoolean(prefs::kTapDraggingEnabled, enabled);
  42. prefs->CommitPendingWrite();
  43. }
  44. class TouchDevicesControllerSigninTest : public NoSessionAshTestBase {
  45. public:
  46. TouchDevicesControllerSigninTest() = default;
  47. TouchDevicesControllerSigninTest(const TouchDevicesControllerSigninTest&) =
  48. delete;
  49. TouchDevicesControllerSigninTest& operator=(
  50. const TouchDevicesControllerSigninTest&) = delete;
  51. ~TouchDevicesControllerSigninTest() override = default;
  52. // NoSessionAshTestBase:
  53. void SetUp() override {
  54. base::CommandLine::ForCurrentProcess()->AppendSwitch(
  55. switches::kAshDebugShortcuts);
  56. NoSessionAshTestBase::SetUp();
  57. CreateTestUserSessions();
  58. // Simulate user 1 login.
  59. SwitchActiveUser(kUser1Email);
  60. ASSERT_TRUE(debug::DebugAcceleratorsEnabled());
  61. }
  62. void CreateTestUserSessions() {
  63. GetSessionControllerClient()->Reset();
  64. GetSessionControllerClient()->AddUserSession(kUser1Email);
  65. GetSessionControllerClient()->AddUserSession(kUser2Email);
  66. }
  67. void SwitchActiveUser(const std::string& email) {
  68. GetSessionControllerClient()->SwitchActiveUser(
  69. AccountId::FromUserEmail(email));
  70. }
  71. };
  72. TEST_F(TouchDevicesControllerSigninTest, PrefsAreRegistered) {
  73. PrefService* prefs =
  74. Shell::Get()->session_controller()->GetLastActiveUserPrefService();
  75. EXPECT_TRUE(prefs->FindPreference(prefs::kTapDraggingEnabled));
  76. EXPECT_TRUE(prefs->FindPreference(prefs::kTouchpadEnabled));
  77. EXPECT_TRUE(prefs->FindPreference(prefs::kTouchscreenEnabled));
  78. }
  79. TEST_F(TouchDevicesControllerSigninTest, SetTapDraggingEnabled) {
  80. auto* controller = Shell::Get()->touch_devices_controller();
  81. ASSERT_FALSE(controller->tap_dragging_enabled_for_test());
  82. SetTapDraggingEnabled(true);
  83. EXPECT_TRUE(controller->tap_dragging_enabled_for_test());
  84. // Switch to user 2 and switch back.
  85. SwitchActiveUser(kUser2Email);
  86. EXPECT_FALSE(controller->tap_dragging_enabled_for_test());
  87. SwitchActiveUser(kUser1Email);
  88. EXPECT_TRUE(controller->tap_dragging_enabled_for_test());
  89. SetTapDraggingEnabled(false);
  90. EXPECT_FALSE(controller->tap_dragging_enabled_for_test());
  91. }
  92. // Tests that touchpad enabled user pref works properly under debug accelerator.
  93. TEST_F(TouchDevicesControllerSigninTest, ToggleTouchpad) {
  94. ASSERT_TRUE(GetUserPrefTouchpadEnabled());
  95. debug::PerformDebugActionIfEnabled(DEBUG_TOGGLE_TOUCH_PAD);
  96. EXPECT_FALSE(GetUserPrefTouchpadEnabled());
  97. // Switch to user 2 and switch back.
  98. SwitchActiveUser(kUser2Email);
  99. EXPECT_TRUE(GetUserPrefTouchpadEnabled());
  100. SwitchActiveUser(kUser1Email);
  101. EXPECT_FALSE(GetUserPrefTouchpadEnabled());
  102. debug::PerformDebugActionIfEnabled(DEBUG_TOGGLE_TOUCH_PAD);
  103. EXPECT_TRUE(GetUserPrefTouchpadEnabled());
  104. }
  105. TEST_F(TouchDevicesControllerSigninTest, SetTouchpadEnabled) {
  106. ASSERT_TRUE(GetUserPrefTouchpadEnabled());
  107. ASSERT_TRUE(GetGlobalTouchpadEnabled());
  108. Shell::Get()->touch_devices_controller()->SetTouchpadEnabled(
  109. false, TouchDeviceEnabledSource::GLOBAL);
  110. ASSERT_TRUE(GetUserPrefTouchpadEnabled());
  111. ASSERT_FALSE(GetGlobalTouchpadEnabled());
  112. Shell::Get()->touch_devices_controller()->SetTouchpadEnabled(
  113. false, TouchDeviceEnabledSource::USER_PREF);
  114. ASSERT_FALSE(GetUserPrefTouchpadEnabled());
  115. ASSERT_FALSE(GetGlobalTouchpadEnabled());
  116. Shell::Get()->touch_devices_controller()->SetTouchpadEnabled(
  117. true, TouchDeviceEnabledSource::GLOBAL);
  118. ASSERT_FALSE(GetUserPrefTouchpadEnabled());
  119. ASSERT_TRUE(GetGlobalTouchpadEnabled());
  120. }
  121. // Tests that touchscreen enabled user pref works properly under debug
  122. // accelerator.
  123. TEST_F(TouchDevicesControllerSigninTest, SetTouchscreenEnabled) {
  124. ASSERT_TRUE(GetGlobalTouchscreenEnabled());
  125. ASSERT_TRUE(GetUserPrefTouchscreenEnabled());
  126. debug::PerformDebugActionIfEnabled(DEBUG_TOGGLE_TOUCH_SCREEN);
  127. EXPECT_TRUE(GetGlobalTouchscreenEnabled());
  128. EXPECT_FALSE(GetUserPrefTouchscreenEnabled());
  129. // Switch to user 2 and switch back.
  130. SwitchActiveUser(kUser2Email);
  131. EXPECT_TRUE(GetUserPrefTouchscreenEnabled());
  132. SwitchActiveUser(kUser1Email);
  133. EXPECT_TRUE(GetGlobalTouchscreenEnabled());
  134. EXPECT_FALSE(GetUserPrefTouchscreenEnabled());
  135. debug::PerformDebugActionIfEnabled(DEBUG_TOGGLE_TOUCH_SCREEN);
  136. EXPECT_TRUE(GetUserPrefTouchscreenEnabled());
  137. EXPECT_TRUE(GetGlobalTouchscreenEnabled());
  138. // The global setting should be preserved when switching users.
  139. Shell::Get()->touch_devices_controller()->SetTouchscreenEnabled(
  140. false, TouchDeviceEnabledSource::GLOBAL);
  141. EXPECT_FALSE(GetGlobalTouchscreenEnabled());
  142. SwitchActiveUser(kUser2Email);
  143. EXPECT_FALSE(GetGlobalTouchscreenEnabled());
  144. }
  145. using TouchDevicesControllerPrefsTest = NoSessionAshTestBase;
  146. // Tests that "Touchpad.TapDragging.Started" is recorded on user session added
  147. // and pref service is ready and "Touchpad.TapDragging.Changed" is recorded each
  148. // time pref changes.
  149. TEST_F(TouchDevicesControllerPrefsTest, RecordUma) {
  150. auto* controller = Shell::Get()->touch_devices_controller();
  151. ASSERT_FALSE(controller->tap_dragging_enabled_for_test());
  152. TestSessionControllerClient* session = GetSessionControllerClient();
  153. // Disable auto-provision of PrefService.
  154. constexpr bool kProvidePrefService = false;
  155. // Add and switch to |kUser1Email|, but user pref service is not ready.
  156. session->AddUserSession(kUser1Email, user_manager::USER_TYPE_REGULAR,
  157. kProvidePrefService);
  158. const AccountId kUserAccount1 = AccountId::FromUserEmail(kUser1Email);
  159. session->SwitchActiveUser(kUserAccount1);
  160. base::HistogramTester histogram_tester;
  161. histogram_tester.ExpectTotalCount("Touchpad.TapDragging.Started", 0);
  162. histogram_tester.ExpectTotalCount("Touchpad.TapDragging.Changed", 0);
  163. // Simulate active user pref service is changed.
  164. auto pref_service = std::make_unique<TestingPrefServiceSimple>();
  165. RegisterUserProfilePrefs(pref_service->registry(), true /* for_test */);
  166. GetSessionControllerClient()->SetUserPrefService(kUserAccount1,
  167. std::move(pref_service));
  168. histogram_tester.ExpectTotalCount("Touchpad.TapDragging.Started", 1);
  169. histogram_tester.ExpectTotalCount("Touchpad.TapDragging.Changed", 0);
  170. EXPECT_FALSE(controller->tap_dragging_enabled_for_test());
  171. SetTapDraggingEnabled(true);
  172. histogram_tester.ExpectTotalCount("Touchpad.TapDragging.Started", 1);
  173. histogram_tester.ExpectTotalCount("Touchpad.TapDragging.Changed", 1);
  174. }
  175. } // namespace
  176. } // namespace ash