diff options
Diffstat (limited to 'content/renderer')
-rw-r--r-- | content/renderer/presentation/presentation_dispatcher.cc | 186 | ||||
-rw-r--r-- | content/renderer/presentation/presentation_dispatcher.h | 38 |
2 files changed, 103 insertions, 121 deletions
diff --git a/content/renderer/presentation/presentation_dispatcher.cc b/content/renderer/presentation/presentation_dispatcher.cc index 1538883..74b4dca 100644 --- a/content/renderer/presentation/presentation_dispatcher.cc +++ b/content/renderer/presentation/presentation_dispatcher.cc @@ -50,22 +50,6 @@ blink::WebPresentationSessionState GetWebPresentationSessionStateFromMojo( return blink::WebPresentationSessionState::Disconnected; } -presentation::SessionMessage* GetMojoSessionMessage( - const blink::WebString& presentationUrl, - const blink::WebString& presentationId, - presentation::PresentationMessageType type, - const uint8* data, - size_t length) { - presentation::SessionMessage* session_message = - new presentation::SessionMessage(); - session_message->presentation_url = presentationUrl.utf8(); - session_message->presentation_id = presentationId.utf8(); - session_message->type = type; - const std::vector<uint8> vector(data, data + length); - session_message->data = mojo::Array<uint8>::From(vector); - return session_message; -} - } // namespace namespace content { @@ -75,9 +59,7 @@ PresentationDispatcher::PresentationDispatcher(RenderFrame* render_frame) controller_(nullptr), binding_(this), listening_state_(ListeningState::Inactive), - last_known_availability_(false), - listening_for_messages_(false) { -} + last_known_availability_(false) {} PresentationDispatcher::~PresentationDispatcher() { // Controller should be destroyed before the dispatcher when frame is @@ -149,21 +131,11 @@ void PresentationDispatcher::sendString( return; } - presentation::SessionMessage* session_message = - new presentation::SessionMessage(); - session_message->presentation_url = presentationUrl.utf8(); - session_message->presentation_id = presentationId.utf8(); - session_message->type = presentation::PresentationMessageType:: - PRESENTATION_MESSAGE_TYPE_TEXT; - session_message->message = message.utf8(); - - message_request_queue_.push(make_linked_ptr(session_message)); + message_request_queue_.push(make_linked_ptr( + CreateSendTextMessageRequest(presentationUrl, presentationId, message))); // Start processing request if only one in the queue. - if (message_request_queue_.size() == 1) { - const linked_ptr<presentation::SessionMessage>& request = - message_request_queue_.front(); - DoSendMessage(*request); - } + if (message_request_queue_.size() == 1) + DoSendMessage(message_request_queue_.front().get()); } void PresentationDispatcher::sendArrayBuffer( @@ -178,18 +150,14 @@ void PresentationDispatcher::sendArrayBuffer( return; } - presentation::SessionMessage* session_message = - GetMojoSessionMessage(presentationUrl, presentationId, - presentation::PresentationMessageType:: - PRESENTATION_MESSAGE_TYPE_ARRAY_BUFFER, - data, length); - message_request_queue_.push(make_linked_ptr(session_message)); + message_request_queue_.push(make_linked_ptr( + CreateSendBinaryMessageRequest(presentationUrl, presentationId, + presentation::PresentationMessageType:: + PRESENTATION_MESSAGE_TYPE_ARRAY_BUFFER, + data, length))); // Start processing request if only one in the queue. - if (message_request_queue_.size() == 1) { - const linked_ptr<presentation::SessionMessage>& request = - message_request_queue_.front(); - DoSendMessage(*request); - } + if (message_request_queue_.size() == 1) + DoSendMessage(message_request_queue_.front().get()); } void PresentationDispatcher::sendBlobData( @@ -204,49 +172,20 @@ void PresentationDispatcher::sendBlobData( return; } - presentation::SessionMessage* session_message = GetMojoSessionMessage( + message_request_queue_.push(make_linked_ptr(CreateSendBinaryMessageRequest( presentationUrl, presentationId, presentation::PresentationMessageType::PRESENTATION_MESSAGE_TYPE_BLOB, - data, length); - message_request_queue_.push(make_linked_ptr(session_message)); - if (message_request_queue_.size() == 1) { - const linked_ptr<presentation::SessionMessage>& request = - message_request_queue_.front(); - DoSendMessage(*request); - } + data, length))); + // Start processing request if only one in the queue. + if (message_request_queue_.size() == 1) + DoSendMessage(message_request_queue_.front().get()); } -void PresentationDispatcher::DoSendMessage( - const presentation::SessionMessage& session_message) { +void PresentationDispatcher::DoSendMessage(SendMessageRequest* request) { ConnectToPresentationServiceIfNeeded(); - presentation::SessionMessagePtr message_request( - presentation::SessionMessage::New()); - message_request->presentation_url = session_message.presentation_url; - message_request->presentation_id = session_message.presentation_id; - message_request->type = session_message.type; - switch (session_message.type) { - case presentation::PresentationMessageType:: - PRESENTATION_MESSAGE_TYPE_TEXT: { - message_request->message = session_message.message; - break; - } - case presentation::PresentationMessageType:: - PRESENTATION_MESSAGE_TYPE_ARRAY_BUFFER: - case presentation::PresentationMessageType:: - PRESENTATION_MESSAGE_TYPE_BLOB: { - message_request->data = - mojo::Array<uint8>::From(session_message.data.storage()); - break; - } - default: { - NOTREACHED() << "Invalid presentation message type " - << session_message.type; - break; - } - } presentation_service_->SendSessionMessage( - message_request.Pass(), + request->session_info.Pass(), request->message.Pass(), base::Bind(&PresentationDispatcher::HandleSendMessageRequests, base::Unretained(this))); } @@ -268,9 +207,7 @@ void PresentationDispatcher::HandleSendMessageRequests(bool success) { message_request_queue_.pop(); if (!message_request_queue_.empty()) { - const linked_ptr<presentation::SessionMessage>& request = - message_request_queue_.front(); - DoSendMessage(*request); + DoSendMessage(message_request_queue_.front().get()); } } @@ -327,8 +264,6 @@ void PresentationDispatcher::DidCommitProvisionalLoad( // Remove all pending send message requests. MessageRequestQueue empty; std::swap(message_request_queue_, empty); - - listening_for_messages_ = false; } void PresentationDispatcher::OnScreenAvailabilityUpdated(bool available) { @@ -378,8 +313,8 @@ void PresentationDispatcher::OnDefaultSessionStarted( if (!session_info.is_null()) { controller_->didStartDefaultSession( - new PresentationSessionClient(session_info.Pass())); - StartListenForMessages(); + new PresentationSessionClient(session_info.Clone())); + presentation_service_->ListenForSessionMessages(session_info.Pass()); } } @@ -397,18 +332,8 @@ void PresentationDispatcher::OnSessionCreated( } DCHECK(!session_info.is_null()); - callback->onSuccess(new PresentationSessionClient(session_info.Pass())); - StartListenForMessages(); -} - -void PresentationDispatcher::StartListenForMessages() { - if (listening_for_messages_) - return; - - listening_for_messages_ = true; - presentation_service_->ListenForSessionMessages( - base::Bind(&PresentationDispatcher::OnSessionMessagesReceived, - base::Unretained(this))); + callback->onSuccess(new PresentationSessionClient(session_info.Clone())); + presentation_service_->ListenForSessionMessages(session_info.Pass()); } void PresentationDispatcher::OnSessionStateChanged( @@ -424,22 +349,16 @@ void PresentationDispatcher::OnSessionStateChanged( } void PresentationDispatcher::OnSessionMessagesReceived( + presentation::PresentationSessionInfoPtr session_info, mojo::Array<presentation::SessionMessagePtr> messages) { - if (!listening_for_messages_) - return; // messages may come after the frame navigated. - - // When messages is null, there is an error at presentation service side. - if (!controller_ || messages.is_null()) { - listening_for_messages_ = false; + if (!controller_) return; - } for (size_t i = 0; i < messages.size(); ++i) { // Note: Passing batches of messages to the Blink layer would be more // efficient. scoped_ptr<PresentationSessionClient> session_client( - new PresentationSessionClient(messages[i]->presentation_url, - messages[i]->presentation_id)); + new PresentationSessionClient(session_info->url, session_info->id)); switch (messages[i]->type) { case presentation::PresentationMessageType:: PRESENTATION_MESSAGE_TYPE_TEXT: { @@ -463,10 +382,6 @@ void PresentationDispatcher::OnSessionMessagesReceived( } } } - - presentation_service_->ListenForSessionMessages( - base::Bind(&PresentationDispatcher::OnSessionMessagesReceived, - base::Unretained(this))); } void PresentationDispatcher::ConnectToPresentationServiceIfNeeded() { @@ -503,4 +418,51 @@ void PresentationDispatcher::UpdateListeningState() { } } +PresentationDispatcher::SendMessageRequest::SendMessageRequest( + presentation::PresentationSessionInfoPtr session_info, + presentation::SessionMessagePtr message) + : session_info(session_info.Pass()), message(message.Pass()) {} + +PresentationDispatcher::SendMessageRequest::~SendMessageRequest() {} + +// static +PresentationDispatcher::SendMessageRequest* +PresentationDispatcher::CreateSendTextMessageRequest( + const blink::WebString& presentationUrl, + const blink::WebString& presentationId, + const blink::WebString& message) { + presentation::PresentationSessionInfoPtr session_info = + presentation::PresentationSessionInfo::New(); + session_info->url = presentationUrl.utf8(); + session_info->id = presentationId.utf8(); + + presentation::SessionMessagePtr session_message = + presentation::SessionMessage::New(); + session_message->type = + presentation::PresentationMessageType::PRESENTATION_MESSAGE_TYPE_TEXT; + session_message->message = message.utf8(); + return new SendMessageRequest(session_info.Pass(), session_message.Pass()); +} + +// static +PresentationDispatcher::SendMessageRequest* +PresentationDispatcher::CreateSendBinaryMessageRequest( + const blink::WebString& presentationUrl, + const blink::WebString& presentationId, + presentation::PresentationMessageType type, + const uint8* data, + size_t length) { + presentation::PresentationSessionInfoPtr session_info = + presentation::PresentationSessionInfo::New(); + session_info->url = presentationUrl.utf8(); + session_info->id = presentationId.utf8(); + + presentation::SessionMessagePtr session_message = + presentation::SessionMessage::New(); + session_message->type = type; + std::vector<uint8> tmp_data_vector(data, data + length); + session_message->data.Swap(&tmp_data_vector); + return new SendMessageRequest(session_info.Pass(), session_message.Pass()); +} + } // namespace content diff --git a/content/renderer/presentation/presentation_dispatcher.h b/content/renderer/presentation/presentation_dispatcher.h index 1f8887a..6ef3874 100644 --- a/content/renderer/presentation/presentation_dispatcher.h +++ b/content/renderer/presentation/presentation_dispatcher.h @@ -31,6 +31,26 @@ class CONTENT_EXPORT PresentationDispatcher ~PresentationDispatcher() override; private: + struct SendMessageRequest { + SendMessageRequest(presentation::PresentationSessionInfoPtr session_info, + presentation::SessionMessagePtr message); + ~SendMessageRequest(); + + presentation::PresentationSessionInfoPtr session_info; + presentation::SessionMessagePtr message; + }; + + static SendMessageRequest* CreateSendTextMessageRequest( + const blink::WebString& presentationUrl, + const blink::WebString& presentationId, + const blink::WebString& message); + static SendMessageRequest* CreateSendBinaryMessageRequest( + const blink::WebString& presentationUrl, + const blink::WebString& presentationId, + presentation::PresentationMessageType type, + const uint8* data, + size_t length); + // WebPresentationClient implementation. virtual void setController( blink::WebPresentationController* controller); @@ -77,6 +97,9 @@ class CONTENT_EXPORT PresentationDispatcher presentation::PresentationSessionInfoPtr session_info, presentation::PresentationSessionState new_state) override; void OnScreenAvailabilityNotSupported() override; + void OnSessionMessagesReceived( + presentation::PresentationSessionInfoPtr session_info, + mojo::Array<presentation::SessionMessagePtr> messages) override; void OnSessionCreated( blink::WebPresentationSessionClientCallbacks* callback, @@ -84,17 +107,17 @@ class CONTENT_EXPORT PresentationDispatcher presentation::PresentationErrorPtr error); void OnDefaultSessionStarted( presentation::PresentationSessionInfoPtr session_info); - void OnSessionMessagesReceived( - mojo::Array<presentation::SessionMessagePtr> messages); - void DoSendMessage(const presentation::SessionMessage& session_message); + + // Call to PresentationService to send the message in |request|. + // |session_info| and |message| of |reuqest| will be consumed. + // |HandleSendMessageRequests| will be invoked after the send is attempted. + void DoSendMessage(SendMessageRequest* request); void HandleSendMessageRequests(bool success); void ConnectToPresentationServiceIfNeeded(); void UpdateListeningState(); - void StartListenForMessages(); - // Used as a weak reference. Can be null since lifetime is bound to the frame. blink::WebPresentationController* controller_; presentation::PresentationServicePtr presentation_service_; @@ -102,8 +125,7 @@ class CONTENT_EXPORT PresentationDispatcher // Message requests are queued here and only one message at a time is sent // over mojo channel. - using MessageRequestQueue = - std::queue<linked_ptr<presentation::SessionMessage>>; + using MessageRequestQueue = std::queue<linked_ptr<SendMessageRequest>>; MessageRequestQueue message_request_queue_; enum class ListeningState { @@ -123,8 +145,6 @@ class CONTENT_EXPORT PresentationDispatcher std::set<blink::WebPresentationAvailabilityObserver*>; AvailabilityObserversSet availability_observers_; - bool listening_for_messages_; - DISALLOW_COPY_AND_ASSIGN(PresentationDispatcher); }; |