Chromium Code Reviews| 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 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 176 size_t length, | 176 size_t length, |
| 177 const blink::WebPresentationConnectionProxy* connection_proxy) { | 177 const blink::WebPresentationConnectionProxy* connection_proxy) { |
| 178 DCHECK(data); | 178 DCHECK(data); |
| 179 if (length > kMaxPresentationConnectionMessageSize) { | 179 if (length > kMaxPresentationConnectionMessageSize) { |
| 180 // TODO(crbug.com/459008): Same as in sendString(). | 180 // TODO(crbug.com/459008): Same as in sendString(). |
| 181 LOG(WARNING) << "data size exceeded limit!"; | 181 LOG(WARNING) << "data size exceeded limit!"; |
| 182 return; | 182 return; |
| 183 } | 183 } |
| 184 | 184 |
| 185 message_request_queue_.push(base::WrapUnique(CreateSendBinaryMessageRequest( | 185 message_request_queue_.push(base::WrapUnique(CreateSendBinaryMessageRequest( |
| 186 presentationUrl, presentationId, | 186 presentationUrl, presentationId, data, length, connection_proxy))); |
| 187 blink::mojom::PresentationMessageType::BINARY, data, length, | |
| 188 connection_proxy))); | |
| 189 // Start processing request if only one in the queue. | 187 // Start processing request if only one in the queue. |
| 190 if (message_request_queue_.size() == 1) | 188 if (message_request_queue_.size() == 1) |
| 191 DoSendMessage(message_request_queue_.front().get()); | 189 DoSendMessage(message_request_queue_.front().get()); |
| 192 } | 190 } |
| 193 | 191 |
| 194 void PresentationDispatcher::sendBlobData( | 192 void PresentationDispatcher::sendBlobData( |
| 195 const blink::WebURL& presentationUrl, | 193 const blink::WebURL& presentationUrl, |
| 196 const blink::WebString& presentationId, | 194 const blink::WebString& presentationId, |
| 197 const uint8_t* data, | 195 const uint8_t* data, |
| 198 size_t length, | 196 size_t length, |
| 199 const blink::WebPresentationConnectionProxy* connection_proxy) { | 197 const blink::WebPresentationConnectionProxy* connection_proxy) { |
| 200 DCHECK(data); | 198 DCHECK(data); |
| 201 if (length > kMaxPresentationConnectionMessageSize) { | 199 if (length > kMaxPresentationConnectionMessageSize) { |
| 202 // TODO(crbug.com/459008): Same as in sendString(). | 200 // TODO(crbug.com/459008): Same as in sendString(). |
| 203 LOG(WARNING) << "data size exceeded limit!"; | 201 LOG(WARNING) << "data size exceeded limit!"; |
| 204 return; | 202 return; |
| 205 } | 203 } |
| 206 | 204 |
| 207 message_request_queue_.push(base::WrapUnique(CreateSendBinaryMessageRequest( | 205 message_request_queue_.push(base::WrapUnique(CreateSendBinaryMessageRequest( |
| 208 presentationUrl, presentationId, | 206 presentationUrl, presentationId, data, length, connection_proxy))); |
| 209 blink::mojom::PresentationMessageType::BINARY, data, length, | |
| 210 connection_proxy))); | |
| 211 // Start processing request if only one in the queue. | 207 // Start processing request if only one in the queue. |
| 212 if (message_request_queue_.size() == 1) | 208 if (message_request_queue_.size() == 1) |
| 213 DoSendMessage(message_request_queue_.front().get()); | 209 DoSendMessage(message_request_queue_.front().get()); |
| 214 } | 210 } |
| 215 | 211 |
| 216 void PresentationDispatcher::DoSendMessage(SendMessageRequest* request) { | 212 void PresentationDispatcher::DoSendMessage(SendMessageRequest* request) { |
| 217 DCHECK(request->connection_proxy); | 213 DCHECK(request->connection_proxy); |
| 218 // 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 |
| 219 // from PresentationDispatcher to PresentationConnectionProxy. | 215 // from PresentationDispatcher to PresentationConnectionProxy. |
| 220 static_cast<const PresentationConnectionProxy*>(request->connection_proxy) | 216 static_cast<const PresentationConnectionProxy*>(request->connection_proxy) |
| (...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 573 controller_->didCloseConnection( | 569 controller_->didCloseConnection( |
| 574 blink::WebPresentationSessionInfo( | 570 blink::WebPresentationSessionInfo( |
| 575 session_info.presentation_url, | 571 session_info.presentation_url, |
| 576 blink::WebString::fromUTF8(session_info.presentation_id)), | 572 blink::WebString::fromUTF8(session_info.presentation_id)), |
| 577 GetWebPresentationConnectionCloseReason(reason), | 573 GetWebPresentationConnectionCloseReason(reason), |
| 578 blink::WebString::fromUTF8(message)); | 574 blink::WebString::fromUTF8(message)); |
| 579 } | 575 } |
| 580 | 576 |
| 581 void PresentationDispatcher::OnConnectionMessagesReceived( | 577 void PresentationDispatcher::OnConnectionMessagesReceived( |
| 582 const PresentationSessionInfo& session_info, | 578 const PresentationSessionInfo& session_info, |
| 583 std::vector<blink::mojom::ConnectionMessagePtr> messages) { | 579 const std::vector<PresentationConnectionMessage>& messages) { |
| 584 if (!controller_) | 580 if (!controller_) |
| 585 return; | 581 return; |
| 586 | 582 |
| 587 for (size_t i = 0; i < messages.size(); ++i) { | 583 for (size_t i = 0; i < messages.size(); ++i) { |
| 588 // Note: Passing batches of messages to the Blink layer would be more | 584 // Note: Passing batches of messages to the Blink layer would be more |
| 589 // efficient. | 585 // efficient. |
| 590 auto web_session_info = blink::WebPresentationSessionInfo( | 586 auto web_session_info = blink::WebPresentationSessionInfo( |
| 591 session_info.presentation_url, | 587 session_info.presentation_url, |
| 592 blink::WebString::fromUTF8(session_info.presentation_id)); | 588 blink::WebString::fromUTF8(session_info.presentation_id)); |
| 593 | 589 |
| 594 switch (messages[i]->type) { | 590 if (messages[i].is_binary()) { |
| 595 case blink::mojom::PresentationMessageType::TEXT: { | 591 controller_->didReceiveSessionBinaryMessage(web_session_info, |
| 596 // TODO(mfoltz): Do we need to DCHECK(messages[i]->message)? | 592 &(messages[i].data->front()), |
| 597 controller_->didReceiveSessionTextMessage( | 593 messages[i].data->size()); |
| 598 web_session_info, | 594 } else { |
| 599 blink::WebString::fromUTF8(messages[i]->message.value())); | 595 DCHECK(messages[i].message); |
| 600 break; | 596 controller_->didReceiveSessionTextMessage( |
| 601 } | 597 web_session_info, blink::WebString::fromUTF8(*messages[i].message)); |
| 602 case blink::mojom::PresentationMessageType::BINARY: { | |
| 603 // TODO(mfoltz): Do we need to DCHECK(messages[i]->data)? | |
| 604 controller_->didReceiveSessionBinaryMessage( | |
| 605 web_session_info, &(messages[i]->data->front()), | |
| 606 messages[i]->data->size()); | |
| 607 break; | |
| 608 } | |
| 609 default: { | |
| 610 NOTREACHED(); | |
| 611 break; | |
| 612 } | |
| 613 } | 598 } |
| 614 } | 599 } |
| 615 } | 600 } |
| 616 | 601 |
| 617 void PresentationDispatcher::ConnectToPresentationServiceIfNeeded() { | 602 void PresentationDispatcher::ConnectToPresentationServiceIfNeeded() { |
| 618 if (presentation_service_.get()) | 603 if (presentation_service_.get()) |
| 619 return; | 604 return; |
| 620 | 605 |
| 621 render_frame()->GetRemoteInterfaces()->GetInterface(&presentation_service_); | 606 render_frame()->GetRemoteInterfaces()->GetInterface(&presentation_service_); |
| 622 presentation_service_->SetClient(binding_.CreateInterfacePtrAndBind()); | 607 presentation_service_->SetClient(binding_.CreateInterfacePtrAndBind()); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 716 status ? status->last_known_availability : ScreenAvailability::UNKNOWN; | 701 status ? status->last_known_availability : ScreenAvailability::UNKNOWN; |
| 717 current_availability = | 702 current_availability = |
| 718 std::max(current_availability, static_cast<int>(screen_availability)); | 703 std::max(current_availability, static_cast<int>(screen_availability)); |
| 719 } | 704 } |
| 720 | 705 |
| 721 return static_cast<ScreenAvailability>(current_availability); | 706 return static_cast<ScreenAvailability>(current_availability); |
| 722 } | 707 } |
| 723 | 708 |
| 724 PresentationDispatcher::SendMessageRequest::SendMessageRequest( | 709 PresentationDispatcher::SendMessageRequest::SendMessageRequest( |
| 725 const PresentationSessionInfo& session_info, | 710 const PresentationSessionInfo& session_info, |
| 726 blink::mojom::ConnectionMessagePtr message, | 711 PresentationConnectionMessage connection_message, |
| 727 const blink::WebPresentationConnectionProxy* connection_proxy) | 712 const blink::WebPresentationConnectionProxy* connection_proxy) |
| 728 : session_info(session_info), | 713 : session_info(session_info), |
| 729 message(std::move(message)), | 714 message(std::move(connection_message)), |
| 730 connection_proxy(connection_proxy) {} | 715 connection_proxy(connection_proxy) {} |
| 731 | 716 |
| 732 PresentationDispatcher::SendMessageRequest::~SendMessageRequest() {} | 717 PresentationDispatcher::SendMessageRequest::~SendMessageRequest() {} |
| 733 | 718 |
| 734 // static | 719 // static |
| 735 PresentationDispatcher::SendMessageRequest* | 720 PresentationDispatcher::SendMessageRequest* |
| 736 PresentationDispatcher::CreateSendTextMessageRequest( | 721 PresentationDispatcher::CreateSendTextMessageRequest( |
| 737 const blink::WebURL& presentationUrl, | 722 const blink::WebURL& presentationUrl, |
| 738 const blink::WebString& presentationId, | 723 const blink::WebString& presentationId, |
| 739 const blink::WebString& message, | 724 const blink::WebString& message, |
| 740 const blink::WebPresentationConnectionProxy* connection_proxy) { | 725 const blink::WebPresentationConnectionProxy* connection_proxy) { |
| 741 PresentationSessionInfo session_info(GURL(presentationUrl), | 726 PresentationSessionInfo session_info(GURL(presentationUrl), |
| 742 presentationId.utf8()); | 727 presentationId.utf8()); |
| 743 | 728 |
| 744 blink::mojom::ConnectionMessagePtr session_message = | 729 return new SendMessageRequest(session_info, |
|
dcheng
2017/02/25 07:17:27
Please add a TODO to make this and the function be
mark a. foltz
2017/02/27 23:25:15
Done.
| |
| 745 blink::mojom::ConnectionMessage::New(); | 730 PresentationConnectionMessage(message.utf8()), |
| 746 session_message->type = blink::mojom::PresentationMessageType::TEXT; | |
| 747 session_message->message = message.utf8(); | |
| 748 return new SendMessageRequest(session_info, std::move(session_message), | |
| 749 connection_proxy); | 731 connection_proxy); |
| 750 } | 732 } |
| 751 | 733 |
| 752 // static | 734 // static |
| 753 PresentationDispatcher::SendMessageRequest* | 735 PresentationDispatcher::SendMessageRequest* |
| 754 PresentationDispatcher::CreateSendBinaryMessageRequest( | 736 PresentationDispatcher::CreateSendBinaryMessageRequest( |
| 755 const blink::WebURL& presentationUrl, | 737 const blink::WebURL& presentationUrl, |
| 756 const blink::WebString& presentationId, | 738 const blink::WebString& presentationId, |
| 757 blink::mojom::PresentationMessageType type, | |
| 758 const uint8_t* data, | 739 const uint8_t* data, |
| 759 size_t length, | 740 size_t length, |
| 760 const blink::WebPresentationConnectionProxy* connection_proxy) { | 741 const blink::WebPresentationConnectionProxy* connection_proxy) { |
| 761 PresentationSessionInfo session_info(GURL(presentationUrl), | 742 PresentationSessionInfo session_info(GURL(presentationUrl), |
| 762 presentationId.utf8()); | 743 presentationId.utf8()); |
| 763 | 744 return new SendMessageRequest( |
| 764 blink::mojom::ConnectionMessagePtr session_message = | 745 session_info, |
| 765 blink::mojom::ConnectionMessage::New(); | 746 PresentationConnectionMessage(std::vector<uint8_t>(data, data + length)), |
| 766 session_message->type = type; | 747 connection_proxy); |
| 767 session_message->data = std::vector<uint8_t>(data, data + length); | |
| 768 return new SendMessageRequest(session_info, std::move(session_message), | |
| 769 connection_proxy); | |
| 770 } | 748 } |
| 771 | 749 |
| 772 PresentationDispatcher::AvailabilityListener::AvailabilityListener( | 750 PresentationDispatcher::AvailabilityListener::AvailabilityListener( |
| 773 const std::vector<GURL>& availability_urls) | 751 const std::vector<GURL>& availability_urls) |
| 774 : urls(availability_urls) {} | 752 : urls(availability_urls) {} |
| 775 | 753 |
| 776 PresentationDispatcher::AvailabilityListener::~AvailabilityListener() {} | 754 PresentationDispatcher::AvailabilityListener::~AvailabilityListener() {} |
| 777 | 755 |
| 778 PresentationDispatcher::ListeningStatus::ListeningStatus( | 756 PresentationDispatcher::ListeningStatus::ListeningStatus( |
| 779 const GURL& availability_url) | 757 const GURL& availability_url) |
| 780 : url(availability_url), | 758 : url(availability_url), |
| 781 last_known_availability(ScreenAvailability::UNKNOWN), | 759 last_known_availability(ScreenAvailability::UNKNOWN), |
| 782 listening_state(ListeningState::INACTIVE) {} | 760 listening_state(ListeningState::INACTIVE) {} |
| 783 | 761 |
| 784 PresentationDispatcher::ListeningStatus::~ListeningStatus() {} | 762 PresentationDispatcher::ListeningStatus::~ListeningStatus() {} |
| 785 | 763 |
| 786 } // namespace content | 764 } // namespace content |
| OLD | NEW |