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

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

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

Powered by Google App Engine
This is Rietveld 408576698