| OLD | NEW |
| 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 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "base/memory/ptr_util.h" | 13 #include "base/memory/ptr_util.h" |
| 14 #include "base/stl_util.h" | 14 #include "base/stl_util.h" |
| 15 #include "base/threading/thread_task_runner_handle.h" | 15 #include "base/threading/thread_task_runner_handle.h" |
| 16 #include "content/public/common/presentation_constants.h" | 16 #include "content/public/common/presentation_connection_message.h" |
| 17 #include "content/public/renderer/render_frame.h" | 17 #include "content/public/renderer/render_frame.h" |
| 18 #include "content/renderer/presentation/presentation_connection_proxy.h" | 18 #include "content/renderer/presentation/presentation_connection_proxy.h" |
| 19 #include "services/service_manager/public/cpp/interface_provider.h" | 19 #include "services/service_manager/public/cpp/interface_provider.h" |
| 20 #include "third_party/WebKit/public/platform/WebString.h" | 20 #include "third_party/WebKit/public/platform/WebString.h" |
| 21 #include "third_party/WebKit/public/platform/WebURL.h" | 21 #include "third_party/WebKit/public/platform/WebURL.h" |
| 22 #include "third_party/WebKit/public/platform/WebVector.h" | 22 #include "third_party/WebKit/public/platform/WebVector.h" |
| 23 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio
nAvailabilityObserver.h" | 23 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio
nAvailabilityObserver.h" |
| 24 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio
nConnection.h" | 24 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio
nConnection.h" |
| 25 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio
nConnectionCallbacks.h" | 25 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio
nConnectionCallbacks.h" |
| 26 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio
nController.h" | 26 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio
nController.h" |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 const blink::WebString& message, | 155 const blink::WebString& message, |
| 156 const blink::WebPresentationConnectionProxy* connection_proxy) { | 156 const blink::WebPresentationConnectionProxy* connection_proxy) { |
| 157 if (message.utf8().size() > kMaxPresentationConnectionMessageSize) { | 157 if (message.utf8().size() > kMaxPresentationConnectionMessageSize) { |
| 158 // TODO(crbug.com/459008): Limit the size of individual messages to 64k | 158 // TODO(crbug.com/459008): Limit the size of individual messages to 64k |
| 159 // for now. Consider throwing DOMException or splitting bigger messages | 159 // for now. Consider throwing DOMException or splitting bigger messages |
| 160 // into smaller chunks later. | 160 // into smaller chunks later. |
| 161 LOG(WARNING) << "message size exceeded limit!"; | 161 LOG(WARNING) << "message size exceeded limit!"; |
| 162 return; | 162 return; |
| 163 } | 163 } |
| 164 | 164 |
| 165 message_request_queue_.push_back( | 165 message_request_queue_.push_back(CreateSendTextMessageRequest( |
| 166 base::WrapUnique(CreateSendTextMessageRequest( | 166 presentationUrl, presentationId, message, connection_proxy)); |
| 167 presentationUrl, presentationId, message, connection_proxy))); | |
| 168 // Start processing request if only one in the queue. | 167 // Start processing request if only one in the queue. |
| 169 if (message_request_queue_.size() == 1) | 168 if (message_request_queue_.size() == 1) |
| 170 DoSendMessage(message_request_queue_.front().get()); | 169 DoSendMessage(message_request_queue_.front().get()); |
| 171 } | 170 } |
| 172 | 171 |
| 173 void PresentationDispatcher::sendArrayBuffer( | 172 void PresentationDispatcher::sendArrayBuffer( |
| 174 const blink::WebURL& presentationUrl, | 173 const blink::WebURL& presentationUrl, |
| 175 const blink::WebString& presentationId, | 174 const blink::WebString& presentationId, |
| 176 const uint8_t* data, | 175 const uint8_t* data, |
| 177 size_t length, | 176 size_t length, |
| 178 const blink::WebPresentationConnectionProxy* connection_proxy) { | 177 const blink::WebPresentationConnectionProxy* connection_proxy) { |
| 179 DCHECK(data); | 178 DCHECK(data); |
| 180 if (length > kMaxPresentationConnectionMessageSize) { | 179 if (length > kMaxPresentationConnectionMessageSize) { |
| 181 // TODO(crbug.com/459008): Same as in sendString(). | 180 // TODO(crbug.com/459008): Same as in sendString(). |
| 182 LOG(WARNING) << "data size exceeded limit!"; | 181 LOG(WARNING) << "data size exceeded limit!"; |
| 183 return; | 182 return; |
| 184 } | 183 } |
| 185 | 184 |
| 186 message_request_queue_.push_back( | 185 message_request_queue_.push_back(CreateSendBinaryMessageRequest( |
| 187 base::WrapUnique(CreateSendBinaryMessageRequest( | 186 presentationUrl, presentationId, data, length, connection_proxy)); |
| 188 presentationUrl, presentationId, | |
| 189 blink::mojom::PresentationMessageType::BINARY, data, length, | |
| 190 connection_proxy))); | |
| 191 // Start processing request if only one in the queue. | 187 // Start processing request if only one in the queue. |
| 192 if (message_request_queue_.size() == 1) | 188 if (message_request_queue_.size() == 1) |
| 193 DoSendMessage(message_request_queue_.front().get()); | 189 DoSendMessage(message_request_queue_.front().get()); |
| 194 } | 190 } |
| 195 | 191 |
| 196 void PresentationDispatcher::sendBlobData( | 192 void PresentationDispatcher::sendBlobData( |
| 197 const blink::WebURL& presentationUrl, | 193 const blink::WebURL& presentationUrl, |
| 198 const blink::WebString& presentationId, | 194 const blink::WebString& presentationId, |
| 199 const uint8_t* data, | 195 const uint8_t* data, |
| 200 size_t length, | 196 size_t length, |
| 201 const blink::WebPresentationConnectionProxy* connection_proxy) { | 197 const blink::WebPresentationConnectionProxy* connection_proxy) { |
| 202 DCHECK(data); | 198 DCHECK(data); |
| 203 if (length > kMaxPresentationConnectionMessageSize) { | 199 if (length > kMaxPresentationConnectionMessageSize) { |
| 204 // TODO(crbug.com/459008): Same as in sendString(). | 200 // TODO(crbug.com/459008): Same as in sendString(). |
| 205 LOG(WARNING) << "data size exceeded limit!"; | 201 LOG(WARNING) << "data size exceeded limit!"; |
| 206 return; | 202 return; |
| 207 } | 203 } |
| 208 | 204 |
| 209 message_request_queue_.push_back( | 205 message_request_queue_.push_back(CreateSendBinaryMessageRequest( |
| 210 base::WrapUnique(CreateSendBinaryMessageRequest( | 206 presentationUrl, presentationId, data, length, connection_proxy)); |
| 211 presentationUrl, presentationId, | |
| 212 blink::mojom::PresentationMessageType::BINARY, data, length, | |
| 213 connection_proxy))); | |
| 214 // Start processing request if only one in the queue. | 207 // Start processing request if only one in the queue. |
| 215 if (message_request_queue_.size() == 1) | 208 if (message_request_queue_.size() == 1) |
| 216 DoSendMessage(message_request_queue_.front().get()); | 209 DoSendMessage(message_request_queue_.front().get()); |
| 217 } | 210 } |
| 218 | 211 |
| 219 void PresentationDispatcher::DoSendMessage(SendMessageRequest* request) { | 212 void PresentationDispatcher::DoSendMessage(SendMessageRequest* request) { |
| 220 DCHECK(request->connection_proxy); | 213 DCHECK(request->connection_proxy); |
| 221 // TODO(crbug.com/684116): Remove static_cast after moving message queue logic | 214 // TODO(crbug.com/684116): Remove static_cast after moving message queue logic |
| 222 // from PresentationDispatcher to PresentationConnectionProxy. | 215 // from PresentationDispatcher to PresentationConnectionProxy. |
| 223 static_cast<const PresentationConnectionProxy*>(request->connection_proxy) | 216 static_cast<const PresentationConnectionProxy*>(request->connection_proxy) |
| (...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 601 controller_->didCloseConnection( | 594 controller_->didCloseConnection( |
| 602 blink::WebPresentationSessionInfo( | 595 blink::WebPresentationSessionInfo( |
| 603 session_info.presentation_url, | 596 session_info.presentation_url, |
| 604 blink::WebString::fromUTF8(session_info.presentation_id)), | 597 blink::WebString::fromUTF8(session_info.presentation_id)), |
| 605 GetWebPresentationConnectionCloseReason(reason), | 598 GetWebPresentationConnectionCloseReason(reason), |
| 606 blink::WebString::fromUTF8(message)); | 599 blink::WebString::fromUTF8(message)); |
| 607 } | 600 } |
| 608 | 601 |
| 609 void PresentationDispatcher::OnConnectionMessagesReceived( | 602 void PresentationDispatcher::OnConnectionMessagesReceived( |
| 610 const PresentationSessionInfo& session_info, | 603 const PresentationSessionInfo& session_info, |
| 611 std::vector<blink::mojom::ConnectionMessagePtr> messages) { | 604 std::vector<PresentationConnectionMessage> messages) { |
| 612 if (!controller_) | 605 if (!controller_) |
| 613 return; | 606 return; |
| 614 | 607 |
| 615 for (size_t i = 0; i < messages.size(); ++i) { | 608 for (size_t i = 0; i < messages.size(); ++i) { |
| 616 // Note: Passing batches of messages to the Blink layer would be more | 609 // Note: Passing batches of messages to the Blink layer would be more |
| 617 // efficient. | 610 // efficient. |
| 618 auto web_session_info = blink::WebPresentationSessionInfo( | 611 auto web_session_info = blink::WebPresentationSessionInfo( |
| 619 session_info.presentation_url, | 612 session_info.presentation_url, |
| 620 blink::WebString::fromUTF8(session_info.presentation_id)); | 613 blink::WebString::fromUTF8(session_info.presentation_id)); |
| 621 | 614 |
| 622 switch (messages[i]->type) { | 615 if (messages[i].is_binary()) { |
| 623 case blink::mojom::PresentationMessageType::TEXT: { | 616 controller_->didReceiveSessionBinaryMessage(web_session_info, |
| 624 // TODO(mfoltz): Do we need to DCHECK(messages[i]->message)? | 617 &(messages[i].data->front()), |
| 625 controller_->didReceiveSessionTextMessage( | 618 messages[i].data->size()); |
| 626 web_session_info, | 619 } else { |
| 627 blink::WebString::fromUTF8(messages[i]->message.value())); | 620 DCHECK(messages[i].message); |
| 628 break; | 621 controller_->didReceiveSessionTextMessage( |
| 629 } | 622 web_session_info, blink::WebString::fromUTF8(*messages[i].message)); |
| 630 case blink::mojom::PresentationMessageType::BINARY: { | |
| 631 // TODO(mfoltz): Do we need to DCHECK(messages[i]->data)? | |
| 632 controller_->didReceiveSessionBinaryMessage( | |
| 633 web_session_info, &(messages[i]->data->front()), | |
| 634 messages[i]->data->size()); | |
| 635 break; | |
| 636 } | |
| 637 default: { | |
| 638 NOTREACHED(); | |
| 639 break; | |
| 640 } | |
| 641 } | 623 } |
| 642 } | 624 } |
| 643 } | 625 } |
| 644 | 626 |
| 645 void PresentationDispatcher::ConnectToPresentationServiceIfNeeded() { | 627 void PresentationDispatcher::ConnectToPresentationServiceIfNeeded() { |
| 646 if (presentation_service_.get()) | 628 if (presentation_service_.get()) |
| 647 return; | 629 return; |
| 648 | 630 |
| 649 render_frame()->GetRemoteInterfaces()->GetInterface(&presentation_service_); | 631 render_frame()->GetRemoteInterfaces()->GetInterface(&presentation_service_); |
| 650 presentation_service_->SetClient(binding_.CreateInterfacePtrAndBind()); | 632 presentation_service_->SetClient(binding_.CreateInterfacePtrAndBind()); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 744 status ? status->last_known_availability : ScreenAvailability::UNKNOWN; | 726 status ? status->last_known_availability : ScreenAvailability::UNKNOWN; |
| 745 current_availability = | 727 current_availability = |
| 746 std::max(current_availability, static_cast<int>(screen_availability)); | 728 std::max(current_availability, static_cast<int>(screen_availability)); |
| 747 } | 729 } |
| 748 | 730 |
| 749 return static_cast<ScreenAvailability>(current_availability); | 731 return static_cast<ScreenAvailability>(current_availability); |
| 750 } | 732 } |
| 751 | 733 |
| 752 PresentationDispatcher::SendMessageRequest::SendMessageRequest( | 734 PresentationDispatcher::SendMessageRequest::SendMessageRequest( |
| 753 const PresentationSessionInfo& session_info, | 735 const PresentationSessionInfo& session_info, |
| 754 blink::mojom::ConnectionMessagePtr message, | 736 PresentationConnectionMessage connection_message, |
| 755 const blink::WebPresentationConnectionProxy* connection_proxy) | 737 const blink::WebPresentationConnectionProxy* connection_proxy) |
| 756 : session_info(session_info), | 738 : session_info(session_info), |
| 757 message(std::move(message)), | 739 message(std::move(connection_message)), |
| 758 connection_proxy(connection_proxy) {} | 740 connection_proxy(connection_proxy) {} |
| 759 | 741 |
| 760 PresentationDispatcher::SendMessageRequest::~SendMessageRequest() {} | 742 PresentationDispatcher::SendMessageRequest::~SendMessageRequest() {} |
| 761 | 743 |
| 762 // static | 744 // static |
| 763 PresentationDispatcher::SendMessageRequest* | 745 std::unique_ptr<PresentationDispatcher::SendMessageRequest> |
| 764 PresentationDispatcher::CreateSendTextMessageRequest( | 746 PresentationDispatcher::CreateSendTextMessageRequest( |
| 765 const blink::WebURL& presentationUrl, | 747 const blink::WebURL& presentationUrl, |
| 766 const blink::WebString& presentationId, | 748 const blink::WebString& presentationId, |
| 767 const blink::WebString& message, | 749 const blink::WebString& message, |
| 768 const blink::WebPresentationConnectionProxy* connection_proxy) { | 750 const blink::WebPresentationConnectionProxy* connection_proxy) { |
| 769 PresentationSessionInfo session_info(GURL(presentationUrl), | 751 PresentationSessionInfo session_info(GURL(presentationUrl), |
| 770 presentationId.utf8()); | 752 presentationId.utf8()); |
| 771 | 753 |
| 772 blink::mojom::ConnectionMessagePtr session_message = | 754 return base::MakeUnique<SendMessageRequest>( |
| 773 blink::mojom::ConnectionMessage::New(); | 755 session_info, PresentationConnectionMessage(message.utf8()), |
| 774 session_message->type = blink::mojom::PresentationMessageType::TEXT; | 756 connection_proxy); |
| 775 session_message->message = message.utf8(); | |
| 776 return new SendMessageRequest(session_info, std::move(session_message), | |
| 777 connection_proxy); | |
| 778 } | 757 } |
| 779 | 758 |
| 780 // static | 759 // static |
| 781 PresentationDispatcher::SendMessageRequest* | 760 std::unique_ptr<PresentationDispatcher::SendMessageRequest> |
| 782 PresentationDispatcher::CreateSendBinaryMessageRequest( | 761 PresentationDispatcher::CreateSendBinaryMessageRequest( |
| 783 const blink::WebURL& presentationUrl, | 762 const blink::WebURL& presentationUrl, |
| 784 const blink::WebString& presentationId, | 763 const blink::WebString& presentationId, |
| 785 blink::mojom::PresentationMessageType type, | |
| 786 const uint8_t* data, | 764 const uint8_t* data, |
| 787 size_t length, | 765 size_t length, |
| 788 const blink::WebPresentationConnectionProxy* connection_proxy) { | 766 const blink::WebPresentationConnectionProxy* connection_proxy) { |
| 789 PresentationSessionInfo session_info(GURL(presentationUrl), | 767 PresentationSessionInfo session_info(GURL(presentationUrl), |
| 790 presentationId.utf8()); | 768 presentationId.utf8()); |
| 791 | 769 return base::MakeUnique<SendMessageRequest>( |
| 792 blink::mojom::ConnectionMessagePtr session_message = | 770 session_info, |
| 793 blink::mojom::ConnectionMessage::New(); | 771 PresentationConnectionMessage(std::vector<uint8_t>(data, data + length)), |
| 794 session_message->type = type; | 772 connection_proxy); |
| 795 session_message->data = std::vector<uint8_t>(data, data + length); | |
| 796 return new SendMessageRequest(session_info, std::move(session_message), | |
| 797 connection_proxy); | |
| 798 } | 773 } |
| 799 | 774 |
| 800 PresentationDispatcher::AvailabilityListener::AvailabilityListener( | 775 PresentationDispatcher::AvailabilityListener::AvailabilityListener( |
| 801 const std::vector<GURL>& availability_urls) | 776 const std::vector<GURL>& availability_urls) |
| 802 : urls(availability_urls) {} | 777 : urls(availability_urls) {} |
| 803 | 778 |
| 804 PresentationDispatcher::AvailabilityListener::~AvailabilityListener() {} | 779 PresentationDispatcher::AvailabilityListener::~AvailabilityListener() {} |
| 805 | 780 |
| 806 PresentationDispatcher::ListeningStatus::ListeningStatus( | 781 PresentationDispatcher::ListeningStatus::ListeningStatus( |
| 807 const GURL& availability_url) | 782 const GURL& availability_url) |
| 808 : url(availability_url), | 783 : url(availability_url), |
| 809 last_known_availability(ScreenAvailability::UNKNOWN), | 784 last_known_availability(ScreenAvailability::UNKNOWN), |
| 810 listening_state(ListeningState::INACTIVE) {} | 785 listening_state(ListeningState::INACTIVE) {} |
| 811 | 786 |
| 812 PresentationDispatcher::ListeningStatus::~ListeningStatus() {} | 787 PresentationDispatcher::ListeningStatus::~ListeningStatus() {} |
| 813 | 788 |
| 814 } // namespace content | 789 } // namespace content |
| OLD | NEW |