Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(304)

Side by Side Diff: ash/system/chromeos/power/power_event_observer_unittest.cc

Issue 910393002: Disable rendering when suspending on chrome os (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Make PowerEventObserver getter cros-specific Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ash/system/chromeos/power/power_event_observer.h" 5 #include "ash/system/chromeos/power/power_event_observer.h"
6 6
7 #include "ash/shell.h"
7 #include "ash/test/ash_test_base.h" 8 #include "ash/test/ash_test_base.h"
8 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
9 #include "base/time/time.h" 10 #include "base/time/time.h"
10 #include "chromeos/dbus/dbus_thread_manager.h" 11 #include "chromeos/dbus/dbus_thread_manager.h"
11 #include "chromeos/dbus/power_manager_client.h" 12 #include "chromeos/dbus/power_manager_client.h"
13 #include "ui/aura/window.h"
14 #include "ui/aura/window_tree_host.h"
15 #include "ui/compositor/compositor.h"
12 16
13 namespace ash { 17 namespace ash {
14 18
15 class PowerEventObserverTest : public test::AshTestBase { 19 class PowerEventObserverTest : public test::AshTestBase {
16 public: 20 public:
17 PowerEventObserverTest() {} 21 PowerEventObserverTest() {}
18 ~PowerEventObserverTest() override {} 22 ~PowerEventObserverTest() override {}
19 23
20 // test::AshTestBase::SetUp() overrides: 24 // test::AshTestBase::SetUp() overrides:
21 void SetUp() override { 25 void SetUp() override {
22 test::AshTestBase::SetUp(); 26 test::AshTestBase::SetUp();
23 observer_.reset(new PowerEventObserver()); 27 observer_.reset(new PowerEventObserver());
24 } 28 }
25 29
26 void TearDown() override { 30 void TearDown() override {
27 observer_.reset(); 31 observer_.reset();
28 test::AshTestBase::TearDown(); 32 test::AshTestBase::TearDown();
29 } 33 }
30 34
31 protected: 35 protected:
36 int GetNumVisibleCompositors() {
37 int result = 0;
38 for (const auto& window : Shell::GetAllRootWindows()) {
39 if (window->GetHost()->compositor()->IsVisible())
40 ++result;
41 }
42
43 return result;
44 }
45
32 scoped_ptr<PowerEventObserver> observer_; 46 scoped_ptr<PowerEventObserver> observer_;
33 47
34 private: 48 private:
35 DISALLOW_COPY_AND_ASSIGN(PowerEventObserverTest); 49 DISALLOW_COPY_AND_ASSIGN(PowerEventObserverTest);
36 }; 50 };
37 51
38 TEST_F(PowerEventObserverTest, LockBeforeSuspend) { 52 TEST_F(PowerEventObserverTest, LockBeforeSuspend) {
39 chromeos::PowerManagerClient* client = 53 chromeos::PowerManagerClient* client =
40 chromeos::DBusThreadManager::Get()->GetPowerManagerClient(); 54 chromeos::DBusThreadManager::Get()->GetPowerManagerClient();
41 ASSERT_EQ(0, client->GetNumPendingSuspendReadinessCallbacks()); 55 ASSERT_EQ(0, client->GetNumPendingSuspendReadinessCallbacks());
42 56
43 // Check that the observer requests a suspend-readiness callback when it hears 57 // Check that the observer requests a suspend-readiness callback when it hears
44 // that the system is about to suspend. 58 // that the system is about to suspend.
45 SetCanLockScreen(true); 59 SetCanLockScreen(true);
46 SetShouldLockScreenBeforeSuspending(true); 60 SetShouldLockScreenBeforeSuspending(true);
47 observer_->SuspendImminent(); 61 observer_->SuspendImminent();
48 EXPECT_EQ(1, client->GetNumPendingSuspendReadinessCallbacks()); 62 EXPECT_EQ(1, client->GetNumPendingSuspendReadinessCallbacks());
49 63
50 // It should run the callback when it hears that the screen is locked. 64 // It should run the callback when it hears that the screen is locked and the
65 // lock screen animations have completed.
51 observer_->ScreenIsLocked(); 66 observer_->ScreenIsLocked();
52 RunAllPendingInMessageLoop(); 67 observer_->OnLockAnimationsComplete();
53 EXPECT_EQ(0, client->GetNumPendingSuspendReadinessCallbacks()); 68 EXPECT_EQ(0, client->GetNumPendingSuspendReadinessCallbacks());
54 69
55 // If the system is already locked, no callback should be requested. 70 // If the system is already locked, no callback should be requested.
56 observer_->SuspendDone(base::TimeDelta()); 71 observer_->SuspendDone(base::TimeDelta());
57 observer_->ScreenIsUnlocked(); 72 observer_->ScreenIsUnlocked();
58 observer_->ScreenIsLocked(); 73 observer_->ScreenIsLocked();
74 observer_->OnLockAnimationsComplete();
59 observer_->SuspendImminent(); 75 observer_->SuspendImminent();
60 EXPECT_EQ(0, client->GetNumPendingSuspendReadinessCallbacks()); 76 EXPECT_EQ(0, client->GetNumPendingSuspendReadinessCallbacks());
61 77
62 // It also shouldn't request a callback if it isn't instructed to lock the 78 // It also shouldn't request a callback if it isn't instructed to lock the
63 // screen. 79 // screen.
64 observer_->SuspendDone(base::TimeDelta()); 80 observer_->SuspendDone(base::TimeDelta());
65 SetShouldLockScreenBeforeSuspending(false); 81 SetShouldLockScreenBeforeSuspending(false);
66 observer_->SuspendImminent(); 82 observer_->SuspendImminent();
67 EXPECT_EQ(0, client->GetNumPendingSuspendReadinessCallbacks()); 83 EXPECT_EQ(0, client->GetNumPendingSuspendReadinessCallbacks());
68 } 84 }
69 85
86 TEST_F(PowerEventObserverTest, SetInvisibleBeforeSuspend) {
87 // Tests that all the Compositors are marked invisible before a suspend
88 // request when the screen is not supposed to be locked before a suspend.
89 EXPECT_EQ(1, GetNumVisibleCompositors());
90
91 observer_->SuspendImminent();
92 EXPECT_EQ(0, GetNumVisibleCompositors());
93 observer_->SuspendDone(base::TimeDelta());
94
95 // Tests that all the Compositors are marked invisible _after_ the screen lock
96 // animations have completed.
97 SetCanLockScreen(true);
98 SetShouldLockScreenBeforeSuspending(true);
99
100 observer_->SuspendImminent();
101 EXPECT_EQ(1, GetNumVisibleCompositors());
102
103 observer_->ScreenIsLocked();
104 EXPECT_EQ(1, GetNumVisibleCompositors());
105
106 observer_->OnLockAnimationsComplete();
107 EXPECT_EQ(0, GetNumVisibleCompositors());
108
109 observer_->SuspendDone(base::TimeDelta());
110 EXPECT_EQ(1, GetNumVisibleCompositors());
111 }
112
113 TEST_F(PowerEventObserverTest, CanceledSuspend) {
114 // Tests that the Compositors are not marked invisible if a suspend is
115 // canceled or the system resumes before the lock screen is ready.
116 SetCanLockScreen(true);
117 SetShouldLockScreenBeforeSuspending(true);
118 observer_->SuspendImminent();
119 EXPECT_EQ(1, GetNumVisibleCompositors());
120
121 observer_->SuspendDone(base::TimeDelta());
122 observer_->ScreenIsLocked();
123 observer_->OnLockAnimationsComplete();
124 EXPECT_EQ(1, GetNumVisibleCompositors());
125 }
126
127 TEST_F(PowerEventObserverTest, DelayResuspendForLockAnimations) {
128 // Tests that the following order of events is handled correctly:
129 //
130 // - A suspend request is started.
131 // - The screen is locked.
132 // - The suspend request is canceled.
133 // - Another suspend request is started.
134 // - The screen lock animations complete.
135 //
136 // In this case, the observer should block the second suspend request until
137 // the animations have completed.
138 SetCanLockScreen(true);
139 SetShouldLockScreenBeforeSuspending(true);
140
141 chromeos::PowerManagerClient* client =
142 chromeos::DBusThreadManager::Get()->GetPowerManagerClient();
143 observer_->SuspendImminent();
144 EXPECT_EQ(1, client->GetNumPendingSuspendReadinessCallbacks());
145
146 observer_->ScreenIsLocked();
147 observer_->SuspendDone(base::TimeDelta());
148 observer_->SuspendImminent();
149
150 // The expected number of suspend readiness callbacks is 2 because the
151 // observer has not run the callback that it got from the first suspend
152 // request. The real PowerManagerClient would reset its internal counter in
153 // this situation but the stub client is not that smart.
154 EXPECT_EQ(2, client->GetNumPendingSuspendReadinessCallbacks());
155
156 observer_->OnLockAnimationsComplete();
157 EXPECT_EQ(1, client->GetNumPendingSuspendReadinessCallbacks());
158 EXPECT_EQ(0, GetNumVisibleCompositors());
159 }
160
70 } // namespace ash 161 } // namespace ash
OLDNEW
« no previous file with comments | « ash/system/chromeos/power/power_event_observer.cc ('k') | chrome/browser/chromeos/login/lock/screen_locker_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698