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 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 message_request_queue_.push(base::WrapUnique(CreateSendBinaryMessageRequest( | 207 message_request_queue_.push(base::WrapUnique(CreateSendBinaryMessageRequest( |
208 presentationUrl, presentationId, | 208 presentationUrl, presentationId, |
209 blink::mojom::PresentationMessageType::BINARY, data, length, | 209 blink::mojom::PresentationMessageType::BINARY, data, length, |
210 connection_proxy))); | 210 connection_proxy))); |
211 // Start processing request if only one in the queue. | 211 // Start processing request if only one in the queue. |
212 if (message_request_queue_.size() == 1) | 212 if (message_request_queue_.size() == 1) |
213 DoSendMessage(message_request_queue_.front().get()); | 213 DoSendMessage(message_request_queue_.front().get()); |
214 } | 214 } |
215 | 215 |
216 void PresentationDispatcher::DoSendMessage(SendMessageRequest* request) { | 216 void PresentationDispatcher::DoSendMessage(SendMessageRequest* request) { |
217 ConnectToPresentationServiceIfNeeded(); | 217 DCHECK(request->connection_proxy); |
218 | 218 // TODO(crbug.com/684116): Remove static_cast after moving message queue logic |
219 presentation_service_->SendConnectionMessage( | 219 // from PresentationDispatcher to PresentationConnectionProxy. |
220 std::move(request->session_info), std::move(request->message), | 220 static_cast<const PresentationConnectionProxy*>(request->connection_proxy) |
221 base::Bind(&PresentationDispatcher::HandleSendMessageRequests, | 221 ->SendConnectionMessage( |
222 base::Unretained(this))); | 222 std::move(request->message), |
| 223 base::Bind(&PresentationDispatcher::HandleSendMessageRequests, |
| 224 base::Unretained(this))); |
223 } | 225 } |
224 | 226 |
225 void PresentationDispatcher::HandleSendMessageRequests(bool success) { | 227 void PresentationDispatcher::HandleSendMessageRequests(bool success) { |
226 // In normal cases, message_request_queue_ should not be empty at this point | 228 // In normal cases, message_request_queue_ should not be empty at this point |
227 // of time, but when DidCommitProvisionalLoad() is invoked before receiving | 229 // of time, but when DidCommitProvisionalLoad() is invoked before receiving |
228 // the callback for previous send mojo call, queue would have been emptied. | 230 // the callback for previous send mojo call, queue would have been emptied. |
229 if (message_request_queue_.empty()) | 231 if (message_request_queue_.empty()) |
230 return; | 232 return; |
231 | 233 |
232 if (!success) { | 234 if (!success) { |
233 // PresentationServiceImpl is informing that Frame has been detached or | 235 // PresentationServiceImpl is informing that Frame has been detached or |
234 // navigated away. Invalidate all pending requests. | 236 // navigated away. Invalidate all pending requests. |
235 MessageRequestQueue empty; | 237 MessageRequestQueue empty; |
236 std::swap(message_request_queue_, empty); | 238 std::swap(message_request_queue_, empty); |
237 return; | 239 return; |
238 } | 240 } |
239 | 241 |
240 message_request_queue_.pop(); | 242 message_request_queue_.pop(); |
241 if (!message_request_queue_.empty()) { | 243 if (!message_request_queue_.empty()) { |
242 DoSendMessage(message_request_queue_.front().get()); | 244 DoSendMessage(message_request_queue_.front().get()); |
243 } | 245 } |
244 } | 246 } |
245 | 247 |
| 248 void PresentationDispatcher::SetControllerConnection( |
| 249 const PresentationSessionInfo& session_info, |
| 250 blink::WebPresentationConnection* connection) { |
| 251 DCHECK(connection); |
| 252 |
| 253 auto* controller_connection_proxy = new ControllerConnectionProxy(connection); |
| 254 connection->bindProxy(base::WrapUnique(controller_connection_proxy)); |
| 255 |
| 256 ConnectToPresentationServiceIfNeeded(); |
| 257 presentation_service_->SetPresentationConnection( |
| 258 session_info, controller_connection_proxy->Bind(), |
| 259 controller_connection_proxy->MakeRemoteRequest()); |
| 260 } |
| 261 |
246 void PresentationDispatcher::closeSession( | 262 void PresentationDispatcher::closeSession( |
247 const blink::WebURL& presentationUrl, | 263 const blink::WebURL& presentationUrl, |
248 const blink::WebString& presentationId) { | 264 const blink::WebString& presentationId) { |
249 ConnectToPresentationServiceIfNeeded(); | 265 ConnectToPresentationServiceIfNeeded(); |
250 presentation_service_->CloseConnection(presentationUrl, | 266 presentation_service_->CloseConnection(presentationUrl, |
251 presentationId.utf8()); | 267 presentationId.utf8()); |
252 } | 268 } |
253 | 269 |
254 void PresentationDispatcher::terminateSession( | 270 void PresentationDispatcher::terminateSession( |
255 const blink::WebURL& presentationUrl, | 271 const blink::WebURL& presentationUrl, |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 | 483 |
468 for (auto* listener : modified_listeners) | 484 for (auto* listener : modified_listeners) |
469 TryRemoveAvailabilityListener(listener); | 485 TryRemoveAvailabilityListener(listener); |
470 } | 486 } |
471 | 487 |
472 void PresentationDispatcher::OnDefaultSessionStarted( | 488 void PresentationDispatcher::OnDefaultSessionStarted( |
473 const PresentationSessionInfo& session_info) { | 489 const PresentationSessionInfo& session_info) { |
474 if (!controller_) | 490 if (!controller_) |
475 return; | 491 return; |
476 | 492 |
477 presentation_service_->ListenForConnectionMessages(session_info); | |
478 auto* connection = | 493 auto* connection = |
479 controller_->didStartDefaultSession(blink::WebPresentationSessionInfo( | 494 controller_->didStartDefaultSession(blink::WebPresentationSessionInfo( |
480 session_info.presentation_url, | 495 session_info.presentation_url, |
481 blink::WebString::fromUTF8(session_info.presentation_id))); | 496 blink::WebString::fromUTF8(session_info.presentation_id))); |
482 connection->bindProxy( | 497 |
483 base::MakeUnique<ControllerConnectionProxy>(connection)); | 498 if (connection) { |
| 499 SetControllerConnection(session_info, connection); |
| 500 // Change blink connection state to 'connected' before listening to |
| 501 // connection message. Remove ListenForConnectionMessage() after |
| 502 // TODO(crbug.com/687011): use BrowserPresentationConnectionProxy to send |
| 503 // message from route to blink connection. |
| 504 presentation_service_->ListenForConnectionMessages(session_info); |
| 505 } |
484 } | 506 } |
485 | 507 |
486 void PresentationDispatcher::OnSessionCreated( | 508 void PresentationDispatcher::OnSessionCreated( |
487 std::unique_ptr<blink::WebPresentationConnectionCallbacks> callback, | 509 std::unique_ptr<blink::WebPresentationConnectionCallbacks> callback, |
488 const base::Optional<PresentationSessionInfo>& session_info, | 510 const base::Optional<PresentationSessionInfo>& session_info, |
489 const base::Optional<PresentationError>& error) { | 511 const base::Optional<PresentationError>& error) { |
490 DCHECK(callback); | 512 DCHECK(callback); |
491 if (error) { | 513 if (error) { |
492 DCHECK(!session_info); | 514 DCHECK(!session_info); |
493 callback->onError(blink::WebPresentationError( | 515 callback->onError(blink::WebPresentationError( |
494 GetWebPresentationErrorType(error->error_type), | 516 GetWebPresentationErrorType(error->error_type), |
495 blink::WebString::fromUTF8(error->message))); | 517 blink::WebString::fromUTF8(error->message))); |
496 return; | 518 return; |
497 } | 519 } |
498 | 520 |
499 DCHECK(session_info); | 521 DCHECK(session_info); |
500 presentation_service_->ListenForConnectionMessages(session_info.value()); | |
501 callback->onSuccess(blink::WebPresentationSessionInfo( | 522 callback->onSuccess(blink::WebPresentationSessionInfo( |
502 session_info->presentation_url, | 523 session_info->presentation_url, |
503 blink::WebString::fromUTF8(session_info->presentation_id))); | 524 blink::WebString::fromUTF8(session_info->presentation_id))); |
504 | 525 // Change blink connection state to 'connected' before listening to |
505 auto* connection = callback->getConnection(); | 526 // connection message. Remove ListenForConnectionMessage() after |
506 connection->bindProxy( | 527 // TODO(crbug.com/687011): use BrowserPresentationConnectionProxy to send |
507 base::MakeUnique<ControllerConnectionProxy>(connection)); | 528 // message from route to blink connection. |
| 529 SetControllerConnection(session_info.value(), callback->getConnection()); |
| 530 presentation_service_->ListenForConnectionMessages(session_info.value()); |
508 } | 531 } |
509 | 532 |
510 void PresentationDispatcher::OnReceiverConnectionAvailable( | 533 void PresentationDispatcher::OnReceiverConnectionAvailable( |
511 const PresentationSessionInfo& session_info, | 534 const PresentationSessionInfo& session_info, |
512 blink::mojom::PresentationConnectionPtr controller_connection_ptr, | 535 blink::mojom::PresentationConnectionPtr controller_connection_ptr, |
513 blink::mojom::PresentationConnectionRequest receiver_connection_request) { | 536 blink::mojom::PresentationConnectionRequest receiver_connection_request) { |
514 DCHECK(receiver_); | 537 DCHECK(receiver_); |
| 538 |
515 // Bind receiver_connection_proxy with PresentationConnection in receiver | 539 // Bind receiver_connection_proxy with PresentationConnection in receiver |
516 // page. | 540 // page. |
517 auto* connection = receiver_->onReceiverConnectionAvailable( | 541 auto* connection = receiver_->onReceiverConnectionAvailable( |
518 blink::WebPresentationSessionInfo( | 542 blink::WebPresentationSessionInfo( |
519 session_info.presentation_url, | 543 session_info.presentation_url, |
520 blink::WebString::fromUTF8(session_info.presentation_id))); | 544 blink::WebString::fromUTF8(session_info.presentation_id))); |
521 auto* receiver_connection_proxy = new ReceiverConnectionProxy(connection); | 545 auto* receiver_connection_proxy = new ReceiverConnectionProxy(connection); |
522 connection->bindProxy(base::WrapUnique(receiver_connection_proxy)); | 546 connection->bindProxy(base::WrapUnique(receiver_connection_proxy)); |
523 | 547 |
524 receiver_connection_proxy->Bind(std::move(receiver_connection_request)); | 548 receiver_connection_proxy->Bind(std::move(receiver_connection_request)); |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
753 | 777 |
754 PresentationDispatcher::ListeningStatus::ListeningStatus( | 778 PresentationDispatcher::ListeningStatus::ListeningStatus( |
755 const GURL& availability_url) | 779 const GURL& availability_url) |
756 : url(availability_url), | 780 : url(availability_url), |
757 last_known_availability(ScreenAvailability::UNKNOWN), | 781 last_known_availability(ScreenAvailability::UNKNOWN), |
758 listening_state(ListeningState::INACTIVE) {} | 782 listening_state(ListeningState::INACTIVE) {} |
759 | 783 |
760 PresentationDispatcher::ListeningStatus::~ListeningStatus() {} | 784 PresentationDispatcher::ListeningStatus::~ListeningStatus() {} |
761 | 785 |
762 } // namespace content | 786 } // namespace content |
OLD | NEW |