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

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 GetUserMediaRequestTrackStartedFailed(&request->request,
506 result,
507 result_name);
505 508
506 DeleteUserMediaRequestInfo(request); 509 DeleteUserMediaRequestInfo(request);
507 } 510 }
508 511
509 void MediaStreamImpl::OnDevicesEnumerated( 512 void MediaStreamImpl::OnDevicesEnumerated(
510 int request_id, 513 int request_id,
511 const StreamDeviceInfoArray& device_array) { 514 const StreamDeviceInfoArray& device_array) {
512 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" << request_id << ")"; 515 DVLOG(1) << "MediaStreamImpl::OnDevicesEnumerated(" << request_id << ")";
513 516
514 MediaDevicesRequestInfo* request = FindMediaDevicesRequestInfo(request_id); 517 MediaDevicesRequestInfo* request = FindMediaDevicesRequestInfo(request_id);
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
599 602
600 void MediaStreamImpl::GetUserMediaRequestSucceeded( 603 void MediaStreamImpl::GetUserMediaRequestSucceeded(
601 const blink::WebMediaStream& stream, 604 const blink::WebMediaStream& stream,
602 blink::WebUserMediaRequest* request_info) { 605 blink::WebUserMediaRequest* request_info) {
603 DVLOG(1) << "MediaStreamImpl::GetUserMediaRequestSucceeded"; 606 DVLOG(1) << "MediaStreamImpl::GetUserMediaRequestSucceeded";
604 request_info->requestSucceeded(stream); 607 request_info->requestSucceeded(stream);
605 } 608 }
606 609
607 void MediaStreamImpl::GetUserMediaRequestFailed( 610 void MediaStreamImpl::GetUserMediaRequestFailed(
608 blink::WebUserMediaRequest* request_info, 611 blink::WebUserMediaRequest* request_info,
609 content::MediaStreamRequestResult result) { 612 MediaStreamRequestResult result) {
610 switch (result) { 613 switch (result) {
611 case MEDIA_DEVICE_OK: 614 case MEDIA_DEVICE_OK:
612 NOTREACHED(); 615 NOTREACHED();
613 break; 616 break;
614 case MEDIA_DEVICE_PERMISSION_DENIED: 617 case MEDIA_DEVICE_PERMISSION_DENIED:
615 request_info->requestDenied(); 618 request_info->requestDenied();
616 break; 619 break;
617 case MEDIA_DEVICE_PERMISSION_DISMISSED: 620 case MEDIA_DEVICE_PERMISSION_DISMISSED:
618 request_info->requestFailedUASpecific("PermissionDismissedError"); 621 request_info->requestFailedUASpecific("PermissionDismissedError");
619 break; 622 break;
620 case MEDIA_DEVICE_INVALID_STATE: 623 case MEDIA_DEVICE_INVALID_STATE:
621 request_info->requestFailedUASpecific("InvalidStateError"); 624 request_info->requestFailedUASpecific("InvalidStateError");
622 break; 625 break;
623 case MEDIA_DEVICE_NO_HARDWARE: 626 case MEDIA_DEVICE_NO_HARDWARE:
624 request_info->requestFailedUASpecific("DevicesNotFoundError"); 627 request_info->requestFailedUASpecific("DevicesNotFoundError");
625 break; 628 break;
626 case MEDIA_DEVICE_INVALID_SECURITY_ORIGIN: 629 case MEDIA_DEVICE_INVALID_SECURITY_ORIGIN:
627 request_info->requestFailedUASpecific("InvalidSecurityOriginError"); 630 request_info->requestFailedUASpecific("InvalidSecurityOriginError");
628 break; 631 break;
629 case MEDIA_DEVICE_TAB_CAPTURE_FAILURE: 632 case MEDIA_DEVICE_TAB_CAPTURE_FAILURE:
630 request_info->requestFailedUASpecific("TabCaptureError"); 633 request_info->requestFailedUASpecific("TabCaptureError");
631 break; 634 break;
632 case MEDIA_DEVICE_SCREEN_CAPTURE_FAILURE: 635 case MEDIA_DEVICE_SCREEN_CAPTURE_FAILURE:
633 request_info->requestFailedUASpecific("ScreenCaptureError"); 636 request_info->requestFailedUASpecific("ScreenCaptureError");
634 break; 637 break;
635 case MEDIA_DEVICE_CAPTURE_FAILURE: 638 case MEDIA_DEVICE_CAPTURE_FAILURE:
636 request_info->requestFailedUASpecific("DeviceCaptureError"); 639 request_info->requestFailedUASpecific("DeviceCaptureError");
637 break; 640 break;
641 default:
642 NOTREACHED();
643 request_info->requestFailed();
644 break;
645 }
646 }
647
648 void MediaStreamImpl::GetUserMediaRequestTrackStartedFailed(
649 blink::WebUserMediaRequest* request_info,
650 MediaStreamRequestResult result,
651 const blink::WebString& result_name) {
652 switch (result) {
653 case MEDIA_DEVICE_CONSTRAINT_NOT_SATISFIED:
654 request_info->requestFailedConstraint(result_name);
655 break;
638 case MEDIA_DEVICE_TRACK_START_FAILURE: 656 case MEDIA_DEVICE_TRACK_START_FAILURE:
639 request_info->requestFailedUASpecific("TrackStartError"); 657 request_info->requestFailedUASpecific("TrackStartError");
640 break; 658 break;
641 default: 659 default:
660 NOTREACHED();
642 request_info->requestFailed(); 661 request_info->requestFailed();
643 break; 662 break;
644 } 663 }
645 } 664 }
646 665
647 void MediaStreamImpl::EnumerateDevicesSucceded( 666 void MediaStreamImpl::EnumerateDevicesSucceded(
648 blink::WebMediaDevicesRequest* request, 667 blink::WebMediaDevicesRequest* request,
649 blink::WebVector<blink::WebMediaDeviceInfo>& devices) { 668 blink::WebVector<blink::WebMediaDeviceInfo>& devices) {
650 request->requestSucceeded(devices); 669 request->requestSucceeded(devices);
651 } 670 }
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
807 826
808 MediaStreamImpl::UserMediaRequestInfo::UserMediaRequestInfo( 827 MediaStreamImpl::UserMediaRequestInfo::UserMediaRequestInfo(
809 int request_id, 828 int request_id,
810 const blink::WebUserMediaRequest& request, 829 const blink::WebUserMediaRequest& request,
811 bool enable_automatic_output_device_selection) 830 bool enable_automatic_output_device_selection)
812 : request_id(request_id), 831 : request_id(request_id),
813 generated(false), 832 generated(false),
814 enable_automatic_output_device_selection( 833 enable_automatic_output_device_selection(
815 enable_automatic_output_device_selection), 834 enable_automatic_output_device_selection),
816 request(request), 835 request(request),
817 request_failed_(false) { 836 request_result_(MEDIA_DEVICE_OK),
837 request_result_name_("") {
818 } 838 }
819 839
820 MediaStreamImpl::UserMediaRequestInfo::~UserMediaRequestInfo() { 840 MediaStreamImpl::UserMediaRequestInfo::~UserMediaRequestInfo() {
821 DVLOG(1) << "~UserMediaRequestInfo"; 841 DVLOG(1) << "~UserMediaRequestInfo";
822 } 842 }
823 843
824 void MediaStreamImpl::UserMediaRequestInfo::StartAudioTrack( 844 void MediaStreamImpl::UserMediaRequestInfo::StartAudioTrack(
825 const blink::WebMediaStreamTrack& track, 845 const blink::WebMediaStreamTrack& track,
826 const blink::WebMediaConstraints& constraints) { 846 const blink::WebMediaConstraints& constraints) {
827 DCHECK(track.source().type() == blink::WebMediaStreamSource::TypeAudio); 847 DCHECK(track.source().type() == blink::WebMediaStreamSource::TypeAudio);
(...skipping 27 matching lines...) Expand all
855 } 875 }
856 876
857 void MediaStreamImpl::UserMediaRequestInfo::CallbackOnTracksStarted( 877 void MediaStreamImpl::UserMediaRequestInfo::CallbackOnTracksStarted(
858 const ResourcesReady& callback) { 878 const ResourcesReady& callback) {
859 DCHECK(ready_callback_.is_null()); 879 DCHECK(ready_callback_.is_null());
860 ready_callback_ = callback; 880 ready_callback_ = callback;
861 CheckAllTracksStarted(); 881 CheckAllTracksStarted();
862 } 882 }
863 883
864 void MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted( 884 void MediaStreamImpl::UserMediaRequestInfo::OnTrackStarted(
865 MediaStreamSource* source, bool success) { 885 MediaStreamSource* source,
866 DVLOG(1) << "OnTrackStarted result " << success; 886 MediaStreamRequestResult result,
887 const blink::WebString& result_name) {
888 DVLOG(1) << "OnTrackStarted result " << result;
867 std::vector<MediaStreamSource*>::iterator it = 889 std::vector<MediaStreamSource*>::iterator it =
868 std::find(sources_waiting_for_callback_.begin(), 890 std::find(sources_waiting_for_callback_.begin(),
869 sources_waiting_for_callback_.end(), 891 sources_waiting_for_callback_.end(),
870 source); 892 source);
871 DCHECK(it != sources_waiting_for_callback_.end()); 893 DCHECK(it != sources_waiting_for_callback_.end());
872 sources_waiting_for_callback_.erase(it); 894 sources_waiting_for_callback_.erase(it);
873 // All tracks must be started successfully. Otherwise the request is a 895 // All tracks must be started successfully. Otherwise the request is a
874 // failure. 896 // failure.
875 if (!success) 897 if (result != MEDIA_DEVICE_OK) {
876 request_failed_ = true; 898 request_result_ = result;
899 request_result_name_ = result_name;
900 }
901
877 CheckAllTracksStarted(); 902 CheckAllTracksStarted();
878 } 903 }
879 904
880 void MediaStreamImpl::UserMediaRequestInfo::CheckAllTracksStarted() { 905 void MediaStreamImpl::UserMediaRequestInfo::CheckAllTracksStarted() {
881 if (!ready_callback_.is_null() && sources_waiting_for_callback_.empty()) { 906 if (!ready_callback_.is_null() && sources_waiting_for_callback_.empty()) {
882 ready_callback_.Run( 907 ready_callback_.Run(this, request_result_, request_result_name_);
883 this,
884 request_failed_ ? MEDIA_DEVICE_TRACK_START_FAILURE : MEDIA_DEVICE_OK);
885 } 908 }
886 } 909 }
887 910
888 bool MediaStreamImpl::UserMediaRequestInfo::IsSourceUsed( 911 bool MediaStreamImpl::UserMediaRequestInfo::IsSourceUsed(
889 const blink::WebMediaStreamSource& source) const { 912 const blink::WebMediaStreamSource& source) const {
890 for (std::vector<blink::WebMediaStreamSource>::const_iterator source_it = 913 for (std::vector<blink::WebMediaStreamSource>::const_iterator source_it =
891 sources_.begin(); 914 sources_.begin();
892 source_it != sources_.end(); ++source_it) { 915 source_it != sources_.end(); ++source_it) {
893 if (source_it->id() == source.id()) 916 if (source_it->id() == source.id())
894 return true; 917 return true;
895 } 918 }
896 return false; 919 return false;
897 } 920 }
898 921
899 void MediaStreamImpl::UserMediaRequestInfo::RemoveSource( 922 void MediaStreamImpl::UserMediaRequestInfo::RemoveSource(
900 const blink::WebMediaStreamSource& source) { 923 const blink::WebMediaStreamSource& source) {
901 for (std::vector<blink::WebMediaStreamSource>::iterator it = 924 for (std::vector<blink::WebMediaStreamSource>::iterator it =
902 sources_.begin(); 925 sources_.begin();
903 it != sources_.end(); ++it) { 926 it != sources_.end(); ++it) {
904 if (source.id() == it->id()) { 927 if (source.id() == it->id()) {
905 sources_.erase(it); 928 sources_.erase(it);
906 return; 929 return;
907 } 930 }
908 } 931 }
909 } 932 }
910 933
911 } // namespace content 934 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698