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

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

Issue 2526533002: Allow MediaSession in iframes to be routed (Closed)
Patch Set: nits Created 4 years 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "content/browser/media/session/media_session_impl.h"
6
7 #include <map>
8 #include <memory>
9
10 #include "content/browser/media/session/media_session_player_observer.h"
11 #include "content/browser/media/session/media_session_service_impl.h"
12 #include "content/test/test_render_view_host.h"
13 #include "content/test/test_web_contents.h"
14 #include "media/base/media_content_type.h"
15
16 namespace content {
17
18 namespace {
19
20 static const int kPlayerId = 0;
21
22 class MockMediaSessionServiceImpl : public MediaSessionServiceImpl {
23 public:
24 explicit MockMediaSessionServiceImpl(RenderFrameHost* rfh)
25 : MediaSessionServiceImpl(rfh) {}
26 ~MockMediaSessionServiceImpl() override = default;
27 };
28
29 class MockMediaSessionPlayerObserver : public MediaSessionPlayerObserver {
30 public:
31 explicit MockMediaSessionPlayerObserver(RenderFrameHost* rfh)
32 : render_frame_host_(rfh) {}
33
34 ~MockMediaSessionPlayerObserver() override = default;
35
36 void OnSuspend(int player_id) override {}
37 void OnResume(int player_id) override {}
38 void OnSetVolumeMultiplier(int player_id, double volume_multiplier) override {
39 }
40 RenderFrameHost* GetRenderFrameHost() const override {
41 return render_frame_host_;
42 }
43
44 private:
45 RenderFrameHost* render_frame_host_;
46 };
47
48 } // anonymous namespace
49
50 class MediaSessionImplServiceRoutingTest
51 : public RenderViewHostImplTestHarness {
52 public:
53 MediaSessionImplServiceRoutingTest() = default;
54 ~MediaSessionImplServiceRoutingTest() override = default;
55
56 void SetUp() override {
57 RenderViewHostImplTestHarness::SetUp();
58
59 contents()->GetMainFrame()->InitializeRenderFrameIfNeeded();
60 main_frame_ = contents()->GetMainFrame();
61 sub_frame_ = main_frame_->AppendChild("sub_frame");
62
63 player_in_main_frame_.reset(
64 new MockMediaSessionPlayerObserver(main_frame_));
65 player_in_sub_frame_.reset(new MockMediaSessionPlayerObserver(sub_frame_));
66 }
67
68 void TearDown() override {
69 services_.clear();
70
71 RenderViewHostImplTestHarness::TearDown();
72 }
73
74 protected:
75 void CreateServiceForFrame(TestRenderFrameHost* frame) {
76 services_[frame] = base::MakeUnique<MockMediaSessionServiceImpl>(frame);
77 services_[frame]->SetMetadata(MediaMetadata());
78 }
79
80 void StartPlayerForFrame(TestRenderFrameHost* frame) {
81 players_[frame] = base::MakeUnique<MockMediaSessionPlayerObserver>(frame);
82 MediaSessionImpl::Get(contents())
83 ->AddPlayer(players_[frame].get(), kPlayerId,
84 media::MediaContentType::Persistent);
85 }
86
87 void ClearPlayersForFrame(TestRenderFrameHost* frame) {
88 if (!players_.count(frame))
89 return;
90
91 MediaSessionImpl::Get(contents())
92 ->RemovePlayer(players_[frame].get(), kPlayerId);
93 }
94
95 MediaSessionServiceImpl* ComputeServiceForRouting() {
96 return MediaSessionImpl::Get(contents())->ComputeServiceForRouting();
97 }
98
99 TestRenderFrameHost* main_frame_;
100 TestRenderFrameHost* sub_frame_;
101
102 std::unique_ptr<MockMediaSessionPlayerObserver> player_in_main_frame_;
103 std::unique_ptr<MockMediaSessionPlayerObserver> player_in_sub_frame_;
104
105 using ServiceMap = std::map<TestRenderFrameHost*,
106 std::unique_ptr<MockMediaSessionServiceImpl>>;
107 ServiceMap services_;
108
109 using PlayerMap = std::map<TestRenderFrameHost*,
110 std::unique_ptr<MockMediaSessionPlayerObserver>>;
111 PlayerMap players_;
112 };
113
114 TEST_F(MediaSessionImplServiceRoutingTest, NoFrameProducesAudio) {
115 CreateServiceForFrame(main_frame_);
116 CreateServiceForFrame(sub_frame_);
117
118 ASSERT_EQ(nullptr, ComputeServiceForRouting());
119 }
120
121 TEST_F(MediaSessionImplServiceRoutingTest,
122 OnlyMainFrameProducesAudioButHasNoService) {
123 StartPlayerForFrame(main_frame_);
124
125 ASSERT_EQ(nullptr, ComputeServiceForRouting());
126 }
127
128 TEST_F(MediaSessionImplServiceRoutingTest,
129 OnlySubFrameProducesAudioButHasNoService) {
130 StartPlayerForFrame(sub_frame_);
131
132 ASSERT_EQ(nullptr, ComputeServiceForRouting());
133 }
134
135 TEST_F(MediaSessionImplServiceRoutingTest,
136 OnlyMainFrameProducesAudioButHasInactiveService) {
137 StartPlayerForFrame(main_frame_);
138
139 CreateServiceForFrame(main_frame_);
140 services_[main_frame_]->SetMetadata(base::nullopt);
141
142 ASSERT_EQ(nullptr, ComputeServiceForRouting());
143 }
144
145 TEST_F(MediaSessionImplServiceRoutingTest,
146 OnlySubFrameProducesAudioButHasInactiveService) {
147 StartPlayerForFrame(sub_frame_);
148
149 CreateServiceForFrame(sub_frame_);
150 services_[sub_frame_]->SetMetadata(base::nullopt);
151
152 ASSERT_EQ(nullptr, ComputeServiceForRouting());
153 }
154
155 TEST_F(MediaSessionImplServiceRoutingTest,
156 BothFrameProducesAudioButOnlySubFrameHasService) {
157 StartPlayerForFrame(main_frame_);
158 StartPlayerForFrame(sub_frame_);
159
160 CreateServiceForFrame(sub_frame_);
161
162 ASSERT_EQ(services_[sub_frame_].get(), ComputeServiceForRouting());
163 }
164
165 TEST_F(MediaSessionImplServiceRoutingTest, PreferTopMostFrame) {
166 StartPlayerForFrame(main_frame_);
167 StartPlayerForFrame(sub_frame_);
168
169 CreateServiceForFrame(main_frame_);
170 CreateServiceForFrame(sub_frame_);
171
172 ASSERT_EQ(services_[main_frame_].get(), ComputeServiceForRouting());
173 }
174
175 TEST_F(MediaSessionImplServiceRoutingTest,
176 RoutedServiceUpdatedAfterRemovingPlayer) {
177 StartPlayerForFrame(main_frame_);
178 StartPlayerForFrame(sub_frame_);
179
180 CreateServiceForFrame(main_frame_);
181 CreateServiceForFrame(sub_frame_);
182
183 ClearPlayersForFrame(main_frame_);
184
185 ASSERT_EQ(services_[sub_frame_].get(), ComputeServiceForRouting());
186 }
187
188 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698