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

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: rebase and change the reviewers list 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 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
335 device_it != video_array.end(); ++device_it) { 335 device_it != video_array.end(); ++device_it) {
336 if (!FindLocalSource(*device_it)) 336 if (!FindLocalSource(*device_it))
337 media_stream_dispatcher_->StopStreamDevice(*device_it); 337 media_stream_dispatcher_->StopStreamDevice(*device_it);
338 } 338 }
339 } 339 }
340 340
341 // Callback from MediaStreamDispatcher. 341 // Callback from MediaStreamDispatcher.
342 // The requested stream failed to be generated. 342 // The requested stream failed to be generated.
343 void MediaStreamImpl::OnStreamGenerationFailed( 343 void MediaStreamImpl::OnStreamGenerationFailed(
344 int request_id, 344 int request_id,
345 content::MediaStreamRequestResult result) { 345 MediaStreamRequestResult result) {
346 DCHECK(CalledOnValidThread()); 346 DCHECK(CalledOnValidThread());
347 DVLOG(1) << "MediaStreamImpl::OnStreamGenerationFailed(" 347 DVLOG(1) << "MediaStreamImpl::OnStreamGenerationFailed("
348 << request_id << ")"; 348 << request_id << ")";
349 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id); 349 UserMediaRequestInfo* request_info = FindUserMediaRequestInfo(request_id);
350 if (!request_info) { 350 if (!request_info) {
351 // This can happen if the request is canceled or the frame reloads while 351 // This can happen if the request is canceled or the frame reloads while
352 // MediaStreamDispatcher is processing the request. 352 // MediaStreamDispatcher is processing the request.
353 DVLOG(1) << "Request ID not found"; 353 DVLOG(1) << "Request ID not found";
354 return; 354 return;
355 } 355 }
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 blink::WebMediaStreamSource::TypeAudio, 493 blink::WebMediaStreamSource::TypeAudio,
494 constraints, 494 constraints,
495 &webkit_source); 495 &webkit_source);
496 (*webkit_tracks)[i].initialize(webkit_source); 496 (*webkit_tracks)[i].initialize(webkit_source);
497 request->StartAudioTrack((*webkit_tracks)[i], constraints); 497 request->StartAudioTrack((*webkit_tracks)[i], constraints);
498 } 498 }
499 } 499 }
500 500
501 void MediaStreamImpl::OnCreateNativeTracksCompleted( 501 void MediaStreamImpl::OnCreateNativeTracksCompleted(
502 UserMediaRequestInfo* request, 502 UserMediaRequestInfo* request,
503 content::MediaStreamRequestResult result) { 503 MediaStreamRequestResult result,
504 const blink::WebString& result_name) {
504 DVLOG(1) << "MediaStreamImpl::OnCreateNativeTracksComplete(" 505 DVLOG(1) << "MediaStreamImpl::OnCreateNativeTracksComplete("
505 << "{request_id = " << request->request_id << "} " 506 << "{request_id = " << request->request_id << "} "
506 << "{result = " << result << "})"; 507 << "{result = " << result << "})";
507 if (result == content::MEDIA_DEVICE_OK) 508 if (result == content::MEDIA_DEVICE_OK)
508 GetUserMediaRequestSucceeded(request->web_stream, &request->request); 509 GetUserMediaRequestSucceeded(request->web_stream, &request->request);
509 else 510 else
510 GetUserMediaRequestFailed(&request->request, result); 511 GetUserMediaRequestTrackStartedFailed(&request->request,
512 result,
513 result_name);
511 514
512 DeleteUserMediaRequestInfo(request); 515 DeleteUserMediaRequestInfo(request);
513 } 516 }
514 517
515 void MediaStreamImpl::OnDevicesEnumerated( 518 void MediaStreamImpl::OnDevicesEnumerated(
516 int request_id, 519 int request_id,
517 const StreamDeviceInfoArray& device_array) { 520 const StreamDeviceInfoArray& device_array) {
518 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" << request_id << ")"; 521 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" << request_id << ")";
519 522
520 MediaDevicesRequestInfo* request = FindMediaDevicesRequestInfo(request_id); 523 MediaDevicesRequestInfo* request = FindMediaDevicesRequestInfo(request_id);
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 void MediaStreamImpl::GetUserMediaRequestSucceeded( 609 void MediaStreamImpl::GetUserMediaRequestSucceeded(
607 const blink::WebMediaStream& stream, 610 const blink::WebMediaStream& stream,
608 blink::WebUserMediaRequest* request_info) { 611 blink::WebUserMediaRequest* request_info) {
609 DVLOG(1) << "MediaStreamImpl::GetUserMediaRequestSucceeded"; 612 DVLOG(1) << "MediaStreamImpl::GetUserMediaRequestSucceeded";
610 LogUserMediaRequestResult(MEDIA_DEVICE_OK); 613 LogUserMediaRequestResult(MEDIA_DEVICE_OK);
611 request_info->requestSucceeded(stream); 614 request_info->requestSucceeded(stream);
612 } 615 }
613 616
614 void MediaStreamImpl::GetUserMediaRequestFailed( 617 void MediaStreamImpl::GetUserMediaRequestFailed(
615 blink::WebUserMediaRequest* request_info, 618 blink::WebUserMediaRequest* request_info,
616 content::MediaStreamRequestResult result) { 619 MediaStreamRequestResult result) {
617 LogUserMediaRequestResult(result); 620 LogUserMediaRequestResult(result);
618 switch (result) { 621 switch (result) {
619 case MEDIA_DEVICE_OK: 622 case MEDIA_DEVICE_OK:
620 NOTREACHED(); 623 NOTREACHED();
621 break; 624 break;
622 case MEDIA_DEVICE_PERMISSION_DENIED: 625 case MEDIA_DEVICE_PERMISSION_DENIED:
623 request_info->requestDenied(); 626 request_info->requestDenied();
624 break; 627 break;
625 case MEDIA_DEVICE_PERMISSION_DISMISSED: 628 case MEDIA_DEVICE_PERMISSION_DISMISSED:
626 request_info->requestFailedUASpecific("PermissionDismissedError"); 629 request_info->requestFailedUASpecific("PermissionDismissedError");
627 break; 630 break;
628 case MEDIA_DEVICE_INVALID_STATE: 631 case MEDIA_DEVICE_INVALID_STATE:
629 request_info->requestFailedUASpecific("InvalidStateError"); 632 request_info->requestFailedUASpecific("InvalidStateError");
630 break; 633 break;
631 case MEDIA_DEVICE_NO_HARDWARE: 634 case MEDIA_DEVICE_NO_HARDWARE:
632 request_info->requestFailedUASpecific("DevicesNotFoundError"); 635 request_info->requestFailedUASpecific("DevicesNotFoundError");
633 break; 636 break;
634 case MEDIA_DEVICE_INVALID_SECURITY_ORIGIN: 637 case MEDIA_DEVICE_INVALID_SECURITY_ORIGIN:
635 request_info->requestFailedUASpecific("InvalidSecurityOriginError"); 638 request_info->requestFailedUASpecific("InvalidSecurityOriginError");
636 break; 639 break;
637 case MEDIA_DEVICE_TAB_CAPTURE_FAILURE: 640 case MEDIA_DEVICE_TAB_CAPTURE_FAILURE:
638 request_info->requestFailedUASpecific("TabCaptureError"); 641 request_info->requestFailedUASpecific("TabCaptureError");
639 break; 642 break;
640 case MEDIA_DEVICE_SCREEN_CAPTURE_FAILURE: 643 case MEDIA_DEVICE_SCREEN_CAPTURE_FAILURE:
641 request_info->requestFailedUASpecific("ScreenCaptureError"); 644 request_info->requestFailedUASpecific("ScreenCaptureError");
642 break; 645 break;
643 case MEDIA_DEVICE_CAPTURE_FAILURE: 646 case MEDIA_DEVICE_CAPTURE_FAILURE:
644 request_info->requestFailedUASpecific("DeviceCaptureError"); 647 request_info->requestFailedUASpecific("DeviceCaptureError");
645 break; 648 break;
649 default:
650 NOTREACHED();
651 request_info->requestFailed();
652 break;
653 }
654 }
655
656 void MediaStreamImpl::GetUserMediaRequestTrackStartedFailed(
657 blink::WebUserMediaRequest* request_info,
658 MediaStreamRequestResult result,
659 const blink::WebString& result_name) {
660 switch (result) {
661 case MEDIA_DEVICE_CONSTRAINT_NOT_SATISFIED:
662 request_info->requestFailedConstraint(result_name);
663 break;
646 case MEDIA_DEVICE_TRACK_START_FAILURE: 664 case MEDIA_DEVICE_TRACK_START_FAILURE:
647 request_info->requestFailedUASpecific("TrackStartError"); 665 request_info->requestFailedUASpecific("TrackStartError");
648 break; 666 break;
649 default: 667 default:
668 NOTREACHED();
650 request_info->requestFailed(); 669 request_info->requestFailed();
651 break; 670 break;
652 } 671 }
653 } 672 }
654 673
655 void MediaStreamImpl::EnumerateDevicesSucceded( 674 void MediaStreamImpl::EnumerateDevicesSucceded(
656 blink::WebMediaDevicesRequest* request, 675 blink::WebMediaDevicesRequest* request,
657 blink::WebVector<blink::WebMediaDeviceInfo>& devices) { 676 blink::WebVector<blink::WebMediaDeviceInfo>& devices) {
658 request->requestSucceeded(devices); 677 request->requestSucceeded(devices);
659 } 678 }
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
825 844
826 MediaStreamImpl::UserMediaRequestInfo::UserMediaRequestInfo( 845 MediaStreamImpl::UserMediaRequestInfo::UserMediaRequestInfo(
827 int request_id, 846 int request_id,
828 const blink::WebUserMediaRequest& request, 847 const blink::WebUserMediaRequest& request,
829 bool enable_automatic_output_device_selection) 848 bool enable_automatic_output_device_selection)
830 : request_id(request_id), 849 : request_id(request_id),
831 generated(false), 850 generated(false),
832 enable_automatic_output_device_selection( 851 enable_automatic_output_device_selection(
833 enable_automatic_output_device_selection), 852 enable_automatic_output_device_selection),
834 request(request), 853 request(request),
835 request_failed_(false) { 854 request_result_(MEDIA_DEVICE_OK),
855 request_result_name_("") {
836 } 856 }
837 857
838 MediaStreamImpl::UserMediaRequestInfo::~UserMediaRequestInfo() { 858 MediaStreamImpl::UserMediaRequestInfo::~UserMediaRequestInfo() {
839 DVLOG(1) << "~UserMediaRequestInfo"; 859 DVLOG(1) << "~UserMediaRequestInfo";
840 } 860 }
841 861
842 void MediaStreamImpl::UserMediaRequestInfo::StartAudioTrack( 862 void MediaStreamImpl::UserMediaRequestInfo::StartAudioTrack(
843 const blink::WebMediaStreamTrack& track, 863 const blink::WebMediaStreamTrack& track,
844 const blink::WebMediaConstraints& constraints) { 864 const blink::WebMediaConstraints& constraints) {
845 DCHECK(track.source().type() == blink::WebMediaStreamSource::TypeAudio); 865 DCHECK(track.source().type() == blink::WebMediaStreamSource::TypeAudio);
(...skipping 27 matching lines...) Expand all
873 } 893 }
874 894
875 void MediaStreamImpl::UserMediaRequestInfo::CallbackOnTracksStarted( 895 void MediaStreamImpl::UserMediaRequestInfo::CallbackOnTracksStarted(
876 const ResourcesReady& callback) { 896 const ResourcesReady& callback) {
877 DCHECK(ready_callback_.is_null()); 897 DCHECK(ready_callback_.is_null());
878 ready_callback_ = callback; 898 ready_callback_ = callback;
879 CheckAllTracksStarted(); 899 CheckAllTracksStarted();
880 } 900 }
881 901
882 void MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted( 902 void MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted(
883 MediaStreamSource* source, bool success) { 903 MediaStreamSource* source,
884 DVLOG(1) << "OnTrackStarted result " << success; 904 MediaStreamRequestResult result,
905 const blink::WebString& result_name) {
906 DVLOG(1) << "OnTrackStarted result " << result;
885 std::vector<MediaStreamSource*>::iterator it = 907 std::vector<MediaStreamSource*>::iterator it =
886 std::find(sources_waiting_for_callback_.begin(), 908 std::find(sources_waiting_for_callback_.begin(),
887 sources_waiting_for_callback_.end(), 909 sources_waiting_for_callback_.end(),
888 source); 910 source);
889 DCHECK(it != sources_waiting_for_callback_.end()); 911 DCHECK(it != sources_waiting_for_callback_.end());
890 sources_waiting_for_callback_.erase(it); 912 sources_waiting_for_callback_.erase(it);
891 // All tracks must be started successfully. Otherwise the request is a 913 // All tracks must be started successfully. Otherwise the request is a
892 // failure. 914 // failure.
893 if (!success) 915 if (result != MEDIA_DEVICE_OK) {
894 request_failed_ = true; 916 request_result_ = result;
917 request_result_name_ = result_name;
918 }
919
895 CheckAllTracksStarted(); 920 CheckAllTracksStarted();
896 } 921 }
897 922
898 void MediaStreamImpl::UserMediaRequestInfo::CheckAllTracksStarted() { 923 void MediaStreamImpl::UserMediaRequestInfo::CheckAllTracksStarted() {
899 if (!ready_callback_.is_null() && sources_waiting_for_callback_.empty()) { 924 if (!ready_callback_.is_null() && sources_waiting_for_callback_.empty()) {
900 ready_callback_.Run( 925 ready_callback_.Run(this, request_result_, request_result_name_);
901 this,
902 request_failed_ ? MEDIA_DEVICE_TRACK_START_FAILURE : MEDIA_DEVICE_OK);
903 } 926 }
904 } 927 }
905 928
906 bool MediaStreamImpl::UserMediaRequestInfo::IsSourceUsed( 929 bool MediaStreamImpl::UserMediaRequestInfo::IsSourceUsed(
907 const blink::WebMediaStreamSource& source) const { 930 const blink::WebMediaStreamSource& source) const {
908 for (std::vector<blink::WebMediaStreamSource>::const_iterator source_it = 931 for (std::vector<blink::WebMediaStreamSource>::const_iterator source_it =
909 sources_.begin(); 932 sources_.begin();
910 source_it != sources_.end(); ++source_it) { 933 source_it != sources_.end(); ++source_it) {
911 if (source_it->id() == source.id()) 934 if (source_it->id() == source.id())
912 return true; 935 return true;
(...skipping 11 matching lines...) Expand all
924 return; 947 return;
925 } 948 }
926 } 949 }
927 } 950 }
928 951
929 bool MediaStreamImpl::UserMediaRequestInfo::HasPendingSources() const { 952 bool MediaStreamImpl::UserMediaRequestInfo::HasPendingSources() const {
930 return !sources_waiting_for_callback_.empty(); 953 return !sources_waiting_for_callback_.empty();
931 } 954 }
932 955
933 } // namespace content 956 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/media_stream_impl.h ('k') | content/renderer/media/media_stream_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698