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

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

Powered by Google App Engine
This is Rietveld 408576698