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

Side by Side Diff: content/browser/media/session/media_session_impl_service_routing_unittest.cc

Issue 2612293003: [MediaSession] Don't reset metadata and actions when the session goes uncontrollable (Closed)
Patch Set: rebased Created 3 years, 11 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 "content/browser/media/session/media_session_impl.h" 5 #include "content/browser/media/session/media_session_impl.h"
6 6
7 #include <map> 7 #include <map>
8 #include <memory> 8 #include <memory>
9 9
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
11 #include "base/strings/utf_string_conversions.h"
11 #include "content/browser/media/session/media_session_player_observer.h" 12 #include "content/browser/media/session/media_session_player_observer.h"
12 #include "content/browser/media/session/media_session_service_impl.h" 13 #include "content/browser/media/session/media_session_service_impl.h"
14 #include "content/browser/media/session/mock_media_session_observer.h"
13 #include "content/test/test_render_view_host.h" 15 #include "content/test/test_render_view_host.h"
14 #include "content/test/test_web_contents.h" 16 #include "content/test/test_web_contents.h"
15 #include "media/base/media_content_type.h" 17 #include "media/base/media_content_type.h"
16 18
19 using ::testing::_;
20 using ::testing::AnyNumber;
21 using ::testing::Eq;
22
17 namespace content { 23 namespace content {
18 24
19 namespace { 25 namespace {
20 26
21 static const int kPlayerId = 0; 27 static const int kPlayerId = 0;
22 28
23 class MockMediaSessionServiceImpl : public MediaSessionServiceImpl { 29 class MockMediaSessionServiceImpl : public MediaSessionServiceImpl {
24 public: 30 public:
25 explicit MockMediaSessionServiceImpl(RenderFrameHost* rfh) 31 explicit MockMediaSessionServiceImpl(RenderFrameHost* rfh)
26 : MediaSessionServiceImpl(rfh) {} 32 : MediaSessionServiceImpl(rfh) {}
(...skipping 24 matching lines...) Expand all
51 class MediaSessionImplServiceRoutingTest 57 class MediaSessionImplServiceRoutingTest
52 : public RenderViewHostImplTestHarness { 58 : public RenderViewHostImplTestHarness {
53 public: 59 public:
54 MediaSessionImplServiceRoutingTest() = default; 60 MediaSessionImplServiceRoutingTest() = default;
55 ~MediaSessionImplServiceRoutingTest() override = default; 61 ~MediaSessionImplServiceRoutingTest() override = default;
56 62
57 void SetUp() override { 63 void SetUp() override {
58 RenderViewHostImplTestHarness::SetUp(); 64 RenderViewHostImplTestHarness::SetUp();
59 65
60 contents()->GetMainFrame()->InitializeRenderFrameIfNeeded(); 66 contents()->GetMainFrame()->InitializeRenderFrameIfNeeded();
67 mock_media_session_observer_.reset(
68 new MockMediaSessionObserver(MediaSessionImpl::Get(contents())));
61 main_frame_ = contents()->GetMainFrame(); 69 main_frame_ = contents()->GetMainFrame();
62 sub_frame_ = main_frame_->AppendChild("sub_frame"); 70 sub_frame_ = main_frame_->AppendChild("sub_frame");
63 71
64 player_in_main_frame_.reset( 72 player_in_main_frame_.reset(
65 new MockMediaSessionPlayerObserver(main_frame_)); 73 new MockMediaSessionPlayerObserver(main_frame_));
66 player_in_sub_frame_.reset(new MockMediaSessionPlayerObserver(sub_frame_)); 74 player_in_sub_frame_.reset(new MockMediaSessionPlayerObserver(sub_frame_));
67 } 75 }
68 76
69 void TearDown() override { 77 void TearDown() override {
78 mock_media_session_observer_.reset();
70 services_.clear(); 79 services_.clear();
71 80
72 RenderViewHostImplTestHarness::TearDown(); 81 RenderViewHostImplTestHarness::TearDown();
73 } 82 }
74 83
75 protected: 84 protected:
85 MockMediaSessionObserver* mock_media_session_observer() {
86 return mock_media_session_observer_.get();
87 }
88
76 void CreateServiceForFrame(TestRenderFrameHost* frame) { 89 void CreateServiceForFrame(TestRenderFrameHost* frame) {
77 services_[frame] = base::MakeUnique<MockMediaSessionServiceImpl>(frame); 90 services_[frame] = base::MakeUnique<MockMediaSessionServiceImpl>(frame);
78 } 91 }
79 92
80 void DestroyServiceForFrame(TestRenderFrameHost* frame) { 93 void DestroyServiceForFrame(TestRenderFrameHost* frame) {
81 services_.erase(frame); 94 services_.erase(frame);
82 } 95 }
83 96
84 void StartPlayerForFrame(TestRenderFrameHost* frame) { 97 void StartPlayerForFrame(TestRenderFrameHost* frame) {
85 players_[frame] = base::MakeUnique<MockMediaSessionPlayerObserver>(frame); 98 players_[frame] = base::MakeUnique<MockMediaSessionPlayerObserver>(frame);
(...skipping 13 matching lines...) Expand all
99 MediaSessionServiceImpl* ComputeServiceForRouting() { 112 MediaSessionServiceImpl* ComputeServiceForRouting() {
100 return MediaSessionImpl::Get(contents())->ComputeServiceForRouting(); 113 return MediaSessionImpl::Get(contents())->ComputeServiceForRouting();
101 } 114 }
102 115
103 TestRenderFrameHost* main_frame_; 116 TestRenderFrameHost* main_frame_;
104 TestRenderFrameHost* sub_frame_; 117 TestRenderFrameHost* sub_frame_;
105 118
106 std::unique_ptr<MockMediaSessionPlayerObserver> player_in_main_frame_; 119 std::unique_ptr<MockMediaSessionPlayerObserver> player_in_main_frame_;
107 std::unique_ptr<MockMediaSessionPlayerObserver> player_in_sub_frame_; 120 std::unique_ptr<MockMediaSessionPlayerObserver> player_in_sub_frame_;
108 121
122 std::unique_ptr<MockMediaSessionObserver> mock_media_session_observer_;
123
109 using ServiceMap = std::map<TestRenderFrameHost*, 124 using ServiceMap = std::map<TestRenderFrameHost*,
110 std::unique_ptr<MockMediaSessionServiceImpl>>; 125 std::unique_ptr<MockMediaSessionServiceImpl>>;
111 ServiceMap services_; 126 ServiceMap services_;
112 127
113 using PlayerMap = std::map<TestRenderFrameHost*, 128 using PlayerMap = std::map<TestRenderFrameHost*,
114 std::unique_ptr<MockMediaSessionPlayerObserver>>; 129 std::unique_ptr<MockMediaSessionPlayerObserver>>;
115 PlayerMap players_; 130 PlayerMap players_;
116 }; 131 };
117 132
118 TEST_F(MediaSessionImplServiceRoutingTest, NoFrameProducesAudio) { 133 TEST_F(MediaSessionImplServiceRoutingTest, NoFrameProducesAudio) {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 StartPlayerForFrame(sub_frame_); 211 StartPlayerForFrame(sub_frame_);
197 212
198 CreateServiceForFrame(main_frame_); 213 CreateServiceForFrame(main_frame_);
199 CreateServiceForFrame(sub_frame_); 214 CreateServiceForFrame(sub_frame_);
200 215
201 ClearPlayersForFrame(main_frame_); 216 ClearPlayersForFrame(main_frame_);
202 217
203 ASSERT_EQ(services_[sub_frame_].get(), ComputeServiceForRouting()); 218 ASSERT_EQ(services_[sub_frame_].get(), ComputeServiceForRouting());
204 } 219 }
205 220
221 TEST_F(MediaSessionImplServiceRoutingTest,
222 DontNotifyMetadataAndActionsChangeWhenUncontrollable) {
223 EXPECT_CALL(*mock_media_session_observer(), MediaSessionMetadataChanged(_))
224 .Times(0);
225 EXPECT_CALL(*mock_media_session_observer(), MediaSessionActionsChanged(_))
226 .Times(0);
227
228 CreateServiceForFrame(main_frame_);
229
230 services_[main_frame_]->SetMetadata(MediaMetadata());
231 services_[main_frame_]->EnableAction(blink::mojom::MediaSessionAction::PLAY);
232 }
233
234 TEST_F(MediaSessionImplServiceRoutingTest,
235 NotifyMetadataAndActionsChangeWhenControllable) {
236 MediaMetadata expected_metadata;
237 expected_metadata.title = base::ASCIIToUTF16("title");
238 expected_metadata.artist = base::ASCIIToUTF16("artist");
239 expected_metadata.album = base::ASCIIToUTF16("album");
240
241 std::set<blink::mojom::MediaSessionAction> empty_actions;
242 std::set<blink::mojom::MediaSessionAction> expected_actions;
243 expected_actions.insert(blink::mojom::MediaSessionAction::PLAY);
244
245 EXPECT_CALL(*mock_media_session_observer(),
246 MediaSessionMetadataChanged(Eq(base::nullopt)))
247 .Times(AnyNumber());
248 EXPECT_CALL(*mock_media_session_observer(),
249 MediaSessionActionsChanged(Eq(empty_actions)))
250 .Times(AnyNumber());
251
252 EXPECT_CALL(*mock_media_session_observer(),
253 MediaSessionMetadataChanged(Eq(expected_metadata)))
254 .Times(1);
255 EXPECT_CALL(*mock_media_session_observer(),
256 MediaSessionActionsChanged(Eq(expected_actions)))
257 .Times(1);
258
259 CreateServiceForFrame(main_frame_);
260 StartPlayerForFrame(main_frame_);
261
262 services_[main_frame_]->SetMetadata(expected_metadata);
263 services_[main_frame_]->EnableAction(blink::mojom::MediaSessionAction::PLAY);
264 }
265
266 TEST_F(MediaSessionImplServiceRoutingTest,
267 NotifyMetadataAndActionsChangeWhenTurningControllable) {
268 MediaMetadata expected_metadata;
269 expected_metadata.title = base::ASCIIToUTF16("title");
270 expected_metadata.artist = base::ASCIIToUTF16("artist");
271 expected_metadata.album = base::ASCIIToUTF16("album");
272
273 std::set<blink::mojom::MediaSessionAction> expected_actions;
274 expected_actions.insert(blink::mojom::MediaSessionAction::PLAY);
275
276 EXPECT_CALL(*mock_media_session_observer(),
277 MediaSessionMetadataChanged(Eq(expected_metadata)))
278 .Times(1);
279 EXPECT_CALL(*mock_media_session_observer(),
280 MediaSessionActionsChanged(Eq(expected_actions)))
281 .Times(1);
282
283 CreateServiceForFrame(main_frame_);
284
285 services_[main_frame_]->SetMetadata(expected_metadata);
286 services_[main_frame_]->EnableAction(blink::mojom::MediaSessionAction::PLAY);
287
288 StartPlayerForFrame(main_frame_);
289 }
290
291 TEST_F(MediaSessionImplServiceRoutingTest,
292 DontNotifyMetadataAndActionsChangeWhenTurningUncontrollable) {
293 MediaMetadata expected_metadata;
294 expected_metadata.title = base::ASCIIToUTF16("title");
295 expected_metadata.artist = base::ASCIIToUTF16("artist");
296 expected_metadata.album = base::ASCIIToUTF16("album");
297
298 std::set<blink::mojom::MediaSessionAction> empty_actions;
299 std::set<blink::mojom::MediaSessionAction> expected_actions;
300 expected_actions.insert(blink::mojom::MediaSessionAction::PLAY);
301
302 EXPECT_CALL(*mock_media_session_observer(), MediaSessionMetadataChanged(_))
303 .Times(AnyNumber());
304 EXPECT_CALL(*mock_media_session_observer(), MediaSessionActionsChanged(_))
305 .Times(AnyNumber());
306 EXPECT_CALL(*mock_media_session_observer(),
307 MediaSessionMetadataChanged(Eq(base::nullopt)))
308 .Times(0);
309 EXPECT_CALL(*mock_media_session_observer(),
310 MediaSessionActionsChanged(Eq(empty_actions)))
311 .Times(0);
312
313 CreateServiceForFrame(main_frame_);
314
315 services_[main_frame_]->SetMetadata(expected_metadata);
316 services_[main_frame_]->EnableAction(blink::mojom::MediaSessionAction::PLAY);
317
318 StartPlayerForFrame(main_frame_);
319 ClearPlayersForFrame(main_frame_);
320 }
321
206 } // namespace content 322 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698