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

Side by Side Diff: content/renderer/media/media_stream_impl.cc

Issue 391703002: Implement ConstraintNotSatisfiedError for getusermedia (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 4 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/media/media_stream_impl.h" 5 #include "content/renderer/media/media_stream_impl.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/hash.h" 9 #include "base/hash.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 // Wait for the tracks to be started successfully or to fail. 329 // Wait for the tracks to be started successfully or to fail.
330 request_info->CallbackOnTracksStarted( 330 request_info->CallbackOnTracksStarted(
331 base::Bind(&MediaStreamImpl::OnCreateNativeTracksCompleted, 331 base::Bind(&MediaStreamImpl::OnCreateNativeTracksCompleted,
332 weak_factory_.GetWeakPtr())); 332 weak_factory_.GetWeakPtr()));
333 } 333 }
334 334
335 // Callback from MediaStreamDispatcher. 335 // Callback from MediaStreamDispatcher.
336 // The requested stream failed to be generated. 336 // The requested stream failed to be generated.
337 void MediaStreamImpl::OnStreamGenerationFailed( 337 void MediaStreamImpl::OnStreamGenerationFailed(
338 int request_id, 338 int request_id,
339 content::MediaStreamRequestResult result) { 339 MediaStreamRequestResult result) {
340 DCHECK(CalledOnValidThread()); 340 DCHECK(CalledOnValidThread());
341 DVLOG(1) << "MediaStreamImpl::OnStreamGenerationFailed(" 341 DVLOG(1) << "MediaStreamImpl::OnStreamGenerationFailed("
342 << request_id << ")"; 342 << request_id << ")";
343 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); 343 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id);
344 if (!request_info) { 344 if (!request_info) {
345 // This can happen if the request is canceled or the frame reloads while 345 // This can happen if the request is canceled or the frame reloads while
346 // MediaStreamDispatcher is processing the request. 346 // MediaStreamDispatcher is processing the request.
347 DVLOG(1) << "Request ID not found"; 347 DVLOG(1) << "Request ID not found";
348 return; 348 return;
349 } 349 }
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
487 blink::WebMediaStreamSource::TypeAudio, 487 blink::WebMediaStreamSource::TypeAudio,
488 constraints, 488 constraints,
489 &webkit_source); 489 &webkit_source);
490 (*webkit_tracks)[i].initialize(webkit_source); 490 (*webkit_tracks)[i].initialize(webkit_source);
491 request->StartAudioTrack((*webkit_tracks)[i], constraints); 491 request->StartAudioTrack((*webkit_tracks)[i], constraints);
492 } 492 }
493 } 493 }
494 494
495 void MediaStreamImpl::OnCreateNativeTracksCompleted( 495 void MediaStreamImpl::OnCreateNativeTracksCompleted(
496 UserMediaRequestInfo* request, 496 UserMediaRequestInfo* request,
497 content::MediaStreamRequestResult result) { 497 MediaStreamRequestResult result,
498 const blink::WebString& result_name) {
498 DVLOG(1) << "MediaStreamImpl::OnCreateNativeTracksComplete(" 499 DVLOG(1) << "MediaStreamImpl::OnCreateNativeTracksComplete("
499 << "{request_id = " << request->request_id << "} " 500 << "{request_id = " << request->request_id << "} "
500 << "{result = " << result << "})"; 501 << "{result = " << result << "})";
501 if (result == content::MEDIA_DEVICE_OK) 502 if (result == content::MEDIA_DEVICE_OK)
502 GetUserMediaRequestSucceeded(request->web_stream, &request->request); 503 GetUserMediaRequestSucceeded(request->web_stream, &request->request);
503 else 504 else
504 GetUserMediaRequestFailed(&request->request, result); 505 GetUserMediaRequestFailed(&request->request, result, result_name);
505 506
506 DeleteUserMediaRequestInfo(request); 507 DeleteUserMediaRequestInfo(request);
507 } 508 }
508 509
509 void MediaStreamImpl::OnDevicesEnumerated( 510 void MediaStreamImpl::OnDevicesEnumerated(
510 int request_id, 511 int request_id,
511 const StreamDeviceInfoArray& device_array) { 512 const StreamDeviceInfoArray& device_array) {
512 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" << request_id << ")"; 513 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" << request_id << ")";
513 514
514 MediaDevicesRequestInfo* request = FindMediaDevicesRequestInfo(request_id); 515 MediaDevicesRequestInfo* request = FindMediaDevicesRequestInfo(request_id);
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
599 600
600 void MediaStreamImpl::GetUserMediaRequestSucceeded( 601 void MediaStreamImpl::GetUserMediaRequestSucceeded(
601 const blink::WebMediaStream& stream, 602 const blink::WebMediaStream& stream,
602 blink::WebUserMediaRequest* request_info) { 603 blink::WebUserMediaRequest* request_info) {
603 DVLOG(1) << "MediaStreamImpl::GetUserMediaRequestSucceeded"; 604 DVLOG(1) << "MediaStreamImpl::GetUserMediaRequestSucceeded";
604 request_info->requestSucceeded(stream); 605 request_info->requestSucceeded(stream);
605 } 606 }
606 607
607 void MediaStreamImpl::GetUserMediaRequestFailed( 608 void MediaStreamImpl::GetUserMediaRequestFailed(
608 blink::WebUserMediaRequest* request_info, 609 blink::WebUserMediaRequest* request_info,
609 content::MediaStreamRequestResult result) { 610 MediaStreamRequestResult result) {
610 switch (result) { 611 switch (result) {
611 case MEDIA_DEVICE_OK: 612 case MEDIA_DEVICE_OK:
612 NOTREACHED(); 613 NOTREACHED();
613 break; 614 break;
614 case MEDIA_DEVICE_PERMISSION_DENIED: 615 case MEDIA_DEVICE_PERMISSION_DENIED:
615 request_info->requestDenied(); 616 request_info->requestDenied();
616 break; 617 break;
617 case MEDIA_DEVICE_PERMISSION_DISMISSED: 618 case MEDIA_DEVICE_PERMISSION_DISMISSED:
618 request_info->requestFailedUASpecific("PermissionDismissedError"); 619 request_info->requestFailedUASpecific("PermissionDismissedError");
619 break; 620 break;
620 case MEDIA_DEVICE_INVALID_STATE: 621 case MEDIA_DEVICE_INVALID_STATE:
621 request_info->requestFailedUASpecific("InvalidStateError"); 622 request_info->requestFailedUASpecific("InvalidStateError");
622 break; 623 break;
623 case MEDIA_DEVICE_NO_HARDWARE: 624 case MEDIA_DEVICE_NO_HARDWARE:
624 request_info->requestFailedUASpecific("DevicesNotFoundError"); 625 request_info->requestFailedUASpecific("DevicesNotFoundError");
625 break; 626 break;
626 case MEDIA_DEVICE_INVALID_SECURITY_ORIGIN: 627 case MEDIA_DEVICE_INVALID_SECURITY_ORIGIN:
627 request_info->requestFailedUASpecific("InvalidSecurityOriginError"); 628 request_info->requestFailedUASpecific("InvalidSecurityOriginError");
628 break; 629 break;
629 case MEDIA_DEVICE_TAB_CAPTURE_FAILURE: 630 case MEDIA_DEVICE_TAB_CAPTURE_FAILURE:
630 request_info->requestFailedUASpecific("TabCaptureError"); 631 request_info->requestFailedUASpecific("TabCaptureError");
631 break; 632 break;
632 case MEDIA_DEVICE_SCREEN_CAPTURE_FAILURE: 633 case MEDIA_DEVICE_SCREEN_CAPTURE_FAILURE:
633 request_info->requestFailedUASpecific("ScreenCaptureError"); 634 request_info->requestFailedUASpecific("ScreenCaptureError");
634 break; 635 break;
635 case MEDIA_DEVICE_CAPTURE_FAILURE: 636 case MEDIA_DEVICE_CAPTURE_FAILURE:
636 request_info->requestFailedUASpecific("DeviceCaptureError"); 637 request_info->requestFailedUASpecific("DeviceCaptureError");
637 break; 638 break;
639 default:
miu 2014/07/30 19:37:23 It's generally not good practice to use "default"
jiajia.qin 2014/07/31 13:43:00 Done.
miu 2014/07/31 19:30:09 You should still call request_info->requestFailed(
jiajia.qin 2014/08/01 05:25:33 Done.
640 request_info->requestFailed();
641 break;
642 }
643 }
644
645 void MediaStreamImpl::GetUserMediaRequestFailed(
miu 2014/07/30 19:37:23 IMHO, this shouldn't be a separate method. Can yo
jiajia.qin 2014/07/31 13:43:00 The new 3rd arg is only for 'TrackStartError'. For
646 blink::WebUserMediaRequest* request_info,
647 MediaStreamRequestResult result,
648 const blink::WebString& result_name) {
649 switch (result) {
650 case MEDIA_DEVICE_CONSTRAINT_NOT_SATISFIED:
651 request_info->requestFailedConstraint(result_name);
652 break;
638 case MEDIA_DEVICE_TRACK_START_FAILURE: 653 case MEDIA_DEVICE_TRACK_START_FAILURE:
639 request_info->requestFailedUASpecific("TrackStartError"); 654 request_info->requestFailedUASpecific("TrackStartError");
640 break; 655 break;
641 default: 656 default:
642 request_info->requestFailed(); 657 request_info->requestFailed();
643 break; 658 break;
644 } 659 }
645 } 660 }
646 661
647 void MediaStreamImpl::EnumerateDevicesSucceded( 662 void MediaStreamImpl::EnumerateDevicesSucceded(
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
855 } 870 }
856 871
857 void MediaStreamImpl::UserMediaRequestInfo::CallbackOnTracksStarted( 872 void MediaStreamImpl::UserMediaRequestInfo::CallbackOnTracksStarted(
858 const ResourcesReady& callback) { 873 const ResourcesReady& callback) {
859 DCHECK(ready_callback_.is_null()); 874 DCHECK(ready_callback_.is_null());
860 ready_callback_ = callback; 875 ready_callback_ = callback;
861 CheckAllTracksStarted(); 876 CheckAllTracksStarted();
862 } 877 }
863 878
864 void MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted( 879 void MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted(
865 MediaStreamSource* source, bool success) { 880 MediaStreamSource* source,
866 DVLOG(1) << "OnTrackStarted result " << success; 881 MediaStreamRequestResult result,
882 const blink::WebString& result_name) {
883 DVLOG(1) << "OnTrackStarted result " << result;
867 std::vector<MediaStreamSource*>::iterator it = 884 std::vector<MediaStreamSource*>::iterator it =
868 std::find(sources_waiting_for_callback_.begin(), 885 std::find(sources_waiting_for_callback_.begin(),
869 sources_waiting_for_callback_.end(), 886 sources_waiting_for_callback_.end(),
870 source); 887 source);
871 DCHECK(it != sources_waiting_for_callback_.end()); 888 DCHECK(it != sources_waiting_for_callback_.end());
872 sources_waiting_for_callback_.erase(it); 889 sources_waiting_for_callback_.erase(it);
873 // All tracks must be started successfully. Otherwise the request is a 890 // All tracks must be started successfully. Otherwise the request is a
874 // failure. 891 // failure.
875 if (!success) 892 if (result != MEDIA_DEVICE_OK)
876 request_failed_ = true; 893 request_failed_ = true;
877 CheckAllTracksStarted(); 894 if (!ready_callback_.is_null() && sources_waiting_for_callback_.empty()) {
895 ready_callback_.Run(this, result, result_name);
896 }
878 } 897 }
879 898
880 void MediaStreamImpl::UserMediaRequestInfo::CheckAllTracksStarted() { 899 void MediaStreamImpl::UserMediaRequestInfo::CheckAllTracksStarted() {
881 if (!ready_callback_.is_null() && sources_waiting_for_callback_.empty()) { 900 if (!ready_callback_.is_null() && sources_waiting_for_callback_.empty()) {
882 ready_callback_.Run( 901 ready_callback_.Run(
883 this, 902 this,
884 request_failed_ ? MEDIA_DEVICE_TRACK_START_FAILURE : MEDIA_DEVICE_OK); 903 request_failed_ ? MEDIA_DEVICE_TRACK_START_FAILURE : MEDIA_DEVICE_OK,
904 "");
885 } 905 }
886 } 906 }
887 907
888 bool MediaStreamImpl::UserMediaRequestInfo::IsSourceUsed( 908 bool MediaStreamImpl::UserMediaRequestInfo::IsSourceUsed(
889 const blink::WebMediaStreamSource& source) const { 909 const blink::WebMediaStreamSource& source) const {
890 for (std::vector<blink::WebMediaStreamSource>::const_iterator source_it = 910 for (std::vector<blink::WebMediaStreamSource>::const_iterator source_it =
891 sources_.begin(); 911 sources_.begin();
892 source_it != sources_.end(); ++source_it) { 912 source_it != sources_.end(); ++source_it) {
893 if (source_it->id() == source.id()) 913 if (source_it->id() == source.id())
894 return true; 914 return true;
895 } 915 }
896 return false; 916 return false;
897 } 917 }
898 918
899 void MediaStreamImpl::UserMediaRequestInfo::RemoveSource( 919 void MediaStreamImpl::UserMediaRequestInfo::RemoveSource(
900 const blink::WebMediaStreamSource& source) { 920 const blink::WebMediaStreamSource& source) {
901 for (std::vector<blink::WebMediaStreamSource>::iterator it = 921 for (std::vector<blink::WebMediaStreamSource>::iterator it =
902 sources_.begin(); 922 sources_.begin();
903 it != sources_.end(); ++it) { 923 it != sources_.end(); ++it) {
904 if (source.id() == it->id()) { 924 if (source.id() == it->id()) {
905 sources_.erase(it); 925 sources_.erase(it);
906 return; 926 return;
907 } 927 }
908 } 928 }
909 } 929 }
910 930
911 } // namespace content 931 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698