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

Side by Side Diff: content/renderer/presentation/presentation_dispatcher.cc

Issue 2471573005: [Presentation API] (5th) (1-UA) integrate controller and receiver side for 1-UA messaging (Closed)
Patch Set: split renderer related changes into 4th patch 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
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/renderer/presentation/presentation_dispatcher.h" 5 #include "content/renderer/presentation/presentation_dispatcher.h"
6 6
7 #include <utility> 7 #include <utility>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 case blink::mojom::PresentationConnectionCloseReason::CLOSED: 69 case blink::mojom::PresentationConnectionCloseReason::CLOSED:
70 return blink::WebPresentationConnectionCloseReason::Closed; 70 return blink::WebPresentationConnectionCloseReason::Closed;
71 case blink::mojom::PresentationConnectionCloseReason::WENT_AWAY: 71 case blink::mojom::PresentationConnectionCloseReason::WENT_AWAY:
72 return blink::WebPresentationConnectionCloseReason::WentAway; 72 return blink::WebPresentationConnectionCloseReason::WentAway;
73 default: 73 default:
74 NOTREACHED(); 74 NOTREACHED();
75 return blink::WebPresentationConnectionCloseReason::Error; 75 return blink::WebPresentationConnectionCloseReason::Error;
76 } 76 }
77 } 77 }
78 78
79 // TODO(zhaobin): remove this function and use typemap instead after
80 // crbug.com/632623 lands.
81 blink::mojom::SessionMessagePtr ToMojoTextMessage(
82 const blink::WebString& message) {
83 blink::mojom::SessionMessagePtr session_message =
84 blink::mojom::SessionMessage::New();
85 session_message->type = blink::mojom::PresentationMessageType::TEXT;
86 session_message->message = message.utf8();
87 return session_message;
88 }
89
90 // TODO(zhaobin): remove this function and use typemap instead after
91 // crbug.com/632623 lands.
92 blink::mojom::SessionMessagePtr ToMojoBinaryMessage(
93 blink::mojom::PresentationMessageType type,
94 const uint8_t* data,
95 size_t length) {
96 blink::mojom::SessionMessagePtr session_message =
97 blink::mojom::SessionMessage::New();
98 session_message->type = type;
99 session_message->data = std::vector<uint8_t>(data, data + length);
100 return session_message;
101 }
102
79 } // namespace 103 } // namespace
80 104
81 namespace content { 105 namespace content {
82 106
83 PresentationDispatcher::PresentationDispatcher(RenderFrame* render_frame) 107 PresentationDispatcher::PresentationDispatcher(RenderFrame* render_frame)
84 : RenderFrameObserver(render_frame), 108 : RenderFrameObserver(render_frame),
85 controller_(nullptr), 109 controller_(nullptr),
86 binding_(this) { 110 receiver_(nullptr),
87 } 111 binding_(this) {}
88 112
89 PresentationDispatcher::~PresentationDispatcher() { 113 PresentationDispatcher::~PresentationDispatcher() {
90 // Controller should be destroyed before the dispatcher when frame is 114 // Controller should be destroyed before the dispatcher when frame is
91 // destroyed. 115 // destroyed.
92 DCHECK(!controller_); 116 DCHECK(!controller_);
93 } 117 }
94 118
95 void PresentationDispatcher::setController( 119 void PresentationDispatcher::setController(
96 blink::WebPresentationController* controller) { 120 blink::WebPresentationController* controller) {
97 // There shouldn't be any swapping from one non-null controller to another. 121 // There shouldn't be any swapping from one non-null controller to another.
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 // Start processing request if only one in the queue. 224 // Start processing request if only one in the queue.
201 if (message_request_queue_.size() == 1) 225 if (message_request_queue_.size() == 1)
202 DoSendMessage(message_request_queue_.front().get(), connection_proxy); 226 DoSendMessage(message_request_queue_.front().get(), connection_proxy);
203 } 227 }
204 228
205 void PresentationDispatcher::DoSendMessage( 229 void PresentationDispatcher::DoSendMessage(
206 SendMessageRequest* request, 230 SendMessageRequest* request,
207 const blink::WebPresentationConnectionProxy* connection_proxy) { 231 const blink::WebPresentationConnectionProxy* connection_proxy) {
208 ConnectToPresentationServiceIfNeeded(); 232 ConnectToPresentationServiceIfNeeded();
209 233
210 presentation_service_->SendSessionMessage( 234 static_cast<const PresentationConnectionProxy*>(connection_proxy)
211 std::move(request->session_info), std::move(request->message), 235 ->SendSessionMessage(std::move(request->session_info),
212 base::Bind(&PresentationDispatcher::HandleSendMessageRequests, 236 std::move(request->message));
213 base::Unretained(this), nullptr));
214 } 237 }
215 238
216 void PresentationDispatcher::HandleSendMessageRequests( 239 void PresentationDispatcher::HandleSendMessageRequests(
217 const blink::WebPresentationConnectionProxy* connection_proxy, 240 const blink::WebPresentationConnectionProxy* connection_proxy,
218 bool success) { 241 bool success) {
219 // In normal cases, message_request_queue_ should not be empty at this point 242 // In normal cases, message_request_queue_ should not be empty at this point
220 // of time, but when DidCommitProvisionalLoad() is invoked before receiving 243 // of time, but when DidCommitProvisionalLoad() is invoked before receiving
221 // the callback for previous send mojo call, queue would have been emptied. 244 // the callback for previous send mojo call, queue would have been emptied.
222 if (message_request_queue_.empty()) 245 if (message_request_queue_.empty())
223 return; 246 return;
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
378 } 401 }
379 status->availability_callbacks.Clear(); 402 status->availability_callbacks.Clear();
380 UpdateListeningState(status); 403 UpdateListeningState(status);
381 } 404 }
382 405
383 void PresentationDispatcher::OnDefaultSessionStarted( 406 void PresentationDispatcher::OnDefaultSessionStarted(
384 blink::mojom::PresentationSessionInfoPtr session_info) { 407 blink::mojom::PresentationSessionInfoPtr session_info) {
385 if (!controller_) 408 if (!controller_)
386 return; 409 return;
387 410
388 if (!session_info.is_null()) { 411 if (session_info.is_null())
389 presentation_service_->ListenForSessionMessages(session_info.Clone()); 412 return;
390 controller_->didStartDefaultSession( 413
391 new PresentationConnectionClient(std::move(session_info))); 414 presentation_service_->ListenForSessionMessages(session_info.Clone());
392 } 415 controller_->didStartDefaultSession(new PresentationConnectionClient(
416 session_info->url, session_info->id,
417 CreateAndSetControllerConnectionProxy(session_info.Clone())));
393 } 418 }
394 419
395 void PresentationDispatcher::OnSessionCreated( 420 void PresentationDispatcher::OnSessionCreated(
396 blink::WebPresentationConnectionClientCallbacks* callback, 421 blink::WebPresentationConnectionClientCallbacks* callback,
397 blink::mojom::PresentationSessionInfoPtr session_info, 422 blink::mojom::PresentationSessionInfoPtr session_info,
398 blink::mojom::PresentationErrorPtr error) { 423 blink::mojom::PresentationErrorPtr error) {
399 DCHECK(callback); 424 DCHECK(callback);
400 if (!error.is_null()) { 425 if (!error.is_null()) {
401 DCHECK(session_info.is_null()); 426 DCHECK(session_info.is_null());
402 callback->onError(blink::WebPresentationError( 427 callback->onError(blink::WebPresentationError(
403 GetWebPresentationErrorTypeFromMojo(error->error_type), 428 GetWebPresentationErrorTypeFromMojo(error->error_type),
404 blink::WebString::fromUTF8(error->message))); 429 blink::WebString::fromUTF8(error->message)));
405 return; 430 return;
406 } 431 }
407 432
408 DCHECK(!session_info.is_null()); 433 DCHECK(!session_info.is_null());
409 presentation_service_->ListenForSessionMessages(session_info.Clone()); 434 presentation_service_->ListenForSessionMessages(session_info.Clone());
410 callback->onSuccess( 435
411 base::MakeUnique<PresentationConnectionClient>(std::move(session_info))); 436 callback->onSuccess(base::MakeUnique<PresentationConnectionClient>(
437 session_info->url, session_info->id,
438 CreateAndSetControllerConnectionProxy(session_info.Clone())));
412 } 439 }
413 440
414 void PresentationDispatcher::OnReceiverConnectionAvailable( 441 void PresentationDispatcher::OnReceiverConnectionAvailable(
415 blink::mojom::PresentationSessionInfoPtr session_info) { 442 blink::mojom::PresentationSessionInfoPtr session_info,
416 if (receiver_) { 443 blink::mojom::PresentationConnectionPtr controller) {
417 receiver_->onReceiverConnectionAvailable( 444 DCHECK(receiver_);
418 new PresentationConnectionClient(std::move(session_info))); 445
419 } 446 std::unique_ptr<PresentationConnectionProxy> receiver_connection_proxy =
447 base::MakeUnique<PresentationConnectionProxy>();
448
449 receiver_connection_proxy->RegisterOnMessageCallback(
450 base::Bind(&PresentationDispatcher::HandleSendMessageRequests,
451 base::Unretained(this), receiver_connection_proxy.get()));
452
453 PresentationConnectionProxy* receiver_connection_ptr =
454 receiver_connection_proxy.get();
455 // Bind receiver_connection_proxy with PresentationConnection
456 // in receiver page.
457 receiver_->onReceiverConnectionAvailable(
458 new PresentationConnectionClient(session_info->url, session_info->id,
459 std::move(receiver_connection_proxy)));
460
461 controller->SetTargetConnection(receiver_connection_ptr->Bind());
462 receiver_connection_ptr->SetTargetConnection(std::move(controller));
420 } 463 }
421 464
422 void PresentationDispatcher::OnConnectionStateChanged( 465 void PresentationDispatcher::OnConnectionStateChanged(
423 blink::mojom::PresentationSessionInfoPtr connection, 466 blink::mojom::PresentationSessionInfoPtr connection,
424 blink::mojom::PresentationConnectionState state) { 467 blink::mojom::PresentationConnectionState state) {
425 if (!controller_) 468 if (!controller_)
426 return; 469 return;
427 470
428 DCHECK(!connection.is_null()); 471 DCHECK(!connection.is_null());
429 controller_->didChangeSessionState( 472 controller_->didChangeSessionState(
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 ConnectToPresentationServiceIfNeeded(); 542 ConnectToPresentationServiceIfNeeded();
500 if (should_listen) { 543 if (should_listen) {
501 status->listening_state = ListeningState::WAITING; 544 status->listening_state = ListeningState::WAITING;
502 presentation_service_->ListenForScreenAvailability(status->url); 545 presentation_service_->ListenForScreenAvailability(status->url);
503 } else { 546 } else {
504 status->listening_state = ListeningState::INACTIVE; 547 status->listening_state = ListeningState::INACTIVE;
505 presentation_service_->StopListeningForScreenAvailability(status->url); 548 presentation_service_->StopListeningForScreenAvailability(status->url);
506 } 549 }
507 } 550 }
508 551
552 std::unique_ptr<PresentationConnectionProxy>
553 PresentationDispatcher::CreateAndSetControllerConnectionProxy(
554 blink::mojom::PresentationSessionInfoPtr session_info) {
555 std::unique_ptr<PresentationConnectionProxy> controller_connection_proxy =
556 base::MakeUnique<PresentationConnectionProxy>();
557 controller_connection_proxy->RegisterOnMessageCallback(
558 base::Bind(&PresentationDispatcher::HandleSendMessageRequests,
559 base::Unretained(this), controller_connection_proxy.get()));
560
561 // Pass controller_connection_proxy to PSImpl and register
562 // it with OffscreenPresentationManager.
563 presentation_service_->SetPresentationConnection(
564 session_info.Clone(), controller_connection_proxy->Bind());
565
566 return controller_connection_proxy;
567 }
568
509 PresentationDispatcher::SendMessageRequest::SendMessageRequest( 569 PresentationDispatcher::SendMessageRequest::SendMessageRequest(
510 blink::mojom::PresentationSessionInfoPtr session_info, 570 blink::mojom::PresentationSessionInfoPtr session_info,
511 blink::mojom::SessionMessagePtr message) 571 blink::mojom::SessionMessagePtr message)
512 : session_info(std::move(session_info)), message(std::move(message)) {} 572 : session_info(std::move(session_info)), message(std::move(message)) {}
513 573
514 PresentationDispatcher::SendMessageRequest::~SendMessageRequest() {} 574 PresentationDispatcher::SendMessageRequest::~SendMessageRequest() {}
515 575
516 // static 576 // static
517 PresentationDispatcher::SendMessageRequest* 577 PresentationDispatcher::SendMessageRequest*
518 PresentationDispatcher::CreateSendTextMessageRequest( 578 PresentationDispatcher::CreateSendTextMessageRequest(
519 const blink::WebURL& presentationUrl, 579 const blink::WebURL& presentationUrl,
520 const blink::WebString& presentationId, 580 const blink::WebString& presentationId,
521 const blink::WebString& message) { 581 const blink::WebString& message) {
522 blink::mojom::PresentationSessionInfoPtr session_info = 582 blink::mojom::PresentationSessionInfoPtr session_info =
523 blink::mojom::PresentationSessionInfo::New(); 583 blink::mojom::PresentationSessionInfo::New();
524 session_info->url = presentationUrl; 584 session_info->url = presentationUrl;
525 session_info->id = presentationId.utf8(); 585 session_info->id = presentationId.utf8();
526 586
527 blink::mojom::SessionMessagePtr session_message =
528 blink::mojom::SessionMessage::New();
529 session_message->type = blink::mojom::PresentationMessageType::TEXT;
530 session_message->message = message.utf8();
531 return new SendMessageRequest(std::move(session_info), 587 return new SendMessageRequest(std::move(session_info),
532 std::move(session_message)); 588 ToMojoTextMessage(message));
533 } 589 }
534 590
535 // static 591 // static
536 PresentationDispatcher::SendMessageRequest* 592 PresentationDispatcher::SendMessageRequest*
537 PresentationDispatcher::CreateSendBinaryMessageRequest( 593 PresentationDispatcher::CreateSendBinaryMessageRequest(
538 const blink::WebURL& presentationUrl, 594 const blink::WebURL& presentationUrl,
539 const blink::WebString& presentationId, 595 const blink::WebString& presentationId,
540 blink::mojom::PresentationMessageType type, 596 blink::mojom::PresentationMessageType type,
541 const uint8_t* data, 597 const uint8_t* data,
542 size_t length) { 598 size_t length) {
543 blink::mojom::PresentationSessionInfoPtr session_info = 599 blink::mojom::PresentationSessionInfoPtr session_info =
544 blink::mojom::PresentationSessionInfo::New(); 600 blink::mojom::PresentationSessionInfo::New();
545 session_info->url = presentationUrl; 601 session_info->url = presentationUrl;
546 session_info->id = presentationId.utf8(); 602 session_info->id = presentationId.utf8();
547 603
548 blink::mojom::SessionMessagePtr session_message =
549 blink::mojom::SessionMessage::New();
550 session_message->type = type;
551 session_message->data = std::vector<uint8_t>(data, data + length);
552 return new SendMessageRequest(std::move(session_info), 604 return new SendMessageRequest(std::move(session_info),
553 std::move(session_message)); 605 ToMojoBinaryMessage(type, data, length));
554 } 606 }
555 607
556 PresentationDispatcher::AvailabilityStatus::AvailabilityStatus( 608 PresentationDispatcher::AvailabilityStatus::AvailabilityStatus(
557 const GURL& availability_url) 609 const GURL& availability_url)
558 : url(availability_url), 610 : url(availability_url),
559 last_known_availability(false), 611 last_known_availability(false),
560 listening_state(ListeningState::INACTIVE) {} 612 listening_state(ListeningState::INACTIVE) {}
561 613
562 PresentationDispatcher::AvailabilityStatus::~AvailabilityStatus() { 614 PresentationDispatcher::AvailabilityStatus::~AvailabilityStatus() {
563 } 615 }
564 616
565 } // namespace content 617 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698