| Index: content/renderer/presentation/presentation_dispatcher.cc
|
| diff --git a/content/renderer/presentation/presentation_dispatcher.cc b/content/renderer/presentation/presentation_dispatcher.cc
|
| index c25efc23f8a27236a8d11127d8befba5b1ffc3b4..55f890adc3193e03251623ffa764bcd999b37ff4 100644
|
| --- a/content/renderer/presentation/presentation_dispatcher.cc
|
| +++ b/content/renderer/presentation/presentation_dispatcher.cc
|
| @@ -76,6 +76,30 @@ GetWebPresentationConnectionCloseReasonFromMojo(
|
| }
|
| }
|
|
|
| +// TODO(zhaobin): remove this function and use typemap instead after
|
| +// crbug.com/632623 lands.
|
| +blink::mojom::SessionMessagePtr ToMojoTextMessage(
|
| + const blink::WebString& message) {
|
| + blink::mojom::SessionMessagePtr session_message =
|
| + blink::mojom::SessionMessage::New();
|
| + session_message->type = blink::mojom::PresentationMessageType::TEXT;
|
| + session_message->message = message.utf8();
|
| + return session_message;
|
| +}
|
| +
|
| +// TODO(zhaobin): remove this function and use typemap instead after
|
| +// crbug.com/632623 lands.
|
| +blink::mojom::SessionMessagePtr ToMojoBinaryMessage(
|
| + blink::mojom::PresentationMessageType type,
|
| + const uint8_t* data,
|
| + size_t length) {
|
| + blink::mojom::SessionMessagePtr session_message =
|
| + blink::mojom::SessionMessage::New();
|
| + session_message->type = type;
|
| + session_message->data = std::vector<uint8_t>(data, data + length);
|
| + return session_message;
|
| +}
|
| +
|
| } // namespace
|
|
|
| namespace content {
|
| @@ -83,8 +107,8 @@ namespace content {
|
| PresentationDispatcher::PresentationDispatcher(RenderFrame* render_frame)
|
| : RenderFrameObserver(render_frame),
|
| controller_(nullptr),
|
| - binding_(this) {
|
| -}
|
| + receiver_(nullptr),
|
| + binding_(this) {}
|
|
|
| PresentationDispatcher::~PresentationDispatcher() {
|
| // Controller should be destroyed before the dispatcher when frame is
|
| @@ -207,10 +231,9 @@ void PresentationDispatcher::DoSendMessage(
|
| const blink::WebPresentationConnectionProxy* connection_proxy) {
|
| ConnectToPresentationServiceIfNeeded();
|
|
|
| - presentation_service_->SendSessionMessage(
|
| - std::move(request->session_info), std::move(request->message),
|
| - base::Bind(&PresentationDispatcher::HandleSendMessageRequests,
|
| - base::Unretained(this), nullptr));
|
| + static_cast<const PresentationConnectionProxy*>(connection_proxy)
|
| + ->SendSessionMessage(std::move(request->session_info),
|
| + std::move(request->message));
|
| }
|
|
|
| void PresentationDispatcher::HandleSendMessageRequests(
|
| @@ -385,11 +408,13 @@ void PresentationDispatcher::OnDefaultSessionStarted(
|
| if (!controller_)
|
| return;
|
|
|
| - if (!session_info.is_null()) {
|
| - presentation_service_->ListenForSessionMessages(session_info.Clone());
|
| - controller_->didStartDefaultSession(
|
| - new PresentationConnectionClient(std::move(session_info)));
|
| - }
|
| + if (session_info.is_null())
|
| + return;
|
| +
|
| + presentation_service_->ListenForSessionMessages(session_info.Clone());
|
| + controller_->didStartDefaultSession(new PresentationConnectionClient(
|
| + session_info->url, session_info->id,
|
| + CreateAndSetControllerConnectionProxy(session_info.Clone())));
|
| }
|
|
|
| void PresentationDispatcher::OnSessionCreated(
|
| @@ -407,16 +432,34 @@ void PresentationDispatcher::OnSessionCreated(
|
|
|
| DCHECK(!session_info.is_null());
|
| presentation_service_->ListenForSessionMessages(session_info.Clone());
|
| - callback->onSuccess(
|
| - base::MakeUnique<PresentationConnectionClient>(std::move(session_info)));
|
| +
|
| + callback->onSuccess(base::MakeUnique<PresentationConnectionClient>(
|
| + session_info->url, session_info->id,
|
| + CreateAndSetControllerConnectionProxy(session_info.Clone())));
|
| }
|
|
|
| void PresentationDispatcher::OnReceiverConnectionAvailable(
|
| - blink::mojom::PresentationSessionInfoPtr session_info) {
|
| - if (receiver_) {
|
| - receiver_->onReceiverConnectionAvailable(
|
| - new PresentationConnectionClient(std::move(session_info)));
|
| - }
|
| + blink::mojom::PresentationSessionInfoPtr session_info,
|
| + blink::mojom::PresentationConnectionPtr controller) {
|
| + DCHECK(receiver_);
|
| +
|
| + std::unique_ptr<PresentationConnectionProxy> receiver_connection_proxy =
|
| + base::MakeUnique<PresentationConnectionProxy>();
|
| +
|
| + receiver_connection_proxy->RegisterOnMessageCallback(
|
| + base::Bind(&PresentationDispatcher::HandleSendMessageRequests,
|
| + base::Unretained(this), receiver_connection_proxy.get()));
|
| +
|
| + PresentationConnectionProxy* receiver_connection_ptr =
|
| + receiver_connection_proxy.get();
|
| + // Bind receiver_connection_proxy with PresentationConnection
|
| + // in receiver page.
|
| + receiver_->onReceiverConnectionAvailable(
|
| + new PresentationConnectionClient(session_info->url, session_info->id,
|
| + std::move(receiver_connection_proxy)));
|
| +
|
| + controller->SetTargetConnection(receiver_connection_ptr->Bind());
|
| + receiver_connection_ptr->SetTargetConnection(std::move(controller));
|
| }
|
|
|
| void PresentationDispatcher::OnConnectionStateChanged(
|
| @@ -506,6 +549,23 @@ void PresentationDispatcher::UpdateListeningState(AvailabilityStatus* status) {
|
| }
|
| }
|
|
|
| +std::unique_ptr<PresentationConnectionProxy>
|
| +PresentationDispatcher::CreateAndSetControllerConnectionProxy(
|
| + blink::mojom::PresentationSessionInfoPtr session_info) {
|
| + std::unique_ptr<PresentationConnectionProxy> controller_connection_proxy =
|
| + base::MakeUnique<PresentationConnectionProxy>();
|
| + controller_connection_proxy->RegisterOnMessageCallback(
|
| + base::Bind(&PresentationDispatcher::HandleSendMessageRequests,
|
| + base::Unretained(this), controller_connection_proxy.get()));
|
| +
|
| + // Pass controller_connection_proxy to PSImpl and register
|
| + // it with OffscreenPresentationManager.
|
| + presentation_service_->SetPresentationConnection(
|
| + session_info.Clone(), controller_connection_proxy->Bind());
|
| +
|
| + return controller_connection_proxy;
|
| +}
|
| +
|
| PresentationDispatcher::SendMessageRequest::SendMessageRequest(
|
| blink::mojom::PresentationSessionInfoPtr session_info,
|
| blink::mojom::SessionMessagePtr message)
|
| @@ -524,12 +584,8 @@ PresentationDispatcher::CreateSendTextMessageRequest(
|
| session_info->url = presentationUrl;
|
| session_info->id = presentationId.utf8();
|
|
|
| - blink::mojom::SessionMessagePtr session_message =
|
| - blink::mojom::SessionMessage::New();
|
| - session_message->type = blink::mojom::PresentationMessageType::TEXT;
|
| - session_message->message = message.utf8();
|
| return new SendMessageRequest(std::move(session_info),
|
| - std::move(session_message));
|
| + ToMojoTextMessage(message));
|
| }
|
|
|
| // static
|
| @@ -545,12 +601,8 @@ PresentationDispatcher::CreateSendBinaryMessageRequest(
|
| session_info->url = presentationUrl;
|
| session_info->id = presentationId.utf8();
|
|
|
| - blink::mojom::SessionMessagePtr session_message =
|
| - blink::mojom::SessionMessage::New();
|
| - session_message->type = type;
|
| - session_message->data = std::vector<uint8_t>(data, data + length);
|
| return new SendMessageRequest(std::move(session_info),
|
| - std::move(session_message));
|
| + ToMojoBinaryMessage(type, data, length));
|
| }
|
|
|
| PresentationDispatcher::AvailabilityStatus::AvailabilityStatus(
|
|
|