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

Side by Side Diff: content/renderer/media/renderer_webmediaplayer_delegate_browsertest.cc

Issue 1766783003: Expand suspension of idle media players to all platforms. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@notify_pause
Patch Set: Fixup API comments. Created 4 years, 9 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 2016 The Chromium Authors. All rights reserved. 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 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 "base/bind.h" 5 #include "base/bind.h"
6 #include "base/bind_helpers.h" 6 #include "base/bind_helpers.h"
7 #include "base/run_loop.h" 7 #include "base/run_loop.h"
8 #include "base/test/simple_test_tick_clock.h" 8 #include "base/test/simple_test_tick_clock.h"
9 #include "base/tuple.h" 9 #include "base/tuple.h"
10 #include "content/common/media/media_player_delegate_messages.h" 10 #include "content/common/media/media_player_delegate_messages.h"
(...skipping 10 matching lines...) Expand all
21 closure.Run(); 21 closure.Run();
22 } 22 }
23 23
24 class MockWebMediaPlayerDelegateObserver 24 class MockWebMediaPlayerDelegateObserver
25 : public WebMediaPlayerDelegate::Observer { 25 : public WebMediaPlayerDelegate::Observer {
26 public: 26 public:
27 MockWebMediaPlayerDelegateObserver() {} 27 MockWebMediaPlayerDelegateObserver() {}
28 ~MockWebMediaPlayerDelegateObserver() {} 28 ~MockWebMediaPlayerDelegateObserver() {}
29 29
30 // WebMediaPlayerDelegate::Observer implementation. 30 // WebMediaPlayerDelegate::Observer implementation.
31 MOCK_METHOD1(OnHidden, void(bool)); 31 MOCK_METHOD0(OnHidden, void());
32 MOCK_METHOD0(OnShown, void()); 32 MOCK_METHOD0(OnShown, void());
33 MOCK_METHOD1(OnSuspendRequested, void(bool));
33 MOCK_METHOD0(OnPlay, void()); 34 MOCK_METHOD0(OnPlay, void());
34 MOCK_METHOD0(OnPause, void()); 35 MOCK_METHOD0(OnPause, void());
35 MOCK_METHOD1(OnVolumeMultiplierUpdate, void(double)); 36 MOCK_METHOD1(OnVolumeMultiplierUpdate, void(double));
36 }; 37 };
37 38
38 class RendererWebMediaPlayerDelegateTest : public content::RenderViewTest { 39 class RendererWebMediaPlayerDelegateTest : public content::RenderViewTest {
39 public: 40 public:
40 RendererWebMediaPlayerDelegateTest() {} 41 RendererWebMediaPlayerDelegateTest() {}
41 ~RendererWebMediaPlayerDelegateTest() override {} 42 ~RendererWebMediaPlayerDelegateTest() override {}
42 43
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 EXPECT_EQ(delegate_id, base::get<0>(result)); 117 EXPECT_EQ(delegate_id, base::get<0>(result));
117 } 118 }
118 119
119 delegate_manager_->RemoveObserver(delegate_id); 120 delegate_manager_->RemoveObserver(delegate_id);
120 } 121 }
121 122
122 TEST_F(RendererWebMediaPlayerDelegateTest, DeliversObserverNotifications) { 123 TEST_F(RendererWebMediaPlayerDelegateTest, DeliversObserverNotifications) {
123 testing::StrictMock<MockWebMediaPlayerDelegateObserver> observer; 124 testing::StrictMock<MockWebMediaPlayerDelegateObserver> observer;
124 const int delegate_id = delegate_manager_->AddObserver(&observer); 125 const int delegate_id = delegate_manager_->AddObserver(&observer);
125 126
126 EXPECT_CALL(observer, OnHidden(false)); 127 EXPECT_CALL(observer, OnHidden());
127 delegate_manager_->WasHidden(); 128 delegate_manager_->WasHidden();
128 129
129 EXPECT_CALL(observer, OnShown()); 130 EXPECT_CALL(observer, OnShown());
130 delegate_manager_->WasShown(); 131 delegate_manager_->WasShown();
131 132
132 EXPECT_CALL(observer, OnPause()); 133 EXPECT_CALL(observer, OnPause());
133 MediaPlayerDelegateMsg_Pause pause_msg(0, delegate_id); 134 MediaPlayerDelegateMsg_Pause pause_msg(0, delegate_id);
134 delegate_manager_->OnMessageReceived(pause_msg); 135 delegate_manager_->OnMessageReceived(pause_msg);
135 136
136 EXPECT_CALL(observer, OnPlay()); 137 EXPECT_CALL(observer, OnPlay());
137 MediaPlayerDelegateMsg_Play play_msg(0, delegate_id); 138 MediaPlayerDelegateMsg_Play play_msg(0, delegate_id);
138 delegate_manager_->OnMessageReceived(play_msg); 139 delegate_manager_->OnMessageReceived(play_msg);
139 140
140 const double kTestMultiplier = 0.5; 141 const double kTestMultiplier = 0.5;
141 EXPECT_CALL(observer, OnVolumeMultiplierUpdate(kTestMultiplier)); 142 EXPECT_CALL(observer, OnVolumeMultiplierUpdate(kTestMultiplier));
142 MediaPlayerDelegateMsg_UpdateVolumeMultiplier volume_msg(0, delegate_id, 143 MediaPlayerDelegateMsg_UpdateVolumeMultiplier volume_msg(0, delegate_id,
143 kTestMultiplier); 144 kTestMultiplier);
144 delegate_manager_->OnMessageReceived(volume_msg); 145 delegate_manager_->OnMessageReceived(volume_msg);
145 146
146 EXPECT_CALL(observer, OnHidden(true)); 147 EXPECT_CALL(observer, OnSuspendRequested(true));
147 MediaPlayerDelegateMsg_SuspendAllMediaPlayers suspend_msg(0); 148 MediaPlayerDelegateMsg_SuspendAllMediaPlayers suspend_msg(0);
148 delegate_manager_->OnMessageReceived(suspend_msg); 149 delegate_manager_->OnMessageReceived(suspend_msg);
149 150
150 delegate_manager_->RemoveObserver(delegate_id); 151 delegate_manager_->RemoveObserver(delegate_id);
151 } 152 }
152 153
153 TEST_F(RendererWebMediaPlayerDelegateTest, IdleDelegatesAreSuspended) { 154 TEST_F(RendererWebMediaPlayerDelegateTest, IdleDelegatesAreSuspended) {
154 // Start the tick clock off at a non-null value. 155 // Start the tick clock off at a non-null value.
155 base::SimpleTestTickClock tick_clock; 156 base::SimpleTestTickClock tick_clock;
156 tick_clock.Advance(base::TimeDelta::FromSeconds(1234)); 157 tick_clock.Advance(base::TimeDelta::FromSeconds(1234));
157 158
158 const base::TimeDelta kIdleTimeout = base::TimeDelta::FromSeconds(2); 159 const base::TimeDelta kIdleTimeout = base::TimeDelta::FromSeconds(2);
159 delegate_manager_->EnableInstantIdleCleanupForTesting(kIdleTimeout, 160 delegate_manager_->SetIdleCleanupParamsForTesting(kIdleTimeout, &tick_clock);
160 &tick_clock);
161 EXPECT_FALSE(delegate_manager_->IsIdleCleanupTimerRunningForTesting()); 161 EXPECT_FALSE(delegate_manager_->IsIdleCleanupTimerRunningForTesting());
162 162
163 testing::StrictMock<MockWebMediaPlayerDelegateObserver> observer_1; 163 testing::StrictMock<MockWebMediaPlayerDelegateObserver> observer_1;
164 const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1); 164 const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1);
165 EXPECT_TRUE(delegate_manager_->IsIdleCleanupTimerRunningForTesting()); 165 EXPECT_TRUE(delegate_manager_->IsIdleCleanupTimerRunningForTesting());
166 delegate_manager_->DidPlay(delegate_id_1, true, true, false, 166 delegate_manager_->DidPlay(delegate_id_1, true, true, false,
167 base::TimeDelta()); 167 base::TimeDelta());
168 EXPECT_FALSE(delegate_manager_->IsIdleCleanupTimerRunningForTesting()); 168 EXPECT_FALSE(delegate_manager_->IsIdleCleanupTimerRunningForTesting());
169 169
170 // Never playing should count as idle. 170 // Never playing should count as idle.
171 testing::StrictMock<MockWebMediaPlayerDelegateObserver> observer_2; 171 testing::StrictMock<MockWebMediaPlayerDelegateObserver> observer_2;
172 const int delegate_id_2 = delegate_manager_->AddObserver(&observer_2); 172 const int delegate_id_2 = delegate_manager_->AddObserver(&observer_2);
173 EXPECT_TRUE(delegate_manager_->IsIdleCleanupTimerRunningForTesting()); 173 EXPECT_TRUE(delegate_manager_->IsIdleCleanupTimerRunningForTesting());
174 174
175 // Adding the observer should instantly queue the timeout task, once run the 175 // Adding the observer should instantly queue the timeout task, once run the
176 // second delegate should be expired while the first is kept alive. 176 // second delegate should be expired while the first is kept alive.
177 { 177 {
178 EXPECT_CALL(observer_2, OnHidden(true)) 178 EXPECT_CALL(observer_2, OnSuspendRequested(false))
179 .WillOnce(RunClosure(base::Bind( 179 .WillOnce(RunClosure(base::Bind(
180 &RendererWebMediaPlayerDelegate::PlayerGone, 180 &RendererWebMediaPlayerDelegate::PlayerGone,
181 base::Unretained(delegate_manager_.get()), delegate_id_2))); 181 base::Unretained(delegate_manager_.get()), delegate_id_2)));
182 base::RunLoop run_loop; 182 base::RunLoop run_loop;
183 base::MessageLoop::current()->PostTask(FROM_HERE, run_loop.QuitClosure()); 183 base::MessageLoop::current()->PostTask(FROM_HERE, run_loop.QuitClosure());
184 tick_clock.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1)); 184 tick_clock.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1));
185 run_loop.Run(); 185 run_loop.Run();
186 } 186 }
187 187
188 // Pausing should not count as idle if playback didn't reach end of stream. 188 // Pausing should count as idle if playback didn't reach end of stream, but
189 // in this case the player will not remove the MediaSession.
189 delegate_manager_->DidPause(delegate_id_1, false /* reached_end_of_stream */); 190 delegate_manager_->DidPause(delegate_id_1, false /* reached_end_of_stream */);
190 testing::StrictMock<MockWebMediaPlayerDelegateObserver> observer_3; 191 testing::StrictMock<MockWebMediaPlayerDelegateObserver> observer_3;
191 const int delegate_id_3 = delegate_manager_->AddObserver(&observer_3); 192 const int delegate_id_3 = delegate_manager_->AddObserver(&observer_3);
192 delegate_manager_->DidPlay(delegate_id_3, true, true, false, 193 delegate_manager_->DidPlay(delegate_id_3, true, true, false,
193 base::TimeDelta()); 194 base::TimeDelta());
194 195
195 // Adding the observer should instantly queue the timeout task, once run no 196 // Adding the observer should instantly queue the timeout task, once run no
196 // delegates should have been expired. 197 // delegates should have been expired.
197 { 198 {
199 EXPECT_CALL(observer_1, OnSuspendRequested(false))
200 .Times(testing::AtLeast(1));
198 base::RunLoop run_loop; 201 base::RunLoop run_loop;
199 base::MessageLoop::current()->PostTask(FROM_HERE, run_loop.QuitClosure()); 202 base::MessageLoop::current()->PostTask(FROM_HERE, run_loop.QuitClosure());
200 tick_clock.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1)); 203 tick_clock.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1));
201 run_loop.Run(); 204 run_loop.Run();
202 } 205 }
203 206
204 delegate_manager_->DidPlay(delegate_id_1, true, true, false, 207 delegate_manager_->DidPlay(delegate_id_1, true, true, false,
205 base::TimeDelta()); 208 base::TimeDelta());
206 209
207 // Pausing after reaching end of stream should count as idle. 210 // Pausing after reaching end of stream should count as idle.
208 delegate_manager_->DidPause(delegate_id_1, true /* reached_end_of_stream */); 211 delegate_manager_->DidPause(delegate_id_1, true /* reached_end_of_stream */);
209 212
210 // Once the timeout task runs the first delegate should be expired while the 213 // Once the timeout task runs the first delegate should be expired while the
211 // third is kept alive. 214 // third is kept alive.
212 { 215 {
213 EXPECT_CALL(observer_1, OnHidden(true)) 216 EXPECT_CALL(observer_1, OnSuspendRequested(false))
214 .WillOnce(RunClosure(base::Bind( 217 .WillOnce(RunClosure(base::Bind(
215 &RendererWebMediaPlayerDelegate::PlayerGone, 218 &RendererWebMediaPlayerDelegate::PlayerGone,
216 base::Unretained(delegate_manager_.get()), delegate_id_1))); 219 base::Unretained(delegate_manager_.get()), delegate_id_1)));
217 base::RunLoop run_loop; 220 base::RunLoop run_loop;
218 base::MessageLoop::current()->PostTask(FROM_HERE, run_loop.QuitClosure()); 221 base::MessageLoop::current()->PostTask(FROM_HERE, run_loop.QuitClosure());
219 tick_clock.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1)); 222 tick_clock.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1));
220 run_loop.Run(); 223 run_loop.Run();
221 } 224 }
222 225
223 delegate_manager_->RemoveObserver(delegate_id_1); 226 delegate_manager_->RemoveObserver(delegate_id_1);
224 delegate_manager_->RemoveObserver(delegate_id_2); 227 delegate_manager_->RemoveObserver(delegate_id_2);
225 delegate_manager_->RemoveObserver(delegate_id_3); 228 delegate_manager_->RemoveObserver(delegate_id_3);
226 EXPECT_FALSE(delegate_manager_->IsIdleCleanupTimerRunningForTesting()); 229 EXPECT_FALSE(delegate_manager_->IsIdleCleanupTimerRunningForTesting());
227 } 230 }
228 231
232 TEST_F(RendererWebMediaPlayerDelegateTest, IdleDelegatesIgnoresSuspendRequest) {
233 // Start the tick clock off at a non-null value.
234 base::SimpleTestTickClock tick_clock;
235 tick_clock.Advance(base::TimeDelta::FromSeconds(1234));
236
237 const base::TimeDelta kIdleTimeout = base::TimeDelta::FromSeconds(2);
238 delegate_manager_->SetIdleCleanupParamsForTesting(kIdleTimeout, &tick_clock);
239 EXPECT_FALSE(delegate_manager_->IsIdleCleanupTimerRunningForTesting());
240
241 testing::StrictMock<MockWebMediaPlayerDelegateObserver> observer_1;
242 const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1);
243 EXPECT_TRUE(delegate_manager_->IsIdleCleanupTimerRunningForTesting());
244
245 // Adding the observer should instantly queue the timeout task, once run the
246 // second delegate should be expired while the first is kept alive.
247 EXPECT_CALL(observer_1, OnSuspendRequested(false));
248 base::RunLoop run_loop;
249 base::MessageLoop::current()->PostTask(FROM_HERE, run_loop.QuitClosure());
250 tick_clock.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1));
251 run_loop.Run();
252
253 // Even though the player did not call PlayerGone() it should be removed from
254 // future idle cleanup polls.
255 EXPECT_FALSE(delegate_manager_->IsIdleCleanupTimerRunningForTesting());
256 delegate_manager_->RemoveObserver(delegate_id_1);
257 }
258
229 } // namespace media 259 } // namespace media
OLDNEW
« no previous file with comments | « content/renderer/media/renderer_webmediaplayer_delegate.cc ('k') | content/renderer/media/webmediaplayer_ms.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698