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