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 <algorithm> | 7 #include <algorithm> |
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 "content/public/common/presentation_constants.h" | 14 #include "content/public/common/presentation_constants.h" |
15 #include "content/public/renderer/render_frame.h" | 15 #include "content/public/renderer/render_frame.h" |
16 #include "content/renderer/presentation/presentation_connection_client.h" | 16 #include "content/renderer/presentation/presentation_connection_client.h" |
17 #include "services/shell/public/cpp/interface_provider.h" | 17 #include "services/shell/public/cpp/interface_provider.h" |
18 #include "third_party/WebKit/public/platform/WebString.h" | 18 #include "third_party/WebKit/public/platform/WebString.h" |
19 #include "third_party/WebKit/public/platform/WebURL.h" | 19 #include "third_party/WebKit/public/platform/WebVector.h" |
20 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio
nAvailabilityObserver.h" | 20 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio
nAvailabilityObserver.h" |
21 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio
nController.h" | 21 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio
nController.h" |
22 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio
nError.h" | 22 #include "third_party/WebKit/public/platform/modules/presentation/WebPresentatio
nError.h" |
23 #include "third_party/WebKit/public/platform/modules/presentation/presentation.m
ojom.h" | 23 #include "third_party/WebKit/public/platform/modules/presentation/presentation.m
ojom.h" |
24 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 24 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
25 #include "url/gurl.h" | 25 #include "url/gurl.h" |
26 | 26 |
27 namespace { | 27 namespace { |
28 | 28 |
29 blink::WebPresentationError::ErrorType GetWebPresentationErrorTypeFromMojo( | 29 blink::WebPresentationError::ErrorType GetWebPresentationErrorTypeFromMojo( |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 blink::WebPresentationController* controller) { | 93 blink::WebPresentationController* controller) { |
94 // There shouldn't be any swapping from one non-null controller to another. | 94 // There shouldn't be any swapping from one non-null controller to another. |
95 DCHECK(controller != controller_ && (!controller || !controller_)); | 95 DCHECK(controller != controller_ && (!controller || !controller_)); |
96 controller_ = controller; | 96 controller_ = controller; |
97 // The controller is set to null when the frame is about to be detached. | 97 // The controller is set to null when the frame is about to be detached. |
98 // Nothing is listening for screen availability anymore but the Mojo service | 98 // Nothing is listening for screen availability anymore but the Mojo service |
99 // will know about the frame being detached anyway. | 99 // will know about the frame being detached anyway. |
100 } | 100 } |
101 | 101 |
102 void PresentationDispatcher::startSession( | 102 void PresentationDispatcher::startSession( |
103 const blink::WebString& presentationUrl, | 103 const blink::WebVector<blink::WebString>& presentationUrls, |
104 blink::WebPresentationConnectionClientCallbacks* callback) { | 104 blink::WebPresentationConnectionClientCallbacks* callback) { |
105 DCHECK(callback); | 105 DCHECK(callback); |
106 ConnectToPresentationServiceIfNeeded(); | 106 ConnectToPresentationServiceIfNeeded(); |
107 | 107 |
| 108 std::vector<GURL> urls(presentationUrls.size()); |
| 109 std::transform(presentationUrls.begin(), presentationUrls.end(), urls.begin(), |
| 110 [](const blink::WebString& url) { return GURL(url.utf8()); }); |
| 111 |
108 // The dispatcher owns the service so |this| will be valid when | 112 // The dispatcher owns the service so |this| will be valid when |
109 // OnSessionCreated() is called. |callback| needs to be alive and also needs | 113 // OnSessionCreated() is called. |callback| needs to be alive and also needs |
110 // to be destroyed so we transfer its ownership to the mojo callback. | 114 // to be destroyed so we transfer its ownership to the mojo callback. |
111 presentation_service_->StartSession( | 115 presentation_service_->StartSession( |
112 presentationUrl.utf8(), | 116 urls, base::Bind(&PresentationDispatcher::OnSessionCreated, |
113 base::Bind(&PresentationDispatcher::OnSessionCreated, | 117 base::Unretained(this), base::Owned(callback))); |
114 base::Unretained(this), | |
115 base::Owned(callback))); | |
116 } | 118 } |
117 | 119 |
118 void PresentationDispatcher::joinSession( | 120 void PresentationDispatcher::joinSession( |
119 const blink::WebString& presentationUrl, | 121 const blink::WebVector<blink::WebString>& presentationUrls, |
120 const blink::WebString& presentationId, | 122 const blink::WebString& presentationId, |
121 blink::WebPresentationConnectionClientCallbacks* callback) { | 123 blink::WebPresentationConnectionClientCallbacks* callback) { |
122 DCHECK(callback); | 124 DCHECK(callback); |
123 ConnectToPresentationServiceIfNeeded(); | 125 ConnectToPresentationServiceIfNeeded(); |
124 | 126 |
| 127 std::vector<GURL> urls(presentationUrls.size()); |
| 128 std::transform(presentationUrls.begin(), presentationUrls.end(), urls.begin(), |
| 129 [](const blink::WebString& url) { return GURL(url.utf8()); }); |
| 130 |
125 // The dispatcher owns the service so |this| will be valid when | 131 // The dispatcher owns the service so |this| will be valid when |
126 // OnSessionCreated() is called. |callback| needs to be alive and also needs | 132 // OnSessionCreated() is called. |callback| needs to be alive and also needs |
127 // to be destroyed so we transfer its ownership to the mojo callback. | 133 // to be destroyed so we transfer its ownership to the mojo callback. |
128 presentation_service_->JoinSession( | 134 presentation_service_->JoinSession( |
129 presentationUrl.utf8(), | 135 urls, presentationId.utf8(), |
130 presentationId.utf8(), | |
131 base::Bind(&PresentationDispatcher::OnSessionCreated, | 136 base::Bind(&PresentationDispatcher::OnSessionCreated, |
132 base::Unretained(this), | 137 base::Unretained(this), base::Owned(callback))); |
133 base::Owned(callback))); | |
134 } | 138 } |
135 | 139 |
136 void PresentationDispatcher::sendString( | 140 void PresentationDispatcher::sendString( |
137 const blink::WebString& presentationUrl, | 141 const blink::WebString& presentationUrl, |
138 const blink::WebString& presentationId, | 142 const blink::WebString& presentationId, |
139 const blink::WebString& message) { | 143 const blink::WebString& message) { |
140 if (message.utf8().size() > kMaxPresentationSessionMessageSize) { | 144 if (message.utf8().size() > kMaxPresentationSessionMessageSize) { |
141 // TODO(crbug.com/459008): Limit the size of individual messages to 64k | 145 // TODO(crbug.com/459008): Limit the size of individual messages to 64k |
142 // for now. Consider throwing DOMException or splitting bigger messages | 146 // for now. Consider throwing DOMException or splitting bigger messages |
143 // into smaller chunks later. | 147 // into smaller chunks later. |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 message_request_queue_.pop(); | 223 message_request_queue_.pop(); |
220 if (!message_request_queue_.empty()) { | 224 if (!message_request_queue_.empty()) { |
221 DoSendMessage(message_request_queue_.front().get()); | 225 DoSendMessage(message_request_queue_.front().get()); |
222 } | 226 } |
223 } | 227 } |
224 | 228 |
225 void PresentationDispatcher::closeSession( | 229 void PresentationDispatcher::closeSession( |
226 const blink::WebString& presentationUrl, | 230 const blink::WebString& presentationUrl, |
227 const blink::WebString& presentationId) { | 231 const blink::WebString& presentationId) { |
228 ConnectToPresentationServiceIfNeeded(); | 232 ConnectToPresentationServiceIfNeeded(); |
229 | 233 presentation_service_->CloseConnection(GURL(presentationUrl.utf8()), |
230 presentation_service_->CloseConnection(presentationUrl.utf8(), | |
231 presentationId.utf8()); | 234 presentationId.utf8()); |
232 } | 235 } |
233 | 236 |
234 void PresentationDispatcher::terminateSession( | 237 void PresentationDispatcher::terminateSession( |
235 const blink::WebString& presentationUrl, | 238 const blink::WebString& presentationUrl, |
236 const blink::WebString& presentationId) { | 239 const blink::WebString& presentationId) { |
237 ConnectToPresentationServiceIfNeeded(); | 240 ConnectToPresentationServiceIfNeeded(); |
238 | 241 presentation_service_->Terminate(GURL(presentationUrl.utf8()), |
239 presentation_service_->Terminate(presentationUrl.utf8(), | |
240 presentationId.utf8()); | 242 presentationId.utf8()); |
241 } | 243 } |
242 | 244 |
243 void PresentationDispatcher::getAvailability( | 245 void PresentationDispatcher::getAvailability( |
244 const blink::WebString& availabilityUrl, | 246 const blink::WebString& availabilityUrl, |
245 blink::WebPresentationAvailabilityCallbacks* callbacks) { | 247 blink::WebPresentationAvailabilityCallbacks* callbacks) { |
246 const std::string& availability_url = availabilityUrl.utf8(); | 248 const std::string& availability_url = availabilityUrl.utf8(); |
247 AvailabilityStatus* status = nullptr; | 249 AvailabilityStatus* status = nullptr; |
248 auto status_it = availability_status_.find(availability_url); | 250 auto status_it = availability_status_.find(availability_url); |
249 if (status_it == availability_status_.end()) { | 251 if (status_it == availability_status_.end()) { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 auto status_it = availability_status_.find(availability_url); | 285 auto status_it = availability_status_.find(availability_url); |
284 if (status_it == availability_status_.end()) { | 286 if (status_it == availability_status_.end()) { |
285 DLOG(WARNING) << "Stop listening for availability for unknown URL " | 287 DLOG(WARNING) << "Stop listening for availability for unknown URL " |
286 << availability_url; | 288 << availability_url; |
287 return; | 289 return; |
288 } | 290 } |
289 status_it->second->availability_observers.erase(observer); | 291 status_it->second->availability_observers.erase(observer); |
290 UpdateListeningState(status_it->second.get()); | 292 UpdateListeningState(status_it->second.get()); |
291 } | 293 } |
292 | 294 |
293 void PresentationDispatcher::setDefaultPresentationUrl( | 295 void PresentationDispatcher::setDefaultPresentationUrls( |
294 const blink::WebString& url) { | 296 const blink::WebVector<blink::WebString>& presentationUrls) { |
295 ConnectToPresentationServiceIfNeeded(); | 297 ConnectToPresentationServiceIfNeeded(); |
296 presentation_service_->SetDefaultPresentationURL(url.utf8()); | 298 |
| 299 std::vector<GURL> urls(presentationUrls.size()); |
| 300 std::transform(presentationUrls.begin(), presentationUrls.end(), urls.begin(), |
| 301 [](const blink::WebString& url) { return GURL(url.utf8()); }); |
| 302 presentation_service_->SetDefaultPresentationUrls(urls); |
297 } | 303 } |
298 | 304 |
299 void PresentationDispatcher::DidCommitProvisionalLoad( | 305 void PresentationDispatcher::DidCommitProvisionalLoad( |
300 bool is_new_navigation, | 306 bool is_new_navigation, |
301 bool is_same_page_navigation) { | 307 bool is_same_page_navigation) { |
302 blink::WebFrame* frame = render_frame()->GetWebFrame(); | 308 blink::WebFrame* frame = render_frame()->GetWebFrame(); |
303 // If not top-level navigation. | 309 // If not top-level navigation. |
304 if (frame->parent() || is_same_page_navigation) | 310 if (frame->parent() || is_same_page_navigation) |
305 return; | 311 return; |
306 | 312 |
307 // Remove all pending send message requests. | 313 // Remove all pending send message requests. |
308 MessageRequestQueue empty; | 314 MessageRequestQueue empty; |
309 std::swap(message_request_queue_, empty); | 315 std::swap(message_request_queue_, empty); |
310 } | 316 } |
311 | 317 |
312 void PresentationDispatcher::OnDestruct() { | 318 void PresentationDispatcher::OnDestruct() { |
313 delete this; | 319 delete this; |
314 } | 320 } |
315 | 321 |
316 void PresentationDispatcher::OnScreenAvailabilityUpdated(const std::string& url, | 322 void PresentationDispatcher::OnScreenAvailabilityUpdated(const GURL& url, |
317 bool available) { | 323 bool available) { |
318 auto status_it = availability_status_.find(url); | 324 auto status_it = availability_status_.find(url.spec()); |
319 if (status_it == availability_status_.end()) | 325 if (status_it == availability_status_.end()) |
320 return; | 326 return; |
321 AvailabilityStatus* status = status_it->second.get(); | 327 AvailabilityStatus* status = status_it->second.get(); |
322 DCHECK(status); | 328 DCHECK(status); |
323 | 329 |
324 if (status->listening_state == ListeningState::WAITING) | 330 if (status->listening_state == ListeningState::WAITING) |
325 status->listening_state = ListeningState::ACTIVE; | 331 status->listening_state = ListeningState::ACTIVE; |
326 | 332 |
327 for (auto* observer : status->availability_observers) | 333 for (auto* observer : status->availability_observers) |
328 observer->availabilityChanged(available); | 334 observer->availabilityChanged(available); |
329 | 335 |
330 for (AvailabilityCallbacksMap::iterator iter(&status->availability_callbacks); | 336 for (AvailabilityCallbacksMap::iterator iter(&status->availability_callbacks); |
331 !iter.IsAtEnd(); iter.Advance()) { | 337 !iter.IsAtEnd(); iter.Advance()) { |
332 iter.GetCurrentValue()->onSuccess(available); | 338 iter.GetCurrentValue()->onSuccess(available); |
333 } | 339 } |
334 status->last_known_availability = available; | 340 status->last_known_availability = available; |
335 status->availability_callbacks.Clear(); | 341 status->availability_callbacks.Clear(); |
336 UpdateListeningState(status); | 342 UpdateListeningState(status); |
337 } | 343 } |
338 | 344 |
339 void PresentationDispatcher::OnScreenAvailabilityNotSupported( | 345 void PresentationDispatcher::OnScreenAvailabilityNotSupported(const GURL& url) { |
340 const std::string& url) { | 346 auto status_it = availability_status_.find(url.spec()); |
341 auto status_it = availability_status_.find(url); | |
342 if (status_it == availability_status_.end()) | 347 if (status_it == availability_status_.end()) |
343 return; | 348 return; |
344 AvailabilityStatus* status = status_it->second.get(); | 349 AvailabilityStatus* status = status_it->second.get(); |
345 DCHECK(status); | 350 DCHECK(status); |
346 DCHECK(status->listening_state == ListeningState::WAITING); | 351 DCHECK(status->listening_state == ListeningState::WAITING); |
347 | 352 |
348 const blink::WebString& not_supported_error = blink::WebString::fromUTF8( | 353 const blink::WebString& not_supported_error = blink::WebString::fromUTF8( |
349 "getAvailability() isn't supported at the moment. It can be due to " | 354 "getAvailability() isn't supported at the moment. It can be due to " |
350 "a permanent or temporary system limitation. It is recommended to " | 355 "a permanent or temporary system limitation. It is recommended to " |
351 "try to blindly start a session in that case."); | 356 "try to blindly start a session in that case."); |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
463 bool should_listen = !status->availability_callbacks.IsEmpty() || | 468 bool should_listen = !status->availability_callbacks.IsEmpty() || |
464 !status->availability_observers.empty(); | 469 !status->availability_observers.empty(); |
465 bool is_listening = status->listening_state != ListeningState::INACTIVE; | 470 bool is_listening = status->listening_state != ListeningState::INACTIVE; |
466 | 471 |
467 if (should_listen == is_listening) | 472 if (should_listen == is_listening) |
468 return; | 473 return; |
469 | 474 |
470 ConnectToPresentationServiceIfNeeded(); | 475 ConnectToPresentationServiceIfNeeded(); |
471 if (should_listen) { | 476 if (should_listen) { |
472 status->listening_state = ListeningState::WAITING; | 477 status->listening_state = ListeningState::WAITING; |
473 presentation_service_->ListenForScreenAvailability(status->url); | 478 presentation_service_->ListenForScreenAvailability(GURL(status->url)); |
474 } else { | 479 } else { |
475 status->listening_state = ListeningState::INACTIVE; | 480 status->listening_state = ListeningState::INACTIVE; |
476 presentation_service_->StopListeningForScreenAvailability(status->url); | 481 presentation_service_->StopListeningForScreenAvailability( |
| 482 GURL(status->url)); |
477 } | 483 } |
478 } | 484 } |
479 | 485 |
480 PresentationDispatcher::SendMessageRequest::SendMessageRequest( | 486 PresentationDispatcher::SendMessageRequest::SendMessageRequest( |
481 blink::mojom::PresentationSessionInfoPtr session_info, | 487 blink::mojom::PresentationSessionInfoPtr session_info, |
482 blink::mojom::SessionMessagePtr message) | 488 blink::mojom::SessionMessagePtr message) |
483 : session_info(std::move(session_info)), message(std::move(message)) {} | 489 : session_info(std::move(session_info)), message(std::move(message)) {} |
484 | 490 |
485 PresentationDispatcher::SendMessageRequest::~SendMessageRequest() {} | 491 PresentationDispatcher::SendMessageRequest::~SendMessageRequest() {} |
486 | 492 |
487 // static | 493 // static |
488 PresentationDispatcher::SendMessageRequest* | 494 PresentationDispatcher::SendMessageRequest* |
489 PresentationDispatcher::CreateSendTextMessageRequest( | 495 PresentationDispatcher::CreateSendTextMessageRequest( |
490 const blink::WebString& presentationUrl, | 496 const blink::WebString& presentationUrl, |
491 const blink::WebString& presentationId, | 497 const blink::WebString& presentationId, |
492 const blink::WebString& message) { | 498 const blink::WebString& message) { |
493 blink::mojom::PresentationSessionInfoPtr session_info = | 499 blink::mojom::PresentationSessionInfoPtr session_info = |
494 blink::mojom::PresentationSessionInfo::New(); | 500 blink::mojom::PresentationSessionInfo::New(); |
495 session_info->url = presentationUrl.utf8(); | 501 session_info->url = GURL(presentationUrl.utf8()); |
496 session_info->id = presentationId.utf8(); | 502 session_info->id = presentationId.utf8(); |
497 | 503 |
498 blink::mojom::SessionMessagePtr session_message = | 504 blink::mojom::SessionMessagePtr session_message = |
499 blink::mojom::SessionMessage::New(); | 505 blink::mojom::SessionMessage::New(); |
500 session_message->type = blink::mojom::PresentationMessageType::TEXT; | 506 session_message->type = blink::mojom::PresentationMessageType::TEXT; |
501 session_message->message = message.utf8(); | 507 session_message->message = message.utf8(); |
502 return new SendMessageRequest(std::move(session_info), | 508 return new SendMessageRequest(std::move(session_info), |
503 std::move(session_message)); | 509 std::move(session_message)); |
504 } | 510 } |
505 | 511 |
506 // static | 512 // static |
507 PresentationDispatcher::SendMessageRequest* | 513 PresentationDispatcher::SendMessageRequest* |
508 PresentationDispatcher::CreateSendBinaryMessageRequest( | 514 PresentationDispatcher::CreateSendBinaryMessageRequest( |
509 const blink::WebString& presentationUrl, | 515 const blink::WebString& presentationUrl, |
510 const blink::WebString& presentationId, | 516 const blink::WebString& presentationId, |
511 blink::mojom::PresentationMessageType type, | 517 blink::mojom::PresentationMessageType type, |
512 const uint8_t* data, | 518 const uint8_t* data, |
513 size_t length) { | 519 size_t length) { |
514 blink::mojom::PresentationSessionInfoPtr session_info = | 520 blink::mojom::PresentationSessionInfoPtr session_info = |
515 blink::mojom::PresentationSessionInfo::New(); | 521 blink::mojom::PresentationSessionInfo::New(); |
516 session_info->url = presentationUrl.utf8(); | 522 session_info->url = GURL(presentationUrl.utf8()); |
517 session_info->id = presentationId.utf8(); | 523 session_info->id = presentationId.utf8(); |
518 | 524 |
519 blink::mojom::SessionMessagePtr session_message = | 525 blink::mojom::SessionMessagePtr session_message = |
520 blink::mojom::SessionMessage::New(); | 526 blink::mojom::SessionMessage::New(); |
521 session_message->type = type; | 527 session_message->type = type; |
522 session_message->data = std::vector<uint8_t>(data, data + length); | 528 session_message->data = std::vector<uint8_t>(data, data + length); |
523 return new SendMessageRequest(std::move(session_info), | 529 return new SendMessageRequest(std::move(session_info), |
524 std::move(session_message)); | 530 std::move(session_message)); |
525 } | 531 } |
526 | 532 |
527 PresentationDispatcher::AvailabilityStatus::AvailabilityStatus( | 533 PresentationDispatcher::AvailabilityStatus::AvailabilityStatus( |
528 const std::string& availability_url) | 534 const std::string& availability_url) |
529 : url(availability_url), | 535 : url(availability_url), |
530 last_known_availability(false), | 536 last_known_availability(false), |
531 listening_state(ListeningState::INACTIVE) {} | 537 listening_state(ListeningState::INACTIVE) {} |
532 | 538 |
533 PresentationDispatcher::AvailabilityStatus::~AvailabilityStatus() { | 539 PresentationDispatcher::AvailabilityStatus::~AvailabilityStatus() { |
534 } | 540 } |
535 | 541 |
536 } // namespace content | 542 } // namespace content |
OLD | NEW |