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

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: merge with master Created 3 years, 10 months 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 <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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698