| OLD | NEW |
| (Empty) |
| 1 // Copyright 2016 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 | |
| 5 #include "ash/system/chromeos/power/tablet_power_button_controller.h" | |
| 6 | |
| 7 #include <memory> | |
| 8 | |
| 9 #include "ash/common/ash_switches.h" | |
| 10 #include "ash/common/session/session_state_delegate.h" | |
| 11 #include "ash/common/wm/maximize_mode/maximize_mode_controller.h" | |
| 12 #include "ash/common/wm_shell.h" | |
| 13 #include "ash/shell.h" | |
| 14 #include "ash/test/ash_test_base.h" | |
| 15 #include "ash/test/lock_state_controller_test_api.h" | |
| 16 #include "ash/test/test_shell_delegate.h" | |
| 17 #include "ash/wm/lock_state_controller.h" | |
| 18 #include "ash/wm/power_button_controller.h" | |
| 19 #include "base/command_line.h" | |
| 20 #include "base/compiler_specific.h" | |
| 21 #include "base/memory/ptr_util.h" | |
| 22 #include "base/run_loop.h" | |
| 23 #include "base/test/simple_test_tick_clock.h" | |
| 24 #include "chromeos/dbus/dbus_thread_manager.h" | |
| 25 #include "chromeos/dbus/fake_power_manager_client.h" | |
| 26 #include "ui/events/event.h" | |
| 27 #include "ui/events/test/event_generator.h" | |
| 28 | |
| 29 namespace ash { | |
| 30 namespace test { | |
| 31 | |
| 32 namespace { | |
| 33 | |
| 34 // A non-zero brightness used for test. | |
| 35 constexpr int kNonZeroBrightness = 10; | |
| 36 | |
| 37 void CopyResult(bool* dest, bool src) { | |
| 38 *dest = src; | |
| 39 } | |
| 40 | |
| 41 } // namespace | |
| 42 | |
| 43 class TabletPowerButtonControllerTest : public AshTestBase { | |
| 44 public: | |
| 45 TabletPowerButtonControllerTest() {} | |
| 46 ~TabletPowerButtonControllerTest() override {} | |
| 47 | |
| 48 void SetUp() override { | |
| 49 // This also initializes DBusThreadManager. | |
| 50 std::unique_ptr<chromeos::DBusThreadManagerSetter> dbus_setter = | |
| 51 chromeos::DBusThreadManager::GetSetterForTesting(); | |
| 52 power_manager_client_ = new chromeos::FakePowerManagerClient(); | |
| 53 dbus_setter->SetPowerManagerClient(base::WrapUnique(power_manager_client_)); | |
| 54 base::CommandLine::ForCurrentProcess()->AppendSwitch( | |
| 55 switches::kAshEnableTouchView); | |
| 56 AshTestBase::SetUp(); | |
| 57 | |
| 58 lock_state_controller_ = Shell::GetInstance()->lock_state_controller(); | |
| 59 tablet_controller_ = Shell::GetInstance() | |
| 60 ->power_button_controller() | |
| 61 ->tablet_power_button_controller_for_test(); | |
| 62 test_api_ = base::MakeUnique<TabletPowerButtonController::TestApi>( | |
| 63 tablet_controller_); | |
| 64 lock_state_test_api_ = | |
| 65 base::MakeUnique<LockStateControllerTestApi>(lock_state_controller_); | |
| 66 tick_clock_ = new base::SimpleTestTickClock; | |
| 67 tablet_controller_->SetTickClockForTesting( | |
| 68 std::unique_ptr<base::TickClock>(tick_clock_)); | |
| 69 shell_delegate_ = | |
| 70 static_cast<TestShellDelegate*>(WmShell::Get()->delegate()); | |
| 71 generator_ = &AshTestBase::GetEventGenerator(); | |
| 72 power_manager_client_->SendBrightnessChanged(kNonZeroBrightness, false); | |
| 73 EXPECT_FALSE(GetBacklightsForcedOff()); | |
| 74 } | |
| 75 | |
| 76 void TearDown() override { | |
| 77 generator_ = nullptr; | |
| 78 const bool is_mash = WmShell::Get()->IsRunningInMash(); | |
| 79 AshTestBase::TearDown(); | |
| 80 // Mash shuts down dbus after each test. | |
| 81 if (!is_mash) | |
| 82 chromeos::DBusThreadManager::Shutdown(); | |
| 83 } | |
| 84 | |
| 85 protected: | |
| 86 void PressPowerButton() { | |
| 87 tablet_controller_->OnPowerButtonEvent(true, base::TimeTicks::Now()); | |
| 88 } | |
| 89 | |
| 90 void ReleasePowerButton() { | |
| 91 tablet_controller_->OnPowerButtonEvent(false, base::TimeTicks::Now()); | |
| 92 } | |
| 93 | |
| 94 void UnlockScreen() { | |
| 95 lock_state_controller_->OnLockStateChanged(false); | |
| 96 WmShell::Get()->GetSessionStateDelegate()->UnlockScreen(); | |
| 97 } | |
| 98 | |
| 99 void Initialize(LoginStatus status) { | |
| 100 lock_state_controller_->OnLoginStateChanged(status); | |
| 101 SetUserLoggedIn(status != LoginStatus::NOT_LOGGED_IN); | |
| 102 lock_state_controller_->OnLockStateChanged(false); | |
| 103 } | |
| 104 | |
| 105 void EnableMaximizeMode(bool enabled) { | |
| 106 WmShell::Get()->maximize_mode_controller()->EnableMaximizeModeWindowManager( | |
| 107 enabled); | |
| 108 } | |
| 109 | |
| 110 bool GetLockedState() { | |
| 111 return WmShell::Get()->GetSessionStateDelegate()->IsScreenLocked(); | |
| 112 } | |
| 113 | |
| 114 bool GetBacklightsForcedOff() WARN_UNUSED_RESULT { | |
| 115 bool forced_off = false; | |
| 116 power_manager_client_->GetBacklightsForcedOff( | |
| 117 base::Bind(&CopyResult, base::Unretained(&forced_off))); | |
| 118 base::RunLoop().RunUntilIdle(); | |
| 119 return forced_off; | |
| 120 } | |
| 121 | |
| 122 // Ownership is passed on to chromeos::DBusThreadManager. | |
| 123 chromeos::FakePowerManagerClient* power_manager_client_; | |
| 124 | |
| 125 LockStateController* lock_state_controller_; // Not owned. | |
| 126 TabletPowerButtonController* tablet_controller_; // Not owned. | |
| 127 std::unique_ptr<TabletPowerButtonController::TestApi> test_api_; | |
| 128 std::unique_ptr<LockStateControllerTestApi> lock_state_test_api_; | |
| 129 base::SimpleTestTickClock* tick_clock_; // Not owned. | |
| 130 TestShellDelegate* shell_delegate_; // Not owned. | |
| 131 ui::test::EventGenerator* generator_ = nullptr; | |
| 132 | |
| 133 DISALLOW_COPY_AND_ASSIGN(TabletPowerButtonControllerTest); | |
| 134 }; | |
| 135 | |
| 136 TEST_F(TabletPowerButtonControllerTest, LockScreenIfRequired) { | |
| 137 Initialize(LoginStatus::USER); | |
| 138 SetShouldLockScreenAutomatically(true); | |
| 139 EXPECT_FALSE(GetLockedState()); | |
| 140 | |
| 141 // On User logged in status, power-button-press-release should lock screen if | |
| 142 // automatic screen-locking was requested. | |
| 143 PressPowerButton(); | |
| 144 ReleasePowerButton(); | |
| 145 EXPECT_TRUE(GetLockedState()); | |
| 146 | |
| 147 // On locked state, power-button-press-release should do nothing. | |
| 148 PressPowerButton(); | |
| 149 ReleasePowerButton(); | |
| 150 EXPECT_TRUE(GetLockedState()); | |
| 151 | |
| 152 // Unlock the sceen. | |
| 153 UnlockScreen(); | |
| 154 ASSERT_FALSE(GetLockedState()); | |
| 155 | |
| 156 // power-button-press-release should not lock the screen if automatic | |
| 157 // screen-locking wasn't requested. | |
| 158 SetShouldLockScreenAutomatically(false); | |
| 159 PressPowerButton(); | |
| 160 ReleasePowerButton(); | |
| 161 EXPECT_FALSE(GetLockedState()); | |
| 162 } | |
| 163 | |
| 164 // Tests that shutdown animation is not started if the power button is released | |
| 165 // quickly. | |
| 166 TEST_F(TabletPowerButtonControllerTest, | |
| 167 ReleasePowerButtonBeforeStartingShutdownAnimation) { | |
| 168 PressPowerButton(); | |
| 169 EXPECT_TRUE(test_api_->ShutdownTimerIsRunning()); | |
| 170 EXPECT_FALSE(GetBacklightsForcedOff()); | |
| 171 ReleasePowerButton(); | |
| 172 power_manager_client_->SendBrightnessChanged(0, false); | |
| 173 EXPECT_FALSE(test_api_->ShutdownTimerIsRunning()); | |
| 174 EXPECT_TRUE(GetBacklightsForcedOff()); | |
| 175 | |
| 176 PressPowerButton(); | |
| 177 power_manager_client_->SendBrightnessChanged(kNonZeroBrightness, false); | |
| 178 EXPECT_TRUE(test_api_->ShutdownTimerIsRunning()); | |
| 179 EXPECT_FALSE(GetBacklightsForcedOff()); | |
| 180 ReleasePowerButton(); | |
| 181 EXPECT_FALSE(test_api_->ShutdownTimerIsRunning()); | |
| 182 EXPECT_FALSE(GetBacklightsForcedOff()); | |
| 183 } | |
| 184 | |
| 185 // Tests that the shutdown animation is started when the power button is | |
| 186 // released after the timer fires. | |
| 187 TEST_F(TabletPowerButtonControllerTest, | |
| 188 ReleasePowerButtonDuringShutdownAnimation) { | |
| 189 PressPowerButton(); | |
| 190 test_api_->TriggerShutdownTimeout(); | |
| 191 EXPECT_TRUE(lock_state_test_api_->shutdown_timer_is_running()); | |
| 192 ReleasePowerButton(); | |
| 193 EXPECT_FALSE(lock_state_test_api_->shutdown_timer_is_running()); | |
| 194 EXPECT_FALSE(GetBacklightsForcedOff()); | |
| 195 | |
| 196 // Test again when backlights is forced off. | |
| 197 PressPowerButton(); | |
| 198 ReleasePowerButton(); | |
| 199 power_manager_client_->SendBrightnessChanged(0, false); | |
| 200 EXPECT_TRUE(GetBacklightsForcedOff()); | |
| 201 | |
| 202 PressPowerButton(); | |
| 203 power_manager_client_->SendBrightnessChanged(kNonZeroBrightness, false); | |
| 204 EXPECT_FALSE(GetBacklightsForcedOff()); | |
| 205 test_api_->TriggerShutdownTimeout(); | |
| 206 EXPECT_TRUE(lock_state_test_api_->shutdown_timer_is_running()); | |
| 207 ReleasePowerButton(); | |
| 208 EXPECT_FALSE(lock_state_test_api_->shutdown_timer_is_running()); | |
| 209 EXPECT_FALSE(GetBacklightsForcedOff()); | |
| 210 } | |
| 211 | |
| 212 // Tests tapping power button when screen is idle off. | |
| 213 TEST_F(TabletPowerButtonControllerTest, TappingPowerButtonWhenScreenIsIdleOff) { | |
| 214 power_manager_client_->SendBrightnessChanged(0, false); | |
| 215 PressPowerButton(); | |
| 216 EXPECT_FALSE(GetBacklightsForcedOff()); | |
| 217 power_manager_client_->SendBrightnessChanged(kNonZeroBrightness, false); | |
| 218 ReleasePowerButton(); | |
| 219 EXPECT_FALSE(GetBacklightsForcedOff()); | |
| 220 } | |
| 221 | |
| 222 // Tests tapping power button when device is suspended without backlights forced | |
| 223 // off. | |
| 224 TEST_F(TabletPowerButtonControllerTest, | |
| 225 TappingPowerButtonWhenSuspendedWithoutBacklightsForcedOff) { | |
| 226 power_manager_client_->SendSuspendImminent(); | |
| 227 power_manager_client_->SendBrightnessChanged(0, false); | |
| 228 // There is a power button pressed here, but PowerButtonEvent is sent later. | |
| 229 power_manager_client_->SendSuspendDone(); | |
| 230 power_manager_client_->SendBrightnessChanged(kNonZeroBrightness, false); | |
| 231 | |
| 232 // Send the power button event after a short delay and check that backlights | |
| 233 // are not forced off. | |
| 234 tick_clock_->Advance(base::TimeDelta::FromMilliseconds(500)); | |
| 235 power_manager_client_->SendPowerButtonEvent(true, tick_clock_->NowTicks()); | |
| 236 EXPECT_TRUE(test_api_->ShutdownTimerIsRunning()); | |
| 237 power_manager_client_->SendPowerButtonEvent(false, tick_clock_->NowTicks()); | |
| 238 EXPECT_FALSE(test_api_->ShutdownTimerIsRunning()); | |
| 239 EXPECT_FALSE(GetBacklightsForcedOff()); | |
| 240 | |
| 241 // Send the power button event after a longer delay and check that backlights | |
| 242 // are forced off. | |
| 243 tick_clock_->Advance(base::TimeDelta::FromMilliseconds(1600)); | |
| 244 power_manager_client_->SendPowerButtonEvent(true, tick_clock_->NowTicks()); | |
| 245 EXPECT_TRUE(test_api_->ShutdownTimerIsRunning()); | |
| 246 power_manager_client_->SendPowerButtonEvent(false, tick_clock_->NowTicks()); | |
| 247 power_manager_client_->SendBrightnessChanged(0, false); | |
| 248 EXPECT_FALSE(test_api_->ShutdownTimerIsRunning()); | |
| 249 EXPECT_TRUE(GetBacklightsForcedOff()); | |
| 250 } | |
| 251 | |
| 252 // Tests tapping power button when device is suspended with backlights forced | |
| 253 // off. | |
| 254 TEST_F(TabletPowerButtonControllerTest, | |
| 255 TappingPowerButtonWhenSuspendedWithBacklightsForcedOff) { | |
| 256 PressPowerButton(); | |
| 257 ReleasePowerButton(); | |
| 258 power_manager_client_->SendBrightnessChanged(0, false); | |
| 259 EXPECT_TRUE(GetBacklightsForcedOff()); | |
| 260 power_manager_client_->SendSuspendImminent(); | |
| 261 // There is a power button pressed here, but PowerButtonEvent is sent later. | |
| 262 // Because of backlights forced off, resuming system will not restore | |
| 263 // brightness. | |
| 264 power_manager_client_->SendSuspendDone(); | |
| 265 | |
| 266 // Send the power button event after a short delay and check that backlights | |
| 267 // are not forced off. | |
| 268 tick_clock_->Advance(base::TimeDelta::FromMilliseconds(500)); | |
| 269 power_manager_client_->SendPowerButtonEvent(true, tick_clock_->NowTicks()); | |
| 270 power_manager_client_->SendBrightnessChanged(kNonZeroBrightness, false); | |
| 271 EXPECT_TRUE(test_api_->ShutdownTimerIsRunning()); | |
| 272 power_manager_client_->SendPowerButtonEvent(false, tick_clock_->NowTicks()); | |
| 273 EXPECT_FALSE(test_api_->ShutdownTimerIsRunning()); | |
| 274 EXPECT_FALSE(GetBacklightsForcedOff()); | |
| 275 | |
| 276 // Send the power button event after a longer delay and check that backlights | |
| 277 // are forced off. | |
| 278 tick_clock_->Advance(base::TimeDelta::FromMilliseconds(1600)); | |
| 279 power_manager_client_->SendPowerButtonEvent(true, tick_clock_->NowTicks()); | |
| 280 EXPECT_TRUE(test_api_->ShutdownTimerIsRunning()); | |
| 281 power_manager_client_->SendPowerButtonEvent(false, tick_clock_->NowTicks()); | |
| 282 power_manager_client_->SendBrightnessChanged(0, false); | |
| 283 EXPECT_FALSE(test_api_->ShutdownTimerIsRunning()); | |
| 284 EXPECT_TRUE(GetBacklightsForcedOff()); | |
| 285 } | |
| 286 | |
| 287 // For convertible device working on laptop mode, tests keyboard/mouse event | |
| 288 // when screen is off. | |
| 289 TEST_F(TabletPowerButtonControllerTest, ConvertibleOnLaptopMode) { | |
| 290 EnableMaximizeMode(false); | |
| 291 | |
| 292 // KeyEvent should SetBacklightsForcedOff(false). | |
| 293 PressPowerButton(); | |
| 294 ReleasePowerButton(); | |
| 295 power_manager_client_->SendBrightnessChanged(0, false); | |
| 296 EXPECT_TRUE(GetBacklightsForcedOff()); | |
| 297 generator_->PressKey(ui::VKEY_L, ui::EF_NONE); | |
| 298 power_manager_client_->SendBrightnessChanged(kNonZeroBrightness, false); | |
| 299 EXPECT_FALSE(GetBacklightsForcedOff()); | |
| 300 | |
| 301 // Regular mouse event should SetBacklightsForcedOff(false). | |
| 302 PressPowerButton(); | |
| 303 ReleasePowerButton(); | |
| 304 power_manager_client_->SendBrightnessChanged(0, false); | |
| 305 EXPECT_TRUE(GetBacklightsForcedOff()); | |
| 306 generator_->MoveMouseBy(1, 1); | |
| 307 power_manager_client_->SendBrightnessChanged(kNonZeroBrightness, false); | |
| 308 EXPECT_FALSE(GetBacklightsForcedOff()); | |
| 309 | |
| 310 // Synthesized mouse event should not SetBacklightsForcedOff(false). | |
| 311 PressPowerButton(); | |
| 312 ReleasePowerButton(); | |
| 313 power_manager_client_->SendBrightnessChanged(0, false); | |
| 314 EXPECT_TRUE(GetBacklightsForcedOff()); | |
| 315 generator_->set_flags(ui::EF_IS_SYNTHESIZED); | |
| 316 generator_->MoveMouseBy(1, 1); | |
| 317 generator_->set_flags(ui::EF_NONE); | |
| 318 EXPECT_TRUE(GetBacklightsForcedOff()); | |
| 319 } | |
| 320 | |
| 321 // For convertible device working on tablet mode, keyboard/mouse event should | |
| 322 // not SetBacklightsForcedOff(false) when screen is off. | |
| 323 TEST_F(TabletPowerButtonControllerTest, ConvertibleOnMaximizeMode) { | |
| 324 EnableMaximizeMode(true); | |
| 325 | |
| 326 PressPowerButton(); | |
| 327 ReleasePowerButton(); | |
| 328 power_manager_client_->SendBrightnessChanged(0, false); | |
| 329 EXPECT_TRUE(GetBacklightsForcedOff()); | |
| 330 generator_->PressKey(ui::VKEY_L, ui::EF_NONE); | |
| 331 EXPECT_TRUE(GetBacklightsForcedOff()); | |
| 332 | |
| 333 generator_->MoveMouseBy(1, 1); | |
| 334 EXPECT_TRUE(GetBacklightsForcedOff()); | |
| 335 } | |
| 336 | |
| 337 // Tests that a single set of power button pressed-and-released operation should | |
| 338 // cause only one SetBacklightsForcedOff call. | |
| 339 TEST_F(TabletPowerButtonControllerTest, IgnorePowerOnKeyEvent) { | |
| 340 ui::KeyEvent power_key_pressed(ui::ET_KEY_PRESSED, ui::VKEY_POWER, | |
| 341 ui::EF_NONE); | |
| 342 ui::KeyEvent power_key_released(ui::ET_KEY_RELEASED, ui::VKEY_POWER, | |
| 343 ui::EF_NONE); | |
| 344 | |
| 345 // There are two |power_key_pressed| events and |power_key_released| events | |
| 346 // generated for each pressing and releasing, and multiple repeating pressed | |
| 347 // events depending on holding. | |
| 348 tablet_controller_->OnKeyEvent(&power_key_pressed); | |
| 349 tablet_controller_->OnKeyEvent(&power_key_pressed); | |
| 350 PressPowerButton(); | |
| 351 tablet_controller_->OnKeyEvent(&power_key_pressed); | |
| 352 tablet_controller_->OnKeyEvent(&power_key_pressed); | |
| 353 tablet_controller_->OnKeyEvent(&power_key_pressed); | |
| 354 ReleasePowerButton(); | |
| 355 tablet_controller_->OnKeyEvent(&power_key_released); | |
| 356 tablet_controller_->OnKeyEvent(&power_key_released); | |
| 357 EXPECT_EQ(1, power_manager_client_->num_set_backlights_forced_off_calls()); | |
| 358 } | |
| 359 | |
| 360 // Tests that under (1) tablet power button pressed/released, (2) keyboard/mouse | |
| 361 // events on laptop mode when screen is off, requesting/stopping backlights | |
| 362 // forced off should also set corresponding touch screen state in local pref. | |
| 363 TEST_F(TabletPowerButtonControllerTest, TouchScreenState) { | |
| 364 // Tests tablet power button. | |
| 365 EXPECT_TRUE(shell_delegate_->IsTouchscreenEnabledInPrefs(true)); | |
| 366 PressPowerButton(); | |
| 367 ReleasePowerButton(); | |
| 368 power_manager_client_->SendBrightnessChanged(0, false); | |
| 369 EXPECT_FALSE(shell_delegate_->IsTouchscreenEnabledInPrefs(true)); | |
| 370 | |
| 371 PressPowerButton(); | |
| 372 power_manager_client_->SendBrightnessChanged(kNonZeroBrightness, false); | |
| 373 ReleasePowerButton(); | |
| 374 EXPECT_TRUE(shell_delegate_->IsTouchscreenEnabledInPrefs(true)); | |
| 375 | |
| 376 EnableMaximizeMode(false); | |
| 377 // KeyEvent on laptop mode when screen is off. | |
| 378 PressPowerButton(); | |
| 379 ReleasePowerButton(); | |
| 380 power_manager_client_->SendBrightnessChanged(0, false); | |
| 381 EXPECT_TRUE(GetBacklightsForcedOff()); | |
| 382 EXPECT_FALSE(shell_delegate_->IsTouchscreenEnabledInPrefs(true)); | |
| 383 generator_->PressKey(ui::VKEY_L, ui::EF_NONE); | |
| 384 power_manager_client_->SendBrightnessChanged(kNonZeroBrightness, false); | |
| 385 EXPECT_TRUE(shell_delegate_->IsTouchscreenEnabledInPrefs(true)); | |
| 386 | |
| 387 // MouseEvent on laptop mode when screen is off. | |
| 388 PressPowerButton(); | |
| 389 ReleasePowerButton(); | |
| 390 power_manager_client_->SendBrightnessChanged(0, false); | |
| 391 EXPECT_TRUE(GetBacklightsForcedOff()); | |
| 392 EXPECT_FALSE(shell_delegate_->IsTouchscreenEnabledInPrefs(true)); | |
| 393 generator_->MoveMouseBy(1, 1); | |
| 394 power_manager_client_->SendBrightnessChanged(kNonZeroBrightness, false); | |
| 395 EXPECT_TRUE(shell_delegate_->IsTouchscreenEnabledInPrefs(true)); | |
| 396 } | |
| 397 | |
| 398 // When user switches convertible device between laptop mode and tablet mode, | |
| 399 // power button may be pressed and held, which may cause unwanted shutdown. | |
| 400 TEST_F(TabletPowerButtonControllerTest, | |
| 401 EnterOrLeaveMaximizeModeWhilePressingPowerButton) { | |
| 402 Initialize(LoginStatus::USER); | |
| 403 SetShouldLockScreenAutomatically(true); | |
| 404 EXPECT_FALSE(GetLockedState()); | |
| 405 | |
| 406 power_manager_client_->SendPowerButtonEvent(true, tick_clock_->NowTicks()); | |
| 407 EXPECT_TRUE(test_api_->ShutdownTimerIsRunning()); | |
| 408 tablet_controller_->OnMaximizeModeStarted(); | |
| 409 EXPECT_FALSE(test_api_->ShutdownTimerIsRunning()); | |
| 410 tick_clock_->Advance(base::TimeDelta::FromMilliseconds(1500)); | |
| 411 power_manager_client_->SendPowerButtonEvent(false, tick_clock_->NowTicks()); | |
| 412 EXPECT_FALSE(GetLockedState()); | |
| 413 EXPECT_FALSE(GetBacklightsForcedOff()); | |
| 414 | |
| 415 power_manager_client_->SendPowerButtonEvent(true, tick_clock_->NowTicks()); | |
| 416 test_api_->TriggerShutdownTimeout(); | |
| 417 EXPECT_TRUE(lock_state_test_api_->shutdown_timer_is_running()); | |
| 418 tablet_controller_->OnMaximizeModeStarted(); | |
| 419 EXPECT_FALSE(lock_state_test_api_->shutdown_timer_is_running()); | |
| 420 tick_clock_->Advance(base::TimeDelta::FromMilliseconds(2500)); | |
| 421 power_manager_client_->SendPowerButtonEvent(false, tick_clock_->NowTicks()); | |
| 422 EXPECT_FALSE(GetLockedState()); | |
| 423 EXPECT_FALSE(GetBacklightsForcedOff()); | |
| 424 | |
| 425 power_manager_client_->SendPowerButtonEvent(true, tick_clock_->NowTicks()); | |
| 426 EXPECT_TRUE(test_api_->ShutdownTimerIsRunning()); | |
| 427 tablet_controller_->OnMaximizeModeEnded(); | |
| 428 EXPECT_FALSE(test_api_->ShutdownTimerIsRunning()); | |
| 429 tick_clock_->Advance(base::TimeDelta::FromMilliseconds(3500)); | |
| 430 power_manager_client_->SendPowerButtonEvent(false, tick_clock_->NowTicks()); | |
| 431 EXPECT_FALSE(GetLockedState()); | |
| 432 EXPECT_FALSE(GetBacklightsForcedOff()); | |
| 433 | |
| 434 power_manager_client_->SendPowerButtonEvent(true, tick_clock_->NowTicks()); | |
| 435 test_api_->TriggerShutdownTimeout(); | |
| 436 EXPECT_TRUE(lock_state_test_api_->shutdown_timer_is_running()); | |
| 437 tablet_controller_->OnMaximizeModeEnded(); | |
| 438 EXPECT_FALSE(lock_state_test_api_->shutdown_timer_is_running()); | |
| 439 tick_clock_->Advance(base::TimeDelta::FromMilliseconds(4500)); | |
| 440 power_manager_client_->SendPowerButtonEvent(false, tick_clock_->NowTicks()); | |
| 441 EXPECT_FALSE(GetLockedState()); | |
| 442 EXPECT_FALSE(GetBacklightsForcedOff()); | |
| 443 } | |
| 444 | |
| 445 // Tests that repeated power button releases are ignored (crbug.com/675291). | |
| 446 TEST_F(TabletPowerButtonControllerTest, IgnoreRepeatedPowerButtonReleases) { | |
| 447 // Advance a long duration from initialized last resume time in | |
| 448 // |tablet_controller_| to avoid cross interference. | |
| 449 tick_clock_->Advance(base::TimeDelta::FromMilliseconds(2000)); | |
| 450 | |
| 451 // Set backlights forced off for starting point. | |
| 452 PressPowerButton(); | |
| 453 ReleasePowerButton(); | |
| 454 power_manager_client_->SendBrightnessChanged(0, false); | |
| 455 EXPECT_TRUE(GetBacklightsForcedOff()); | |
| 456 | |
| 457 // Test that a pressing-releasing operation after a short duration, backlights | |
| 458 // forced off is stopped since we don't drop request for power button pressed. | |
| 459 tick_clock_->Advance(base::TimeDelta::FromMilliseconds(200)); | |
| 460 power_manager_client_->SendPowerButtonEvent(true, tick_clock_->NowTicks()); | |
| 461 power_manager_client_->SendBrightnessChanged(kNonZeroBrightness, false); | |
| 462 power_manager_client_->SendPowerButtonEvent(false, tick_clock_->NowTicks()); | |
| 463 EXPECT_FALSE(GetBacklightsForcedOff()); | |
| 464 | |
| 465 // Test that after another short duration, backlights will not be forced off | |
| 466 // since this immediately following forcing off request needs to be dropped. | |
| 467 tick_clock_->Advance(base::TimeDelta::FromMilliseconds(200)); | |
| 468 power_manager_client_->SendPowerButtonEvent(true, tick_clock_->NowTicks()); | |
| 469 power_manager_client_->SendPowerButtonEvent(false, tick_clock_->NowTicks()); | |
| 470 EXPECT_FALSE(GetBacklightsForcedOff()); | |
| 471 | |
| 472 // Test that after another long duration, backlights should be forced off. | |
| 473 tick_clock_->Advance(base::TimeDelta::FromMilliseconds(800)); | |
| 474 power_manager_client_->SendPowerButtonEvent(true, tick_clock_->NowTicks()); | |
| 475 power_manager_client_->SendPowerButtonEvent(false, tick_clock_->NowTicks()); | |
| 476 power_manager_client_->SendBrightnessChanged(0, false); | |
| 477 EXPECT_TRUE(GetBacklightsForcedOff()); | |
| 478 } | |
| 479 | |
| 480 } // namespace test | |
| 481 } // namespace ash | |
| OLD | NEW |