| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |