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 |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 | 306 |
307 // Remove all pending send message requests. | 307 // Remove all pending send message requests. |
308 MessageRequestQueue empty; | 308 MessageRequestQueue empty; |
309 std::swap(message_request_queue_, empty); | 309 std::swap(message_request_queue_, empty); |
310 } | 310 } |
311 | 311 |
312 void PresentationDispatcher::OnDestruct() { | 312 void PresentationDispatcher::OnDestruct() { |
313 delete this; | 313 delete this; |
314 } | 314 } |
315 | 315 |
316 void PresentationDispatcher::OnScreenAvailabilityUpdated(const std::string& url, | 316 void PresentationDispatcher::OnScreenAvailabilityUpdated( |
317 bool available) { | 317 const mojo::String& url, bool available) { |
318 auto status_it = availability_status_.find(url); | 318 const std::string& availability_url = url.get(); |
| 319 auto status_it = availability_status_.find(availability_url); |
319 if (status_it == availability_status_.end()) | 320 if (status_it == availability_status_.end()) |
320 return; | 321 return; |
321 AvailabilityStatus* status = status_it->second.get(); | 322 AvailabilityStatus* status = status_it->second.get(); |
322 DCHECK(status); | 323 DCHECK(status); |
323 | 324 |
324 if (status->listening_state == ListeningState::WAITING) | 325 if (status->listening_state == ListeningState::WAITING) |
325 status->listening_state = ListeningState::ACTIVE; | 326 status->listening_state = ListeningState::ACTIVE; |
326 | 327 |
327 for (auto* observer : status->availability_observers) | 328 for (auto* observer : status->availability_observers) |
328 observer->availabilityChanged(available); | 329 observer->availabilityChanged(available); |
329 | 330 |
330 for (AvailabilityCallbacksMap::iterator iter(&status->availability_callbacks); | 331 for (AvailabilityCallbacksMap::iterator iter(&status->availability_callbacks); |
331 !iter.IsAtEnd(); iter.Advance()) { | 332 !iter.IsAtEnd(); iter.Advance()) { |
332 iter.GetCurrentValue()->onSuccess(available); | 333 iter.GetCurrentValue()->onSuccess(available); |
333 } | 334 } |
334 status->last_known_availability = available; | 335 status->last_known_availability = available; |
335 status->availability_callbacks.Clear(); | 336 status->availability_callbacks.Clear(); |
336 UpdateListeningState(status); | 337 UpdateListeningState(status); |
337 } | 338 } |
338 | 339 |
339 void PresentationDispatcher::OnScreenAvailabilityNotSupported( | 340 void PresentationDispatcher::OnScreenAvailabilityNotSupported( |
340 const std::string& url) { | 341 const mojo::String& url) { |
341 auto status_it = availability_status_.find(url); | 342 const std::string& availability_url = url.get(); |
| 343 auto status_it = availability_status_.find(availability_url); |
342 if (status_it == availability_status_.end()) | 344 if (status_it == availability_status_.end()) |
343 return; | 345 return; |
344 AvailabilityStatus* status = status_it->second.get(); | 346 AvailabilityStatus* status = status_it->second.get(); |
345 DCHECK(status); | 347 DCHECK(status); |
346 DCHECK(status->listening_state == ListeningState::WAITING); | 348 DCHECK(status->listening_state == ListeningState::WAITING); |
347 | 349 |
348 const blink::WebString& not_supported_error = blink::WebString::fromUTF8( | 350 const blink::WebString& not_supported_error = blink::WebString::fromUTF8( |
349 "getAvailability() isn't supported at the moment. It can be due to " | 351 "getAvailability() isn't supported at the moment. It can be due to " |
350 "a permanent or temporary system limitation. It is recommended to " | 352 "a permanent or temporary system limitation. It is recommended to " |
351 "try to blindly start a session in that case."); | 353 "try to blindly start a session in that case."); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
398 | 400 |
399 DCHECK(!connection.is_null()); | 401 DCHECK(!connection.is_null()); |
400 controller_->didChangeSessionState( | 402 controller_->didChangeSessionState( |
401 new PresentationConnectionClient(std::move(connection)), | 403 new PresentationConnectionClient(std::move(connection)), |
402 GetWebPresentationConnectionStateFromMojo(state)); | 404 GetWebPresentationConnectionStateFromMojo(state)); |
403 } | 405 } |
404 | 406 |
405 void PresentationDispatcher::OnConnectionClosed( | 407 void PresentationDispatcher::OnConnectionClosed( |
406 blink::mojom::PresentationSessionInfoPtr connection, | 408 blink::mojom::PresentationSessionInfoPtr connection, |
407 blink::mojom::PresentationConnectionCloseReason reason, | 409 blink::mojom::PresentationConnectionCloseReason reason, |
408 const std::string& message) { | 410 const mojo::String& message) { |
409 if (!controller_) | 411 if (!controller_) |
410 return; | 412 return; |
411 | 413 |
412 DCHECK(!connection.is_null()); | 414 DCHECK(!connection.is_null()); |
413 controller_->didCloseConnection( | 415 controller_->didCloseConnection( |
414 new PresentationConnectionClient(std::move(connection)), | 416 new PresentationConnectionClient(std::move(connection)), |
415 GetWebPresentationConnectionCloseReasonFromMojo(reason), | 417 GetWebPresentationConnectionCloseReasonFromMojo(reason), |
416 blink::WebString::fromUTF8(message)); | 418 blink::WebString::fromUTF8(message)); |
417 } | 419 } |
418 | 420 |
419 void PresentationDispatcher::OnSessionMessagesReceived( | 421 void PresentationDispatcher::OnSessionMessagesReceived( |
420 blink::mojom::PresentationSessionInfoPtr session_info, | 422 blink::mojom::PresentationSessionInfoPtr session_info, |
421 std::vector<blink::mojom::SessionMessagePtr> messages) { | 423 mojo::Array<blink::mojom::SessionMessagePtr> messages) { |
422 if (!controller_) | 424 if (!controller_) |
423 return; | 425 return; |
424 | 426 |
425 for (size_t i = 0; i < messages.size(); ++i) { | 427 for (size_t i = 0; i < messages.size(); ++i) { |
426 // Note: Passing batches of messages to the Blink layer would be more | 428 // Note: Passing batches of messages to the Blink layer would be more |
427 // efficient. | 429 // efficient. |
428 std::unique_ptr<PresentationConnectionClient> session_client( | 430 std::unique_ptr<PresentationConnectionClient> session_client( |
429 new PresentationConnectionClient(session_info->url, session_info->id)); | 431 new PresentationConnectionClient(session_info->url, session_info->id)); |
430 switch (messages[i]->type) { | 432 switch (messages[i]->type) { |
431 case blink::mojom::PresentationMessageType::TEXT: { | 433 case blink::mojom::PresentationMessageType::TEXT: { |
432 // TODO(mfoltz): Do we need to DCHECK(messages[i]->message)? | |
433 controller_->didReceiveSessionTextMessage( | 434 controller_->didReceiveSessionTextMessage( |
434 session_client.release(), | 435 session_client.release(), |
435 blink::WebString::fromUTF8(messages[i]->message.value())); | 436 blink::WebString::fromUTF8(messages[i]->message)); |
436 break; | 437 break; |
437 } | 438 } |
438 case blink::mojom::PresentationMessageType::ARRAY_BUFFER: | 439 case blink::mojom::PresentationMessageType::ARRAY_BUFFER: |
439 case blink::mojom::PresentationMessageType::BLOB: { | 440 case blink::mojom::PresentationMessageType::BLOB: { |
440 // TODO(mfoltz): Do we need to DCHECK(messages[i]->data)? | |
441 controller_->didReceiveSessionBinaryMessage( | 441 controller_->didReceiveSessionBinaryMessage( |
442 session_client.release(), &(messages[i]->data->front()), | 442 session_client.release(), &(messages[i]->data.front()), |
443 messages[i]->data->size()); | 443 messages[i]->data.size()); |
444 break; | 444 break; |
445 } | 445 } |
446 default: { | 446 default: { |
447 NOTREACHED(); | 447 NOTREACHED(); |
448 break; | 448 break; |
449 } | 449 } |
450 } | 450 } |
451 } | 451 } |
452 } | 452 } |
453 | 453 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
512 const uint8_t* data, | 512 const uint8_t* data, |
513 size_t length) { | 513 size_t length) { |
514 blink::mojom::PresentationSessionInfoPtr session_info = | 514 blink::mojom::PresentationSessionInfoPtr session_info = |
515 blink::mojom::PresentationSessionInfo::New(); | 515 blink::mojom::PresentationSessionInfo::New(); |
516 session_info->url = presentationUrl.utf8(); | 516 session_info->url = presentationUrl.utf8(); |
517 session_info->id = presentationId.utf8(); | 517 session_info->id = presentationId.utf8(); |
518 | 518 |
519 blink::mojom::SessionMessagePtr session_message = | 519 blink::mojom::SessionMessagePtr session_message = |
520 blink::mojom::SessionMessage::New(); | 520 blink::mojom::SessionMessage::New(); |
521 session_message->type = type; | 521 session_message->type = type; |
522 session_message->data = std::vector<uint8_t>(data, data + length); | 522 std::vector<uint8_t> tmp_data_vector(data, data + length); |
| 523 session_message->data.Swap(&tmp_data_vector); |
523 return new SendMessageRequest(std::move(session_info), | 524 return new SendMessageRequest(std::move(session_info), |
524 std::move(session_message)); | 525 std::move(session_message)); |
525 } | 526 } |
526 | 527 |
527 PresentationDispatcher::AvailabilityStatus::AvailabilityStatus( | 528 PresentationDispatcher::AvailabilityStatus::AvailabilityStatus( |
528 const std::string& availability_url) | 529 const std::string& availability_url) |
529 : url(availability_url), | 530 : url(availability_url), |
530 last_known_availability(false), | 531 last_known_availability(false), |
531 listening_state(ListeningState::INACTIVE) {} | 532 listening_state(ListeningState::INACTIVE) {} |
532 | 533 |
533 PresentationDispatcher::AvailabilityStatus::~AvailabilityStatus() { | 534 PresentationDispatcher::AvailabilityStatus::~AvailabilityStatus() { |
534 } | 535 } |
535 | 536 |
536 } // namespace content | 537 } // namespace content |
OLD | NEW |