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

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

Issue 2685373002: [Media>Session] Pause all players for non-routed frames when receiving PAUSE action (Closed)
Patch Set: Created 3 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
« no previous file with comments | « content/browser/media/session/media_session_impl.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/run_loop.h"
11 #include "base/strings/utf_string_conversions.h" 12 #include "base/strings/utf_string_conversions.h"
12 #include "content/browser/media/session/media_session_player_observer.h" 13 #include "content/browser/media/session/media_session_player_observer.h"
13 #include "content/browser/media/session/media_session_service_impl.h" 14 #include "content/browser/media/session/media_session_service_impl.h"
14 #include "content/browser/media/session/mock_media_session_observer.h" 15 #include "content/browser/media/session/mock_media_session_observer.h"
15 #include "content/test/test_render_view_host.h" 16 #include "content/test/test_render_view_host.h"
16 #include "content/test/test_web_contents.h" 17 #include "content/test/test_web_contents.h"
17 #include "media/base/media_content_type.h" 18 #include "media/base/media_content_type.h"
19 #include "third_party/WebKit/public/platform/modules/mediasession/media_session. mojom.h"
18 20
19 using ::testing::_; 21 using ::testing::_;
20 using ::testing::AnyNumber; 22 using ::testing::AnyNumber;
21 using ::testing::Eq; 23 using ::testing::Eq;
24 using ::testing::InvokeWithoutArgs;
22 25
23 namespace content { 26 namespace content {
24 27
25 namespace { 28 namespace {
26 29
27 static const int kPlayerId = 0; 30 static const int kPlayerId = 0;
28 31
29 class MockMediaSessionServiceImpl : public MediaSessionServiceImpl { 32 class MockMediaSessionServiceImpl : public MediaSessionServiceImpl {
30 public: 33 public:
31 explicit MockMediaSessionServiceImpl(RenderFrameHost* rfh) 34 explicit MockMediaSessionServiceImpl(RenderFrameHost* rfh)
32 : MediaSessionServiceImpl(rfh) {} 35 : MediaSessionServiceImpl(rfh) {}
33 ~MockMediaSessionServiceImpl() override = default; 36 ~MockMediaSessionServiceImpl() override = default;
34 }; 37 };
35 38
39 class MockMediaSessionClient : public blink::mojom::MediaSessionClient {
40 public:
41 MockMediaSessionClient() : binding_(this) {}
42
43 blink::mojom::MediaSessionClientPtr CreateInterfacePtrAndBind() {
44 return binding_.CreateInterfacePtrAndBind();
45 }
46
47 MOCK_METHOD1(DidReceiveAction, void(blink::mojom::MediaSessionAction action));
48
49 private:
50 mojo::Binding<blink::mojom::MediaSessionClient> binding_;
51
52 DISALLOW_COPY_AND_ASSIGN(MockMediaSessionClient);
53 };
54
36 class MockMediaSessionPlayerObserver : public MediaSessionPlayerObserver { 55 class MockMediaSessionPlayerObserver : public MediaSessionPlayerObserver {
37 public: 56 public:
38 explicit MockMediaSessionPlayerObserver(RenderFrameHost* rfh) 57 explicit MockMediaSessionPlayerObserver(RenderFrameHost* rfh)
39 : render_frame_host_(rfh) {} 58 : render_frame_host_(rfh) {}
40 59
41 ~MockMediaSessionPlayerObserver() override = default; 60 ~MockMediaSessionPlayerObserver() override = default;
42 61
43 void OnSuspend(int player_id) override {} 62 MOCK_METHOD1(OnSuspend, void(int player_id));
44 void OnResume(int player_id) override {} 63 MOCK_METHOD1(OnResume, void(int player_id));
45 void OnSetVolumeMultiplier(int player_id, double volume_multiplier) override { 64 MOCK_METHOD2(OnSetVolumeMultiplier,
46 } 65 void(int player_id, double volume_multiplier));
66
47 RenderFrameHost* GetRenderFrameHost() const override { 67 RenderFrameHost* GetRenderFrameHost() const override {
48 return render_frame_host_; 68 return render_frame_host_;
49 } 69 }
50 70
51 private: 71 private:
52 RenderFrameHost* render_frame_host_; 72 RenderFrameHost* render_frame_host_;
53 }; 73 };
54 74
55 } // anonymous namespace 75 } // anonymous namespace
56 76
(...skipping 13 matching lines...) Expand all
70 sub_frame_ = main_frame_->AppendChild("sub_frame"); 90 sub_frame_ = main_frame_->AppendChild("sub_frame");
71 91
72 player_in_main_frame_.reset( 92 player_in_main_frame_.reset(
73 new MockMediaSessionPlayerObserver(main_frame_)); 93 new MockMediaSessionPlayerObserver(main_frame_));
74 player_in_sub_frame_.reset(new MockMediaSessionPlayerObserver(sub_frame_)); 94 player_in_sub_frame_.reset(new MockMediaSessionPlayerObserver(sub_frame_));
75 } 95 }
76 96
77 void TearDown() override { 97 void TearDown() override {
78 mock_media_session_observer_.reset(); 98 mock_media_session_observer_.reset();
79 services_.clear(); 99 services_.clear();
100 clients_.clear();
80 101
81 RenderViewHostImplTestHarness::TearDown(); 102 RenderViewHostImplTestHarness::TearDown();
82 } 103 }
83 104
84 protected: 105 protected:
85 MockMediaSessionObserver* mock_media_session_observer() { 106 MockMediaSessionObserver* mock_media_session_observer() {
86 return mock_media_session_observer_.get(); 107 return mock_media_session_observer_.get();
87 } 108 }
88 109
89 void CreateServiceForFrame(TestRenderFrameHost* frame) { 110 void CreateServiceForFrame(TestRenderFrameHost* frame) {
90 services_[frame] = base::MakeUnique<MockMediaSessionServiceImpl>(frame); 111 services_[frame] = base::MakeUnique<MockMediaSessionServiceImpl>(frame);
112 clients_[frame] = base::MakeUnique<MockMediaSessionClient>();
113 services_[frame]->SetClient(clients_[frame]->CreateInterfacePtrAndBind());
91 } 114 }
92 115
93 void DestroyServiceForFrame(TestRenderFrameHost* frame) { 116 void DestroyServiceForFrame(TestRenderFrameHost* frame) {
94 services_.erase(frame); 117 services_.erase(frame);
118 clients_.erase(frame);
119 }
120
121 MockMediaSessionClient* GetClientForFrame(TestRenderFrameHost* frame) {
122 auto iter = clients_.find(frame);
123 return (iter != clients_.end()) ? iter->second.get() : nullptr;
95 } 124 }
96 125
97 void StartPlayerForFrame(TestRenderFrameHost* frame) { 126 void StartPlayerForFrame(TestRenderFrameHost* frame) {
98 players_[frame] = base::MakeUnique<MockMediaSessionPlayerObserver>(frame); 127 players_[frame] = base::MakeUnique<MockMediaSessionPlayerObserver>(frame);
99 MediaSessionImpl::Get(contents()) 128 MediaSessionImpl::Get(contents())
100 ->AddPlayer(players_[frame].get(), kPlayerId, 129 ->AddPlayer(players_[frame].get(), kPlayerId,
101 media::MediaContentType::Persistent); 130 media::MediaContentType::Persistent);
102 } 131 }
103 132
104 void ClearPlayersForFrame(TestRenderFrameHost* frame) { 133 void ClearPlayersForFrame(TestRenderFrameHost* frame) {
105 if (!players_.count(frame)) 134 if (!players_.count(frame))
106 return; 135 return;
107 136
108 MediaSessionImpl::Get(contents()) 137 MediaSessionImpl::Get(contents())
109 ->RemovePlayer(players_[frame].get(), kPlayerId); 138 ->RemovePlayer(players_[frame].get(), kPlayerId);
110 } 139 }
111 140
141 MockMediaSessionPlayerObserver* GetPlayerForFrame(
142 TestRenderFrameHost* frame) {
143 auto iter = players_.find(frame);
144 return (iter != players_.end()) ? iter->second.get() : nullptr;
145 }
146
112 MediaSessionServiceImpl* ComputeServiceForRouting() { 147 MediaSessionServiceImpl* ComputeServiceForRouting() {
113 return MediaSessionImpl::Get(contents())->ComputeServiceForRouting(); 148 return MediaSessionImpl::Get(contents())->ComputeServiceForRouting();
114 } 149 }
115 150
116 TestRenderFrameHost* main_frame_; 151 TestRenderFrameHost* main_frame_;
117 TestRenderFrameHost* sub_frame_; 152 TestRenderFrameHost* sub_frame_;
118 153
119 std::unique_ptr<MockMediaSessionPlayerObserver> player_in_main_frame_; 154 std::unique_ptr<MockMediaSessionPlayerObserver> player_in_main_frame_;
120 std::unique_ptr<MockMediaSessionPlayerObserver> player_in_sub_frame_; 155 std::unique_ptr<MockMediaSessionPlayerObserver> player_in_sub_frame_;
121 156
122 std::unique_ptr<MockMediaSessionObserver> mock_media_session_observer_; 157 std::unique_ptr<MockMediaSessionObserver> mock_media_session_observer_;
123 158
124 using ServiceMap = std::map<TestRenderFrameHost*, 159 using ServiceMap = std::map<TestRenderFrameHost*,
125 std::unique_ptr<MockMediaSessionServiceImpl>>; 160 std::unique_ptr<MockMediaSessionServiceImpl>>;
126 ServiceMap services_; 161 ServiceMap services_;
127 162
163 using ClientMap =
164 std::map<TestRenderFrameHost*, std::unique_ptr<MockMediaSessionClient>>;
165 ClientMap clients_;
166
128 using PlayerMap = std::map<TestRenderFrameHost*, 167 using PlayerMap = std::map<TestRenderFrameHost*,
129 std::unique_ptr<MockMediaSessionPlayerObserver>>; 168 std::unique_ptr<MockMediaSessionPlayerObserver>>;
130 PlayerMap players_; 169 PlayerMap players_;
131 }; 170 };
132 171
133 TEST_F(MediaSessionImplServiceRoutingTest, NoFrameProducesAudio) { 172 TEST_F(MediaSessionImplServiceRoutingTest, NoFrameProducesAudio) {
134 CreateServiceForFrame(main_frame_); 173 CreateServiceForFrame(main_frame_);
135 CreateServiceForFrame(sub_frame_); 174 CreateServiceForFrame(sub_frame_);
136 175
137 ASSERT_EQ(nullptr, ComputeServiceForRouting()); 176 ASSERT_EQ(nullptr, ComputeServiceForRouting());
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
312 351
313 CreateServiceForFrame(main_frame_); 352 CreateServiceForFrame(main_frame_);
314 353
315 services_[main_frame_]->SetMetadata(expected_metadata); 354 services_[main_frame_]->SetMetadata(expected_metadata);
316 services_[main_frame_]->EnableAction(blink::mojom::MediaSessionAction::PLAY); 355 services_[main_frame_]->EnableAction(blink::mojom::MediaSessionAction::PLAY);
317 356
318 StartPlayerForFrame(main_frame_); 357 StartPlayerForFrame(main_frame_);
319 ClearPlayersForFrame(main_frame_); 358 ClearPlayersForFrame(main_frame_);
320 } 359 }
321 360
361 TEST_F(MediaSessionImplServiceRoutingTest,
362 TestPauseBehaviorWhenMainFrameIsRouted) {
363 base::RunLoop run_loop;
364
365 StartPlayerForFrame(main_frame_);
366 StartPlayerForFrame(sub_frame_);
367
368 CreateServiceForFrame(main_frame_);
369
370 EXPECT_CALL(*GetPlayerForFrame(sub_frame_), OnSuspend(_));
371 EXPECT_CALL(*GetClientForFrame(main_frame_),
372 DidReceiveAction(blink::mojom::MediaSessionAction::PAUSE))
373 .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
374
375 services_[main_frame_]->EnableAction(blink::mojom::MediaSessionAction::PAUSE);
376
377 MediaSessionImpl::Get(contents())
378 ->DidReceiveAction(blink::mojom::MediaSessionAction::PAUSE);
379
380 run_loop.Run();
381 }
382
383 TEST_F(MediaSessionImplServiceRoutingTest,
384 TestPauseBehaviorWhenSubFrameIsRouted) {
385 base::RunLoop run_loop;
386
387 StartPlayerForFrame(main_frame_);
388 StartPlayerForFrame(sub_frame_);
389
390 CreateServiceForFrame(sub_frame_);
391
392 EXPECT_CALL(*GetPlayerForFrame(main_frame_), OnSuspend(_));
393 EXPECT_CALL(*GetClientForFrame(sub_frame_),
394 DidReceiveAction(blink::mojom::MediaSessionAction::PAUSE))
395 .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
396
397 services_[sub_frame_]->EnableAction(blink::mojom::MediaSessionAction::PAUSE);
398
399 MediaSessionImpl::Get(contents())
400 ->DidReceiveAction(blink::mojom::MediaSessionAction::PAUSE);
401
402 run_loop.Run();
403 }
404
322 } // namespace content 405 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/media/session/media_session_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698