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

Side by Side Diff: content/renderer/presentation/presentation_dispatcher.cc

Issue 2379703002: [Presentation API] (alternative) 1-UA: send message between controller and receiver page (Closed)
Patch Set: resolve code review comments from Mark Created 4 years, 2 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 <utility> 7 #include <utility>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/memory/ptr_util.h" 12 #include "base/memory/ptr_util.h"
13 #include "content/public/common/presentation_constants.h" 13 #include "content/public/common/presentation_constants.h"
14 #include "content/public/renderer/render_frame.h" 14 #include "content/public/renderer/render_frame.h"
15 #include "content/renderer/presentation/presentation_connection_client.h" 15 #include "content/renderer/presentation/presentation_connection_client.h"
16 #include "content/renderer/presentation/presentation_connection_proxy.h"
16 #include "services/service_manager/public/cpp/interface_provider.h" 17 #include "services/service_manager/public/cpp/interface_provider.h"
17 #include "third_party/WebKit/public/platform/WebString.h" 18 #include "third_party/WebKit/public/platform/WebString.h"
18 #include "third_party/WebKit/public/platform/WebURL.h" 19 #include "third_party/WebKit/public/platform/WebURL.h"
19 #include "third_party/WebKit/public/platform/WebVector.h" 20 #include "third_party/WebKit/public/platform/WebVector.h"
20 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nAvailabilityObserver.h" 21 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nAvailabilityObserver.h"
21 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nController.h" 22 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nController.h"
22 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nError.h" 23 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nError.h"
23 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nReceiver.h" 24 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nReceiver.h"
24 #include "third_party/WebKit/public/platform/modules/presentation/presentation.m ojom.h" 25 #include "third_party/WebKit/public/platform/modules/presentation/presentation.m ojom.h"
25 #include "third_party/WebKit/public/web/WebLocalFrame.h" 26 #include "third_party/WebKit/public/web/WebLocalFrame.h"
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 } 75 }
75 } 76 }
76 77
77 } // namespace 78 } // namespace
78 79
79 namespace content { 80 namespace content {
80 81
81 PresentationDispatcher::PresentationDispatcher(RenderFrame* render_frame) 82 PresentationDispatcher::PresentationDispatcher(RenderFrame* render_frame)
82 : RenderFrameObserver(render_frame), 83 : RenderFrameObserver(render_frame),
83 controller_(nullptr), 84 controller_(nullptr),
84 binding_(this) { 85 receiver_(nullptr),
85 } 86 binding_(this) {}
86 87
87 PresentationDispatcher::~PresentationDispatcher() { 88 PresentationDispatcher::~PresentationDispatcher() {
88 // Controller should be destroyed before the dispatcher when frame is 89 // Controller should be destroyed before the dispatcher when frame is
89 // destroyed. 90 // destroyed.
90 DCHECK(!controller_); 91 DCHECK(!controller_);
91 } 92 }
92 93
93 void PresentationDispatcher::setController( 94 void PresentationDispatcher::setController(
94 blink::WebPresentationController* controller) { 95 blink::WebPresentationController* controller) {
95 // There shouldn't be any swapping from one non-null controller to another. 96 // There shouldn't be any swapping from one non-null controller to another.
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 } 369 }
369 status->availability_callbacks.Clear(); 370 status->availability_callbacks.Clear();
370 UpdateListeningState(status); 371 UpdateListeningState(status);
371 } 372 }
372 373
373 void PresentationDispatcher::OnDefaultSessionStarted( 374 void PresentationDispatcher::OnDefaultSessionStarted(
374 blink::mojom::PresentationSessionInfoPtr session_info) { 375 blink::mojom::PresentationSessionInfoPtr session_info) {
375 if (!controller_) 376 if (!controller_)
376 return; 377 return;
377 378
378 if (!session_info.is_null()) { 379 if (session_info.is_null())
379 presentation_service_->ListenForSessionMessages(session_info.Clone()); 380 return;
380 controller_->didStartDefaultSession( 381
381 new PresentationConnectionClient(std::move(session_info))); 382 presentation_service_->ListenForSessionMessages(session_info.Clone());
imcheng 2016/11/01 17:20:30 It seems we shouldn't be listening for messages fr
zhaobin 2016/11/02 03:55:48 Done.
382 } 383
384 controller_->didStartDefaultSession(new PresentationConnectionClient(
385 session_info.Clone(),
386 CreateAndSetControllerConnectionProxy(session_info.Clone())));
383 } 387 }
384 388
385 void PresentationDispatcher::OnSessionCreated( 389 void PresentationDispatcher::OnSessionCreated(
386 blink::WebPresentationConnectionClientCallbacks* callback, 390 blink::WebPresentationConnectionClientCallbacks* callback,
387 blink::mojom::PresentationSessionInfoPtr session_info, 391 blink::mojom::PresentationSessionInfoPtr session_info,
388 blink::mojom::PresentationErrorPtr error) { 392 blink::mojom::PresentationErrorPtr error) {
389 DCHECK(callback); 393 DCHECK(callback);
390 if (!error.is_null()) { 394 if (!error.is_null()) {
391 DCHECK(session_info.is_null()); 395 DCHECK(session_info.is_null());
392 callback->onError(blink::WebPresentationError( 396 callback->onError(blink::WebPresentationError(
393 GetWebPresentationErrorTypeFromMojo(error->error_type), 397 GetWebPresentationErrorTypeFromMojo(error->error_type),
394 blink::WebString::fromUTF8(error->message))); 398 blink::WebString::fromUTF8(error->message)));
395 return; 399 return;
396 } 400 }
397 401
398 DCHECK(!session_info.is_null()); 402 DCHECK(!session_info.is_null());
399 presentation_service_->ListenForSessionMessages(session_info.Clone()); 403 presentation_service_->ListenForSessionMessages(session_info.Clone());
imcheng 2016/11/01 17:20:30 ditto
zhaobin 2016/11/02 03:55:48 Done.
400 callback->onSuccess( 404
401 base::MakeUnique<PresentationConnectionClient>(std::move(session_info))); 405 callback->onSuccess(base::MakeUnique<PresentationConnectionClient>(
406 session_info.Clone(),
407 CreateAndSetControllerConnectionProxy(session_info.Clone())));
402 } 408 }
403 409
404 void PresentationDispatcher::OnReceiverConnectionAvailable( 410 void PresentationDispatcher::OnReceiverConnectionAvailable(
405 blink::mojom::PresentationSessionInfoPtr session_info) { 411 blink::mojom::PresentationSessionInfoPtr session_info,
406 if (receiver_) { 412 blink::mojom::PresentationConnectionPtr controller) {
407 receiver_->onReceiverConnectionAvailable( 413 DCHECK(receiver_);
408 new PresentationConnectionClient(std::move(session_info))); 414
409 } 415 std::unique_ptr<PresentationConnectionProxy> receiver_connection_proxy =
416 base::MakeUnique<PresentationConnectionProxy>();
417
418 controller->SetTargetConnection(receiver_connection_proxy->Bind());
419 receiver_connection_proxy->SetTargetConnection(std::move(controller));
420 // Bind receiver_connection_proxy with PresentationConnection
421 // in receiver page.
422 receiver_->onReceiverConnectionAvailable(new PresentationConnectionClient(
423 std::move(session_info), std::move(receiver_connection_proxy)));
410 } 424 }
411 425
412 void PresentationDispatcher::OnConnectionStateChanged( 426 void PresentationDispatcher::OnConnectionStateChanged(
413 blink::mojom::PresentationSessionInfoPtr connection, 427 blink::mojom::PresentationSessionInfoPtr connection,
414 blink::mojom::PresentationConnectionState state) { 428 blink::mojom::PresentationConnectionState state) {
415 if (!controller_) 429 if (!controller_)
416 return; 430 return;
417 431
418 DCHECK(!connection.is_null()); 432 DCHECK(!connection.is_null());
419 controller_->didChangeSessionState( 433 controller_->didChangeSessionState(
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 ConnectToPresentationServiceIfNeeded(); 503 ConnectToPresentationServiceIfNeeded();
490 if (should_listen) { 504 if (should_listen) {
491 status->listening_state = ListeningState::WAITING; 505 status->listening_state = ListeningState::WAITING;
492 presentation_service_->ListenForScreenAvailability(status->url); 506 presentation_service_->ListenForScreenAvailability(status->url);
493 } else { 507 } else {
494 status->listening_state = ListeningState::INACTIVE; 508 status->listening_state = ListeningState::INACTIVE;
495 presentation_service_->StopListeningForScreenAvailability(status->url); 509 presentation_service_->StopListeningForScreenAvailability(status->url);
496 } 510 }
497 } 511 }
498 512
513 std::unique_ptr<PresentationConnectionProxy>
514 PresentationDispatcher::CreateAndSetControllerConnectionProxy(
515 blink::mojom::PresentationSessionInfoPtr session_info) {
516 if (session_info->is_offscreen) {
517 std::unique_ptr<PresentationConnectionProxy> controller_connection_proxy =
518 base::MakeUnique<PresentationConnectionProxy>();
519 // Pass controller_connection_proxy to PSImpl and register
520 // it with OffscreenPresentationManager.
521 presentation_service_->SetPresentationConnection(
522 session_info.Clone(), controller_connection_proxy->Bind());
523
524 return controller_connection_proxy;
525 }
526 return nullptr;
527 }
528
529 // static
530 blink::mojom::SessionMessagePtr PresentationDispatcher::ToMojoTextMessage(
531 const blink::WebString& message) {
532 blink::mojom::SessionMessagePtr session_message =
533 blink::mojom::SessionMessage::New();
534 session_message->type = blink::mojom::PresentationMessageType::TEXT;
535 session_message->message = message.utf8();
536 return session_message;
537 }
538
539 // static
540 blink::mojom::SessionMessagePtr PresentationDispatcher::ToMojoBinaryMessage(
541 blink::mojom::PresentationMessageType type,
542 const uint8_t* data,
543 size_t length) {
544 blink::mojom::SessionMessagePtr session_message =
545 blink::mojom::SessionMessage::New();
546 session_message->type = type;
547 session_message->data = std::vector<uint8_t>(data, data + length);
548 return session_message;
549 }
550
499 PresentationDispatcher::SendMessageRequest::SendMessageRequest( 551 PresentationDispatcher::SendMessageRequest::SendMessageRequest(
500 blink::mojom::PresentationSessionInfoPtr session_info, 552 blink::mojom::PresentationSessionInfoPtr session_info,
501 blink::mojom::SessionMessagePtr message) 553 blink::mojom::SessionMessagePtr message)
502 : session_info(std::move(session_info)), message(std::move(message)) {} 554 : session_info(std::move(session_info)), message(std::move(message)) {}
503 555
504 PresentationDispatcher::SendMessageRequest::~SendMessageRequest() {} 556 PresentationDispatcher::SendMessageRequest::~SendMessageRequest() {}
505 557
506 // static 558 // static
507 PresentationDispatcher::SendMessageRequest* 559 PresentationDispatcher::SendMessageRequest*
508 PresentationDispatcher::CreateSendTextMessageRequest( 560 PresentationDispatcher::CreateSendTextMessageRequest(
509 const blink::WebURL& presentationUrl, 561 const blink::WebURL& presentationUrl,
510 const blink::WebString& presentationId, 562 const blink::WebString& presentationId,
511 const blink::WebString& message) { 563 const blink::WebString& message) {
512 blink::mojom::PresentationSessionInfoPtr session_info = 564 blink::mojom::PresentationSessionInfoPtr session_info =
513 blink::mojom::PresentationSessionInfo::New(); 565 blink::mojom::PresentationSessionInfo::New();
514 session_info->url = presentationUrl; 566 session_info->url = presentationUrl;
515 session_info->id = presentationId.utf8(); 567 session_info->id = presentationId.utf8();
516 568
517 blink::mojom::SessionMessagePtr session_message =
518 blink::mojom::SessionMessage::New();
519 session_message->type = blink::mojom::PresentationMessageType::TEXT;
520 session_message->message = message.utf8();
521 return new SendMessageRequest(std::move(session_info), 569 return new SendMessageRequest(std::move(session_info),
522 std::move(session_message)); 570 ToMojoTextMessage(message));
523 } 571 }
524 572
525 // static 573 // static
526 PresentationDispatcher::SendMessageRequest* 574 PresentationDispatcher::SendMessageRequest*
527 PresentationDispatcher::CreateSendBinaryMessageRequest( 575 PresentationDispatcher::CreateSendBinaryMessageRequest(
528 const blink::WebURL& presentationUrl, 576 const blink::WebURL& presentationUrl,
529 const blink::WebString& presentationId, 577 const blink::WebString& presentationId,
530 blink::mojom::PresentationMessageType type, 578 blink::mojom::PresentationMessageType type,
531 const uint8_t* data, 579 const uint8_t* data,
532 size_t length) { 580 size_t length) {
533 blink::mojom::PresentationSessionInfoPtr session_info = 581 blink::mojom::PresentationSessionInfoPtr session_info =
534 blink::mojom::PresentationSessionInfo::New(); 582 blink::mojom::PresentationSessionInfo::New();
535 session_info->url = presentationUrl; 583 session_info->url = presentationUrl;
536 session_info->id = presentationId.utf8(); 584 session_info->id = presentationId.utf8();
537 585
538 blink::mojom::SessionMessagePtr session_message =
539 blink::mojom::SessionMessage::New();
540 session_message->type = type;
541 session_message->data = std::vector<uint8_t>(data, data + length);
542 return new SendMessageRequest(std::move(session_info), 586 return new SendMessageRequest(std::move(session_info),
543 std::move(session_message)); 587 ToMojoBinaryMessage(type, data, length));
544 } 588 }
545 589
546 PresentationDispatcher::AvailabilityStatus::AvailabilityStatus( 590 PresentationDispatcher::AvailabilityStatus::AvailabilityStatus(
547 const GURL& availability_url) 591 const GURL& availability_url)
548 : url(availability_url), 592 : url(availability_url),
549 last_known_availability(false), 593 last_known_availability(false),
550 listening_state(ListeningState::INACTIVE) {} 594 listening_state(ListeningState::INACTIVE) {}
551 595
552 PresentationDispatcher::AvailabilityStatus::~AvailabilityStatus() { 596 PresentationDispatcher::AvailabilityStatus::~AvailabilityStatus() {
553 } 597 }
554 598
555 } // namespace content 599 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698