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

Side by Side Diff: chrome/browser/media/router/presentation_service_delegate_impl.cc

Issue 1314413005: [Presentation API] 1-UA presentation support + presenter APIs. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 6 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "chrome/browser/media/router/presentation_service_delegate_impl.h" 5 #include "chrome/browser/media/router/presentation_service_delegate_impl.h"
6 6
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/containers/scoped_ptr_hash_map.h" 11 #include "base/containers/scoped_ptr_hash_map.h"
12 #include "base/containers/small_map.h" 12 #include "base/containers/small_map.h"
13 #include "base/guid.h"
14 #include "base/strings/string_util.h" 13 #include "base/strings/string_util.h"
15 #include "base/strings/stringprintf.h" 14 #include "base/strings/stringprintf.h"
16 #include "chrome/browser/media/router/create_presentation_connection_request.h" 15 #include "chrome/browser/media/router/create_presentation_connection_request.h"
17 #include "chrome/browser/media/router/media_route.h" 16 #include "chrome/browser/media/router/media_route.h"
18 #include "chrome/browser/media/router/media_router.h" 17 #include "chrome/browser/media/router/media_router.h"
19 #include "chrome/browser/media/router/media_router_dialog_controller.h" 18 #include "chrome/browser/media/router/media_router_dialog_controller.h"
20 #include "chrome/browser/media/router/media_router_factory.h" 19 #include "chrome/browser/media/router/media_router_factory.h"
21 #include "chrome/browser/media/router/media_sink.h" 20 #include "chrome/browser/media/router/media_sink.h"
22 #include "chrome/browser/media/router/media_source_helper.h" 21 #include "chrome/browser/media/router/media_source_helper.h"
22 #include "chrome/browser/media/router/offscreen_presentation_manager.h"
23 #include "chrome/browser/media/router/offscreen_presentation_manager_factory.h"
23 #include "chrome/browser/media/router/presentation_media_sinks_observer.h" 24 #include "chrome/browser/media/router/presentation_media_sinks_observer.h"
24 #include "chrome/browser/media/router/presentation_session_messages_observer.h" 25 #include "chrome/browser/media/router/presentation_session_messages_observer.h"
25 #include "chrome/browser/media/router/route_request_result.h" 26 #include "chrome/browser/media/router/route_request_result.h"
26 #include "chrome/browser/sessions/session_tab_helper.h" 27 #include "chrome/browser/sessions/session_tab_helper.h"
27 #include "content/public/browser/browser_context.h" 28 #include "content/public/browser/browser_context.h"
28 #include "content/public/browser/presentation_screen_availability_listener.h" 29 #include "content/public/browser/presentation_screen_availability_listener.h"
29 #include "content/public/browser/presentation_session.h" 30 #include "content/public/browser/presentation_session.h"
30 #include "content/public/browser/render_frame_host.h" 31 #include "content/public/browser/render_frame_host.h"
31 #include "content/public/browser/render_process_host.h" 32 #include "content/public/browser/render_process_host.h"
32 33
33 DEFINE_WEB_CONTENTS_USER_DATA_KEY( 34 DEFINE_WEB_CONTENTS_USER_DATA_KEY(
34 media_router::PresentationServiceDelegateImpl); 35 media_router::PresentationServiceDelegateImpl);
35 36
36 using content::RenderFrameHost; 37 using content::RenderFrameHost;
37 38
38 namespace media_router { 39 namespace media_router {
39 40
41 using OffscreenPresentationConnection =
42 OffscreenPresentationManager::OffscreenPresentationConnection;
43
40 namespace { 44 namespace {
41 45
42 using DelegateObserver = content::PresentationServiceDelegate::Observer; 46 using DelegateObserver = content::PresentationServiceDelegate::Observer;
43 47
44 // Returns the unique identifier for the supplied RenderFrameHost. 48 // Returns the unique identifier for the supplied RenderFrameHost.
45 RenderFrameHostId GetRenderFrameHostId(RenderFrameHost* render_frame_host) { 49 RenderFrameHostId GetRenderFrameHostId(RenderFrameHost* render_frame_host) {
46 int render_process_id = render_frame_host->GetProcess()->GetID(); 50 int render_process_id = render_frame_host->GetProcess()->GetID();
47 int render_frame_id = render_frame_host->GetRoutingID(); 51 int render_frame_id = render_frame_host->GetRoutingID();
48 return RenderFrameHostId(render_process_id, render_frame_id); 52 return RenderFrameHostId(render_process_id, render_frame_id);
49 } 53 }
(...skipping 22 matching lines...) Expand all
72 ~PresentationFrame(); 76 ~PresentationFrame();
73 77
74 // Mirror corresponding APIs in PresentationServiceDelegateImpl. 78 // Mirror corresponding APIs in PresentationServiceDelegateImpl.
75 bool SetScreenAvailabilityListener( 79 bool SetScreenAvailabilityListener(
76 content::PresentationScreenAvailabilityListener* listener); 80 content::PresentationScreenAvailabilityListener* listener);
77 bool RemoveScreenAvailabilityListener( 81 bool RemoveScreenAvailabilityListener(
78 content::PresentationScreenAvailabilityListener* listener); 82 content::PresentationScreenAvailabilityListener* listener);
79 bool HasScreenAvailabilityListenerForTest( 83 bool HasScreenAvailabilityListenerForTest(
80 const MediaSource::Id& source_id) const; 84 const MediaSource::Id& source_id) const;
81 std::string GetDefaultPresentationId() const; 85 std::string GetDefaultPresentationId() const;
86 void SendMessage(const content::PresentationSessionInfo& session,
87 std::unique_ptr<content::PresentationSessionMessage> message,
88 const content::SendMessageCallback send_message_cb);
82 void ListenForConnectionStateChange( 89 void ListenForConnectionStateChange(
83 const content::PresentationSessionInfo& connection, 90 const content::PresentationSessionInfo& connection,
84 const content::PresentationConnectionStateChangedCallback& 91 const content::PresentationConnectionStateChangedCallback&
85 state_changed_cb); 92 state_changed_cb);
86 void ListenForSessionMessages( 93 void ListenForSessionMessages(
87 const content::PresentationSessionInfo& session, 94 const content::PresentationSessionInfo& session,
88 const content::PresentationSessionMessageCallback& message_cb); 95 const content::PresentationSessionMessageCallback& message_cb);
89 96
90 void Reset(); 97 void Reset();
91 void RemoveConnection(const std::string& presentation_id, 98 void RemoveConnection(
92 const MediaRoute::Id& route_id); 99 const std::string& presentation_id,
100 const content::PresentationConnectionStateChangeInfo& state_change_info);
93 101
94 const MediaRoute::Id GetRouteId(const std::string& presentation_id) const; 102 const MediaRoute::Id GetRouteId(const std::string& presentation_id) const;
95 const std::vector<MediaRoute::Id> GetRouteIds() const; 103 const std::vector<MediaRoute::Id> GetRouteIds() const;
96 104
97 void OnPresentationSessionStarted( 105 void OnPresentationSessionStarted(
98 const content::PresentationSessionInfo& session, 106 const content::PresentationSessionInfo& session,
99 const MediaRoute::Id& route_id); 107 const MediaRoute& route);
100 void OnPresentationServiceDelegateDestroyed() const; 108 void OnPresentationServiceDelegateDestroyed() const;
101 109
102 void set_delegate_observer(DelegateObserver* observer) { 110 void set_delegate_observer(DelegateObserver* observer) {
103 delegate_observer_ = observer; 111 delegate_observer_ = observer;
104 } 112 }
105 113
106 private: 114 private:
107 MediaSource GetMediaSourceFromListener( 115 MediaSource GetMediaSourceFromListener(
108 content::PresentationScreenAvailabilityListener* listener) const; 116 content::PresentationScreenAvailabilityListener* listener) const;
117 // Gets the OffscreenPresentationConnection associated with |presentation_id|
118 // within this frame. Returns nullptr if |presentation_id| is not
119 // registered as an offscreen presentation.
120 OffscreenPresentationConnection* FindOffscreenConnection(
121 const std::string& presentation_id) const;
122
109 base::SmallMap<std::map<std::string, MediaRoute::Id>> 123 base::SmallMap<std::map<std::string, MediaRoute::Id>>
110 presentation_id_to_route_id_; 124 presentation_id_to_route_id_;
111 base::SmallMap< 125 base::SmallMap<
112 std::map<std::string, std::unique_ptr<PresentationMediaSinksObserver>>> 126 std::map<std::string, std::unique_ptr<PresentationMediaSinksObserver>>>
113 url_to_sinks_observer_; 127 url_to_sinks_observer_;
128
129 // Controller objects for offscreen presentations. Note that offscreen
130 // presentations are manipulated with these objects instead of the observers
131 // and MediaRouter objects below. Maps from presentation ID to the
132 // corresponding OffscreenPresentationConnection within this frame.
133 std::map<std::string, std::unique_ptr<OffscreenPresentationConnection>>
134 offscreen_presentation_connections_;
135
114 base::ScopedPtrHashMap< 136 base::ScopedPtrHashMap<
115 MediaRoute::Id, 137 MediaRoute::Id,
116 std::unique_ptr<PresentationConnectionStateSubscription>> 138 std::unique_ptr<PresentationConnectionStateSubscription>>
117 connection_state_subscriptions_; 139 connection_state_subscriptions_;
118 ScopedVector<PresentationSessionMessagesObserver> session_messages_observers_; 140 ScopedVector<PresentationSessionMessagesObserver> session_messages_observers_;
119 141
120 RenderFrameHostId render_frame_host_id_; 142 RenderFrameHostId render_frame_host_id_;
121 143
122 // References to the owning WebContents, and the corresponding MediaRouter. 144 // References to the owning WebContents, the corresponding MediaRouter, and
145 // OffscreenPresentationManager.
123 const content::WebContents* web_contents_; 146 const content::WebContents* web_contents_;
124 MediaRouter* router_; 147 MediaRouter* const router_;
148 OffscreenPresentationManager* const offscreen_presentation_manager_;
125 149
126 DelegateObserver* delegate_observer_; 150 DelegateObserver* delegate_observer_;
127 }; 151 };
128 152
129 PresentationFrame::PresentationFrame( 153 PresentationFrame::PresentationFrame(
130 const RenderFrameHostId& render_frame_host_id, 154 const RenderFrameHostId& render_frame_host_id,
131 content::WebContents* web_contents, 155 content::WebContents* web_contents,
132 MediaRouter* router) 156 MediaRouter* router)
133 : render_frame_host_id_(render_frame_host_id), 157 : render_frame_host_id_(render_frame_host_id),
134 web_contents_(web_contents), 158 web_contents_(web_contents),
135 router_(router), 159 router_(router),
160 offscreen_presentation_manager_(
161 OffscreenPresentationManagerFactory::GetOrCreateForBrowserContext(
162 web_contents_->GetBrowserContext())),
136 delegate_observer_(nullptr) { 163 delegate_observer_(nullptr) {
137 DCHECK(web_contents_); 164 DCHECK(web_contents_);
138 DCHECK(router_); 165 DCHECK(router_);
166 DCHECK(offscreen_presentation_manager_);
139 } 167 }
140 168
141 PresentationFrame::~PresentationFrame() { 169 PresentationFrame::~PresentationFrame() {
142 } 170 }
143 171
144 void PresentationFrame::OnPresentationServiceDelegateDestroyed() const { 172 void PresentationFrame::OnPresentationServiceDelegateDestroyed() const {
145 if (delegate_observer_) 173 if (delegate_observer_)
146 delegate_observer_->OnDelegateDestroyed(); 174 delegate_observer_->OnDelegateDestroyed();
147 } 175 }
148 176
149 void PresentationFrame::OnPresentationSessionStarted( 177 void PresentationFrame::OnPresentationSessionStarted(
150 const content::PresentationSessionInfo& session, 178 const content::PresentationSessionInfo& session,
151 const MediaRoute::Id& route_id) { 179 const MediaRoute& route) {
152 presentation_id_to_route_id_[session.presentation_id] = route_id; 180 const std::string& presentation_id = session.presentation_id;
181 presentation_id_to_route_id_[presentation_id] = route.media_route_id();
182 if (route.is_offscreen_presentation()) {
183 DCHECK(!ContainsKey(offscreen_presentation_connections_, presentation_id));
184 std::unique_ptr<OffscreenPresentationConnection> offscreen_connection =
185 offscreen_presentation_manager_->ConnectToOffscreenPresentation(
186 presentation_id, render_frame_host_id_);
187
188 // |offscreen_connection| could be nullptr for a couple of reasons:
189 // 1) An OffscreenPresentationConnection for presentation_id already exists.
190 // This could be due to a race between two or more route requests.
191 // 2) The receiver is already gone, so the route will die soon. This should
192 // happen very rarely since the receiver has to unregister itself between
193 // when offscreen presentation was created and when the resulting route
194 // arrived at MR.
195 if (!offscreen_connection) {
196 // TODO(imcheng): we should probably reject the route request and detach
197 // the route in this case. crbug.com/513859
198 DLOG(ERROR) << "CreateOffscreenPresentationConnection returned nullptr.";
199 } else {
200 offscreen_presentation_connections_.insert(
201 std::make_pair(presentation_id, std::move(offscreen_connection)));
202 }
203 }
153 } 204 }
154 205
155 const MediaRoute::Id PresentationFrame::GetRouteId( 206 const MediaRoute::Id PresentationFrame::GetRouteId(
156 const std::string& presentation_id) const { 207 const std::string& presentation_id) const {
157 auto it = presentation_id_to_route_id_.find(presentation_id); 208 auto it = presentation_id_to_route_id_.find(presentation_id);
158 return it != presentation_id_to_route_id_.end() ? it->second : ""; 209 return it != presentation_id_to_route_id_.end() ? it->second : "";
159 } 210 }
160 211
161 const std::vector<MediaRoute::Id> PresentationFrame::GetRouteIds() const {
162 std::vector<MediaRoute::Id> route_ids;
163 for (const auto& e : presentation_id_to_route_id_)
164 route_ids.push_back(e.second);
165 return route_ids;
166 }
167
168 bool PresentationFrame::SetScreenAvailabilityListener( 212 bool PresentationFrame::SetScreenAvailabilityListener(
169 content::PresentationScreenAvailabilityListener* listener) { 213 content::PresentationScreenAvailabilityListener* listener) {
170 MediaSource source(GetMediaSourceFromListener(listener)); 214 MediaSource source(GetMediaSourceFromListener(listener));
171 auto& sinks_observer = url_to_sinks_observer_[source.id()]; 215 auto& sinks_observer = url_to_sinks_observer_[source.id()];
172 if (sinks_observer && sinks_observer->listener() == listener) 216 if (sinks_observer && sinks_observer->listener() == listener)
173 return false; 217 return false;
174 218
175 sinks_observer.reset(new PresentationMediaSinksObserver( 219 sinks_observer.reset(new PresentationMediaSinksObserver(
176 router_, listener, source, 220 router_, listener, source,
177 GetLastCommittedURLForFrame(render_frame_host_id_).GetOrigin())); 221 GetLastCommittedURLForFrame(render_frame_host_id_).GetOrigin()));
(...skipping 20 matching lines...) Expand all
198 } 242 }
199 243
200 bool PresentationFrame::HasScreenAvailabilityListenerForTest( 244 bool PresentationFrame::HasScreenAvailabilityListenerForTest(
201 const MediaSource::Id& source_id) const { 245 const MediaSource::Id& source_id) const {
202 return url_to_sinks_observer_.find(source_id) != url_to_sinks_observer_.end(); 246 return url_to_sinks_observer_.find(source_id) != url_to_sinks_observer_.end();
203 } 247 }
204 248
205 void PresentationFrame::Reset() { 249 void PresentationFrame::Reset() {
206 for (const auto& pid_route_id : presentation_id_to_route_id_) 250 for (const auto& pid_route_id : presentation_id_to_route_id_)
207 router_->DetachRoute(pid_route_id.second); 251 router_->DetachRoute(pid_route_id.second);
208
209 presentation_id_to_route_id_.clear(); 252 presentation_id_to_route_id_.clear();
210 url_to_sinks_observer_.clear(); 253 url_to_sinks_observer_.clear();
254 offscreen_presentation_connections_.clear();
211 connection_state_subscriptions_.clear(); 255 connection_state_subscriptions_.clear();
212 session_messages_observers_.clear(); 256 session_messages_observers_.clear();
213 } 257 }
214 258
215 void PresentationFrame::RemoveConnection(const std::string& presentation_id, 259 void PresentationFrame::SendMessage(
216 const MediaRoute::Id& route_id) { 260 const content::PresentationSessionInfo& session,
261 std::unique_ptr<content::PresentationSessionMessage> message,
262 const content::SendMessageCallback send_message_cb) {
263 OffscreenPresentationConnection* offscreen_connection =
264 FindOffscreenConnection(session.presentation_id);
265 if (offscreen_connection) {
266 offscreen_connection->SendMessage(std::move(message), send_message_cb);
267 } else {
268 auto it = presentation_id_to_route_id_.find(session.presentation_id);
269 if (it == presentation_id_to_route_id_.end()) {
270 DVLOG(2) << "ListenForSessionMessages: no route for "
271 << session.presentation_id;
272 return;
273 }
274 if (message->is_binary()) {
275 router_->SendRouteBinaryMessage(it->second, std::move(message->data),
276 send_message_cb);
277 } else {
278 router_->SendRouteMessage(it->second, message->message, send_message_cb);
279 }
280 }
281 }
282
283 OffscreenPresentationConnection* PresentationFrame::FindOffscreenConnection(
284 const std::string& presentation_id) const {
285 auto offscreen_connection_it =
286 offscreen_presentation_connections_.find(presentation_id);
287 return offscreen_connection_it != offscreen_presentation_connections_.end()
288 ? offscreen_connection_it->second.get()
289 : nullptr;
290 }
291
292 void PresentationFrame::RemoveConnection(
293 const std::string& presentation_id,
294 const content::PresentationConnectionStateChangeInfo& state_change_info) {
295 auto it = presentation_id_to_route_id_.find(presentation_id);
296 if (it == presentation_id_to_route_id_.end())
297 return;
298
217 // Remove the presentation id mapping so a later call to Reset is a no-op. 299 // Remove the presentation id mapping so a later call to Reset is a no-op.
218 presentation_id_to_route_id_.erase(presentation_id); 300 MediaRoute::Id route_id = it->second;
301 presentation_id_to_route_id_.erase(it);
219 302
303 if (OffscreenPresentationConnection* offscreen_connection =
304 FindOffscreenConnection(presentation_id)) {
305 offscreen_connection->RemoveFromPresentation(state_change_info);
306 offscreen_presentation_connections_.erase(presentation_id);
307 return;
308 }
309
310 // Not an offscreen presentation.
220 // We no longer need to observe route messages. 311 // We no longer need to observe route messages.
221 auto observer_iter = std::find_if( 312 auto observer_iter = std::find_if(
222 session_messages_observers_.begin(), session_messages_observers_.end(), 313 session_messages_observers_.begin(), session_messages_observers_.end(),
223 [&route_id](const PresentationSessionMessagesObserver* observer) { 314 [&route_id](const PresentationSessionMessagesObserver* observer) {
224 return route_id == observer->route_id(); 315 return route_id == observer->route_id();
225 }); 316 });
226 if (observer_iter != session_messages_observers_.end()) 317 if (observer_iter != session_messages_observers_.end())
227 session_messages_observers_.erase(observer_iter); 318 session_messages_observers_.erase(observer_iter);
228 319
229 // We keep the PresentationConnectionStateChangedCallback registered with MR 320 // We keep the PresentationConnectionStateChangedCallback registered with MR
230 // so the MRP can tell us when terminate() completed. 321 // so the MRP can tell us when terminate() completed.
231 } 322 }
232 323
233 void PresentationFrame::ListenForConnectionStateChange( 324 void PresentationFrame::ListenForConnectionStateChange(
234 const content::PresentationSessionInfo& connection, 325 const content::PresentationSessionInfo& connection,
235 const content::PresentationConnectionStateChangedCallback& 326 const content::PresentationConnectionStateChangedCallback&
236 state_changed_cb) { 327 state_changed_cb) {
237 auto it = presentation_id_to_route_id_.find(connection.presentation_id); 328 auto it = presentation_id_to_route_id_.find(connection.presentation_id);
238 if (it == presentation_id_to_route_id_.end()) { 329 if (it == presentation_id_to_route_id_.end()) {
239 DLOG(ERROR) << __FUNCTION__ << "route id not found for presentation: " 330 DLOG(ERROR) << __FUNCTION__ << "route id not found for presentation: "
240 << connection.presentation_id; 331 << connection.presentation_id;
241 return; 332 return;
242 } 333 }
243 334
335 // An offscreen controller presentation listens for state change from both
336 // the receiver and MR.
337 OffscreenPresentationConnection* offscreen_connection =
338 FindOffscreenConnection(connection.presentation_id);
339 if (offscreen_connection) {
340 offscreen_connection->ListenForStateChange(state_changed_cb);
341 }
342
244 const MediaRoute::Id& route_id = it->second; 343 const MediaRoute::Id& route_id = it->second;
245 if (connection_state_subscriptions_.contains(route_id)) { 344 if (connection_state_subscriptions_.contains(route_id)) {
246 DLOG(ERROR) << __FUNCTION__ << "Already listening connection state change " 345 DLOG(ERROR) << __FUNCTION__ << "Already listening connection state change "
247 "for route: " 346 "for route: "
248 << route_id; 347 << route_id;
249 return; 348 return;
250 } 349 }
251 350
252 connection_state_subscriptions_.add( 351 connection_state_subscriptions_.add(
253 route_id, router_->AddPresentationConnectionStateChangedCallback( 352 route_id, router_->AddPresentationConnectionStateChangedCallback(
254 it->second, state_changed_cb)); 353 it->second, state_changed_cb));
255 } 354 }
256 355
257 void PresentationFrame::ListenForSessionMessages( 356 void PresentationFrame::ListenForSessionMessages(
258 const content::PresentationSessionInfo& session, 357 const content::PresentationSessionInfo& session,
259 const content::PresentationSessionMessageCallback& message_cb) { 358 const content::PresentationSessionMessageCallback& message_cb) {
260 auto it = presentation_id_to_route_id_.find(session.presentation_id); 359 auto it = presentation_id_to_route_id_.find(session.presentation_id);
261 if (it == presentation_id_to_route_id_.end()) { 360 if (it == presentation_id_to_route_id_.end()) {
262 DVLOG(2) << "ListenForSessionMessages: no route for " 361 DVLOG(2) << "ListenForSessionMessages: no route for "
263 << session.presentation_id; 362 << session.presentation_id;
264 return; 363 return;
265 } 364 }
266 365
366 // An offscreen controller presentation listens for messages from both the
367 // receiver and MR.
368 OffscreenPresentationConnection* offscreen_connection =
369 FindOffscreenConnection(session.presentation_id);
370 if (offscreen_connection) {
371 offscreen_connection->ListenForMessages(message_cb);
372 }
373
374 // TODO(imcheng): Limit to 1 observer per presentation.
267 session_messages_observers_.push_back( 375 session_messages_observers_.push_back(
268 new PresentationSessionMessagesObserver(message_cb, it->second, router_)); 376 new PresentationSessionMessagesObserver(message_cb, it->second, router_));
269 } 377 }
270 378
271 MediaSource PresentationFrame::GetMediaSourceFromListener( 379 MediaSource PresentationFrame::GetMediaSourceFromListener(
272 content::PresentationScreenAvailabilityListener* listener) const { 380 content::PresentationScreenAvailabilityListener* listener) const {
273 // If the default presentation URL is empty then fall back to tab mirroring. 381 // If the default presentation URL is empty then fall back to tab mirroring.
274 std::string availability_url(listener->GetAvailabilityUrl()); 382 std::string availability_url(listener->GetAvailabilityUrl());
275 return availability_url.empty() 383 return availability_url.empty()
276 ? MediaSourceForTab(SessionTabHelper::IdForTab(web_contents_)) 384 ? MediaSourceForTab(SessionTabHelper::IdForTab(web_contents_))
277 : MediaSourceForPresentationUrl(availability_url); 385 : MediaSourceForPresentationUrl(availability_url);
278 } 386 }
279 387
280 // Used by PresentationServiceDelegateImpl to manage PresentationFrames. 388 // Used by PresentationServiceDelegateImpl to manage PresentationFrames.
281 class PresentationFrameManager { 389 class PresentationFrameManager {
282 public: 390 public:
283 PresentationFrameManager(content::WebContents* web_contents, 391 PresentationFrameManager(content::WebContents* web_contents,
284 MediaRouter* router); 392 MediaRouter* router);
285 ~PresentationFrameManager(); 393 ~PresentationFrameManager();
286 394
287 // Mirror corresponding APIs in PresentationServiceDelegateImpl. 395 // Mirror corresponding APIs in PresentationServiceDelegateImpl.
288 bool SetScreenAvailabilityListener( 396 bool SetScreenAvailabilityListener(
289 const RenderFrameHostId& render_frame_host_id, 397 const RenderFrameHostId& render_frame_host_id,
290 content::PresentationScreenAvailabilityListener* listener); 398 content::PresentationScreenAvailabilityListener* listener);
291 bool RemoveScreenAvailabilityListener( 399 bool RemoveScreenAvailabilityListener(
292 const RenderFrameHostId& render_frame_host_id, 400 const RenderFrameHostId& render_frame_host_id,
293 content::PresentationScreenAvailabilityListener* listener); 401 content::PresentationScreenAvailabilityListener* listener);
402 void SendMessage(const RenderFrameHostId& render_frame_host_id,
403 const content::PresentationSessionInfo& session,
404 std::unique_ptr<content::PresentationSessionMessage> message,
405 const content::SendMessageCallback send_message_cb);
294 void ListenForConnectionStateChange( 406 void ListenForConnectionStateChange(
295 const RenderFrameHostId& render_frame_host_id, 407 const RenderFrameHostId& render_frame_host_id,
296 const content::PresentationSessionInfo& connection, 408 const content::PresentationSessionInfo& connection,
297 const content::PresentationConnectionStateChangedCallback& 409 const content::PresentationConnectionStateChangedCallback&
298 state_changed_cb); 410 state_changed_cb);
299 void ListenForSessionMessages( 411 void ListenForSessionMessages(
300 const RenderFrameHostId& render_frame_host_id, 412 const RenderFrameHostId& render_frame_host_id,
301 const content::PresentationSessionInfo& session, 413 const content::PresentationSessionInfo& session,
302 const content::PresentationSessionMessageCallback& message_cb); 414 const content::PresentationSessionMessageCallback& message_cb);
303 415
304 // Sets or clears the default presentation request and callback for the given 416 // Sets or clears the default presentation request and callback for the given
305 // frame. Also sets / clears the default presentation requests for the owning 417 // frame. Also sets / clears the default presentation requests for the owning
306 // tab WebContents. 418 // tab WebContents.
307 void SetDefaultPresentationUrl( 419 void SetDefaultPresentationUrl(
308 const RenderFrameHostId& render_frame_host_id, 420 const RenderFrameHostId& render_frame_host_id,
309 const std::string& default_presentation_url, 421 const std::string& default_presentation_url,
310 const content::PresentationSessionStartedCallback& callback); 422 const content::PresentationSessionStartedCallback& callback);
311 void AddDelegateObserver(const RenderFrameHostId& render_frame_host_id, 423 void AddDelegateObserver(const RenderFrameHostId& render_frame_host_id,
312 DelegateObserver* observer); 424 DelegateObserver* observer);
313 void RemoveDelegateObserver(const RenderFrameHostId& render_frame_host_id); 425 void RemoveDelegateObserver(const RenderFrameHostId& render_frame_host_id);
314 void AddDefaultPresentationRequestObserver( 426 void AddDefaultPresentationRequestObserver(
315 PresentationServiceDelegateImpl::DefaultPresentationRequestObserver* 427 PresentationServiceDelegateImpl::DefaultPresentationRequestObserver*
316 observer); 428 observer);
317 void RemoveDefaultPresentationRequestObserver( 429 void RemoveDefaultPresentationRequestObserver(
318 PresentationServiceDelegateImpl::DefaultPresentationRequestObserver* 430 PresentationServiceDelegateImpl::DefaultPresentationRequestObserver*
319 observer); 431 observer);
320 void Reset(const RenderFrameHostId& render_frame_host_id); 432 void Reset(const RenderFrameHostId& render_frame_host_id);
321 void RemoveConnection(const RenderFrameHostId& render_frame_host_id, 433 void RemoveConnection(
322 const MediaRoute::Id& route_id, 434 const RenderFrameHostId& render_frame_host_id,
323 const std::string& presentation_id); 435 const std::string& presentation_id,
436 const content::PresentationConnectionStateChangeInfo& state_change_info);
324 bool HasScreenAvailabilityListenerForTest( 437 bool HasScreenAvailabilityListenerForTest(
325 const RenderFrameHostId& render_frame_host_id, 438 const RenderFrameHostId& render_frame_host_id,
326 const MediaSource::Id& source_id) const; 439 const MediaSource::Id& source_id) const;
327 void SetMediaRouterForTest(MediaRouter* router); 440 void SetMediaRouterForTest(MediaRouter* router);
328 441
329 void OnPresentationSessionStarted( 442 void OnPresentationSessionStarted(
330 const RenderFrameHostId& render_frame_host_id, 443 const RenderFrameHostId& render_frame_host_id,
331 const content::PresentationSessionInfo& session, 444 const content::PresentationSessionInfo& session,
332 const MediaRoute::Id& route_id); 445 const MediaRoute& route);
333 void OnDefaultPresentationSessionStarted( 446 void OnDefaultPresentationSessionStarted(
334 const PresentationRequest& request, 447 const PresentationRequest& request,
335 const content::PresentationSessionInfo& session, 448 const content::PresentationSessionInfo& session,
336 const MediaRoute::Id& route_id); 449 const MediaRoute& route);
337 450
338 const MediaRoute::Id GetRouteId(const RenderFrameHostId& render_frame_host_id, 451 const MediaRoute::Id GetRouteId(const RenderFrameHostId& render_frame_host_id,
339 const std::string& presentation_id) const; 452 const std::string& presentation_id) const;
340 const std::vector<MediaRoute::Id> GetRouteIds(
341 const RenderFrameHostId& render_frame_host_id) const;
342 453
343 const PresentationRequest* default_presentation_request() const { 454 const PresentationRequest* default_presentation_request() const {
344 return default_presentation_request_.get(); 455 return default_presentation_request_.get();
345 } 456 }
346 457
347 private: 458 private:
348 PresentationFrame* GetOrAddPresentationFrame( 459 PresentationFrame* GetOrAddPresentationFrame(
349 const RenderFrameHostId& render_frame_host_id); 460 const RenderFrameHostId& render_frame_host_id);
350 461
351 // Sets the default presentation request for the owning WebContents and 462 // Sets the default presentation request for the owning WebContents and
(...skipping 20 matching lines...) Expand all
372 content::PresentationSessionStartedCallback 483 content::PresentationSessionStartedCallback
373 default_presentation_started_callback_; 484 default_presentation_started_callback_;
374 485
375 // References to the observers listening for changes to this tab WebContent's 486 // References to the observers listening for changes to this tab WebContent's
376 // default presentation. 487 // default presentation.
377 base::ObserverList< 488 base::ObserverList<
378 PresentationServiceDelegateImpl::DefaultPresentationRequestObserver> 489 PresentationServiceDelegateImpl::DefaultPresentationRequestObserver>
379 default_presentation_request_observers_; 490 default_presentation_request_observers_;
380 491
381 // References to the owning WebContents, and the corresponding MediaRouter. 492 // References to the owning WebContents, and the corresponding MediaRouter.
493 content::WebContents* const web_contents_;
382 MediaRouter* router_; 494 MediaRouter* router_;
383 content::WebContents* web_contents_;
384 }; 495 };
385 496
386 PresentationFrameManager::PresentationFrameManager( 497 PresentationFrameManager::PresentationFrameManager(
387 content::WebContents* web_contents, 498 content::WebContents* web_contents,
388 MediaRouter* router) 499 MediaRouter* router)
389 : router_(router), web_contents_(web_contents) { 500 : web_contents_(web_contents), router_(router) {
390 DCHECK(web_contents_); 501 DCHECK(web_contents_);
391 DCHECK(router_); 502 DCHECK(router_);
392 } 503 }
393 504
394 PresentationFrameManager::~PresentationFrameManager() { 505 PresentationFrameManager::~PresentationFrameManager() {
395 for (auto& frame : presentation_frames_) 506 for (auto& frame : presentation_frames_)
396 frame.second->OnPresentationServiceDelegateDestroyed(); 507 frame.second->OnPresentationServiceDelegateDestroyed();
397 } 508 }
398 509
399 void PresentationFrameManager::OnPresentationSessionStarted( 510 void PresentationFrameManager::OnPresentationSessionStarted(
400 const RenderFrameHostId& render_frame_host_id, 511 const RenderFrameHostId& render_frame_host_id,
401 const content::PresentationSessionInfo& session, 512 const content::PresentationSessionInfo& session,
402 const MediaRoute::Id& route_id) { 513 const MediaRoute& route) {
403 auto presentation_frame = GetOrAddPresentationFrame(render_frame_host_id); 514 auto presentation_frame = GetOrAddPresentationFrame(render_frame_host_id);
404 presentation_frame->OnPresentationSessionStarted(session, route_id); 515 presentation_frame->OnPresentationSessionStarted(session, route);
405 } 516 }
406 517
407 void PresentationFrameManager::OnDefaultPresentationSessionStarted( 518 void PresentationFrameManager::OnDefaultPresentationSessionStarted(
408 const PresentationRequest& request, 519 const PresentationRequest& request,
409 const content::PresentationSessionInfo& session, 520 const content::PresentationSessionInfo& session,
410 const MediaRoute::Id& route_id) { 521 const MediaRoute& route) {
411 auto presentation_frame = 522 auto presentation_frame =
412 presentation_frames_.get(request.render_frame_host_id()); 523 presentation_frames_.get(request.render_frame_host_id());
413 if (presentation_frame) 524 if (presentation_frame)
414 presentation_frame->OnPresentationSessionStarted(session, route_id); 525 presentation_frame->OnPresentationSessionStarted(session, route);
415 526
416 if (default_presentation_request_ && 527 if (default_presentation_request_ &&
417 default_presentation_request_->Equals(request)) { 528 default_presentation_request_->Equals(request)) {
418 default_presentation_started_callback_.Run(session); 529 default_presentation_started_callback_.Run(session);
419 } 530 }
420 } 531 }
421 532
422 const MediaRoute::Id PresentationFrameManager::GetRouteId( 533 const MediaRoute::Id PresentationFrameManager::GetRouteId(
423 const RenderFrameHostId& render_frame_host_id, 534 const RenderFrameHostId& render_frame_host_id,
424 const std::string& presentation_id) const { 535 const std::string& presentation_id) const {
425 auto presentation_frame = presentation_frames_.get(render_frame_host_id); 536 auto presentation_frame = presentation_frames_.get(render_frame_host_id);
426 return presentation_frame ? presentation_frame->GetRouteId(presentation_id) 537 return presentation_frame ? presentation_frame->GetRouteId(presentation_id)
427 : ""; 538 : "";
428 } 539 }
429 540
430 const std::vector<MediaRoute::Id> PresentationFrameManager::GetRouteIds(
431 const RenderFrameHostId& render_frame_host_id) const {
432 auto presentation_frame = presentation_frames_.get(render_frame_host_id);
433 return presentation_frame ? presentation_frame->GetRouteIds()
434 : std::vector<MediaRoute::Id>();
435 }
436
437 bool PresentationFrameManager::SetScreenAvailabilityListener( 541 bool PresentationFrameManager::SetScreenAvailabilityListener(
438 const RenderFrameHostId& render_frame_host_id, 542 const RenderFrameHostId& render_frame_host_id,
439 content::PresentationScreenAvailabilityListener* listener) { 543 content::PresentationScreenAvailabilityListener* listener) {
440 DCHECK(listener); 544 DCHECK(listener);
441 auto presentation_frame = GetOrAddPresentationFrame(render_frame_host_id); 545 auto presentation_frame = GetOrAddPresentationFrame(render_frame_host_id);
442 return presentation_frame->SetScreenAvailabilityListener(listener); 546 return presentation_frame->SetScreenAvailabilityListener(listener);
443 } 547 }
444 548
445 bool PresentationFrameManager::RemoveScreenAvailabilityListener( 549 bool PresentationFrameManager::RemoveScreenAvailabilityListener(
446 const RenderFrameHostId& render_frame_host_id, 550 const RenderFrameHostId& render_frame_host_id,
447 content::PresentationScreenAvailabilityListener* listener) { 551 content::PresentationScreenAvailabilityListener* listener) {
448 DCHECK(listener); 552 DCHECK(listener);
449 auto presentation_frame = presentation_frames_.get(render_frame_host_id); 553 auto presentation_frame = presentation_frames_.get(render_frame_host_id);
450 return presentation_frame && 554 return presentation_frame &&
451 presentation_frame->RemoveScreenAvailabilityListener(listener); 555 presentation_frame->RemoveScreenAvailabilityListener(listener);
452 } 556 }
453 557
454 bool PresentationFrameManager::HasScreenAvailabilityListenerForTest( 558 bool PresentationFrameManager::HasScreenAvailabilityListenerForTest(
455 const RenderFrameHostId& render_frame_host_id, 559 const RenderFrameHostId& render_frame_host_id,
456 const MediaSource::Id& source_id) const { 560 const MediaSource::Id& source_id) const {
457 auto presentation_frame = presentation_frames_.get(render_frame_host_id); 561 auto presentation_frame = presentation_frames_.get(render_frame_host_id);
458 return presentation_frame && 562 return presentation_frame &&
459 presentation_frame->HasScreenAvailabilityListenerForTest(source_id); 563 presentation_frame->HasScreenAvailabilityListenerForTest(source_id);
460 } 564 }
461 565
566 void PresentationFrameManager::SendMessage(
567 const RenderFrameHostId& render_frame_host_id,
568 const content::PresentationSessionInfo& session,
569 std::unique_ptr<content::PresentationSessionMessage> message,
570 const content::SendMessageCallback send_message_cb) {
571 PresentationFrame* presentation_frame =
572 presentation_frames_.get(render_frame_host_id);
573 if (!presentation_frame) {
574 DVLOG(2) << "SendMessage: PresentationFrame does not exist "
575 << "for: (" << render_frame_host_id.first << ", "
576 << render_frame_host_id.second << ")";
577 send_message_cb.Run(false);
578 return;
579 }
580
581 presentation_frame->SendMessage(session, std::move(message), send_message_cb);
582 }
583
462 void PresentationFrameManager::ListenForConnectionStateChange( 584 void PresentationFrameManager::ListenForConnectionStateChange(
463 const RenderFrameHostId& render_frame_host_id, 585 const RenderFrameHostId& render_frame_host_id,
464 const content::PresentationSessionInfo& connection, 586 const content::PresentationSessionInfo& connection,
465 const content::PresentationConnectionStateChangedCallback& 587 const content::PresentationConnectionStateChangedCallback&
466 state_changed_cb) { 588 state_changed_cb) {
467 auto presentation_frame = presentation_frames_.get(render_frame_host_id); 589 auto presentation_frame = presentation_frames_.get(render_frame_host_id);
468 if (presentation_frame) { 590 if (presentation_frame) {
469 presentation_frame->ListenForConnectionStateChange(connection, 591 presentation_frame->ListenForConnectionStateChange(connection,
470 state_changed_cb); 592 state_changed_cb);
471 } 593 }
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
541 663
542 if (default_presentation_request_ && 664 if (default_presentation_request_ &&
543 render_frame_host_id == 665 render_frame_host_id ==
544 default_presentation_request_->render_frame_host_id()) { 666 default_presentation_request_->render_frame_host_id()) {
545 ClearDefaultPresentationRequest(); 667 ClearDefaultPresentationRequest();
546 } 668 }
547 } 669 }
548 670
549 void PresentationFrameManager::RemoveConnection( 671 void PresentationFrameManager::RemoveConnection(
550 const RenderFrameHostId& render_frame_host_id, 672 const RenderFrameHostId& render_frame_host_id,
551 const MediaRoute::Id& route_id, 673 const std::string& presentation_id,
552 const std::string& presentation_id) { 674 const content::PresentationConnectionStateChangeInfo& state_change_info) {
553 auto presentation_frame = presentation_frames_.get(render_frame_host_id); 675 auto presentation_frame = presentation_frames_.get(render_frame_host_id);
554 if (presentation_frame) 676 if (presentation_frame)
555 presentation_frame->RemoveConnection(route_id, presentation_id); 677 presentation_frame->RemoveConnection(presentation_id, state_change_info);
556 } 678 }
557 679
558 PresentationFrame* PresentationFrameManager::GetOrAddPresentationFrame( 680 PresentationFrame* PresentationFrameManager::GetOrAddPresentationFrame(
559 const RenderFrameHostId& render_frame_host_id) { 681 const RenderFrameHostId& render_frame_host_id) {
560 if (!presentation_frames_.contains(render_frame_host_id)) { 682 if (!presentation_frames_.contains(render_frame_host_id)) {
561 presentation_frames_.add( 683 presentation_frames_.add(
562 render_frame_host_id, 684 render_frame_host_id,
563 std::unique_ptr<PresentationFrame>(new PresentationFrame( 685 std::unique_ptr<PresentationFrame>(new PresentationFrame(
564 render_frame_host_id, web_contents_, router_))); 686 render_frame_host_id, web_contents_, router_)));
565 } 687 }
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
679 const content::PresentationSessionStartedCallback& success_cb, 801 const content::PresentationSessionStartedCallback& success_cb,
680 const content::PresentationSessionErrorCallback& error_cb, 802 const content::PresentationSessionErrorCallback& error_cb,
681 const RouteRequestResult& result) { 803 const RouteRequestResult& result) {
682 if (!result.route()) { 804 if (!result.route()) {
683 error_cb.Run(content::PresentationError( 805 error_cb.Run(content::PresentationError(
684 content::PRESENTATION_ERROR_NO_PRESENTATION_FOUND, result.error())); 806 content::PRESENTATION_ERROR_NO_PRESENTATION_FOUND, result.error()));
685 } else { 807 } else {
686 DVLOG(1) << "OnJoinRouteResponse: " 808 DVLOG(1) << "OnJoinRouteResponse: "
687 << "route_id: " << result.route()->media_route_id() 809 << "route_id: " << result.route()->media_route_id()
688 << ", presentation URL: " << session.presentation_url 810 << ", presentation URL: " << session.presentation_url
689 << ", presentation ID: " << session.presentation_id; 811 << ", presentation ID: " << session.presentation_id
812 << ", offscreen? " << result.route()->is_offscreen_presentation();
690 DCHECK_EQ(session.presentation_id, result.presentation_id()); 813 DCHECK_EQ(session.presentation_id, result.presentation_id());
691 frame_manager_->OnPresentationSessionStarted( 814 frame_manager_->OnPresentationSessionStarted(
692 RenderFrameHostId(render_process_id, render_frame_id), session, 815 RenderFrameHostId(render_process_id, render_frame_id), session,
693 result.route()->media_route_id()); 816 *result.route());
694 success_cb.Run(session); 817 success_cb.Run(session);
695 } 818 }
696 } 819 }
697 820
698 void PresentationServiceDelegateImpl::OnStartSessionSucceeded( 821 void PresentationServiceDelegateImpl::OnStartSessionSucceeded(
699 int render_process_id, 822 int render_process_id,
700 int render_frame_id, 823 int render_frame_id,
701 const content::PresentationSessionStartedCallback& success_cb, 824 const content::PresentationSessionStartedCallback& success_cb,
702 const content::PresentationSessionInfo& new_session, 825 const content::PresentationSessionInfo& new_session,
703 const MediaRoute::Id& route_id) { 826 const MediaRoute& route) {
827 const MediaRoute::Id& route_id = route.media_route_id();
704 DVLOG(1) << "OnStartSessionSucceeded: " 828 DVLOG(1) << "OnStartSessionSucceeded: "
705 << "route_id: " << route_id 829 << "route_id: " << route_id
706 << ", presentation URL: " << new_session.presentation_url 830 << ", presentation URL: " << new_session.presentation_url
707 << ", presentation ID: " << new_session.presentation_id; 831 << ", presentation ID: " << new_session.presentation_id;
708 frame_manager_->OnPresentationSessionStarted( 832 frame_manager_->OnPresentationSessionStarted(
709 RenderFrameHostId(render_process_id, render_frame_id), new_session, 833 RenderFrameHostId(render_process_id, render_frame_id), new_session,
710 route_id); 834 route);
711 success_cb.Run(new_session); 835 success_cb.Run(new_session);
712 } 836 }
713 837
714 void PresentationServiceDelegateImpl::StartSession( 838 void PresentationServiceDelegateImpl::StartSession(
715 int render_process_id, 839 int render_process_id,
716 int render_frame_id, 840 int render_frame_id,
717 const std::string& presentation_url, 841 const std::string& presentation_url,
718 const content::PresentationSessionStartedCallback& success_cb, 842 const content::PresentationSessionStartedCallback& success_cb,
719 const content::PresentationSessionErrorCallback& error_cb) { 843 const content::PresentationSessionErrorCallback& error_cb) {
720 if (presentation_url.empty() || !IsValidPresentationUrl(presentation_url)) { 844 if (presentation_url.empty() || !IsValidPresentationUrl(presentation_url)) {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
771 const std::string& presentation_id) { 895 const std::string& presentation_id) {
772 const RenderFrameHostId rfh_id(render_process_id, render_frame_id); 896 const RenderFrameHostId rfh_id(render_process_id, render_frame_id);
773 const MediaRoute::Id& route_id = 897 const MediaRoute::Id& route_id =
774 frame_manager_->GetRouteId(rfh_id, presentation_id); 898 frame_manager_->GetRouteId(rfh_id, presentation_id);
775 if (route_id.empty()) { 899 if (route_id.empty()) {
776 DVLOG(1) << "No active route for: " << presentation_id; 900 DVLOG(1) << "No active route for: " << presentation_id;
777 return; 901 return;
778 } 902 }
779 903
780 router_->DetachRoute(route_id); 904 router_->DetachRoute(route_id);
781 frame_manager_->RemoveConnection(rfh_id, presentation_id, route_id); 905
906 content::PresentationConnectionStateChangeInfo state_change_info(
907 content::PRESENTATION_CONNECTION_STATE_CLOSED);
908 state_change_info.close_reason =
909 content::PRESENTATION_CONNECTION_CLOSE_REASON_CLOSED;
910 frame_manager_->RemoveConnection(rfh_id, presentation_id, state_change_info);
782 // TODO(mfoltz): close() should always succeed so there is no need to keep the 911 // TODO(mfoltz): close() should always succeed so there is no need to keep the
783 // state_changed_cb around - remove it and fire the ChangeEvent on the 912 // state_changed_cb around - remove it and fire the ChangeEvent on the
784 // PresentationConnection in Blink. 913 // PresentationConnection in Blink.
785 } 914 }
786 915
787 void PresentationServiceDelegateImpl::Terminate( 916 void PresentationServiceDelegateImpl::Terminate(
788 int render_process_id, 917 int render_process_id,
789 int render_frame_id, 918 int render_frame_id,
790 const std::string& presentation_id) { 919 const std::string& presentation_id) {
791 const RenderFrameHostId rfh_id(render_process_id, render_frame_id); 920 const RenderFrameHostId rfh_id(render_process_id, render_frame_id);
792 const MediaRoute::Id& route_id = 921 const MediaRoute::Id& route_id =
793 frame_manager_->GetRouteId(rfh_id, presentation_id); 922 frame_manager_->GetRouteId(rfh_id, presentation_id);
794 if (route_id.empty()) { 923 if (route_id.empty()) {
795 DVLOG(1) << "No active route for: " << presentation_id; 924 DVLOG(1) << "No active route for: " << presentation_id;
796 return; 925 return;
797 } 926 }
927
798 router_->TerminateRoute(route_id); 928 router_->TerminateRoute(route_id);
799 frame_manager_->RemoveConnection(rfh_id, presentation_id, route_id); 929
930 content::PresentationConnectionStateChangeInfo state_change_info(
931 content::PRESENTATION_CONNECTION_STATE_TERMINATED);
932 frame_manager_->RemoveConnection(rfh_id, presentation_id, state_change_info);
800 } 933 }
801 934
802 void PresentationServiceDelegateImpl::ListenForSessionMessages( 935 void PresentationServiceDelegateImpl::ListenForSessionMessages(
803 int render_process_id, 936 int render_process_id,
804 int render_frame_id, 937 int render_frame_id,
805 const content::PresentationSessionInfo& session, 938 const content::PresentationSessionInfo& session,
806 const content::PresentationSessionMessageCallback& message_cb) { 939 const content::PresentationSessionMessageCallback& message_cb) {
807 frame_manager_->ListenForSessionMessages( 940 RenderFrameHostId render_frame_host_id(render_process_id, render_frame_id);
808 RenderFrameHostId(render_process_id, render_frame_id), session, 941 frame_manager_->ListenForSessionMessages(render_frame_host_id, session,
809 message_cb); 942 message_cb);
810 } 943 }
811 944
812 void PresentationServiceDelegateImpl::SendMessage( 945 void PresentationServiceDelegateImpl::SendMessage(
813 int render_process_id, 946 int render_process_id,
814 int render_frame_id, 947 int render_frame_id,
815 const content::PresentationSessionInfo& session, 948 const content::PresentationSessionInfo& session,
816 std::unique_ptr<content::PresentationSessionMessage> message, 949 std::unique_ptr<content::PresentationSessionMessage> message,
817 const SendMessageCallback& send_message_cb) { 950 const content::SendMessageCallback& send_message_cb) {
818 const MediaRoute::Id& route_id = frame_manager_->GetRouteId( 951 RenderFrameHostId render_frame_host_id(render_process_id, render_frame_id);
819 RenderFrameHostId(render_process_id, render_frame_id), 952 frame_manager_->SendMessage(render_frame_host_id, session, std::move(message),
820 session.presentation_id); 953 send_message_cb);
821 if (route_id.empty()) {
822 DVLOG(1) << "No active route for " << session.presentation_id;
823 send_message_cb.Run(false);
824 return;
825 }
826
827 if (message->is_binary()) {
828 router_->SendRouteBinaryMessage(route_id, std::move(message->data),
829 send_message_cb);
830 } else {
831 router_->SendRouteMessage(route_id, message->message, send_message_cb);
832 }
833 } 954 }
834 955
835 void PresentationServiceDelegateImpl::ListenForConnectionStateChange( 956 void PresentationServiceDelegateImpl::ListenForConnectionStateChange(
836 int render_process_id, 957 int render_process_id,
837 int render_frame_id, 958 int render_frame_id,
838 const content::PresentationSessionInfo& connection, 959 const content::PresentationSessionInfo& connection,
839 const content::PresentationConnectionStateChangedCallback& 960 const content::PresentationConnectionStateChangedCallback&
840 state_changed_cb) { 961 state_changed_cb) {
841 frame_manager_->ListenForConnectionStateChange( 962 frame_manager_->ListenForConnectionStateChange(
842 RenderFrameHostId(render_process_id, render_frame_id), connection, 963 RenderFrameHostId(render_process_id, render_frame_id), connection,
843 state_changed_cb); 964 state_changed_cb);
844 } 965 }
845 966
967 std::vector<content::PresentationSessionInfo>
968 PresentationServiceDelegateImpl::GetReceiverConnections(
969 int render_process_id,
970 int render_frame_id,
971 const content::PresentationSessionStartedCallback& callback) {
972 // We only support receiver APIs in offscreen tabs created for offscreen
973 // presentations.
974 // See ReceiverPresentationServiceDelegateImpl for details.
975 NOTIMPLEMENTED();
976 return std::vector<content::PresentationSessionInfo>();
977 }
978
846 void PresentationServiceDelegateImpl::OnRouteResponse( 979 void PresentationServiceDelegateImpl::OnRouteResponse(
847 const PresentationRequest& presentation_request, 980 const PresentationRequest& presentation_request,
848 const RouteRequestResult& result) { 981 const RouteRequestResult& result) {
849 if (!result.route()) 982 if (!result.route())
850 return; 983 return;
851 984
852 content::PresentationSessionInfo session_info( 985 content::PresentationSessionInfo session_info(
853 presentation_request.presentation_url(), result.presentation_id()); 986 presentation_request.presentation_url(), result.presentation_id());
854 frame_manager_->OnDefaultPresentationSessionStarted( 987 frame_manager_->OnDefaultPresentationSessionStarted(
855 presentation_request, session_info, result.route()->media_route_id()); 988 presentation_request, session_info, *result.route());
856 } 989 }
857 990
858 void PresentationServiceDelegateImpl::AddDefaultPresentationRequestObserver( 991 void PresentationServiceDelegateImpl::AddDefaultPresentationRequestObserver(
859 DefaultPresentationRequestObserver* observer) { 992 DefaultPresentationRequestObserver* observer) {
860 frame_manager_->AddDefaultPresentationRequestObserver(observer); 993 frame_manager_->AddDefaultPresentationRequestObserver(observer);
861 } 994 }
862 995
863 void PresentationServiceDelegateImpl::RemoveDefaultPresentationRequestObserver( 996 void PresentationServiceDelegateImpl::RemoveDefaultPresentationRequestObserver(
864 DefaultPresentationRequestObserver* observer) { 997 DefaultPresentationRequestObserver* observer) {
865 frame_manager_->RemoveDefaultPresentationRequestObserver(observer); 998 frame_manager_->RemoveDefaultPresentationRequestObserver(observer);
(...skipping 23 matching lines...) Expand all
889 bool PresentationServiceDelegateImpl::HasScreenAvailabilityListenerForTest( 1022 bool PresentationServiceDelegateImpl::HasScreenAvailabilityListenerForTest(
890 int render_process_id, 1023 int render_process_id,
891 int render_frame_id, 1024 int render_frame_id,
892 const MediaSource::Id& source_id) const { 1025 const MediaSource::Id& source_id) const {
893 RenderFrameHostId render_frame_host_id(render_process_id, render_frame_id); 1026 RenderFrameHostId render_frame_host_id(render_process_id, render_frame_id);
894 return frame_manager_->HasScreenAvailabilityListenerForTest( 1027 return frame_manager_->HasScreenAvailabilityListenerForTest(
895 render_frame_host_id, source_id); 1028 render_frame_host_id, source_id);
896 } 1029 }
897 1030
898 } // namespace media_router 1031 } // namespace media_router
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698