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 <string> | 7 #include <string> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 message_request_queue_.push(base::WrapUnique(CreateSendBinaryMessageRequest( | 220 message_request_queue_.push(base::WrapUnique(CreateSendBinaryMessageRequest( |
221 presentationUrl, presentationId, | 221 presentationUrl, presentationId, |
222 blink::mojom::PresentationMessageType::BINARY, data, length, | 222 blink::mojom::PresentationMessageType::BINARY, data, length, |
223 connection_proxy))); | 223 connection_proxy))); |
224 // Start processing request if only one in the queue. | 224 // Start processing request if only one in the queue. |
225 if (message_request_queue_.size() == 1) | 225 if (message_request_queue_.size() == 1) |
226 DoSendMessage(message_request_queue_.front().get()); | 226 DoSendMessage(message_request_queue_.front().get()); |
227 } | 227 } |
228 | 228 |
229 void PresentationDispatcher::DoSendMessage(SendMessageRequest* request) { | 229 void PresentationDispatcher::DoSendMessage(SendMessageRequest* request) { |
230 ConnectToPresentationServiceIfNeeded(); | 230 DCHECK(request->connection_proxy); |
231 | 231 // TODO(crbug.com/684116): Remove static_cast after moving message queue logic |
232 presentation_service_->SendConnectionMessage( | 232 // from PresentationDispatcher to PresentationConnectionProxy. |
233 std::move(request->session_info), std::move(request->message), | 233 static_cast<const PresentationConnectionProxy*>(request->connection_proxy) |
234 base::Bind(&PresentationDispatcher::HandleSendMessageRequests, | 234 ->SendConnectionMessage( |
235 base::Unretained(this))); | 235 std::move(request->message), |
| 236 base::Bind(&PresentationDispatcher::HandleSendMessageRequests, |
| 237 base::Unretained(this))); |
236 } | 238 } |
237 | 239 |
238 void PresentationDispatcher::HandleSendMessageRequests(bool success) { | 240 void PresentationDispatcher::HandleSendMessageRequests(bool success) { |
239 // In normal cases, message_request_queue_ should not be empty at this point | 241 // In normal cases, message_request_queue_ should not be empty at this point |
240 // of time, but when DidCommitProvisionalLoad() is invoked before receiving | 242 // of time, but when DidCommitProvisionalLoad() is invoked before receiving |
241 // the callback for previous send mojo call, queue would have been emptied. | 243 // the callback for previous send mojo call, queue would have been emptied. |
242 if (message_request_queue_.empty()) | 244 if (message_request_queue_.empty()) |
243 return; | 245 return; |
244 | 246 |
245 if (!success) { | 247 if (!success) { |
246 // PresentationServiceImpl is informing that Frame has been detached or | 248 // PresentationServiceImpl is informing that Frame has been detached or |
247 // navigated away. Invalidate all pending requests. | 249 // navigated away. Invalidate all pending requests. |
248 MessageRequestQueue empty; | 250 MessageRequestQueue empty; |
249 std::swap(message_request_queue_, empty); | 251 std::swap(message_request_queue_, empty); |
250 return; | 252 return; |
251 } | 253 } |
252 | 254 |
253 message_request_queue_.pop(); | 255 message_request_queue_.pop(); |
254 if (!message_request_queue_.empty()) { | 256 if (!message_request_queue_.empty()) { |
255 DoSendMessage(message_request_queue_.front().get()); | 257 DoSendMessage(message_request_queue_.front().get()); |
256 } | 258 } |
257 } | 259 } |
258 | 260 |
| 261 void PresentationDispatcher::SetControllerConnection( |
| 262 blink::mojom::PresentationSessionInfoPtr session_info, |
| 263 blink::WebPresentationConnection* connection) { |
| 264 DCHECK(connection); |
| 265 |
| 266 auto* controller_connection_proxy = new ControllerConnectionProxy(connection); |
| 267 connection->bindProxy(base::WrapUnique(controller_connection_proxy)); |
| 268 |
| 269 ConnectToPresentationServiceIfNeeded(); |
| 270 presentation_service_->SetPresentationConnection( |
| 271 session_info.Clone(), controller_connection_proxy->Bind(), |
| 272 controller_connection_proxy->MakeRemoteRequest()); |
| 273 } |
| 274 |
259 void PresentationDispatcher::closeSession( | 275 void PresentationDispatcher::closeSession( |
260 const blink::WebURL& presentationUrl, | 276 const blink::WebURL& presentationUrl, |
261 const blink::WebString& presentationId) { | 277 const blink::WebString& presentationId) { |
262 ConnectToPresentationServiceIfNeeded(); | 278 ConnectToPresentationServiceIfNeeded(); |
263 presentation_service_->CloseConnection(presentationUrl, | 279 presentation_service_->CloseConnection(presentationUrl, |
264 presentationId.utf8()); | 280 presentationId.utf8()); |
265 } | 281 } |
266 | 282 |
267 void PresentationDispatcher::terminateSession( | 283 void PresentationDispatcher::terminateSession( |
268 const blink::WebURL& presentationUrl, | 284 const blink::WebURL& presentationUrl, |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
481 for (auto* listener : modified_listeners) | 497 for (auto* listener : modified_listeners) |
482 TryRemoveAvailabilityListener(listener); | 498 TryRemoveAvailabilityListener(listener); |
483 } | 499 } |
484 | 500 |
485 void PresentationDispatcher::OnDefaultSessionStarted( | 501 void PresentationDispatcher::OnDefaultSessionStarted( |
486 blink::mojom::PresentationSessionInfoPtr session_info) { | 502 blink::mojom::PresentationSessionInfoPtr session_info) { |
487 if (!controller_) | 503 if (!controller_) |
488 return; | 504 return; |
489 | 505 |
490 if (!session_info.is_null()) { | 506 if (!session_info.is_null()) { |
491 presentation_service_->ListenForConnectionMessages(session_info.Clone()); | |
492 auto* connection = controller_->didStartDefaultSession( | 507 auto* connection = controller_->didStartDefaultSession( |
493 mojo::ConvertTo<blink::WebPresentationSessionInfo>(session_info)); | 508 mojo::ConvertTo<blink::WebPresentationSessionInfo>(session_info)); |
494 connection->bindProxy( | 509 |
495 base::MakeUnique<ControllerConnectionProxy>(connection)); | 510 if (connection) { |
| 511 SetControllerConnection(session_info.Clone(), connection); |
| 512 // Change blink connection state to 'connected' before listening to |
| 513 // connection message. Remove ListenForConnectionMessage() after |
| 514 // TODO(crbug.com/687011): use BrowserPresentationConnectionProxy to send |
| 515 // message from route to blink connection. |
| 516 presentation_service_->ListenForConnectionMessages(session_info.Clone()); |
| 517 } |
496 } | 518 } |
497 } | 519 } |
498 | 520 |
499 void PresentationDispatcher::OnSessionCreated( | 521 void PresentationDispatcher::OnSessionCreated( |
500 std::unique_ptr<blink::WebPresentationConnectionCallbacks> callback, | 522 std::unique_ptr<blink::WebPresentationConnectionCallbacks> callback, |
501 blink::mojom::PresentationSessionInfoPtr session_info, | 523 blink::mojom::PresentationSessionInfoPtr session_info, |
502 blink::mojom::PresentationErrorPtr error) { | 524 blink::mojom::PresentationErrorPtr error) { |
503 DCHECK(callback); | 525 DCHECK(callback); |
504 if (!error.is_null()) { | 526 if (!error.is_null()) { |
505 DCHECK(session_info.is_null()); | 527 DCHECK(session_info.is_null()); |
506 callback->onError(blink::WebPresentationError( | 528 callback->onError(blink::WebPresentationError( |
507 GetWebPresentationErrorTypeFromMojo(error->error_type), | 529 GetWebPresentationErrorTypeFromMojo(error->error_type), |
508 blink::WebString::fromUTF8(error->message))); | 530 blink::WebString::fromUTF8(error->message))); |
509 return; | 531 return; |
510 } | 532 } |
511 | 533 |
512 DCHECK(!session_info.is_null()); | 534 DCHECK(!session_info.is_null()); |
513 presentation_service_->ListenForConnectionMessages(session_info.Clone()); | |
514 callback->onSuccess( | 535 callback->onSuccess( |
515 mojo::ConvertTo<blink::WebPresentationSessionInfo>(session_info)); | 536 mojo::ConvertTo<blink::WebPresentationSessionInfo>(session_info)); |
516 | 537 // Change blink connection state to 'connected' before listening to |
517 auto* connection = callback->getConnection(); | 538 // connection message. Remove ListenForConnectionMessage() after |
518 connection->bindProxy( | 539 // TODO(crbug.com/687011): use BrowserPresentationConnectionProxy to send |
519 base::MakeUnique<ControllerConnectionProxy>(connection)); | 540 // message from route to blink connection. |
| 541 SetControllerConnection(session_info.Clone(), callback->getConnection()); |
| 542 presentation_service_->ListenForConnectionMessages(session_info.Clone()); |
520 } | 543 } |
521 | 544 |
522 void PresentationDispatcher::OnReceiverConnectionAvailable( | 545 void PresentationDispatcher::OnReceiverConnectionAvailable( |
523 blink::mojom::PresentationSessionInfoPtr session_info, | 546 blink::mojom::PresentationSessionInfoPtr session_info, |
524 blink::mojom::PresentationConnectionPtr controller_connection_ptr, | 547 blink::mojom::PresentationConnectionPtr controller_connection_ptr, |
525 blink::mojom::PresentationConnectionRequest receiver_connection_request) { | 548 blink::mojom::PresentationConnectionRequest receiver_connection_request) { |
526 DCHECK(receiver_); | 549 DCHECK(receiver_); |
| 550 |
527 // Bind receiver_connection_proxy with PresentationConnection in receiver | 551 // Bind receiver_connection_proxy with PresentationConnection in receiver |
528 // page. | 552 // page. |
529 auto* connection = receiver_->onReceiverConnectionAvailable( | 553 auto* connection = receiver_->onReceiverConnectionAvailable( |
530 mojo::ConvertTo<blink::WebPresentationSessionInfo>(session_info)); | 554 mojo::ConvertTo<blink::WebPresentationSessionInfo>(session_info)); |
531 auto* receiver_connection_proxy = new ReceiverConnectionProxy(connection); | 555 auto* receiver_connection_proxy = new ReceiverConnectionProxy(connection); |
532 connection->bindProxy(base::WrapUnique(receiver_connection_proxy)); | 556 connection->bindProxy(base::WrapUnique(receiver_connection_proxy)); |
533 | 557 |
534 receiver_connection_proxy->Bind(std::move(receiver_connection_request)); | 558 receiver_connection_proxy->Bind(std::move(receiver_connection_request)); |
535 receiver_connection_proxy->BindControllerConnection( | 559 receiver_connection_proxy->BindControllerConnection( |
536 std::move(controller_connection_ptr)); | 560 std::move(controller_connection_ptr)); |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
761 | 785 |
762 PresentationDispatcher::ListeningStatus::ListeningStatus( | 786 PresentationDispatcher::ListeningStatus::ListeningStatus( |
763 const GURL& availability_url) | 787 const GURL& availability_url) |
764 : url(availability_url), | 788 : url(availability_url), |
765 last_known_availability(ScreenAvailability::UNKNOWN), | 789 last_known_availability(ScreenAvailability::UNKNOWN), |
766 listening_state(ListeningState::INACTIVE) {} | 790 listening_state(ListeningState::INACTIVE) {} |
767 | 791 |
768 PresentationDispatcher::ListeningStatus::~ListeningStatus() {} | 792 PresentationDispatcher::ListeningStatus::~ListeningStatus() {} |
769 | 793 |
770 } // namespace content | 794 } // namespace content |
OLD | NEW |