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

Side by Side Diff: content/browser/presentation/presentation_service_impl.cc

Issue 2174693004: [Presentation API] Add support to content/ for multiple URLs per PresentationRequest. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update service, dispatcher to use Mojo URLs. Created 4 years, 4 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 "content/browser/presentation/presentation_service_impl.h" 5 #include "content/browser/presentation/presentation_service_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 #include <algorithm> 9 #include <algorithm>
10 #include <string>
11 #include <utility> 10 #include <utility>
12 #include <vector>
13 11
14 #include "base/logging.h" 12 #include "base/logging.h"
15 #include "base/stl_util.h" 13 #include "base/stl_util.h"
16 #include "content/browser/presentation/presentation_type_converters.h" 14 #include "content/browser/presentation/presentation_type_converters.h"
17 #include "content/public/browser/content_browser_client.h" 15 #include "content/public/browser/content_browser_client.h"
18 #include "content/public/browser/navigation_details.h" 16 #include "content/public/browser/navigation_details.h"
19 #include "content/public/browser/presentation_session_message.h" 17 #include "content/public/browser/presentation_session_message.h"
20 #include "content/public/browser/render_frame_host.h" 18 #include "content/public/browser/render_frame_host.h"
21 #include "content/public/browser/render_process_host.h" 19 #include "content/public/browser/render_process_host.h"
22 #include "content/public/browser/web_contents.h" 20 #include "content/public/browser/web_contents.h"
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 } 174 }
177 175
178 void PresentationServiceImpl::SetClient( 176 void PresentationServiceImpl::SetClient(
179 blink::mojom::PresentationServiceClientPtr client) { 177 blink::mojom::PresentationServiceClientPtr client) {
180 DCHECK(!client_.get()); 178 DCHECK(!client_.get());
181 // TODO(imcheng): Set ErrorHandler to listen for errors. 179 // TODO(imcheng): Set ErrorHandler to listen for errors.
182 client_ = std::move(client); 180 client_ = std::move(client);
183 } 181 }
184 182
185 void PresentationServiceImpl::ListenForScreenAvailability( 183 void PresentationServiceImpl::ListenForScreenAvailability(
186 const std::string& url) { 184 url::mojom::UrlPtr url) {
187 DVLOG(2) << "ListenForScreenAvailability " << url; 185 DVLOG(2) << "ListenForScreenAvailability " << url->url;
188 if (!delegate_) { 186 if (!delegate_) {
189 client_->OnScreenAvailabilityUpdated(url, false); 187 client_->OnScreenAvailabilityUpdated(std::move(url), false);
190 return; 188 return;
191 } 189 }
192 190
193 if (screen_availability_listeners_.count(url)) 191 if (screen_availability_listeners_.count(url->url))
194 return; 192 return;
195 193
196 std::unique_ptr<ScreenAvailabilityListenerImpl> listener( 194 std::unique_ptr<ScreenAvailabilityListenerImpl> listener(
197 new ScreenAvailabilityListenerImpl(url, this)); 195 new ScreenAvailabilityListenerImpl(url->url, this));
198 if (delegate_->AddScreenAvailabilityListener( 196 if (delegate_->AddScreenAvailabilityListener(
199 render_process_id_, 197 render_process_id_,
200 render_frame_id_, 198 render_frame_id_,
201 listener.get())) { 199 listener.get())) {
202 screen_availability_listeners_[url] = std::move(listener); 200 screen_availability_listeners_[url->url] = std::move(listener);
203 } else { 201 } else {
204 DVLOG(1) << "AddScreenAvailabilityListener failed. Ignoring request."; 202 DVLOG(1) << "AddScreenAvailabilityListener failed. Ignoring request.";
205 } 203 }
206 } 204 }
207 205
208 void PresentationServiceImpl::StopListeningForScreenAvailability( 206 void PresentationServiceImpl::StopListeningForScreenAvailability(
209 const std::string& url) { 207 url::mojom::UrlPtr url) {
210 DVLOG(2) << "StopListeningForScreenAvailability " << url; 208 DVLOG(2) << "StopListeningForScreenAvailability " << url->url;
211 if (!delegate_) 209 if (!delegate_)
212 return; 210 return;
213 211
214 auto listener_it = screen_availability_listeners_.find(url); 212 auto listener_it = screen_availability_listeners_.find(url->url);
215 if (listener_it == screen_availability_listeners_.end()) 213 if (listener_it == screen_availability_listeners_.end())
216 return; 214 return;
217 215
218 delegate_->RemoveScreenAvailabilityListener( 216 delegate_->RemoveScreenAvailabilityListener(
219 render_process_id_, render_frame_id_, listener_it->second.get()); 217 render_process_id_, render_frame_id_, listener_it->second.get());
220 screen_availability_listeners_.erase(listener_it); 218 screen_availability_listeners_.erase(listener_it);
221 } 219 }
222 220
223 void PresentationServiceImpl::StartSession(const std::string& presentation_url, 221 void PresentationServiceImpl::StartSession(
224 const NewSessionCallback& callback) { 222 std::vector<url::mojom::UrlPtr> presentation_urls,
223 const NewSessionCallback& callback) {
225 DVLOG(2) << "StartSession"; 224 DVLOG(2) << "StartSession";
226 if (!delegate_) { 225 if (!delegate_) {
227 callback.Run( 226 callback.Run(
228 blink::mojom::PresentationSessionInfoPtr(), 227 blink::mojom::PresentationSessionInfoPtr(),
229 blink::mojom::PresentationError::From(PresentationError( 228 blink::mojom::PresentationError::From(PresentationError(
230 PRESENTATION_ERROR_NO_AVAILABLE_SCREENS, "No screens found."))); 229 PRESENTATION_ERROR_NO_AVAILABLE_SCREENS, "No screens found.")));
231 return; 230 return;
232 } 231 }
233 232
234 // There is a StartSession request in progress. To avoid queueing up 233 // There is a StartSession request in progress. To avoid queueing up
235 // requests, the incoming request is rejected. 234 // requests, the incoming request is rejected.
236 if (start_session_request_id_ != kInvalidRequestSessionId) { 235 if (start_session_request_id_ != kInvalidRequestSessionId) {
237 InvokeNewSessionCallbackWithError(callback); 236 InvokeNewSessionCallbackWithError(callback);
238 return; 237 return;
239 } 238 }
240 239
240 std::vector<std::string> presentation_urls_for_delegate(
241 presentation_urls.size());
242 std::transform(presentation_urls.begin(), presentation_urls.end(),
243 presentation_urls_for_delegate.begin(),
244 [](const url::mojom::UrlPtr& url) { return url->url; });
245
241 start_session_request_id_ = GetNextRequestSessionId(); 246 start_session_request_id_ = GetNextRequestSessionId();
242 pending_start_session_cb_.reset(new NewSessionCallbackWrapper(callback)); 247 pending_start_session_cb_.reset(new NewSessionCallbackWrapper(callback));
243 delegate_->StartSession( 248 delegate_->StartSession(
244 render_process_id_, render_frame_id_, presentation_url, 249 render_process_id_, render_frame_id_, presentation_urls_for_delegate,
245 base::Bind(&PresentationServiceImpl::OnStartSessionSucceeded, 250 base::Bind(&PresentationServiceImpl::OnStartSessionSucceeded,
246 weak_factory_.GetWeakPtr(), start_session_request_id_), 251 weak_factory_.GetWeakPtr(), start_session_request_id_),
247 base::Bind(&PresentationServiceImpl::OnStartSessionError, 252 base::Bind(&PresentationServiceImpl::OnStartSessionError,
248 weak_factory_.GetWeakPtr(), start_session_request_id_)); 253 weak_factory_.GetWeakPtr(), start_session_request_id_));
249 } 254 }
250 255
251 void PresentationServiceImpl::JoinSession( 256 void PresentationServiceImpl::JoinSession(
252 const std::string& presentation_url, 257 std::vector<url::mojom::UrlPtr> presentation_urls,
253 const base::Optional<std::string>& presentation_id, 258 const base::Optional<std::string>& presentation_id,
254 const NewSessionCallback& callback) { 259 const NewSessionCallback& callback) {
255 DVLOG(2) << "JoinSession"; 260 DVLOG(2) << "JoinSession";
256 if (!delegate_) { 261 if (!delegate_) {
257 callback.Run(blink::mojom::PresentationSessionInfoPtr(), 262 callback.Run(blink::mojom::PresentationSessionInfoPtr(),
258 blink::mojom::PresentationError::From(PresentationError( 263 blink::mojom::PresentationError::From(PresentationError(
259 PRESENTATION_ERROR_NO_PRESENTATION_FOUND, 264 PRESENTATION_ERROR_NO_PRESENTATION_FOUND,
260 "Error joining route: No matching route"))); 265 "Error joining route: No matching route")));
261 return; 266 return;
262 } 267 }
263 268
269 std::vector<std::string> presentation_urls_for_delegate(
270 presentation_urls.size());
271 std::transform(presentation_urls.begin(), presentation_urls.end(),
272 presentation_urls_for_delegate.begin(),
273 [](const url::mojom::UrlPtr& url) { return url->url; });
274
264 int request_session_id = RegisterJoinSessionCallback(callback); 275 int request_session_id = RegisterJoinSessionCallback(callback);
265 if (request_session_id == kInvalidRequestSessionId) { 276 if (request_session_id == kInvalidRequestSessionId) {
266 InvokeNewSessionCallbackWithError(callback); 277 InvokeNewSessionCallbackWithError(callback);
267 return; 278 return;
268 } 279 }
269 delegate_->JoinSession( 280 delegate_->JoinSession(
270 render_process_id_, render_frame_id_, presentation_url, 281 render_process_id_, render_frame_id_, presentation_urls_for_delegate,
271 presentation_id.value_or(std::string()), 282 presentation_id.value_or(std::string()),
272 base::Bind(&PresentationServiceImpl::OnJoinSessionSucceeded, 283 base::Bind(&PresentationServiceImpl::OnJoinSessionSucceeded,
273 weak_factory_.GetWeakPtr(), request_session_id), 284 weak_factory_.GetWeakPtr(), request_session_id),
274 base::Bind(&PresentationServiceImpl::OnJoinSessionError, 285 base::Bind(&PresentationServiceImpl::OnJoinSessionError,
275 weak_factory_.GetWeakPtr(), request_session_id)); 286 weak_factory_.GetWeakPtr(), request_session_id));
276 } 287 }
277 288
278 int PresentationServiceImpl::RegisterJoinSessionCallback( 289 int PresentationServiceImpl::RegisterJoinSessionCallback(
279 const NewSessionCallback& callback) { 290 const NewSessionCallback& callback) {
280 if (pending_join_session_cbs_.size() >= kMaxNumQueuedSessionRequests) 291 if (pending_join_session_cbs_.size() >= kMaxNumQueuedSessionRequests)
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 auto it = pending_join_session_cbs_.find(request_session_id); 361 auto it = pending_join_session_cbs_.find(request_session_id);
351 if (it == pending_join_session_cbs_.end()) 362 if (it == pending_join_session_cbs_.end())
352 return false; 363 return false;
353 364
354 DCHECK(it->second.get()); 365 DCHECK(it->second.get());
355 it->second->Run(std::move(session), std::move(error)); 366 it->second->Run(std::move(session), std::move(error));
356 pending_join_session_cbs_.erase(it); 367 pending_join_session_cbs_.erase(it);
357 return true; 368 return true;
358 } 369 }
359 370
360 void PresentationServiceImpl::SetDefaultPresentationURL( 371 void PresentationServiceImpl::SetDefaultPresentationUrls(
361 const std::string& url) { 372 std::vector<url::mojom::UrlPtr> presentation_urls) {
362 DVLOG(2) << "SetDefaultPresentationURL"; 373 DVLOG(2) << "SetDefaultPresentationUrls";
363 if (!delegate_) 374 if (!delegate_)
364 return; 375 return;
365 376
366 if (default_presentation_url_ == url) 377 std::vector<std::string> presentation_urls_for_delegate(
378 presentation_urls.size());
379 std::transform(presentation_urls.begin(), presentation_urls.end(),
380 presentation_urls_for_delegate.begin(),
381 [](const url::mojom::UrlPtr& url) { return url->url; });
382
383 if (default_presentation_urls_ == presentation_urls_for_delegate)
367 return; 384 return;
368 385
369 default_presentation_url_ = url; 386 default_presentation_urls_ = presentation_urls_for_delegate;
370 delegate_->SetDefaultPresentationUrl( 387 delegate_->SetDefaultPresentationUrls(
371 render_process_id_, render_frame_id_, url, 388 render_process_id_, render_frame_id_, presentation_urls_for_delegate,
372 base::Bind(&PresentationServiceImpl::OnDefaultPresentationStarted, 389 base::Bind(&PresentationServiceImpl::OnDefaultPresentationStarted,
373 weak_factory_.GetWeakPtr())); 390 weak_factory_.GetWeakPtr()));
374 } 391 }
375 392
376 void PresentationServiceImpl::SendSessionMessage( 393 void PresentationServiceImpl::SendSessionMessage(
377 blink::mojom::PresentationSessionInfoPtr session, 394 blink::mojom::PresentationSessionInfoPtr session,
378 blink::mojom::SessionMessagePtr session_message, 395 blink::mojom::SessionMessagePtr session_message,
379 const SendSessionMessageCallback& callback) { 396 const SendSessionMessageCallback& callback) {
380 DVLOG(2) << "SendSessionMessage"; 397 DVLOG(2) << "SendSessionMessage";
381 DCHECK(!session_message.is_null()); 398 DCHECK(!session_message.is_null());
(...skipping 16 matching lines...) Expand all
398 void PresentationServiceImpl::OnSendMessageCallback(bool sent) { 415 void PresentationServiceImpl::OnSendMessageCallback(bool sent) {
399 // It is possible that Reset() is invoked before receiving this callback. 416 // It is possible that Reset() is invoked before receiving this callback.
400 // So, always check send_message_callback_ for non-null. 417 // So, always check send_message_callback_ for non-null.
401 if (send_message_callback_) { 418 if (send_message_callback_) {
402 send_message_callback_->Run(sent); 419 send_message_callback_->Run(sent);
403 send_message_callback_.reset(); 420 send_message_callback_.reset();
404 } 421 }
405 } 422 }
406 423
407 void PresentationServiceImpl::CloseConnection( 424 void PresentationServiceImpl::CloseConnection(
408 const std::string& presentation_url, 425 url::mojom::UrlPtr presentation_url,
409 const std::string& presentation_id) { 426 const std::string& presentation_id) {
410 DVLOG(2) << "CloseConnection " << presentation_id; 427 DVLOG(2) << "CloseConnection " << presentation_id;
411 if (delegate_) 428 if (delegate_)
412 delegate_->CloseConnection(render_process_id_, render_frame_id_, 429 delegate_->CloseConnection(render_process_id_, render_frame_id_,
413 presentation_id); 430 presentation_id);
414 } 431 }
415 432
416 void PresentationServiceImpl::Terminate(const std::string& presentation_url, 433 void PresentationServiceImpl::Terminate(url::mojom::UrlPtr presentation_url,
417 const std::string& presentation_id) { 434 const std::string& presentation_id) {
418 DVLOG(2) << "Terminate " << presentation_id; 435 DVLOG(2) << "Terminate " << presentation_id;
419 if (delegate_) 436 if (delegate_)
420 delegate_->Terminate(render_process_id_, render_frame_id_, presentation_id); 437 delegate_->Terminate(render_process_id_, render_frame_id_, presentation_id);
421 } 438 }
422 439
423 void PresentationServiceImpl::OnConnectionStateChanged( 440 void PresentationServiceImpl::OnConnectionStateChanged(
424 const PresentationSessionInfo& connection, 441 const PresentationSessionInfo& connection,
425 const PresentationConnectionStateChangeInfo& info) { 442 const PresentationConnectionStateChangeInfo& info) {
426 DCHECK(client_.get()); 443 DCHECK(client_.get());
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
517 << "should've been deleted during RenderFrameDeleted()."; 534 << "should've been deleted during RenderFrameDeleted().";
518 Reset(); 535 Reset();
519 delete this; 536 delete this;
520 } 537 }
521 538
522 void PresentationServiceImpl::Reset() { 539 void PresentationServiceImpl::Reset() {
523 DVLOG(2) << "PresentationServiceImpl::Reset"; 540 DVLOG(2) << "PresentationServiceImpl::Reset";
524 if (delegate_) 541 if (delegate_)
525 delegate_->Reset(render_process_id_, render_frame_id_); 542 delegate_->Reset(render_process_id_, render_frame_id_);
526 543
527 default_presentation_url_.clear(); 544 default_presentation_urls_.clear();
528 545
529 screen_availability_listeners_.clear(); 546 screen_availability_listeners_.clear();
530 547
531 start_session_request_id_ = kInvalidRequestSessionId; 548 start_session_request_id_ = kInvalidRequestSessionId;
532 pending_start_session_cb_.reset(); 549 pending_start_session_cb_.reset();
533 550
534 pending_join_session_cbs_.clear(); 551 pending_join_session_cbs_.clear();
535 552
536 if (on_session_messages_callback_.get()) { 553 if (on_session_messages_callback_.get()) {
537 on_session_messages_callback_->Run( 554 on_session_messages_callback_->Run(
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 ~ScreenAvailabilityListenerImpl() { 592 ~ScreenAvailabilityListenerImpl() {
576 } 593 }
577 594
578 std::string PresentationServiceImpl::ScreenAvailabilityListenerImpl 595 std::string PresentationServiceImpl::ScreenAvailabilityListenerImpl
579 ::GetAvailabilityUrl() const { 596 ::GetAvailabilityUrl() const {
580 return availability_url_; 597 return availability_url_;
581 } 598 }
582 599
583 void PresentationServiceImpl::ScreenAvailabilityListenerImpl 600 void PresentationServiceImpl::ScreenAvailabilityListenerImpl
584 ::OnScreenAvailabilityChanged(bool available) { 601 ::OnScreenAvailabilityChanged(bool available) {
585 service_->client_->OnScreenAvailabilityUpdated(availability_url_, available); 602 url::mojom::UrlPtr url = url::mojom::Url::New();
603 url->url = availability_url_;
604 service_->client_->OnScreenAvailabilityUpdated(std::move(url), available);
dcheng 2016/08/26 18:13:33 Since this is typemapped, I think you should be ab
586 } 605 }
587 606
588 void PresentationServiceImpl::ScreenAvailabilityListenerImpl 607 void PresentationServiceImpl::ScreenAvailabilityListenerImpl
589 ::OnScreenAvailabilityNotSupported() { 608 ::OnScreenAvailabilityNotSupported() {
590 service_->client_->OnScreenAvailabilityNotSupported(availability_url_); 609 url::mojom::UrlPtr url = url::mojom::Url::New();
610 url->url = availability_url_;
611 service_->client_->OnScreenAvailabilityNotSupported(std::move(url));
591 } 612 }
592 613
593 PresentationServiceImpl::NewSessionCallbackWrapper 614 PresentationServiceImpl::NewSessionCallbackWrapper
594 ::NewSessionCallbackWrapper(const NewSessionCallback& callback) 615 ::NewSessionCallbackWrapper(const NewSessionCallback& callback)
595 : callback_(callback) { 616 : callback_(callback) {
596 } 617 }
597 618
598 PresentationServiceImpl::NewSessionCallbackWrapper 619 PresentationServiceImpl::NewSessionCallbackWrapper
599 ::~NewSessionCallbackWrapper() { 620 ::~NewSessionCallbackWrapper() {
600 if (!callback_.is_null()) 621 if (!callback_.is_null())
601 InvokeNewSessionCallbackWithError(callback_); 622 InvokeNewSessionCallbackWithError(callback_);
602 } 623 }
603 624
604 void PresentationServiceImpl::NewSessionCallbackWrapper::Run( 625 void PresentationServiceImpl::NewSessionCallbackWrapper::Run(
605 blink::mojom::PresentationSessionInfoPtr session, 626 blink::mojom::PresentationSessionInfoPtr session,
606 blink::mojom::PresentationErrorPtr error) { 627 blink::mojom::PresentationErrorPtr error) {
607 DCHECK(!callback_.is_null()); 628 DCHECK(!callback_.is_null());
608 callback_.Run(std::move(session), std::move(error)); 629 callback_.Run(std::move(session), std::move(error));
609 callback_.Reset(); 630 callback_.Reset();
610 } 631 }
611 632
612 } // namespace content 633 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698