OLD | NEW |
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 <tuple> | 5 #include <tuple> |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/location.h" | 9 #include "base/location.h" |
10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
(...skipping 12 matching lines...) Expand all Loading... |
23 using testing::NiceMock; | 23 using testing::NiceMock; |
24 using testing::Return; | 24 using testing::Return; |
25 using testing::StrictMock; | 25 using testing::StrictMock; |
26 | 26 |
27 namespace media { | 27 namespace media { |
28 | 28 |
29 namespace { | 29 namespace { |
30 constexpr base::TimeDelta kIdleTimeout = base::TimeDelta::FromSeconds(1); | 30 constexpr base::TimeDelta kIdleTimeout = base::TimeDelta::FromSeconds(1); |
31 } | 31 } |
32 | 32 |
33 ACTION_P(RunClosure, closure) { | |
34 closure.Run(); | |
35 return true; | |
36 } | |
37 | |
38 class MockWebMediaPlayerDelegateObserver | 33 class MockWebMediaPlayerDelegateObserver |
39 : public WebMediaPlayerDelegate::Observer { | 34 : public WebMediaPlayerDelegate::Observer { |
40 public: | 35 public: |
41 MockWebMediaPlayerDelegateObserver() {} | 36 MockWebMediaPlayerDelegateObserver() {} |
42 ~MockWebMediaPlayerDelegateObserver() {} | 37 ~MockWebMediaPlayerDelegateObserver() {} |
43 | 38 |
44 // WebMediaPlayerDelegate::Observer implementation. | 39 // WebMediaPlayerDelegate::Observer implementation. |
45 MOCK_METHOD0(OnHidden, void()); | 40 MOCK_METHOD0(OnFrameHidden, void()); |
46 MOCK_METHOD0(OnShown, void()); | 41 MOCK_METHOD0(OnFrameClosed, void()); |
47 MOCK_METHOD1(OnSuspendRequested, bool(bool)); | 42 MOCK_METHOD0(OnFrameShown, void()); |
| 43 MOCK_METHOD0(OnIdleTimeout, bool()); |
48 MOCK_METHOD0(OnPlay, void()); | 44 MOCK_METHOD0(OnPlay, void()); |
49 MOCK_METHOD0(OnPause, void()); | 45 MOCK_METHOD0(OnPause, void()); |
50 MOCK_METHOD1(OnVolumeMultiplierUpdate, void(double)); | 46 MOCK_METHOD1(OnVolumeMultiplierUpdate, void(double)); |
51 }; | 47 }; |
52 | 48 |
53 class RendererWebMediaPlayerDelegateTest : public content::RenderViewTest { | 49 class RendererWebMediaPlayerDelegateTest : public content::RenderViewTest { |
54 public: | 50 public: |
55 RendererWebMediaPlayerDelegateTest() {} | 51 RendererWebMediaPlayerDelegateTest() {} |
56 ~RendererWebMediaPlayerDelegateTest() override {} | 52 ~RendererWebMediaPlayerDelegateTest() override {} |
57 | 53 |
(...skipping 12 matching lines...) Expand all Loading... |
70 RenderViewTest::TearDown(); | 66 RenderViewTest::TearDown(); |
71 } | 67 } |
72 | 68 |
73 protected: | 69 protected: |
74 IPC::TestSink& test_sink() { return render_thread_->sink(); } | 70 IPC::TestSink& test_sink() { return render_thread_->sink(); } |
75 | 71 |
76 bool HasPlayingVideo(int delegate_id) { | 72 bool HasPlayingVideo(int delegate_id) { |
77 return delegate_manager_->playing_videos_.count(delegate_id); | 73 return delegate_manager_->playing_videos_.count(delegate_id); |
78 } | 74 } |
79 | 75 |
80 void SetPlayingBackgroundVideo(bool is_playing) { | |
81 delegate_manager_->is_playing_background_video_ = is_playing; | |
82 } | |
83 | |
84 void CallOnMediaDelegatePlay(int delegate_id) { | |
85 delegate_manager_->OnMediaDelegatePlay(delegate_id); | |
86 } | |
87 | |
88 void CallOnMediaDelegatePause(int delegate_id) { | |
89 delegate_manager_->OnMediaDelegatePause(delegate_id); | |
90 } | |
91 | |
92 void SetIsLowEndDeviceForTesting() { | 76 void SetIsLowEndDeviceForTesting() { |
93 delegate_manager_->SetIdleCleanupParamsForTesting(kIdleTimeout, | 77 delegate_manager_->SetIdleCleanupParamsForTesting(kIdleTimeout, |
94 &tick_clock_, true); | 78 &tick_clock_, true); |
95 } | 79 } |
96 | 80 |
| 81 void RunLoopOnce() { |
| 82 base::RunLoop run_loop; |
| 83 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 84 run_loop.QuitClosure()); |
| 85 run_loop.Run(); |
| 86 } |
| 87 |
97 std::unique_ptr<RendererWebMediaPlayerDelegate> delegate_manager_; | 88 std::unique_ptr<RendererWebMediaPlayerDelegate> delegate_manager_; |
98 StrictMock<MockWebMediaPlayerDelegateObserver> observer_1_, observer_2_, | 89 StrictMock<MockWebMediaPlayerDelegateObserver> observer_1_, observer_2_, |
99 observer_3_; | 90 observer_3_; |
100 base::SimpleTestTickClock tick_clock_; | 91 base::SimpleTestTickClock tick_clock_; |
101 | 92 |
102 private: | 93 private: |
103 DISALLOW_COPY_AND_ASSIGN(RendererWebMediaPlayerDelegateTest); | 94 DISALLOW_COPY_AND_ASSIGN(RendererWebMediaPlayerDelegateTest); |
104 }; | 95 }; |
105 | 96 |
106 TEST_F(RendererWebMediaPlayerDelegateTest, SendsMessagesCorrectly) { | 97 TEST_F(RendererWebMediaPlayerDelegateTest, SendsMessagesCorrectly) { |
107 StrictMock<MockWebMediaPlayerDelegateObserver> observer; | 98 StrictMock<MockWebMediaPlayerDelegateObserver> observer; |
108 const int delegate_id = delegate_manager_->AddObserver(&observer); | 99 const int delegate_id = delegate_manager_->AddObserver(&observer); |
109 | 100 |
110 // Verify the playing message. | 101 // Verify the playing message. |
111 { | 102 { |
112 const bool kHasVideo = true, kHasAudio = false, kIsRemote = false; | 103 const bool kHasAudio = false, kHasVideo = true, kIsRemote = false; |
113 const media::MediaContentType kMediaContentType = | 104 const media::MediaContentType kMediaContentType = |
114 media::MediaContentType::Transient; | 105 media::MediaContentType::Transient; |
115 delegate_manager_->DidPlay(delegate_id, kHasVideo, kHasAudio, kIsRemote, | 106 delegate_manager_->DidPlay(delegate_id, kHasAudio, kHasVideo, |
116 kMediaContentType); | 107 kMediaContentType); |
117 | 108 |
118 const IPC::Message* msg = test_sink().GetUniqueMessageMatching( | 109 const IPC::Message* msg = test_sink().GetUniqueMessageMatching( |
119 MediaPlayerDelegateHostMsg_OnMediaPlaying::ID); | 110 MediaPlayerDelegateHostMsg_OnMediaPlaying::ID); |
120 ASSERT_TRUE(msg); | 111 ASSERT_TRUE(msg); |
121 | 112 |
122 std::tuple<int, bool, bool, bool, media::MediaContentType> result; | 113 std::tuple<int, bool, bool, bool, media::MediaContentType> result; |
123 ASSERT_TRUE(MediaPlayerDelegateHostMsg_OnMediaPlaying::Read(msg, &result)); | 114 ASSERT_TRUE(MediaPlayerDelegateHostMsg_OnMediaPlaying::Read(msg, &result)); |
124 EXPECT_EQ(delegate_id, std::get<0>(result)); | 115 EXPECT_EQ(delegate_id, std::get<0>(result)); |
125 EXPECT_EQ(kHasVideo, std::get<1>(result)); | 116 EXPECT_EQ(kHasVideo, std::get<1>(result)); |
126 EXPECT_EQ(kHasAudio, std::get<2>(result)); | 117 EXPECT_EQ(kHasAudio, std::get<2>(result)); |
127 EXPECT_EQ(kIsRemote, std::get<3>(result)); | 118 EXPECT_EQ(kIsRemote, std::get<3>(result)); |
128 EXPECT_EQ(kMediaContentType, std::get<4>(result)); | 119 EXPECT_EQ(kMediaContentType, std::get<4>(result)); |
129 } | 120 } |
130 | 121 |
131 // Verify the paused message. | 122 // Verify the paused message. |
132 { | 123 { |
133 test_sink().ClearMessages(); | 124 test_sink().ClearMessages(); |
134 const bool kReachedEndOfStream = true; | 125 const bool kReachedEndOfStream = false; |
135 delegate_manager_->DidPause(delegate_id, kReachedEndOfStream); | 126 delegate_manager_->DidPause(delegate_id); |
136 | 127 |
137 const IPC::Message* msg = test_sink().GetUniqueMessageMatching( | 128 const IPC::Message* msg = test_sink().GetUniqueMessageMatching( |
138 MediaPlayerDelegateHostMsg_OnMediaPaused::ID); | 129 MediaPlayerDelegateHostMsg_OnMediaPaused::ID); |
139 ASSERT_TRUE(msg); | 130 ASSERT_TRUE(msg); |
140 | 131 |
141 std::tuple<int, bool> result; | 132 std::tuple<int, bool> result; |
142 ASSERT_TRUE(MediaPlayerDelegateHostMsg_OnMediaPaused::Read(msg, &result)); | 133 ASSERT_TRUE(MediaPlayerDelegateHostMsg_OnMediaPaused::Read(msg, &result)); |
143 EXPECT_EQ(delegate_id, std::get<0>(result)); | 134 EXPECT_EQ(delegate_id, std::get<0>(result)); |
144 EXPECT_EQ(kReachedEndOfStream, std::get<1>(result)); | 135 EXPECT_EQ(kReachedEndOfStream, std::get<1>(result)); |
145 } | 136 } |
146 | 137 |
147 // Verify the destruction message. | 138 // Verify the destruction message. |
148 { | 139 { |
149 test_sink().ClearMessages(); | 140 test_sink().ClearMessages(); |
150 delegate_manager_->PlayerGone(delegate_id); | 141 delegate_manager_->PlayerGone(delegate_id); |
151 const IPC::Message* msg = test_sink().GetUniqueMessageMatching( | 142 const IPC::Message* msg = test_sink().GetUniqueMessageMatching( |
152 MediaPlayerDelegateHostMsg_OnMediaDestroyed::ID); | 143 MediaPlayerDelegateHostMsg_OnMediaDestroyed::ID); |
153 ASSERT_TRUE(msg); | 144 ASSERT_TRUE(msg); |
154 | 145 |
155 std::tuple<int> result; | 146 std::tuple<int> result; |
156 ASSERT_TRUE( | 147 ASSERT_TRUE( |
157 MediaPlayerDelegateHostMsg_OnMediaDestroyed::Read(msg, &result)); | 148 MediaPlayerDelegateHostMsg_OnMediaDestroyed::Read(msg, &result)); |
158 EXPECT_EQ(delegate_id, std::get<0>(result)); | 149 EXPECT_EQ(delegate_id, std::get<0>(result)); |
159 } | 150 } |
160 } | 151 } |
161 | 152 |
162 TEST_F(RendererWebMediaPlayerDelegateTest, DeliversObserverNotifications) { | 153 TEST_F(RendererWebMediaPlayerDelegateTest, DeliversObserverNotifications) { |
163 const int delegate_id = delegate_manager_->AddObserver(&observer_1_); | 154 const int delegate_id = delegate_manager_->AddObserver(&observer_1_); |
164 | 155 |
165 EXPECT_CALL(observer_1_, OnHidden()); | 156 EXPECT_CALL(observer_1_, OnFrameHidden()); |
166 delegate_manager_->WasHidden(); | 157 delegate_manager_->WasHidden(); |
167 | 158 |
168 EXPECT_CALL(observer_1_, OnShown()); | 159 EXPECT_CALL(observer_1_, OnFrameShown()); |
169 delegate_manager_->WasShown(); | 160 delegate_manager_->WasShown(); |
170 | 161 |
171 EXPECT_CALL(observer_1_, OnPause()); | 162 EXPECT_CALL(observer_1_, OnPause()); |
172 MediaPlayerDelegateMsg_Pause pause_msg(0, delegate_id); | 163 MediaPlayerDelegateMsg_Pause pause_msg(0, delegate_id); |
173 delegate_manager_->OnMessageReceived(pause_msg); | 164 delegate_manager_->OnMessageReceived(pause_msg); |
174 | 165 |
175 EXPECT_CALL(observer_1_, OnPlay()); | 166 EXPECT_CALL(observer_1_, OnPlay()); |
176 MediaPlayerDelegateMsg_Play play_msg(0, delegate_id); | 167 MediaPlayerDelegateMsg_Play play_msg(0, delegate_id); |
177 delegate_manager_->OnMessageReceived(play_msg); | 168 delegate_manager_->OnMessageReceived(play_msg); |
178 | 169 |
179 const double kTestMultiplier = 0.5; | 170 const double kTestMultiplier = 0.5; |
180 EXPECT_CALL(observer_1_, OnVolumeMultiplierUpdate(kTestMultiplier)); | 171 EXPECT_CALL(observer_1_, OnVolumeMultiplierUpdate(kTestMultiplier)); |
181 MediaPlayerDelegateMsg_UpdateVolumeMultiplier volume_msg(0, delegate_id, | 172 MediaPlayerDelegateMsg_UpdateVolumeMultiplier volume_msg(0, delegate_id, |
182 kTestMultiplier); | 173 kTestMultiplier); |
183 delegate_manager_->OnMessageReceived(volume_msg); | 174 delegate_manager_->OnMessageReceived(volume_msg); |
184 | 175 |
185 EXPECT_CALL(observer_1_, OnSuspendRequested(true)); | 176 EXPECT_CALL(observer_1_, OnFrameClosed()); |
186 MediaPlayerDelegateMsg_SuspendAllMediaPlayers suspend_msg(0); | 177 MediaPlayerDelegateMsg_SuspendAllMediaPlayers suspend_msg(0); |
187 delegate_manager_->OnMessageReceived(suspend_msg); | 178 delegate_manager_->OnMessageReceived(suspend_msg); |
188 } | 179 } |
189 | 180 |
190 TEST_F(RendererWebMediaPlayerDelegateTest, TheTimerIsInitiallyStopped) { | 181 TEST_F(RendererWebMediaPlayerDelegateTest, TheTimerIsInitiallyStopped) { |
191 ASSERT_FALSE(delegate_manager_->IsIdleCleanupTimerRunningForTesting()); | 182 ASSERT_FALSE(delegate_manager_->IsIdleCleanupTimerRunningForTesting()); |
192 } | 183 } |
193 | 184 |
194 TEST_F(RendererWebMediaPlayerDelegateTest, AddingAnObserverStartsTheTimer) { | 185 TEST_F(RendererWebMediaPlayerDelegateTest, AddingAnIdleObserverStartsTheTimer) { |
195 delegate_manager_->AddObserver(&observer_1_); | 186 const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_); |
| 187 delegate_manager_->SetIdle(delegate_id_1, true); |
| 188 RunLoopOnce(); |
196 ASSERT_TRUE(delegate_manager_->IsIdleCleanupTimerRunningForTesting()); | 189 ASSERT_TRUE(delegate_manager_->IsIdleCleanupTimerRunningForTesting()); |
197 } | 190 } |
198 | 191 |
199 TEST_F(RendererWebMediaPlayerDelegateTest, RemovingAllObserversStopsTheTimer) { | 192 TEST_F(RendererWebMediaPlayerDelegateTest, RemovingAllObserversStopsTheTimer) { |
200 delegate_manager_->RemoveObserver( | 193 const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_); |
201 delegate_manager_->AddObserver(&observer_1_)); | 194 delegate_manager_->SetIdle(delegate_id_1, true); |
| 195 RunLoopOnce(); |
| 196 delegate_manager_->RemoveObserver(delegate_id_1); |
| 197 RunLoopOnce(); |
202 ASSERT_FALSE(delegate_manager_->IsIdleCleanupTimerRunningForTesting()); | 198 ASSERT_FALSE(delegate_manager_->IsIdleCleanupTimerRunningForTesting()); |
203 } | 199 } |
204 | 200 |
205 TEST_F(RendererWebMediaPlayerDelegateTest, PlayingDelegatesAreNotIdle) { | |
206 const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_); | |
207 delegate_manager_->DidPlay(delegate_id_1, true, true, false, | |
208 media::MediaContentType::Persistent); | |
209 ASSERT_FALSE(delegate_manager_->IsIdleCleanupTimerRunningForTesting()); | |
210 } | |
211 | |
212 TEST_F(RendererWebMediaPlayerDelegateTest, PlaySuspendsLowEndIdleDelegates) { | 201 TEST_F(RendererWebMediaPlayerDelegateTest, PlaySuspendsLowEndIdleDelegates) { |
213 SetIsLowEndDeviceForTesting(); | 202 SetIsLowEndDeviceForTesting(); |
214 | 203 |
215 const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_); | 204 const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_); |
216 delegate_manager_->AddObserver(&observer_2_); | 205 delegate_manager_->SetIdle(delegate_id_1, true); |
| 206 const int delegate_id_2 = delegate_manager_->AddObserver(&observer_2_); |
| 207 delegate_manager_->SetIdle(delegate_id_2, true); |
| 208 RunLoopOnce(); |
217 | 209 |
218 // Calling play on the first player should suspend the other idle player. | 210 // Calling play on the first player should suspend the other idle player. |
219 EXPECT_CALL(observer_2_, OnSuspendRequested(false)); | 211 EXPECT_CALL(observer_2_, OnIdleTimeout()).WillOnce(Return(true)); |
| 212 delegate_manager_->DidPlay(delegate_id_1, true, true, |
| 213 media::MediaContentType::Persistent); |
| 214 delegate_manager_->SetIdle(delegate_id_1, false); |
220 tick_clock_.Advance(base::TimeDelta::FromMicroseconds(1)); | 215 tick_clock_.Advance(base::TimeDelta::FromMicroseconds(1)); |
221 delegate_manager_->DidPlay(delegate_id_1, true, true, false, | 216 RunLoopOnce(); |
222 media::MediaContentType::Persistent); | |
223 } | 217 } |
224 | 218 |
225 TEST_F(RendererWebMediaPlayerDelegateTest, MaxLowEndIdleDelegates) { | 219 TEST_F(RendererWebMediaPlayerDelegateTest, MaxLowEndIdleDelegates) { |
226 SetIsLowEndDeviceForTesting(); | 220 SetIsLowEndDeviceForTesting(); |
227 | 221 |
228 delegate_manager_->AddObserver(&observer_1_); | 222 int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_); |
229 delegate_manager_->AddObserver(&observer_2_); | 223 delegate_manager_->SetIdle(delegate_id_1, true); |
| 224 int delegate_id_2 = delegate_manager_->AddObserver(&observer_2_); |
| 225 delegate_manager_->SetIdle(delegate_id_2, true); |
| 226 RunLoopOnce(); |
230 | 227 |
231 // Just adding a third idle observer should suspend the others. | 228 // Just adding a third idle observer should suspend all idle players. |
232 EXPECT_CALL(observer_1_, OnSuspendRequested(false)); | 229 EXPECT_CALL(observer_1_, OnIdleTimeout()).WillOnce(Return(true)); |
233 EXPECT_CALL(observer_2_, OnSuspendRequested(false)); | 230 EXPECT_CALL(observer_2_, OnIdleTimeout()).WillOnce(Return(true)); |
| 231 int delegate_id_3 = delegate_manager_->AddObserver(&observer_3_); |
| 232 delegate_manager_->SetIdle(delegate_id_3, true); |
| 233 EXPECT_CALL(observer_3_, OnIdleTimeout()).WillOnce(Return(true)); |
234 tick_clock_.Advance(base::TimeDelta::FromMicroseconds(1)); | 234 tick_clock_.Advance(base::TimeDelta::FromMicroseconds(1)); |
235 delegate_manager_->AddObserver(&observer_3_); | 235 RunLoopOnce(); |
236 } | |
237 | |
238 // Make sure it's safe to call DidPause(), which modifies the idle delegate | |
239 // list, from OnSuspendRequested(), which iterates over the idle delegate list. | |
240 TEST_F(RendererWebMediaPlayerDelegateTest, ReentrantDelegateCallsAreSafe) { | |
241 const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_); | |
242 EXPECT_CALL(observer_1_, OnSuspendRequested(false)) | |
243 .WillOnce(RunClosure(base::Bind(&RendererWebMediaPlayerDelegate::DidPause, | |
244 base::Unretained(delegate_manager_.get()), | |
245 delegate_id_1, false))); | |
246 // Run an idle cleanup. | |
247 tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1)); | |
248 base::RunLoop().RunUntilIdle(); | |
249 } | 236 } |
250 | 237 |
251 TEST_F(RendererWebMediaPlayerDelegateTest, | 238 TEST_F(RendererWebMediaPlayerDelegateTest, |
252 SuspendRequestsAreOnlySentOnceIfHandled) { | 239 SuspendRequestsAreOnlySentOnceIfHandled) { |
253 delegate_manager_->AddObserver(&observer_1_); | 240 int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_); |
254 // Return true from OnSuspendRequested() to indicate that it was handled. So | 241 delegate_manager_->SetIdle(delegate_id_1, true); |
255 // even though the player did not call PlayerGone() it should be removed from | 242 // Return true from OnIdleTimeout() to indicate that it was handled. |
256 // future idle cleanup polls. | 243 EXPECT_CALL(observer_1_, OnIdleTimeout()).WillOnce(Return(true)); |
257 EXPECT_CALL(observer_1_, OnSuspendRequested(false)).WillOnce(Return(true)); | |
258 tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1)); | 244 tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1)); |
259 base::RunLoop().RunUntilIdle(); | 245 base::RunLoop().RunUntilIdle(); |
260 } | 246 } |
261 | 247 |
262 TEST_F(RendererWebMediaPlayerDelegateTest, | 248 TEST_F(RendererWebMediaPlayerDelegateTest, |
263 SuspendRequestsAreSentAgainIfNotHandled) { | 249 SuspendRequestsAreSentAgainIfNotHandled) { |
264 delegate_manager_->AddObserver(&observer_1_); | 250 int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_); |
265 // Return false from OnSuspendRequested() to indicate that it was not handled. | 251 delegate_manager_->SetIdle(delegate_id_1, true); |
266 // The observer should get another OnSuspendRequested. | 252 // Return false from OnIdleTimeout() to indicate that it was not handled. |
267 EXPECT_CALL(observer_1_, OnSuspendRequested(false)) | 253 // The observer should get another OnIdleTimeout() call. |
| 254 EXPECT_CALL(observer_1_, OnIdleTimeout()) |
268 .WillOnce(Return(false)) | 255 .WillOnce(Return(false)) |
269 .WillOnce(Return(true)); | 256 .WillOnce(Return(true)); |
270 tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1)); | 257 tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1)); |
271 base::RunLoop().RunUntilIdle(); | 258 base::RunLoop().RunUntilIdle(); |
272 } | 259 } |
273 | 260 |
274 TEST_F(RendererWebMediaPlayerDelegateTest, IdleDelegatesAreSuspended) { | 261 TEST_F(RendererWebMediaPlayerDelegateTest, IdleDelegatesAreSuspended) { |
275 // Add one non-idle observer and one idle observer. | 262 // Add one non-idle observer and one idle observer. |
276 const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_); | 263 const int delegate_id_1 = delegate_manager_->AddObserver(&observer_1_); |
277 delegate_manager_->DidPlay(delegate_id_1, true, true, false, | 264 const int delegate_id_2 = delegate_manager_->AddObserver(&observer_2_); |
278 media::MediaContentType::Persistent); | 265 delegate_manager_->SetIdle(delegate_id_2, true); |
279 delegate_manager_->AddObserver(&observer_2_); | |
280 | 266 |
281 // The idle cleanup task should suspend the second delegate while the first is | 267 // The idle cleanup task should suspend the second delegate while the first is |
282 // kept alive. | 268 // kept alive. |
283 { | 269 { |
284 EXPECT_CALL(observer_2_, OnSuspendRequested(false)).WillOnce(Return(true)); | 270 EXPECT_CALL(observer_2_, OnIdleTimeout()).WillOnce(Return(true)); |
285 tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1)); | 271 tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1)); |
286 base::RunLoop().RunUntilIdle(); | 272 RunLoopOnce(); |
287 } | 273 } |
288 | 274 |
289 // Pausing should count as idle if playback didn't reach end of stream, but | 275 // Once the player is idle, it should be suspended after |kIdleTimeout|. |
290 // in this case the player will not remove the MediaSession. | 276 delegate_manager_->SetIdle(delegate_id_1, true); |
291 delegate_manager_->DidPause(delegate_id_1, false /* reached_end_of_stream */); | |
292 const int delegate_id_3 = delegate_manager_->AddObserver(&observer_3_); | |
293 delegate_manager_->DidPlay(delegate_id_3, true, true, false, | |
294 media::MediaContentType::Persistent); | |
295 | |
296 // Adding the observer should instantly queue the timeout task. Once run only | |
297 // the first player should be suspended. | |
298 { | 277 { |
299 EXPECT_CALL(observer_1_, OnSuspendRequested(false)).WillOnce(Return(true)); | 278 EXPECT_CALL(observer_1_, OnIdleTimeout()).WillOnce(Return(true)); |
300 base::RunLoop run_loop; | |
301 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, | |
302 run_loop.QuitClosure()); | |
303 tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1)); | 279 tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1)); |
304 run_loop.Run(); | 280 RunLoopOnce(); |
305 } | |
306 | |
307 delegate_manager_->DidPlay(delegate_id_1, true, true, false, | |
308 media::MediaContentType::Persistent); | |
309 | |
310 // Pausing after reaching end of stream should count as idle. | |
311 delegate_manager_->DidPause(delegate_id_1, true /* reached_end_of_stream */); | |
312 | |
313 // Once the timeout task runs the first delegate should be suspended while the | |
314 // third is kept alive. | |
315 { | |
316 EXPECT_CALL(observer_1_, OnSuspendRequested(false)).WillOnce(Return(true)); | |
317 base::RunLoop run_loop; | |
318 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, | |
319 run_loop.QuitClosure()); | |
320 tick_clock_.Advance(kIdleTimeout + base::TimeDelta::FromMicroseconds(1)); | |
321 run_loop.Run(); | |
322 } | 281 } |
323 } | 282 } |
324 | 283 |
325 TEST_F(RendererWebMediaPlayerDelegateTest, PlayingVideosSet) { | 284 TEST_F(RendererWebMediaPlayerDelegateTest, PlayingVideosSet) { |
326 int delegate_id = delegate_manager_->AddObserver(&observer_1_); | 285 int delegate_id = delegate_manager_->AddObserver(&observer_1_); |
327 EXPECT_FALSE(HasPlayingVideo(delegate_id)); | 286 EXPECT_FALSE(HasPlayingVideo(delegate_id)); |
328 | 287 |
329 // Playing a local video adds it to the set. | 288 // Playing a local video adds it to the set. |
330 delegate_manager_->DidPlay(delegate_id, true, true, false, | 289 delegate_manager_->DidPlay(delegate_id, true, true, |
331 MediaContentType::Persistent); | 290 MediaContentType::Persistent); |
332 EXPECT_TRUE(HasPlayingVideo(delegate_id)); | 291 EXPECT_TRUE(HasPlayingVideo(delegate_id)); |
333 | 292 |
334 // Pause doesn't remove the video from the set. | 293 // Pause doesn't remove the video from the set. |
335 delegate_manager_->DidPause(delegate_id, false); | 294 delegate_manager_->DidPause(delegate_id); |
336 EXPECT_TRUE(HasPlayingVideo(delegate_id)); | 295 EXPECT_TRUE(HasPlayingVideo(delegate_id)); |
337 | 296 |
338 // Reaching the end removes the video from the set. | 297 // Reaching the end removes the video from the set. |
339 delegate_manager_->DidPause(delegate_id, true); | |
340 EXPECT_FALSE(HasPlayingVideo(delegate_id)); | |
341 | |
342 // Removing the player removes the video from the set. | |
343 delegate_manager_->DidPlay(delegate_id, true, true, false, | |
344 MediaContentType::Persistent); | |
345 delegate_manager_->PlayerGone(delegate_id); | 298 delegate_manager_->PlayerGone(delegate_id); |
346 EXPECT_FALSE(HasPlayingVideo(delegate_id)); | 299 EXPECT_FALSE(HasPlayingVideo(delegate_id)); |
347 | 300 |
348 // Playing a remote video removes it from the set. | |
349 delegate_manager_->DidPlay(delegate_id, true, true, false, | |
350 MediaContentType::Persistent); | |
351 delegate_manager_->DidPlay(delegate_id, true, true, true, | |
352 MediaContentType::Persistent); | |
353 EXPECT_FALSE(HasPlayingVideo(delegate_id)); | |
354 | |
355 // Playing a local video without audio adds it to the set (because of WMPA). | 301 // Playing a local video without audio adds it to the set (because of WMPA). |
356 delegate_manager_->DidPlay(delegate_id, true, false, false, | 302 delegate_manager_->DidPlay(delegate_id, false, true, |
357 MediaContentType::Persistent); | 303 MediaContentType::Persistent); |
358 EXPECT_TRUE(HasPlayingVideo(delegate_id)); | 304 EXPECT_TRUE(HasPlayingVideo(delegate_id)); |
359 | 305 |
360 // Playing a local audio removes it from the set. | 306 // Playing a local audio removes it from the set. |
361 delegate_manager_->DidPlay(delegate_id, false, true, false, | 307 delegate_manager_->DidPlay(delegate_id, true, false, |
362 MediaContentType::Persistent); | 308 MediaContentType::Persistent); |
363 EXPECT_FALSE(HasPlayingVideo(delegate_id)); | 309 EXPECT_FALSE(HasPlayingVideo(delegate_id)); |
364 | 310 |
365 // Removing the observer also removes the video from the set. | 311 // Removing the observer also removes the video from the set. |
366 delegate_manager_->DidPlay(delegate_id, true, true, false, | 312 delegate_manager_->DidPlay(delegate_id, true, true, |
367 MediaContentType::Persistent); | 313 MediaContentType::Persistent); |
368 delegate_manager_->RemoveObserver(delegate_id); | 314 delegate_manager_->RemoveObserver(delegate_id); |
369 EXPECT_FALSE(HasPlayingVideo(delegate_id)); | 315 EXPECT_FALSE(HasPlayingVideo(delegate_id)); |
370 } | 316 } |
371 | 317 |
372 TEST_F(RendererWebMediaPlayerDelegateTest, IsPlayingBackgroundVideo) { | |
373 NiceMock<MockWebMediaPlayerDelegateObserver> observer; | |
374 int delegate_id = delegate_manager_->AddObserver(&observer); | |
375 EXPECT_FALSE(delegate_manager_->IsPlayingBackgroundVideo()); | |
376 | |
377 // Showing the frame always clears the flag. | |
378 SetPlayingBackgroundVideo(true); | |
379 delegate_manager_->WasShown(); | |
380 EXPECT_FALSE(delegate_manager_->IsPlayingBackgroundVideo()); | |
381 | |
382 // Pausing anything other than a local playing video doesn't affect the flag. | |
383 SetPlayingBackgroundVideo(true); | |
384 CallOnMediaDelegatePause(delegate_id); | |
385 EXPECT_TRUE(delegate_manager_->IsPlayingBackgroundVideo()); | |
386 | |
387 // Pausing a currently playing video clears the flag. | |
388 delegate_manager_->DidPlay(delegate_id, true, true, false, | |
389 MediaContentType::Persistent); | |
390 CallOnMediaDelegatePause(delegate_id); | |
391 EXPECT_FALSE(delegate_manager_->IsPlayingBackgroundVideo()); | |
392 | |
393 // TODO(avayvod): this test can't mock the IsHidden() method. | |
394 // Just test that the value changes or doesn't depending on whether the video | |
395 // is currently playing. | |
396 bool old_value = !delegate_manager_->IsHidden(); | |
397 SetPlayingBackgroundVideo(old_value); | |
398 delegate_manager_->DidPause(delegate_id, true); | |
399 CallOnMediaDelegatePlay(delegate_id); | |
400 EXPECT_EQ(old_value, delegate_manager_->IsPlayingBackgroundVideo()); | |
401 | |
402 delegate_manager_->DidPlay(delegate_id, true, true, false, | |
403 MediaContentType::Persistent); | |
404 CallOnMediaDelegatePlay(delegate_id); | |
405 EXPECT_NE(old_value, delegate_manager_->IsPlayingBackgroundVideo()); | |
406 } | |
407 | |
408 #if defined(OS_ANDROID) | 318 #if defined(OS_ANDROID) |
409 | 319 |
410 TEST_F(RendererWebMediaPlayerDelegateTest, Histograms) { | 320 TEST_F(RendererWebMediaPlayerDelegateTest, Histograms) { |
411 NiceMock<MockWebMediaPlayerDelegateObserver> observer; | 321 NiceMock<MockWebMediaPlayerDelegateObserver> observer; |
412 int delegate_id = delegate_manager_->AddObserver(&observer); | 322 int delegate_id = delegate_manager_->AddObserver(&observer); |
413 base::HistogramTester histogram_tester; | 323 base::HistogramTester histogram_tester; |
414 histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 0); | 324 histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 0); |
415 | 325 |
416 // Pausing or showing doesn't record anything as background playback | 326 // Pausing or showing doesn't record anything as background playback |
417 // hasn't started yet. | 327 // hasn't started yet. |
418 delegate_manager_->DidPlay(delegate_id, true, true, false, | 328 delegate_manager_->DidPlay(delegate_id, true, true, |
419 MediaContentType::Persistent); | 329 MediaContentType::Persistent); |
420 CallOnMediaDelegatePause(delegate_id); | 330 RunLoopOnce(); |
| 331 delegate_manager_->DidPause(delegate_id); |
| 332 RunLoopOnce(); |
421 histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 0); | 333 histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 0); |
422 | 334 |
423 delegate_manager_->DidPlay(delegate_id, true, true, false, | 335 // Doing the same while hidden should record the time. |
| 336 delegate_manager_->SetFrameHiddenForTesting(true); |
| 337 delegate_manager_->DidPlay(delegate_id, true, true, |
424 MediaContentType::Persistent); | 338 MediaContentType::Persistent); |
425 delegate_manager_->WasShown(); | 339 RunLoopOnce(); |
426 histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 0); | |
427 | |
428 // Doing this things after the background playback has started should record | |
429 // the time. | |
430 delegate_manager_->DidPlay(delegate_id, true, true, false, | |
431 MediaContentType::Persistent); | |
432 SetPlayingBackgroundVideo(true); | |
433 CallOnMediaDelegatePause(delegate_id); | |
434 histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 1); | 340 histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 1); |
435 | 341 |
436 delegate_manager_->DidPlay(delegate_id, true, true, false, | 342 delegate_manager_->SetFrameHiddenForTesting(false); |
437 MediaContentType::Persistent); | 343 RunLoopOnce(); |
438 SetPlayingBackgroundVideo(true); | |
439 delegate_manager_->WasShown(); | |
440 histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 2); | 344 histogram_tester.ExpectTotalCount("Media.Android.BackgroundVideoTime", 2); |
441 } | 345 } |
442 | 346 |
443 #endif // OS_ANDROID | 347 #endif // OS_ANDROID |
444 | 348 |
445 } // namespace media | 349 } // namespace media |
OLD | NEW |