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

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

Issue 2471263003: [Presentation API] (4th)(1-UA blink side) Add WebPresentationConnection and WebPresentationConnecti… (Closed)
Patch Set: merge and refactor Created 3 years, 11 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 <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/threading/thread_task_runner_handle.h" 14 #include "base/threading/thread_task_runner_handle.h"
15 #include "content/public/common/presentation_constants.h" 15 #include "content/public/common/presentation_constants.h"
16 #include "content/public/renderer/render_frame.h" 16 #include "content/public/renderer/render_frame.h"
17 #include "mojo/public/cpp/bindings/type_converter.h" 17 #include "mojo/public/cpp/bindings/type_converter.h"
18 #include "services/service_manager/public/cpp/interface_provider.h" 18 #include "services/service_manager/public/cpp/interface_provider.h"
19 #include "third_party/WebKit/public/platform/WebString.h" 19 #include "third_party/WebKit/public/platform/WebString.h"
20 #include "third_party/WebKit/public/platform/WebURL.h" 20 #include "third_party/WebKit/public/platform/WebURL.h"
21 #include "third_party/WebKit/public/platform/WebVector.h" 21 #include "third_party/WebKit/public/platform/WebVector.h"
22 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nAvailabilityObserver.h" 22 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nAvailabilityObserver.h"
23 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nConnectionCallbacks.h"
23 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nController.h" 24 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nController.h"
24 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nError.h" 25 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nError.h"
25 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nReceiver.h" 26 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nReceiver.h"
26 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nSessionInfo.h" 27 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio nSessionInfo.h"
27 #include "third_party/WebKit/public/platform/modules/presentation/presentation.m ojom.h" 28 #include "third_party/WebKit/public/platform/modules/presentation/presentation.m ojom.h"
28 #include "third_party/WebKit/public/web/WebLocalFrame.h" 29 #include "third_party/WebKit/public/web/WebLocalFrame.h"
29 #include "url/gurl.h" 30 #include "url/gurl.h"
30 31
31 namespace mojo { 32 namespace mojo {
32 33
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 } 94 }
94 } 95 }
95 96
96 } // namespace 97 } // namespace
97 98
98 namespace content { 99 namespace content {
99 100
100 PresentationDispatcher::PresentationDispatcher(RenderFrame* render_frame) 101 PresentationDispatcher::PresentationDispatcher(RenderFrame* render_frame)
101 : RenderFrameObserver(render_frame), 102 : RenderFrameObserver(render_frame),
102 controller_(nullptr), 103 controller_(nullptr),
103 binding_(this) { 104 receiver_(nullptr),
104 } 105 binding_(this) {}
105 106
106 PresentationDispatcher::~PresentationDispatcher() { 107 PresentationDispatcher::~PresentationDispatcher() {
107 // Controller should be destroyed before the dispatcher when frame is 108 // Controller should be destroyed before the dispatcher when frame is
108 // destroyed. 109 // destroyed.
109 DCHECK(!controller_); 110 DCHECK(!controller_);
110 } 111 }
111 112
112 void PresentationDispatcher::setController( 113 void PresentationDispatcher::setController(
113 blink::WebPresentationController* controller) { 114 blink::WebPresentationController* controller) {
114 // There shouldn't be any swapping from one non-null controller to another. 115 // There shouldn't be any swapping from one non-null controller to another.
115 DCHECK(controller != controller_ && (!controller || !controller_)); 116 DCHECK(controller != controller_ && (!controller || !controller_));
116 controller_ = controller; 117 controller_ = controller;
117 // The controller is set to null when the frame is about to be detached. 118 // The controller is set to null when the frame is about to be detached.
118 // Nothing is listening for screen availability anymore but the Mojo service 119 // Nothing is listening for screen availability anymore but the Mojo service
119 // will know about the frame being detached anyway. 120 // will know about the frame being detached anyway.
120 } 121 }
121 122
122 void PresentationDispatcher::startSession( 123 void PresentationDispatcher::startSession(
123 const blink::WebVector<blink::WebURL>& presentationUrls, 124 const blink::WebVector<blink::WebURL>& presentationUrls,
124 std::unique_ptr<blink::WebPresentationConnectionCallback> callback) { 125 std::unique_ptr<blink::WebPresentationConnectionCallbacks> callback) {
125 DCHECK(callback); 126 DCHECK(callback);
126 ConnectToPresentationServiceIfNeeded(); 127 ConnectToPresentationServiceIfNeeded();
127 128
128 std::vector<GURL> urls; 129 std::vector<GURL> urls;
129 for (const auto& url : presentationUrls) 130 for (const auto& url : presentationUrls)
130 urls.push_back(url); 131 urls.push_back(url);
131 132
132 // The dispatcher owns the service so |this| will be valid when 133 // The dispatcher owns the service so |this| will be valid when
133 // OnSessionCreated() is called. |callback| needs to be alive and also needs 134 // OnSessionCreated() is called. |callback| needs to be alive and also needs
134 // to be destroyed so we transfer its ownership to the mojo callback. 135 // to be destroyed so we transfer its ownership to the mojo callback.
135 presentation_service_->StartSession( 136 presentation_service_->StartSession(
136 urls, base::Bind(&PresentationDispatcher::OnSessionCreated, 137 urls, base::Bind(&PresentationDispatcher::OnSessionCreated,
137 base::Unretained(this), base::Passed(&callback))); 138 base::Unretained(this), base::Passed(&callback)));
138 } 139 }
139 140
140 void PresentationDispatcher::joinSession( 141 void PresentationDispatcher::joinSession(
141 const blink::WebVector<blink::WebURL>& presentationUrls, 142 const blink::WebVector<blink::WebURL>& presentationUrls,
142 const blink::WebString& presentationId, 143 const blink::WebString& presentationId,
143 std::unique_ptr<blink::WebPresentationConnectionCallback> callback) { 144 std::unique_ptr<blink::WebPresentationConnectionCallbacks> callback) {
144 DCHECK(callback); 145 DCHECK(callback);
145 ConnectToPresentationServiceIfNeeded(); 146 ConnectToPresentationServiceIfNeeded();
146 147
147 std::vector<GURL> urls; 148 std::vector<GURL> urls;
148 for (const auto& url : presentationUrls) 149 for (const auto& url : presentationUrls)
149 urls.push_back(url); 150 urls.push_back(url);
150 151
151 // The dispatcher owns the service so |this| will be valid when 152 // The dispatcher owns the service so |this| will be valid when
152 // OnSessionCreated() is called. |callback| needs to be alive and also needs 153 // OnSessionCreated() is called. |callback| needs to be alive and also needs
153 // to be destroyed so we transfer its ownership to the mojo callback. 154 // to be destroyed so we transfer its ownership to the mojo callback.
154 presentation_service_->JoinSession( 155 presentation_service_->JoinSession(
155 urls, presentationId.utf8(), 156 urls, presentationId.utf8(),
156 base::Bind(&PresentationDispatcher::OnSessionCreated, 157 base::Bind(&PresentationDispatcher::OnSessionCreated,
157 base::Unretained(this), base::Passed(&callback))); 158 base::Unretained(this), base::Passed(&callback)));
158 } 159 }
159 160
160 void PresentationDispatcher::sendString(const blink::WebURL& presentationUrl, 161 void PresentationDispatcher::sendString(
161 const blink::WebString& presentationId, 162 const blink::WebURL& presentationUrl,
162 const blink::WebString& message) { 163 const blink::WebString& presentationId,
164 const blink::WebString& message,
165 const blink::WebPresentationConnectionProxy* connection_proxy) {
163 if (message.utf8().size() > kMaxPresentationConnectionMessageSize) { 166 if (message.utf8().size() > kMaxPresentationConnectionMessageSize) {
164 // TODO(crbug.com/459008): Limit the size of individual messages to 64k 167 // TODO(crbug.com/459008): Limit the size of individual messages to 64k
165 // for now. Consider throwing DOMException or splitting bigger messages 168 // for now. Consider throwing DOMException or splitting bigger messages
166 // into smaller chunks later. 169 // into smaller chunks later.
167 LOG(WARNING) << "message size exceeded limit!"; 170 LOG(WARNING) << "message size exceeded limit!";
168 return; 171 return;
169 } 172 }
170 173
171 message_request_queue_.push(base::WrapUnique( 174 message_request_queue_.push(base::WrapUnique(CreateSendTextMessageRequest(
172 CreateSendTextMessageRequest(presentationUrl, presentationId, message))); 175 presentationUrl, presentationId, message, connection_proxy)));
173 // Start processing request if only one in the queue. 176 // Start processing request if only one in the queue.
174 if (message_request_queue_.size() == 1) 177 if (message_request_queue_.size() == 1)
175 DoSendMessage(message_request_queue_.front().get()); 178 DoSendMessage(message_request_queue_.front().get());
176 } 179 }
177 180
178 void PresentationDispatcher::sendArrayBuffer( 181 void PresentationDispatcher::sendArrayBuffer(
179 const blink::WebURL& presentationUrl, 182 const blink::WebURL& presentationUrl,
180 const blink::WebString& presentationId, 183 const blink::WebString& presentationId,
181 const uint8_t* data, 184 const uint8_t* data,
182 size_t length) { 185 size_t length,
186 const blink::WebPresentationConnectionProxy* connection_proxy) {
183 DCHECK(data); 187 DCHECK(data);
184 if (length > kMaxPresentationConnectionMessageSize) { 188 if (length > kMaxPresentationConnectionMessageSize) {
185 // TODO(crbug.com/459008): Same as in sendString(). 189 // TODO(crbug.com/459008): Same as in sendString().
186 LOG(WARNING) << "data size exceeded limit!"; 190 LOG(WARNING) << "data size exceeded limit!";
187 return; 191 return;
188 } 192 }
189 193
190 message_request_queue_.push(base::WrapUnique(CreateSendBinaryMessageRequest( 194 message_request_queue_.push(base::WrapUnique(CreateSendBinaryMessageRequest(
191 presentationUrl, presentationId, 195 presentationUrl, presentationId,
192 blink::mojom::PresentationMessageType::BINARY, data, length))); 196 blink::mojom::PresentationMessageType::BINARY, data, length,
197 connection_proxy)));
193 // Start processing request if only one in the queue. 198 // Start processing request if only one in the queue.
194 if (message_request_queue_.size() == 1) 199 if (message_request_queue_.size() == 1)
195 DoSendMessage(message_request_queue_.front().get()); 200 DoSendMessage(message_request_queue_.front().get());
196 } 201 }
197 202
198 void PresentationDispatcher::sendBlobData( 203 void PresentationDispatcher::sendBlobData(
199 const blink::WebURL& presentationUrl, 204 const blink::WebURL& presentationUrl,
200 const blink::WebString& presentationId, 205 const blink::WebString& presentationId,
201 const uint8_t* data, 206 const uint8_t* data,
202 size_t length) { 207 size_t length,
208 const blink::WebPresentationConnectionProxy* connection_proxy) {
203 DCHECK(data); 209 DCHECK(data);
204 if (length > kMaxPresentationConnectionMessageSize) { 210 if (length > kMaxPresentationConnectionMessageSize) {
205 // TODO(crbug.com/459008): Same as in sendString(). 211 // TODO(crbug.com/459008): Same as in sendString().
206 LOG(WARNING) << "data size exceeded limit!"; 212 LOG(WARNING) << "data size exceeded limit!";
207 return; 213 return;
208 } 214 }
209 215
210 message_request_queue_.push(base::WrapUnique(CreateSendBinaryMessageRequest( 216 message_request_queue_.push(base::WrapUnique(CreateSendBinaryMessageRequest(
211 presentationUrl, presentationId, 217 presentationUrl, presentationId,
212 blink::mojom::PresentationMessageType::BINARY, data, length))); 218 blink::mojom::PresentationMessageType::BINARY, data, length,
219 connection_proxy)));
213 // Start processing request if only one in the queue. 220 // Start processing request if only one in the queue.
214 if (message_request_queue_.size() == 1) 221 if (message_request_queue_.size() == 1)
215 DoSendMessage(message_request_queue_.front().get()); 222 DoSendMessage(message_request_queue_.front().get());
216 } 223 }
217 224
218 void PresentationDispatcher::DoSendMessage(SendMessageRequest* request) { 225 void PresentationDispatcher::DoSendMessage(SendMessageRequest* request) {
219 ConnectToPresentationServiceIfNeeded(); 226 ConnectToPresentationServiceIfNeeded();
220 227
221 presentation_service_->SendConnectionMessage( 228 presentation_service_->SendConnectionMessage(
222 std::move(request->session_info), std::move(request->message), 229 std::move(request->session_info), std::move(request->message),
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 return; 401 return;
395 402
396 if (!session_info.is_null()) { 403 if (!session_info.is_null()) {
397 presentation_service_->ListenForConnectionMessages(session_info.Clone()); 404 presentation_service_->ListenForConnectionMessages(session_info.Clone());
398 controller_->didStartDefaultSession( 405 controller_->didStartDefaultSession(
399 mojo::ConvertTo<blink::WebPresentationSessionInfo>(session_info)); 406 mojo::ConvertTo<blink::WebPresentationSessionInfo>(session_info));
400 } 407 }
401 } 408 }
402 409
403 void PresentationDispatcher::OnSessionCreated( 410 void PresentationDispatcher::OnSessionCreated(
404 std::unique_ptr<blink::WebPresentationConnectionCallback> callback, 411 std::unique_ptr<blink::WebPresentationConnectionCallbacks> callback,
405 blink::mojom::PresentationSessionInfoPtr session_info, 412 blink::mojom::PresentationSessionInfoPtr session_info,
406 blink::mojom::PresentationErrorPtr error) { 413 blink::mojom::PresentationErrorPtr error) {
407 DCHECK(callback); 414 DCHECK(callback);
408 if (!error.is_null()) { 415 if (!error.is_null()) {
409 DCHECK(session_info.is_null()); 416 DCHECK(session_info.is_null());
410 callback->onError(blink::WebPresentationError( 417 callback->onError(blink::WebPresentationError(
411 GetWebPresentationErrorTypeFromMojo(error->error_type), 418 GetWebPresentationErrorTypeFromMojo(error->error_type),
412 blink::WebString::fromUTF8(error->message))); 419 blink::WebString::fromUTF8(error->message)));
413 return; 420 return;
414 } 421 }
415 422
416 DCHECK(!session_info.is_null()); 423 DCHECK(!session_info.is_null());
417 presentation_service_->ListenForConnectionMessages(session_info.Clone()); 424 presentation_service_->ListenForConnectionMessages(session_info.Clone());
418 callback->onSuccess( 425 callback->onSuccess(
419 mojo::ConvertTo<blink::WebPresentationSessionInfo>(session_info)); 426 mojo::ConvertTo<blink::WebPresentationSessionInfo>(session_info));
420 } 427 }
421 428
422 void PresentationDispatcher::OnReceiverConnectionAvailable( 429 void PresentationDispatcher::OnReceiverConnectionAvailable(
423 blink::mojom::PresentationSessionInfoPtr session_info, 430 blink::mojom::PresentationSessionInfoPtr session_info,
424 blink::mojom::PresentationConnectionPtr, 431 blink::mojom::PresentationConnectionPtr,
425 blink::mojom::PresentationConnectionRequest) { 432 blink::mojom::PresentationConnectionRequest) {
426 if (receiver_) { 433 if (!receiver_) {
427 receiver_->onReceiverConnectionAvailable( 434 receiver_->onReceiverConnectionAvailable(
428 mojo::ConvertTo<blink::WebPresentationSessionInfo>(session_info)); 435 mojo::ConvertTo<blink::WebPresentationSessionInfo>(session_info));
429 } 436 }
430 } 437 }
431 438
432 void PresentationDispatcher::OnConnectionStateChanged( 439 void PresentationDispatcher::OnConnectionStateChanged(
433 blink::mojom::PresentationSessionInfoPtr session_info, 440 blink::mojom::PresentationSessionInfoPtr session_info,
434 blink::mojom::PresentationConnectionState state) { 441 blink::mojom::PresentationConnectionState state) {
435 if (!controller_) 442 if (!controller_)
436 return; 443 return;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
508 status->listening_state = ListeningState::WAITING; 515 status->listening_state = ListeningState::WAITING;
509 presentation_service_->ListenForScreenAvailability(status->url); 516 presentation_service_->ListenForScreenAvailability(status->url);
510 } else { 517 } else {
511 status->listening_state = ListeningState::INACTIVE; 518 status->listening_state = ListeningState::INACTIVE;
512 presentation_service_->StopListeningForScreenAvailability(status->url); 519 presentation_service_->StopListeningForScreenAvailability(status->url);
513 } 520 }
514 } 521 }
515 522
516 PresentationDispatcher::SendMessageRequest::SendMessageRequest( 523 PresentationDispatcher::SendMessageRequest::SendMessageRequest(
517 blink::mojom::PresentationSessionInfoPtr session_info, 524 blink::mojom::PresentationSessionInfoPtr session_info,
518 blink::mojom::ConnectionMessagePtr message) 525 blink::mojom::ConnectionMessagePtr message,
519 : session_info(std::move(session_info)), message(std::move(message)) {} 526 const blink::WebPresentationConnectionProxy* connection_proxy)
527 : session_info(std::move(session_info)),
528 message(std::move(message)),
529 connection_proxy(connection_proxy) {}
520 530
521 PresentationDispatcher::SendMessageRequest::~SendMessageRequest() {} 531 PresentationDispatcher::SendMessageRequest::~SendMessageRequest() {}
522 532
523 // static 533 // static
524 PresentationDispatcher::SendMessageRequest* 534 PresentationDispatcher::SendMessageRequest*
525 PresentationDispatcher::CreateSendTextMessageRequest( 535 PresentationDispatcher::CreateSendTextMessageRequest(
526 const blink::WebURL& presentationUrl, 536 const blink::WebURL& presentationUrl,
527 const blink::WebString& presentationId, 537 const blink::WebString& presentationId,
528 const blink::WebString& message) { 538 const blink::WebString& message,
539 const blink::WebPresentationConnectionProxy* connection_proxy) {
529 blink::mojom::PresentationSessionInfoPtr session_info = 540 blink::mojom::PresentationSessionInfoPtr session_info =
530 blink::mojom::PresentationSessionInfo::New(); 541 blink::mojom::PresentationSessionInfo::New();
531 session_info->url = presentationUrl; 542 session_info->url = presentationUrl;
532 session_info->id = presentationId.utf8(); 543 session_info->id = presentationId.utf8();
533 544
534 blink::mojom::ConnectionMessagePtr session_message = 545 blink::mojom::ConnectionMessagePtr session_message =
535 blink::mojom::ConnectionMessage::New(); 546 blink::mojom::ConnectionMessage::New();
536 session_message->type = blink::mojom::PresentationMessageType::TEXT; 547 session_message->type = blink::mojom::PresentationMessageType::TEXT;
537 session_message->message = message.utf8(); 548 session_message->message = message.utf8();
538 return new SendMessageRequest(std::move(session_info), 549 return new SendMessageRequest(std::move(session_info),
539 std::move(session_message)); 550 std::move(session_message), connection_proxy);
540 } 551 }
541 552
542 // static 553 // static
543 PresentationDispatcher::SendMessageRequest* 554 PresentationDispatcher::SendMessageRequest*
544 PresentationDispatcher::CreateSendBinaryMessageRequest( 555 PresentationDispatcher::CreateSendBinaryMessageRequest(
545 const blink::WebURL& presentationUrl, 556 const blink::WebURL& presentationUrl,
546 const blink::WebString& presentationId, 557 const blink::WebString& presentationId,
547 blink::mojom::PresentationMessageType type, 558 blink::mojom::PresentationMessageType type,
548 const uint8_t* data, 559 const uint8_t* data,
549 size_t length) { 560 size_t length,
561 const blink::WebPresentationConnectionProxy* connection_proxy) {
550 blink::mojom::PresentationSessionInfoPtr session_info = 562 blink::mojom::PresentationSessionInfoPtr session_info =
551 blink::mojom::PresentationSessionInfo::New(); 563 blink::mojom::PresentationSessionInfo::New();
552 session_info->url = presentationUrl; 564 session_info->url = presentationUrl;
553 session_info->id = presentationId.utf8(); 565 session_info->id = presentationId.utf8();
554 566
555 blink::mojom::ConnectionMessagePtr session_message = 567 blink::mojom::ConnectionMessagePtr session_message =
556 blink::mojom::ConnectionMessage::New(); 568 blink::mojom::ConnectionMessage::New();
557 session_message->type = type; 569 session_message->type = type;
558 session_message->data = std::vector<uint8_t>(data, data + length); 570 session_message->data = std::vector<uint8_t>(data, data + length);
559 return new SendMessageRequest(std::move(session_info), 571 return new SendMessageRequest(std::move(session_info),
560 std::move(session_message)); 572 std::move(session_message), connection_proxy);
561 } 573 }
562 574
563 PresentationDispatcher::AvailabilityStatus::AvailabilityStatus( 575 PresentationDispatcher::AvailabilityStatus::AvailabilityStatus(
564 const GURL& availability_url) 576 const GURL& availability_url)
565 : url(availability_url), 577 : url(availability_url),
566 last_known_availability(false), 578 last_known_availability(false),
567 listening_state(ListeningState::INACTIVE) {} 579 listening_state(ListeningState::INACTIVE) {}
568 580
569 PresentationDispatcher::AvailabilityStatus::~AvailabilityStatus() { 581 PresentationDispatcher::AvailabilityStatus::~AvailabilityStatus() {
570 } 582 }
571 583
572 } // namespace content 584 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698